/* Ċ Ġ* ĠDeep ĠV ent ure ĠK 3 D Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ-*- Ġf rik adel ki - cor ps Ġ-*- Ċ Ġ* ĠCreated Ġby Ġein Ġon Ġ 2 0 1 8 / 2 / 1 7 Ċ Ġ*/ Ċ Ċ package Ġorg . f rik adel ki . deep v . demos . pd 0 1 Ċ Ċ import Ġorg . f rik adel ki . deep v . common .* Ċ import Ġorg . f rik adel ki . deep v . common . mesh . Ab c Vertex Attributes B aked Ċ import Ġorg . f rik adel ki . deep v . pipeline . Cull Mode Ċ import Ġorg . f rik adel ki . deep v . pipeline . Pipeline Ċ import Ġorg . f rik adel ki . deep v . pipeline . Triangle Wind ing Ċ import Ġorg . f rik adel ki . deep v . pipeline . math . Vector 4 Ċ import Ġorg . f rik adel ki . deep v . pipeline . program . Program Ċ import Ġorg . f rik adel ki . deep v . pipeline . program . Program Source Ċ import Ġorg . f rik adel ki . deep v . pipeline . program . Uniform Handle Ċ import Ġorg . f rik adel ki . deep v . pipeline . program . Vertex Attribute Handle Ċ import Ġjava . nio . Short Buffer Ċ Ċ class ĠAbc Morph ing Mesh ( zero Frame Attributes : ĠAbc Vertex Attributes B aked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Buffer : ĠShort Buffer ) Ġ{ ĊĠĠĠ Ġclass ĠFrame ( val Ġvertex Attributes : ĠAbc Vertex Attributes B aked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Time Millis : ĠLong ) ĊĊĠĠĠ Ġclass ĠStep ( val Ġfirst : ĠFrame , Ġval Ġsecond : ĠFrame ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġtime Hit ( time Millis : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst . key Time Millis Ġ<= Ġtime Millis Ġ&& Ġtime Millis Ġ<= Ġsecond . key Time Millis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġframes Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFrame ( zero Frame Attributes , Ġ 0 )) ĊĊĠĠĠ Ġvar Ġlength Millis : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġadd Frame ( attributes : ĠAbc Vertex Attributes B aked , Ġanimate In Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( animate In Millis Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlength Millis Ġ+= Ġanimate In Millis ĊĠĠĠĠĠĠĠ Ġframes . add ( Frame ( attributes , Ġlength Millis )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind ( millis : ĠLong ): ĠStep Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġframes . iterator () ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Ġ= Ġit . next () ĊĠĠĠĠĠĠĠ Ġvar Ġnext Ġ= Ġprevious ĊĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( millis Ġ<= Ġnext . key Time Millis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠStep ( previous , Ġnext ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAbc Morph ing Mesh Interpolator ( private Ġval Ġmesh : ĠAbc Morph ing Mesh ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġtime Millis : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġcurrent Frames Ġ= Ġmesh . find ( time Millis ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġinterpolated Time : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġupdate ( delta Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Millis Ġ+= Ġdelta Millis ĊĠĠĠĠĠĠĠ Ġtime Millis Ġ% = Ġmesh . length Millis ĊĠĠĠĠĠĠĠ Ġif Ġ(! current Frames . time Hit ( time Millis )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frames Ġ= Ġmesh . find ( time Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! current Frames . time Hit ( time Millis )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Broken Ġmorph ing Ġmesh .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Interpol ated Time () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Interpol ated Time () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum erator Ġ= Ġ( time Millis Ġ- Ġcurrent Frames . first . key Time Millis ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdenominator Ġ= Ġ( current Frames . second . key Time Millis Ġ- Ġcurrent Frames . first . key Time Millis ). toFloat () ĊĠĠĠĠĠĠĠ Ġinterpolated Time Ġ= Ġnum erator Ġ/ Ġdenominator ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAbc Morph ing Mesh L ump ( private Ġval Ġprogram : ĠAbc Morph ing Mesh Program , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmesh : ĠAbc Morph ing Mesh , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcolor Diffuse : ĠVector 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcolor Specular : ĠVector 4 ) ĊĠĠĠ Ġ: ĠL ump Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmorph ing Interpolator Ġ= ĠAbc Morph ing Mesh Interpolator ( mesh ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( pawn : ĠP awn , Ġscene : ĠScene , Ġcontext : ĠScene . Draw Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram . enable () ĊĠĠĠĠĠĠĠ Ġprogram . set Camera ( scene . camera ) ĊĠĠĠĠĠĠĠ Ġprogram . set Lights ( scene . lights ) ĊĊĠĠĠĠĠĠĠ Ġprogram . setModel Transform ( pawn . transform ) ĊĠĠĠĠĠĠĠ Ġprogram . setModel Color ( color Diffuse , Ġcolor Specular ) ĊĊĠĠĠĠĠĠĠ Ġprogram . set Morph ing Mesh ( morph ing Interpolator ) ĊĠĠĠĠĠĠĠ Ġprogram . draw Triangles ( mesh . index Buffer ) ĊĊĠĠĠĠĠĠĠ Ġprogram . disable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate Animations ( delta Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmorph ing Interpolator . update ( delta Millis ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAbc Morph ing Mesh Program ( val Ġpipeline : ĠPipeline ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlights Snippet Ġ= ĠL ights Snippet ( 2 ) ĊĊĠĠĠ Ġprivate Ġval Ġprogram Source Ġ= ĠProgram Source ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecision Ġmedi ump Ġfloat ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġview Projection Matrix ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġmodel Matrix ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġmat 4 Ġnormals Matrix ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġfloat Ġv Interpol ated Time ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġv Position A ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġv Normal A ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġv Position B ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Ġvec 3 Ġv Normal B ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 3 Ġvar Position ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 3 Ġvar Normal ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 3 Ġv Position Ġ= Ġmix ( v Position A , Ġv Position B , Ġv Interpol ated Time ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 3 Ġv Normal Ġ= Ġmix ( v Normal A , Ġv Normal B , Ġv Interpol ated Time ); ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvec 4 Ġworld Position Ġ= Ġmodel Matrix Ġ* Ġvec 4 ( v Position , Ġ 1 . 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Position Ġ= Ġvec 3 ( world Position ) Ġ/ Ġworld Position . w ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Normal Ġ= Ġnormalize ( normals Matrix Ġ* Ġvec 4 ( v Normal , Ġ 0 . 0 )). xyz ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Position Ġ= Ġview Projection Matrix Ġ* Ġworld Position ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecision Ġmedi ump Ġfloat ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ lights Snippet . fragment Source } ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġvec 4 Ġcamera Eye Position ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġvec 4 Ġmodel Color Diffuse ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuniform Ġvec 4 Ġmodel Color Specular ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 3 Ġvar Position ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvarying Ġvec 3 Ġvar Normal ; ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvoid Ġmain () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ights Intensity Ġlight Ġ= Ġlights Intensity ( var Position , Ġvar Normal , Ġcamera Eye Position . xyz , Ġmodel Color Specular . w ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl _ Frag Color Ġ= Ġ( light . ambient Ġ+ Ġlight . diffuse ) Ġ* Ġmodel Color Diffuse Ġ+ Ġlight . specular Ġ* Ġmodel Color Specular ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĊĠĠĠ Ġprivate Ġval Ġprogram : ĠProgram Ġ= Ġpipeline . load Program ( program Source ) ĊĊĠĠĠ Ġprivate Ġval Ġview Projection Matrix : ĠUniform Handle Ġ= Ġprogram . uniform (" view Projection Matrix ") ĊĠĠĠ Ġprivate Ġval Ġcamera Eye Position : ĠUniform Handle Ġ= Ġprogram . uniform (" camera Eye Position ") ĊĊĠĠĠ Ġprivate Ġval Ġlights Binding Ġ= Ġlights Snippet . make Binding ( program ) ĊĊĠĠĠ Ġprivate Ġval Ġmodel Matrix : ĠUniform Handle Ġ= Ġprogram . uniform (" model Matrix ") ĊĠĠĠ Ġprivate Ġval Ġnormals Matrix : ĠUniform Handle Ġ= Ġprogram . uniform (" normals Matrix ") ĊĠĠĠ Ġprivate Ġval Ġmodel Color Diffuse : ĠUniform Handle Ġ= Ġprogram . uniform (" model Color Diffuse ") ĊĠĠĠ Ġprivate Ġval Ġmodel Color Specular : ĠUniform Handle Ġ= Ġprogram . uniform (" model Color Specular ") ĊĊĠĠĠ Ġprivate Ġval Ġvertex Interpol ated Time : ĠUniform Handle Ġ= Ġprogram . uniform (" v Interpol ated Time ") ĊĠĠĠ Ġprivate Ġval Ġvertex Position A : ĠVertex Attribute Handle Ġ= Ġprogram . vertex Attribute (" v Position A ") ĊĠĠĠ Ġprivate Ġval Ġvertex Normal A : ĠVertex Attribute Handle Ġ= Ġprogram . vertex Attribute (" v Normal A ") ĊĠĠĠ Ġprivate Ġval Ġvertex Position B : ĠVertex Attribute Handle Ġ= Ġprogram . vertex Attribute (" v Position B ") ĊĠĠĠ Ġprivate Ġval Ġvertex Normal B : ĠVertex Attribute Handle Ġ= Ġprogram . vertex Attribute (" v Normal B ") ĊĊĠĠĠ Ġfun Ġenable () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram . use () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Camera ( camera : ĠCamera ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Eye Position . set Vector ( camera . eye Position ) ĊĠĠĠĠĠĠĠ Ġview Projection Matrix . set Matrix ( camera . view Projection Matrix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Lights ( lights : ĠL ights ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlights Binding . set Lights ( lights ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Model Transform ( transform : ĠTransform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel Matrix . set Matrix ( transform . model Matrix ) ĊĠĠĠĠĠĠĠ Ġnormals Matrix . set Matrix ( transform . normals Matrix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Model Color ( color Diffuse : ĠVector 4 , Ġcolor Specular : ĠVector 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel Color Diffuse . set Vector ( color Diffuse ) ĊĠĠĠĠĠĠĠ Ġmodel Color Specular . set Vector ( color Specular ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Morph ing Mesh ( interpol ator : ĠAbc Morph ing Mesh Interpolator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvertex Interpol ated Time . set Float ( interpol ator . interpol ated Time ) ĊĊĠĠĠĠĠĠĠ Ġvertex Position A . enable () ĊĠĠĠĠĠĠĠ Ġvertex Normal A . enable () ĊĠĠĠĠĠĠĠ Ġinterpol ator . current Frames . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. vertex Attributes . bind ( vertex Position A , Ġvertex Normal A ) ĊĊĠĠĠĠĠĠĠ Ġvertex Position B . enable () ĊĠĠĠĠĠĠĠ Ġvertex Normal B . enable () ĊĠĠĠĠĠĠĠ Ġinterpol ator . current Frames . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. vertex Attributes . bind ( vertex Position B , Ġvertex Normal B ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw Triangles ( index Buffer : ĠShort Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpipeline . set Cull ing Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġpipeline . set Cull Face ( Cull Mode . BACK ) ĊĠĠĠĠĠĠĠ Ġpipeline . set Front Face ( Triangle Wind ing . COUNTER CLOCK WISE ) ĊĠĠĠĠĠĠĠ Ġprogram . draw Triangles ( index Buffer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable () Ġ{ ĊĠĠĠĠĠĠĠ Ġvertex Position A . disable () ĊĠĠĠĠĠĠĠ Ġvertex Normal A . disable () ĊĠĠĠĠĠĠĠ Ġvertex Position B . disable () ĊĠĠĠĠĠĠĠ Ġvertex Normal B . disable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogram . dispose () ĊĠĠĠ Ġ} Ċ }