package Ġorg . lwjgl b . engine . loaders . md 5 Ċ Ċ import Ġorg . j om l . Matrix 4 f Ċ import Ġorg . j om l . Vector 3 f Ċ import Ġorg . j om l . Vector 4 f Ċ import Ġorg . lwjgl b . engine . Utils Ċ import Ġorg . lwjgl b . engine . graph . Material Ċ import Ġorg . lwjgl b . engine . graph . Mesh Ċ import Ġorg . lwjgl b . engine . graph . Texture Ċ import Ġorg . lwjgl b . engine . graph . anim . Anim Game Item Ċ import Ġorg . lwjgl b . engine . graph . anim . Anim Vertex Ċ import Ġorg . lwjgl b . engine . graph . anim . Animated Frame Ċ import Ġjava . util .* Ċ Ċ object ĠMD 5 Loader Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġan ĠAnim Game Item Ġinstance Ġbased Ġon Ġa ĠMD 5 ĠModel Ġan ĠMD 5 ĠAnimation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmd 5 Model ĠThe ĠMD 5 ĠModel ĊĠĠĠĠ Ġ* Ġ@ param Ġanim Model ĠThe ĠMD 5 ĠAnimation ĊĠĠĠĠ Ġ* Ġ@ param Ġdefault Colour ĠDefault Ġcolour Ġto Ġuse Ġif Ġthere Ġare Ġno Ġtextures ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ* Ġ@ throws ĠException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġprocess ( md 5 Model : ĠMD 5 Model , Ġanim Model : ĠMD 5 Anim Model , Ġdefault Colour : ĠVector 4 f /* , Ġmaterial : ĠMaterial ? */ ): ĠAnim Game Item Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinv Joint Mat rices Ġ= Ġcalc In Joint Mat rices ( md 5 Model ) ĊĠĠĠĠĠĠĠ Ġval Ġanimated Frames Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Animation Frames ( md 5 Model , Ġanim Model , Ġinv Joint Mat rices ) ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < Mesh > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( md 5 Mesh Ġin Ġmd 5 Model . meshes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Ġ= Ġcreate Texture ( md 5 Mesh , Ġdefault Colour ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= Ġgenerate Mesh ( md 5 Model , Ġmd 5 Mesh , Ġmaterial ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( mesh ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAnim Game Item ( list , Ġanimated Frames , Ġinv Joint Mat rices ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc In Joint Mat rices ( md 5 Model : ĠMD 5 Model ): ĠList < Matrix 4 f > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Matrix 4 f > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġjoint s Ġ= Ġmd 5 Model . joint Info . joints ĊĠĠĠĠĠĠĠ Ġfor Ġ( joint Ġin Ġjoint s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġtranslation Ġmatrix Ġusing Ġjoint Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculates Ġrotation Ġmatrix Ġusing Ġjoint Ġorientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġtransformation Ġmatrix Ġbu Ġmultiply ing Ġtranslation Ġmatrix Ġby Ġrotation Ġmatrix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInstead Ġof Ġmultiply ing Ġwe Ġcan Ġapply Ġrotation Ġwhich Ġis Ġoptimized Ġinternally ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠMatrix 4 f () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. translate ( joint . position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotate ( joint . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. invert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( mat ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Mesh ( md 5 Model : ĠMD 5 Model , Ġmd 5 Mesh : ĠMD 5 Mesh , Ġmaterial : ĠMaterial ): ĠMesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertices : ĠMutable List < Anim Vertex > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġindices : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġmd 5 Vertices Ġ= Ġmd 5 Mesh . vertices ĊĠĠĠĠĠĠĠ Ġval Ġweights Ġ= Ġmd 5 Mesh . weights ĊĠĠĠĠĠĠĠ Ġval Ġjoint s Ġ= Ġmd 5 Model . joint Info . joints ĊĠĠĠĠĠĠĠ Ġfor Ġ( md 5 Vertex Ġin Ġmd 5 Vertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Weight Ġ= Ġmd 5 Vertex . start Weight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Weights Ġ= Ġmd 5 Vertex . weight Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Ġ= ĠAnim Vertex ( num Weights , ĠVector 3 f (), Ġmd 5 Vertex . text Coordinates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertices . add ( vertex ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . position Ġ= ĠVector 3 f () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . text Coordinates Ġ= Ġmd 5 Vertex . text Coordinates Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . joint Indices Ġ= ĠInt Array ( num Weights ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( vertex . joint Indices , Ġ- 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . weights Ġ= ĠFloat Array ( num Weights ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . fill ( vertex . weights , Ġ- 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstart Weight Ġuntil Ġstart Weight Ġ+ Ġnum Weights ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġweights [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjoint Ġ= Ġjoint s [ weight . joint Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotated Pos Ġ= ĠVector 3 f ( weight . position ). rotate ( joint . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġac um Pos Ġ= ĠVector 3 f ( joint . position ). add ( rot ated Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġac um Pos . mul ( weight . bias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . position . add ( ac um Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . joint Indices [ i Ġ- Ġstart Weight ] Ġ= Ġweight . joint Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex . weights [ i Ġ- Ġstart Weight ] Ġ= Ġweight . bias ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( tri Ġin Ġmd 5 Mesh . triangles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices . add ( tri . vertex 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices . add ( tri . vertex 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices . add ( tri . vertex 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormal s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġvertices [ tri . vertex 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġvertices [ tri . vertex 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġvertices [ tri . vertex 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos 0 Ġ= Ġv 0 . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos 1 Ġ= Ġv 1 . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos 2 Ġ= Ġv 2 . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= ĠVector 3 f ( pos 2 ). sub ( pos 0 ). cross ( Vector 3 f ( pos 1 ). sub ( pos 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 0 . normal . add ( normal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 . normal . add ( normal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 . normal . add ( normal ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOnce Ġthe Ġcontributions Ġhave Ġbeen Ġadded , Ġnormalize Ġthe Ġresult ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . normal . normalize () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Mesh ( vertices , Ġindices , Ġmaterial ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Animation Frames ( ĊĠĠĠĠĠĠĠ Ġmd 5 Model : ĠMD 5 Model , ĊĠĠĠĠĠĠĠ Ġanim Model : ĠMD 5 Anim Model , ĊĠĠĠĠĠĠĠ Ġinv Joint Mat rices : ĠList < Matrix 4 f > ĊĠĠĠ Ġ): ĠList < Animated Frame > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanimated Frames : ĠMutable List < Animated Frame > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġframes Ġ= Ġanim Model . frames ĊĠĠĠĠĠĠĠ Ġfor Ġ( frame Ġin Ġframes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġprocess AnimationFrame ( md 5 Model , Ġanim Model , Ġframe , Ġinv Joint Mat rices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimated Frames . add ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġanimated Frames ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess AnimationFrame ( ĊĠĠĠĠĠĠĠ Ġmd 5 Model : ĠMD 5 Model , ĊĠĠĠĠĠĠĠ Ġanim Model : ĠMD 5 Anim Model , ĊĠĠĠĠĠĠĠ Ġframe : ĠMD 5 Frame , ĊĠĠĠĠĠĠĠ Ġinv Joint Mat rices : ĠList < Matrix 4 f >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠAnimated Frame ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠAnimated Frame () ĊĠĠĠĠĠĠĠ Ġval Ġbase Frame Ġ= Ġanim Model . base Frame ĊĠĠĠĠĠĠĠ Ġval Ġhierarchy List Ġ= Ġanim Model . hierarchy . hierarchy DataList ĊĠĠĠĠĠĠĠ Ġval Ġjoint s Ġ= Ġmd 5 Model . joint Info . joints ĊĠĠĠĠĠĠĠ Ġval Ġnum Joint s Ġ= Ġjoint s . size ĊĠĠĠĠĠĠĠ Ġval Ġframe Data Ġ= Ġframe . frame Data ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Joint s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjoint Ġ= Ġjoint s [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Frame Data Ġ= Ġbase Frame . frame DataList [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġbase Frame Data . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġorientation Ġ= Ġbase Frame Data . orientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflags Ġ= Ġhierarchy List ! ![ i ]. flags ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠstartIndex Ġ= Ġhierarchy List [ i ]. startIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 1 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition !!. x Ġ= Ġframe Data [ startIndex ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 2 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition !!. y Ġ= Ġframe Data [ startIndex ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 4 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition !!. z Ġ= Ġframe Data [ startIndex ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 8 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation !!. x Ġ= Ġframe Data [ startIndex ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 1 6 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation !!. y Ġ= Ġframe Data [ startIndex ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags Ġand Ġ 3 2 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation !!. z Ġ= Ġframe Data [ startIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate ĠQuaternion 's Ġw Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠMD 5 Utils . calculate Quaternion ( orientation !!. x , Ġorientation . y , Ġorientation . z ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġtranslation Ġand Ġrotation Ġmatrices Ġfor Ġthis Ġjoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslate Mat Ġ= ĠMatrix 4 f (). translate ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Mat Ġ= ĠMatrix 4 f (). rotate ( orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjoint Mat Ġ= Ġtranslate Mat . mul ( rotation Mat ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJoint Ġposition Ġis Ġrelative Ġto Ġjoint 's Ġparent Ġindex Ġposition . ĠUse Ġparent Ġmatrices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġtransform Ġit Ġto Ġmodel Ġspace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( joint . parent Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Matrix Ġ= Ġresult . local Joint Mat rices [ joint . parent Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoint Mat Ġ= ĠMatrix 4 f ( parent Matrix ). mul ( joint Mat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . set Matrix ( i , Ġjoint Mat , Ġinv Joint Mat rices [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Mesh ( ĊĠĠĠĠĠĠĠ Ġvertices : ĠList < Anim Vertex >, ĊĠĠĠĠĠĠĠ Ġindices : ĠList < Int >, ĊĠĠĠĠĠĠĠ Ġmaterial : ĠMaterial ĊĠĠĠ Ġ): ĠMesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpositions : ĠMutable List < Float > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġtext Coords : ĠMutable List < Float > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġnormals : ĠMutable List < Float > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġjoint Indices : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġweights : ĠMutable List < Float > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( vertex Ġin Ġvertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . add ( vertex . position . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . add ( vertex . position . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions . add ( vertex . position . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Coords . add ( vertex . text Coordinates . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Coords . add ( vertex . text Coordinates . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormals . add ( vertex . normal . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormals . add ( vertex . normal . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormals . add ( vertex . normal . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Weights Ġ= Ġvertex . weights . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMesh . MAX _ WEIGHT S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġnum Weights ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoint Indices . add ( vertex . joint Indices [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweights . add ( vertex . weights [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoint Indices . add (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweights . add (- 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpositions Arr Ġ= ĠUtils . list ToArray ( positions ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Coordinates Arr Ġ= ĠUtils . list ToArray ( text Coords ) ĊĠĠĠĠĠĠĠ Ġval Ġnormals Arr Ġ= ĠUtils . list ToArray ( normals ) ĊĠĠĠĠĠĠĠ Ġval Ġindices Arr Ġ= ĠUtils . list Int ToArray ( indices ) ĊĠĠĠĠĠĠĠ Ġval Ġjoint Indices Arr Ġ= ĠUtils . list Int ToArray ( joint Indices ) ĊĠĠĠĠĠĠĠ Ġval Ġweights Arr Ġ= ĠUtils . list ToArray ( weights ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMesh ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Coordinates Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormals Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindices Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoint Indices Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweights Arr , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Texture ( ĊĠĠĠĠĠĠĠ Ġmd 5 Mesh : ĠMD 5 Mesh , ĊĠĠĠĠĠĠĠ Ġdefault Colour : ĠVector 4 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠMaterial ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtexture Path Ġ= Ġmd 5 Mesh . texture ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( texture Path Ġ!= Ġnull Ġ&& Ġtexture Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtexture Ġ= ĠTexture ( texture Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaterial Ġ= ĠMaterial ( texture ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġnormal ĠMaps ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġtexture Path . lastIndexOf (".") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbasePath Ġ= Ġtexture Path . substring ( 0 , Ġpos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġtexture Path . substring ( pos , Ġtexture Path . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Map FileName Ġ= ĠbasePath Ġ+ Ġ"_ local " Ġ+ Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Utils . exists Resource File ( normal Map FileName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Map Ġ= ĠTexture ( normal Map FileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial . normal Map Ġ= Ġnormal Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaterial ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial ( default Colour , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }