package Ġio . github . tsch ie . k te cs . gl . systems Ċ Ċ import Ġio . github . tsch ie . k te cs . core . query . and Ċ import Ġio . github . tsch ie . k te cs . core . query . has Ċ import Ġio . github . tsch ie . k te cs . core . world . World Ċ import Ġio . github . tsch ie . k te cs . gl . components .* Ċ import Ġio . github . tsch ie . k te cs . gl . math .* Ċ import Ġorg . kh ronos . webgl . Float 3 2 Array Ċ import Ġorg . kh ronos . webgl . Web GL Buffer Ċ import Ġorg . kh ronos . webgl . Web GL Program Ċ import Ġorg . kh ronos . webgl . Web GL Rendering Context Ċ Ċ type alias ĠAttribute Ġ= ĠMap . Entry < String , ĠArray < Array < Float >>> Ċ Ċ /** Ċ Ġ* ĠA Ġrenderer Ġfor Ġkeeping Ġtrack Ġof Ġobjects Ġrelated Ġto Ġa ĠWebGL Rendering Context . Ċ Ġ*/ Ċ class ĠWebGL Renderer ( val Ġgl : ĠWebGL Rendering Context ) Ġ{ ĊĠ Ġval Ġmaterial Programs Ġ= Ġmutable Map Of < Material , ĠWebGL Program ?> () ĊĠ Ġval Ġattribute Buffers Ġ= Ġmutable Map Of < Attribute , ĠWebGL Buffer ?> () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġgl . enable ( Web GL Rendering Context . DEPTH _ TEST ) ĊĠ Ġ} Ċ } Ċ Ċ // ĠTODO : Ġmove Ġinside ĠWebGL Renderer Ġwhen Ġmultiple Ġreceiv ers Ġare Ġsupported Ċ /** Ċ Ġ* ĠR enders Ġall Ġrender able Ġentities Ġ( having Ġtransform , Ġmesh , Ġand Ġmaterial Ġcomponents ) Ġusing Ġevery Ġcamera Ġentity Ġ( having Ġtransform Ġand Ġcamera Ġcomponents ) Ġusing Ġthe Ġspecified ĠWebGL Ġrenderer . Ċ Ġ* Ċ Ġ* Ġ@ receiver Ġworld Ġto Ġquery Ġentities Ġon Ġfor Ġrendering Ċ Ġ* Ġ@ param Ġweb GL Renderer ĠWebGL ĠRenderer Ġwith Ġthe ĠWebGL Ġcontext Ġto Ġuse Ġfor Ġrendering Ċ Ġ*/ Ċ fun ĠWorld . render ( web GL Renderer : ĠWebGL Renderer ) Ġ{ ĊĠ Ġ// Ġclear Ġcanvas ĊĠ Ġweb GL Renderer . gl . viewport ( 0 , Ġ 0 , Ġweb GL Renderer . gl . canvas . width , Ġweb GL Renderer . gl . canvas . height ) ĊĠ Ġweb GL Renderer . gl . clear Color ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĠ Ġweb GL Renderer . gl . clear ( Web GL Rendering Context . COLOR _ BUFFER _ BIT ) ĊĊĠ Ġ// Ġdraw Ġentities Ġwith Ġeach Ġcamera ĊĠ Ġquery ( has < Camera >() Ġand Ġhas < Transform > ()). forEach Ġ{ Ġcamera Entity Ġ-> ĊĠĠĠ Ġval Ġcamera Transform Ġ= Ġcamera Entity . transform !! ĊĠĠĠ Ġval Ġcamera Ġ= Ġcamera Entity . camera !! ĊĊĠĠĠ Ġval Ġcamera Matrix Ġ= Ġcamera Transform . to Matrix () ĊĊĠĠĠ Ġval Ġprojection Matrix Ġ= Ġcamera . projection ĊĠĠĠ Ġval Ġview Matrix Ġ= Ġcamera Matrix . inverse () ĊĠĠĠ Ġval Ġview Projection Matrix Ġ= Ġprojection Matrix Ġ* Ġview Matrix ĊĊĠĠĠ Ġquery ( has < Transform >() Ġand Ġhas < Mesh >() Ġand Ġhas < Material > ()). forEach Ġ{ Ġentity Ġ-> ĊĠĠĠĠĠ Ġval Ġmaterial Ġ= Ġentity . material !! ĊĠĠĠĠĠ Ġval Ġmesh Ġ= Ġentity . mesh !! ĊĠĠĠĠĠ Ġval Ġtransform Ġ= Ġentity . transform !! ĊĊĠĠĠĠĠ Ġ// Ġuse Ġmaterial Ġprogram ĊĠĠĠĠĠ Ġval Ġprogram Ġ= Ġweb GL Renderer . material Programs . get Or Put ( material ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvert Shader Ġ= Ġweb GL Renderer . gl . create Shader ( Web GL Rendering Context . VERTEX _ SHADER ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . shader Source ( vert Shader , Ġmaterial . vertex Shader Source ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . compile Shader ( vert Shader ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfrag Shader Ġ= Ġweb GL Renderer . gl . create Shader ( Web GL Rendering Context . FRAGMENT _ SHADER ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . shader Source ( frag Shader , Ġmaterial . fragment Shader Source ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . compile Shader ( frag Shader ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= Ġweb GL Renderer . gl . create Program () ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . attach Shader ( program , Ġvert Shader ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . attach Shader ( program , Ġfrag Shader ) ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . link Program ( program ) ĊĊĠĠĠĠĠĠĠ Ġprogram ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġweb GL Renderer . gl . use Program ( program ) ĊĊĠĠĠĠĠ Ġ// Ġupdate Ġtransform Ġuniform ĊĠĠĠĠĠ Ġval Ġtransformation Matrix Ġ= Ġtransform . to Matrix () ĊĠĠĠĠĠ Ġval Ġposition Matrix Ġ= Ġview Projection Matrix Ġ* Ġtransformation Matrix ĊĊĠĠĠĠĠ Ġweb GL Renderer . gl . get UniformLocation ( program , Ġ" transform ") ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . uniform Matrix 4 fv ( it , Ġfalse , Ġtransformation Matrix . elements . flatten (). to Typed Array ()) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġweb GL Renderer . gl . get UniformLocation ( program , Ġ" position Matrix ") ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . uniform Matrix 4 fv ( it , Ġfalse , Ġposition Matrix . elements . flatten (). to Typed Array ()) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġdraw Ġvertices ĊĠĠĠĠĠ Ġmesh . attributes [" position "] ?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠ Ġmesh . attributes . forEach Ġ{ Ġattribute Ġ-> ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcheck Ġif Ġattribute Ġwas Ġchanged ĊĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġweb GL Renderer . attribute Buffers . get Or Put ( attribute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġweb GL Renderer . gl . create Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . bind Buffer ( Web GL Rendering Context . ARRAY _ BUFFER , Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . buffer Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebGL Rendering Context . ARRAY _ BUFFER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat 3 2 Array ( attribute . value . flatten (). to Typed Array ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWebGL Rendering Context . STATIC _ DRAW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġattr Location Ġ= Ġweb GL Renderer . gl . get Attrib Location ( program , Ġattribute . key ) ĊĠĠĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . enable VertexAttrib Array ( attr Location ) ĊĠĠĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . bind Buffer ( Web GL Rendering Context . ARRAY _ BUFFER , Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . vertex Attrib Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr Location , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute . value . get OrNull ( 0 )?. size Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWebGL Rendering Context . FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġweb GL Renderer . gl . draw Arrays ( Web GL Rendering Context . TRI ANG LES , Ġ 0 , Ġposition . size ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } ĊĊ Ċ fun ĠTransform . to Matrix () Ġ: ĠMat 4 f Ġ{ ĊĠ Ġreturn ĠMat 4 f (( ĊĠĠĠ ĠMat 4 . from Rotation Translation Scale ( ĊĠĠĠĠĠ ĠMat 4 . create () Ġas ĠFloat 3 2 Array , ĊĠĠĠĠĠ ĠQu at . from Euler ( ĊĠĠĠĠĠĠĠ ĠQu at . create () Ġas ĠFloat 3 2 Array , ĊĠĠĠĠĠĠĠ Ġrotation . x , ĊĠĠĠĠĠĠĠ Ġrotation . y , ĊĠĠĠĠĠĠĠ Ġrotation . z ĊĠĠĠĠĠ Ġ) Ġas ĠFloat 3 2 Array , ĊĠĠĠĠĠ Ġposition . toArray (), ĊĠĠĠĠĠ Ġscale . toArray () ĊĠĠĠ Ġ) Ġas ĠFloat 3 2 Array ). toArray ()) Ċ } Ċ