package Ġcom . le ha ine . little kt . graphics Ċ Ċ import Ġcom . le ha ine . little kt . util . data structure . Pool Ċ import Ġcom . le ha ine . little kt . util . fast ForEach Ċ import Ġcom . le ha ine . little kt . util . internal . um od Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Duration . Companion . milliseconds Ċ Ċ /** Ċ Ġ* ĠEnables Ġplayback Ġof Ġ[ Animation ] Ġclasses . Ċ Ġ* Ġ@ see Ġ[ Animation ] Ċ Ġ* Ġ@ param ĠKey Frame Type Ġthe Ġtype Ġof Ġkey Ġframe Ġthe Ġ[ Animation ] Ġclass Ġis Ġusing . Ċ Ġ* Ġ@ author ĠCol ton ĠDaily Ċ Ġ* Ġ@ date Ġ 1 2 / 2 9 / 2 0 2 1 Ċ Ġ*/ Ċ open Ġclass ĠAnimation Player < Key Frame Type > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġplaying Ġanimations . ĠSet Ġthis Ġby Ġusing Ġone Ġof Ġthe Ġ` play ` Ġmethods . ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ play ] ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ play Once ] ĊĠĠĠĠ Ġ* Ġ@ see Ġ[ play Loop ed ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcurrent Animation : ĠAnimation < Key Frame Type >? Ġget () Ġ= Ġcurrent Animation Instance ?. anim ĊĊĠĠĠ Ġprivate Ġval Ġcurrent Animation Instance : ĠAnimation Instance < Key Frame Type >? Ġget () Ġ= Ġstack . first OrNull () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtotal Ġframes Ġthe Ġ[ current Animation ] Ġhas . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtotal Frames : ĠInt Ġget () Ġ= Ġcurrent Animation ?. total Frames Ġ?: Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtotal Ġamount Ġof Ġframes Ġplayed Ġacross Ġall Ġanimations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtotal Frames Play ed Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġindex Ġof Ġthe Ġcurrent Ġframe ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent Frame Idx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue Ġum od Ġtotal Frames ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Frame Change ?. invoke ( field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent Key Frame : ĠKey Frame Type ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Animation ?. get Frame ( current Frame Idx ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInv oked Ġwhen Ġa Ġframe Ġis Ġchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġon Frame Change : Ġ(( Int ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġanimation Requested Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar ĠnumOf Frames Requested Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . remove First OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance Pool . free ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . first OrNull ()?. let Ġ{ Ġanim Instance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . anim ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Anim Info ( it , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . play s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . speed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġframe Display Time : ĠDuration Ġ= Ġ 1 0 0 . milliseconds ĊĠĠĠ Ġprivate Ġvar Ġanimation Type Ġ= ĠAnimation Type . STANDARD ĊĠĠĠ Ġprivate Ġvar Ġlast Frame Time : ĠDuration Ġ= ĠDuration . ZERO ĊĠĠĠ Ġprivate Ġvar Ġremaining Duration : ĠDuration Ġ= ĠDuration . ZERO ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ<= ĠDuration . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . remove First OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance Pool . free ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . first OrNull ()?. let Ġ{ Ġanim Instance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . anim ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Anim Info ( it , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . play s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . speed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlast Animation : ĠAnimation < Key Frame Type >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Animation Type : ĠAnimation Type ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġoverlap Playing : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġtemp Frames Ġ= Ġmutable ListOf < Key Frame Type >() ĊĠĠĠ Ġprivate Ġval Ġtemp Indices Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġprivate Ġval Ġtemp Times Ġ= Ġmutable ListOf < Duration >() ĊĠĠĠ Ġprivate Ġval Ġtemp Anim Ġ= ĠAnimation ( temp Frames , Ġtemp Indices , Ġtemp Times ) ĊĊĠĠĠ Ġprivate Ġval Ġstates Ġ= Ġarray ListOf < Animation State < Key Frame Type >>() ĊĠĠĠ Ġprivate Ġval Ġstack Ġ= Ġarray ListOf < Animation Instance < Key Frame Type >>() ĊĠĠĠ Ġprivate Ġval Ġanim Instance Pool Ġ= ĠPool ( reset Ġ= Ġ{ Ġit . reset () Ġ}, Ġ 2 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAnimation Instance < Key Frame Type >() ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġa Ġspecified Ġframe Ġfor Ġa Ġcertain Ġamount Ġof Ġframes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( frame : ĠKey Frame Type , Ġframe Time : ĠDuration Ġ= Ġ 5 0 . milliseconds , Ġnum Frames : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtemp Frames . clear () ĊĠĠĠĠĠĠĠ Ġtemp Indices . clear () ĊĠĠĠĠĠĠĠ Ġtemp Times . clear () ĊĠĠĠĠĠĠĠ Ġtemp Frames Ġ+= Ġframe ĊĠĠĠĠĠĠĠ Ġrepeat ( num Frames ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Indices Ġ+= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Times Ġ+= Ġframe Time ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplay ( temp Anim ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġthe Ġspecified Ġanimation Ġan ĠX Ġnumber Ġof Ġtimes . ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġthe Ġanimation Ġto Ġplay ĊĠĠĠĠ Ġ* Ġ@ param Ġtimes Ġthe Ġnumber Ġof Ġtimes Ġto Ġplay ĊĠĠĠĠ Ġ* Ġ@ param Ġqueue Ġif Ġ` false ` Ġwill Ġplay Ġthe Ġanimation Ġimmediately ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( animation : ĠAnimation < Key Frame Type >, Ġtimes : ĠInt Ġ= Ġ 1 , Ġqueue : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! queue Ġ&& Ġstack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance Pool . free ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstack Ġ+= Ġanim Instance Pool . alloc (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplays Ġ= Ġtimes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAnimation Type . STANDARD ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animation Instance ?. let Ġ{ Ġanim Instance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . anim ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Anim Info ( it , Ġanim Instance . play s , Ġanim Instance . speed , Ġanim Instance . duration , Ġanim Instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġthe Ġspecified Ġanimation Ġone Ġtime . ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġthe Ġanimation Ġto Ġplay ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay Once ( animation : ĠAnimation < Key Frame Type >) Ġ= Ġplay ( animation ) ĊĊĠĠĠ Ġprivate Ġfun Ġplay State Anim Once ( animation : ĠAnimation < Key Frame Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġplay ( animation ) ĊĠĠĠĠĠĠĠ Ġstack . last OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is State Anim Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġthe Ġspecified Ġanimation Ġas Ġa Ġloop . ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġthe Ġanimation Ġto Ġplay ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay Loop ed ( animation : ĠAnimation < Key Frame Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance Pool . free ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstack Ġ+= Ġanim Instance Pool . alloc (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAnimation Type . LO O PED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Animation Instance ?. let Ġ{ Ġanim Instance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . anim ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Anim Info ( it , Ġanim Instance . play s , Ġanim Instance . speed , Ġanim Instance . duration , Ġanim Instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay State Anim Loop ed ( animation : ĠAnimation < Key Frame Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġplay Loop ed ( animation ) ĊĠĠĠĠĠĠĠ Ġstack . last OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is State Anim Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġthe Ġspecified Ġanimation Ġfor Ġa Ġduration . ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġthe Ġanimation Ġto Ġplay ĊĠĠĠĠ Ġ* Ġ@ param Ġduration Ġthe Ġduration Ġto Ġplay Ġthe Ġanimation ĊĠĠĠĠ Ġ* Ġ@ param Ġqueue Ġif Ġ` false ` Ġwill Ġplay Ġthe Ġanimation Ġimmediately ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( animation : ĠAnimation < Key Frame Type >, Ġduration : ĠDuration , Ġqueue : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Anim Info ( animation ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! queue Ġ&& Ġstack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance Pool . free ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstack Ġ+= Ġanim Instance Pool . alloc (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . duration Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAnimation Type . DURATION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! queue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Animation Instance ?. let Ġ{ Ġanim Instance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanim Instance . anim ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Anim Info ( it , Ġanim Instance . play s , Ġanim Instance . speed , Ġanim Instance . duration , Ġanim Instance . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġany Ġupdates Ġfor Ġany Ġrequested Ġanimation Ġand Ġgr abs Ġthe Ġnext Ġframe Ġif Ġso . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( dt : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate State Animations () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( animation Requested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Frame ( dt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġany Ġcurrently Ġstopped Ġanimation . ĠThis Ġonly Ġdoes Ġsomething Ġwhen Ġan Ġanimation Ġis Ġstopped Ġwith Ġ[ stop ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Animation ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġany Ġrunning Ġanimations . ĠResume Ġthe Ġcurrent Ġanimation Ġwith Ġ[ start ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation Requested Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Frame ( frame Time : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Frame Time Ġ+= Ġframe Time ĊĠĠĠĠĠĠĠ Ġif Ġ( last Frame Time Ġ+ Ġframe Time Ġ>= Ġframe Display Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( animation Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Type . STANDARD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Of Frames Requested Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnumOf Frames Requested -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Type . DURATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Duration Ġ-= Ġlast Frame Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Type . LO O PED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing , Ġlet Ġit Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation Requested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Frames Play ed ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame Idx ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Display Time Ġ= Ġcurrent Animation ?. get Frame Time ( current Frame Idx ) Ġ?: ĠDuration . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Frame Time Ġ= ĠDuration . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Anim Info ( ĊĠĠĠĠĠĠĠ Ġanimation : ĠAnimation < Key Frame Type >, ĊĠĠĠĠĠĠĠ Ġcycles Requested : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġspeed : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġduration : ĠDuration Ġ= ĠDuration . INF IN ITE , ĊĠĠĠĠĠĠĠ Ġtype : ĠAnimation Type Ġ= ĠAnimation Type . STANDARD , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Frame Idx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġframe Display Time Ġ= Ġanimation . get Frame Time ( current Frame Idx ) Ġ* Ġspeed . toDouble () ĊĠĠĠĠĠĠĠ Ġanimation Type Ġ= Ġtype ĊĠĠĠĠĠĠĠ Ġanimation Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġremaining Duration Ġ= Ġduration ĊĠĠĠĠĠĠĠ ĠnumOf Frames Requested Ġ= Ġcycles Requested Ġ* Ġtotal Frames ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPriority Ġis Ġrepresented Ġby Ġthe Ġdee pe st . ĠThe Ġdee pe st Ġhas Ġtop Ġpriority Ġwhile Ġthe Ġshallow est Ġhas Ġlowest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister State ( ĊĠĠĠĠĠĠĠ Ġanim : ĠAnimation < Key Frame Type >, ĊĠĠĠĠĠĠĠ Ġpriority : ĠInt , ĊĠĠĠĠĠĠĠ Ġloop : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġreason : Ġ() Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove State ( anim ) ĊĠĠĠĠĠĠĠ Ġstates . add ( Animation State ( anim , Ġpriority , Ġloop , Ġreason )) ĊĠĠĠĠĠĠĠ Ġstates . sortBy Descending Ġ{ Ġpriority Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove State ( anim : ĠAnimation < Key Frame Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstates . find Ġ{ Ġit . anim Ġ== Ġanim Ġ} ?. also Ġ{ Ġstates . remove ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All States () Ġ{ ĊĠĠĠĠĠĠĠ Ġstates . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate State Animations () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( states . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( stack . isNotEmpty () Ġ&& Ġcurrent Animation Instance ?. is State Anim Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstates . fast ForEach Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . reason ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Animation Ġ== Ġstate . anim ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay State Anim Loop ed ( state . anim ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay State Anim Once ( state . anim ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAnimation Instance < Key Frame Type >( ĊĠĠĠĠĠĠĠ Ġvar Ġanim : ĠAnimation < Key Frame Type >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġplays : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġvar Ġduration : ĠDuration Ġ= ĠDuration . INF IN ITE , ĊĠĠĠĠĠĠĠ Ġvar Ġis State Anim : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġspeed : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġvar Ġtype : ĠAnimation Type Ġ= ĠAnimation Type . STANDARD , ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplays Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠDuration . INF IN ITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis State Anim Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAnimation Type . STANDARD ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAnimation State < Key Frame Type >( ĊĠĠĠĠĠĠĠ Ġval Ġanim : ĠAnimation < Key Frame Type >, ĊĠĠĠĠĠĠĠ Ġval Ġpriority : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġloop : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġreason : Ġ() Ġ-> ĠBoolean , ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġplayback Ġtypes Ġof Ġanimation . Ċ Ġ* Ġ@ author ĠCol ton ĠDaily Ċ Ġ* Ġ@ date Ġ 1 1 / 2 7 / 2 0 2 1 Ċ Ġ*/ Ċ enum Ġclass ĠAnimation Type Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġanimation Ġthat Ġruns Ġfrom Ġstart Ġto Ġend Ġan Ġ** X ** Ġamount Ġof Ġtimes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠST AND ARD , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġanimation Ġthe Ġloops Ġfrom Ġstart Ġto Ġend . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠLO O PED , ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġanimation Ġtype Ġthe Ġruns Ġfor Ġa Ġcertain Ġduration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠD URATION Ċ }