package Ġcom . rsp si . ext Ċ Ċ import Ġcom . badlogic . gdx . graphics .* Ċ import Ġcom . badlogic . gdx . graphics . g 2 d . Texture Region Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . Model Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . Model Batch Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . Model Cache Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . Render able Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . model . Mesh Part Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . model . Node Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . utils . Mesh Builder Ċ import Ġcom . badlogic . gdx . graphics . g 3 d . utils . Model Builder Ċ import Ġcom . badlogic . gdx . math . Matrix 4 Ċ import Ġcom . badlogic . gdx . math . Vector 3 Ċ import Ġcom . badlogic . gdx . math . collision . BoundingBox Ċ import Ġcom . badlogic . gdx . utils . G dx RuntimeException Ċ import Ġkotlin . contracts . Experimental Contracts ĊĊ Ċ fun Ġempty Texture Region (): ĠTexture Region Ġ{ ĊĠĠĠ Ġval Ġpix map Ġ= ĠP ix map ( 1 , Ġ 1 , ĠP ix map . Format . RGBA 8 8 8 8 ) ĊĠĠĠ Ġpix map . setColor ( Immutable Color . WHITE ) ĊĠĠĠ Ġpix map . draw Pixel ( 0 , Ġ 0 ) ĊĠĠĠ Ġval Ġtexture Ġ= ĠTexture ( pix map ) Ġ// remember Ġto Ġdispose Ġof Ġlater ĊĊĠĠĠ Ġpix map . dispose () ĊĠĠĠ Ġreturn ĠTexture Region ( texture , Ġ 0 , Ġ 0 , Ġ 1 , Ġ 1 ) Ċ } Ċ Ċ fun ĠCamera . center ( boundary : ĠBounding Box , Ġoffset : ĠImmutable Vector 3 Ġ= ĠImmutable Vector 3 . ZERO Ġ): ĠImmutable Vector 3 Ġ= Ġ( boundary . get Center Immutable () Ġ+ Ġthis . position ) Ċ Ċ inline Ġfun Ġ< B Ġ: ĠModel Batch > ĠB . use ( camera : ĠCamera ? Ġ= Ġnull , Ġaction : Ġ( B ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġbegin ( camera ) ĊĠĠĠ Ġaction ( this ) ĊĠĠĠ Ġend () Ċ } Ċ Ċ inline Ġfun Ġ< B Ġ: ĠModel Cache > ĠB . use ( camera : ĠCamera ? Ġ= Ġnull , Ġaction : ĠB . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġbegin ( camera ) ĊĠĠĠ Ġaction ( this ) ĊĠĠĠ Ġend () Ċ } Ċ Ċ inline Ġfun Ġ< B : ĠModel Builder > ĠB . use ( with Root : ĠBoolean Ġ= Ġtrue , Ġaction : Ġ( B ) Ġ-> ĠUnit ): ĠModel Ġ{ ĊĠĠĠ Ġbegin () ĊĠĠĠ Ġif ( with Root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode (" root ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġaction ( this ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġend () Ċ } Ċ Ċ inline Ġfun ĠModel Builder . node ( name : ĠString ? Ġ= Ġnull , Ġaction : Ġ( Node ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġnode Ġ= Ġnode () ĊĠĠĠ Ġnode . id Ġ= Ġname ĊĠĠĠ Ġaction ( node ) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠIterable < T >. forEach Apply ( block : ĠT . () Ġ-> ĠUnit ): ĠUnit Ġ{ ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġelement . apply ( block ) Ċ Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠT . apply If ( condition : ĠBoolean , Ġblock : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif ( condition ) Ġthis . apply ( block ) Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠT . apply If ( condition : ĠT . () Ġ-> ĠBoolean , Ġblock : ĠT . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġif ( condition . invoke ( this )) Ġthis . apply ( block ) Ċ } ĊĊ Ċ inline Ġfun Ġ< T > ĠT . not Equal ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġ== Ġnull Ġ|| Ġ( other . let { Ġit Ġ!= Ġthis Ġ}) Ċ Ċ inline Ġfun Ġ< T > ĠIterable < T >. sum By ( selector : Ġ( T ) Ġ-> ĠFloat ): ĠFloat Ġ{ ĊĠĠĠ Ġvar Ġsum : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġfor Ġ( element Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsum Ġ+= Ġselector ( element ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsum Ċ } Ċ Ċ fun ĠP ix map . setColor ( color : ĠImmutable Color ) Ġ{ ĊĠĠĠ Ġthis . setColor ( color . to Mutable ()) Ċ } Ċ Ċ fun ĠBounding Box . getMin Immutable (): ĠImmutable Vector 3 Ġ= Ġmin . to Immutable () Ċ fun ĠBounding Box . getMax Immutable (): ĠImmutable Vector 3 Ġ= Ġmax . to Immutable () Ċ fun ĠBounding Box . get Center Immutable (): ĠImmutable Vector 3 Ġ= Ġthis . get Center ( Vector 3 ()). to Immutable () Ċ fun ĠBounding Box . get Dimensions Immutable (): ĠImmutable Vector 3 Ġ= ĠImmutable Vector 3 ( width , Ġheight , Ġdepth ) Ċ fun ĠBounding Box . get Half Ext ents (): ĠImmutable Vector 3 Ġ= Ġ Ġ( get Dimensions Immutable () Ġ/ Ġ 2 f ) Ċ Ċ fun Ġmerge Mes hes ( meshes : ĠMutable List < Mesh >, Ġtransformations : ĠMutable List < Matrix 4 ?> ): ĠMesh ? Ġ{ ĊĠĠĠ Ġif Ġ( meshes . size Ġ== Ġ 0 ) Ġreturn Ġnull ĊĠĠĠ Ġvar Ġvertex Array Total Size Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġindex Array Total Size Ġ= Ġ 0 ĊĠĠĠ Ġval Ġva Ġ= Ġmeshes [ 0 ]. vertex Attributes ĊĠĠĠ Ġval Ġva A Ġ= ĠInt Array ( va . size ()) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġva . size ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġva A [ i ] Ġ= Ġva [ i ]. usage ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmeshes . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= Ġmeshes [ i ] ĊĠĠĠĠĠĠĠ Ġif Ġ( mesh . vertex Attributes . size () Ġ!= Ġva . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Mesh ( mesh , Ġtrue , Ġfalse , Ġva A )?. let Ġ{ Ġ Ġmeshes [ i ] Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvertex Array Total Size Ġ+= Ġmesh . num Vertices Ġ* Ġmesh . vertex Size Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġindex Array Total Size Ġ+= Ġmesh . num Indices ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġvertices Ġ= ĠFloat Array ( vertex Array Total Size ) ĊĠĠĠ Ġval Ġindices Ġ= ĠShort Array ( index Array Total Size ) ĊĠĠĠ Ġval Ġindices New Ġ= ĠInt Array ( index Array Total Size ) ĊĠĠĠ Ġvar Ġindex Offset Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġvertex Offset Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġvertex Size Offset Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġvertex Size Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmeshes . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= Ġmeshes [ i ] ĊĠĠĠĠĠĠĠ Ġval Ġnum Indices Ġ= Ġmesh . num Indices ĊĠĠĠĠĠĠĠ Ġval Ġnum Vertices Ġ= Ġmesh . num Vertices ĊĠĠĠĠĠĠĠ Ġvertex Size Ġ= Ġmesh . vertex Size Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġbase Size Ġ= Ġnum Vertices Ġ* Ġvertex Size ĊĠĠĠĠĠĠĠ Ġval Ġpos Attr Ġ= Ġmesh . get Vertex Attribute ( Vertex Attributes . Usage . Position ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġpos Attr . offset Ġ/ Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġnum Components Ġ= Ġpos Attr . num Components ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// uz up eln ian ie Ġtab lic y Ġin de ks ow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmesh . get Indices ( indices , Ġindex Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġindex Offset Ġuntil Ġindex Offset Ġ+ Ġnum Indices ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices New [ c ] Ġ= Ġindices [ c ] Ġ+ Ġvertex Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Offset Ġ+= Ġnum Indices ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmesh . get Vertices ( 0 , Ġbase Size , Ġvertices , Ġvertex Size Offset ) ĊĠĠĠĠĠĠĠ ĠMesh . transform ( transform ations [ i ], Ġvertices , Ġvertex Size , Ġoffset , Ġnum Components , Ġvertex Offset , Ġnum Vertices ) ĊĠĠĠĠĠĠĠ Ġvertex Offset Ġ+= Ġnum Vertices ĊĠĠĠĠĠĠĠ Ġvertex Size Offset Ġ+= Ġbase Size ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult Ġ= ĠMesh ( true , Ġvertex Offset , Ġindices . size , Ġmeshes [ 0 ]. vertex Attributes ) ĊĠĠĠ Ġresult . set Vertices ( vertices ) ĊĠĠĠ Ġresult . set Indices ( indices New . map Ġ{ Ġit . to Short () Ġ}. to Short Array ()) ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġcopy Mesh ( mesh To Copy : ĠMesh , Ġis Static : ĠBoolean , Ġremove Duplicates : ĠBoolean , Ġusage : ĠInt Array ?): ĠMesh ? Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġmove Ġthis Ġto Ġa Ġcopy Ġconstructor ? ĊĠĠĠ Ġ// ĠTODO Ġduplicate Ġthe Ġbuffers Ġwithout Ġdouble Ġcopying Ġthe Ġdata Ġif Ġpossible . ĊĠĠĠ Ġ// ĠTODO Ġperhaps Ġmove Ġthis Ġcode Ġto ĠJNI Ġif Ġit Ġturns Ġout Ġbeing Ġtoo Ġslow . ĊĠĠĠ Ġval Ġvertex Size Ġ= Ġmesh To Copy . vertex Size Ġ/ Ġ 4 ĊĠĠĠ Ġvar Ġnum Vertices Ġ= Ġmesh To Copy . num Vertices ĊĠĠĠ Ġvar Ġvertices Ġ= ĠFloat Array ( num Vertices Ġ* Ġvertex Size ) ĊĠĠĠ Ġmesh To Copy . get Vertices ( 0 , Ġvertices . size , Ġvertices ) ĊĠĠĠ Ġvar Ġchecks : ĠShort Array ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġattrs : ĠArray < Vertex Attribute ?> ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġnew Vertex Size Ġ= Ġ 0 ĊĠĠĠ Ġif Ġ( usage Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġ` as ` Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġusage . indices ) Ġif Ġ( mesh To Copy . get Vertex Attribute ( usage [ i ]) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġmesh To Copy . get Vertex Attribute ( usage [ i ]). num Components ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` as ` ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs Ġ= ĠarrayOf Null s (` as `) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks Ġ= ĠShort Array ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġai Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġusage . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġmesh To Copy . get Vertex Attribute ( usage [ i ]) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġa . num Components ) Ġchecks [++ idx ] Ġ= Ġ( a . offset Ġ/ Ġ 4 Ġ+ Ġj ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs [++ ai ] Ġ= ĠVertex Attribute ( a . usage , Ġa . num Components , Ġa . alias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Vertex Size Ġ+= Ġa . num Components ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( checks Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchecks Ġ= ĠShort Array ( vertex Size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvertex Size ) Ġchecks [ i ] Ġ= Ġi . to Short () ĊĠĠĠĠĠĠĠ Ġnew Vertex Size Ġ= Ġvertex Size ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnum Indices Ġ= Ġmesh To Copy . num Indices ĊĠĠĠ Ġvar Ġindices : ĠShort Array ? Ġ= Ġnull ĊĠĠĠ Ġif Ġ( num Indices Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġindices Ġ= ĠShort Array ( num Indices ) ĊĠĠĠĠĠĠĠ Ġmesh To Copy . get Indices ( indices ) ĊĠĠĠĠĠĠĠ Ġif Ġ( remove Duplicates Ġ|| Ġnew Vertex Size Ġ!= Ġvertex Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠFloat Array ( vertices . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx 1 Ġ= Ġindices [ i ] Ġ* Ġvertex Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Index : ĠShort Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Duplicates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj : ĠShort Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( j Ġ< Ġsize Ġ&& Ġnew Index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx 2 Ġ= Ġj Ġ* Ġnew Vertex Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( k Ġ< Ġchecks . size Ġ&& Ġfound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp [ idx 2 Ġ+ Ġk ] Ġ!= Ġvertices [ idx 1 Ġ+ Ġchecks [ k ]]) Ġfound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found ) Ġnew Index Ġ= Ġj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Index Ġ> Ġ 0 ) Ġindices [ i ] Ġ= Ġnew Index Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġsize Ġ* Ġnew Vertex Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġchecks . indices ) Ġtmp [ idx Ġ+ Ġj ] Ġ= Ġvertices [ idx 1 Ġ+ Ġchecks [ j ]] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindices [ i ] Ġ= Ġsize . to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices Ġ= Ġtmp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Vertices Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult : ĠMesh Ġ= Ġif Ġ( attrs Ġ== Ġnull ) ĠMesh ( is Static , Ġnum Vertices , Ġindices ?. size Ġ?: Ġ 0 , Ġmesh To Copy . vertex Attributes ) Ġelse ĠMesh ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Static , Ġnum Vertices , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices ?. size Ġ?: Ġ 0 , Ġ* attrs ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġresult . set Vertices ( vertices , Ġ 0 , Ġnum Vertices Ġ* Ġnew Vertex Size ) ĊĠĠĠ Ġresult . set Indices ( indices ) ĊĠĠĠ Ġreturn Ġresult Ċ } ĊĊ Ċ fun ĠMatrix 4 . is Identity () Ġ= Ġthis Ġ== ĠMatrix 4 (). id t () ĊĊĊ