/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠN ich olas ĠB ily k Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Member Visibility Can Be Private ", Ġ" unused ") Ċ Ċ package Ġcom . ac orn ui . particle ĊĊ Ċ import Ġcom . ac orn ui . collection . ArrayList Ċ import Ġcom . ac orn ui . recycle . Clear able Ċ import Ġcom . ac orn ui . graphic . Color Ċ import Ġcom . ac orn ui . math . Math Utils . clamp Ċ import Ġcom . ac orn ui . math . Vector 3 Ċ import Ġcom . ac orn ui . math . Vector 3 Ro Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ Ċ class ĠParticle Effect Instance ( ĊĊĉ ĉ val Ġemitter Instances : ĠList < Particle Emitter Instance > Ċ Ċ ) Ġ{ ĊĊ ĉ private Ġval Ġ_ position Ġ= ĠVector 3 () ĊĊ ĉ val Ġposition : ĠVector 3 Ro Ċĉ ĉ get () Ġ= Ġ_ position ĊĊ ĉ fun Ġset Position ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ{ Ċĉ ĉ translate Position ( x Ġ- Ġ_ position . x , Ġy Ġ- Ġ_ position . y , Ġz Ġ- Ġ_ position . z ) Ċ ĉ } ĊĊ ĉ fun Ġtranslate Position ( xD : ĠFloat , Ġy D : ĠFloat , Ġz D : ĠFloat ) Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. emitter Instances . last Index ) Ġ{ Ċĉĉ ĉ emitter Instances [ i ]. position . add ( xD , Ġy D , Ġz D ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRew inds Ġall Ġemitter s . Ċĉ Ġ* Ġ@ see ĠParticle Emitter Instance . rewind Ċĉ Ġ*/ Ċ ĉ fun Ġre wind () Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. emitter Instances . last Index ) Ġ{ Ċĉĉ ĉ emitter Instances [ i ]. rewind () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠSto ps Ġall Ġemitter s Ċĉ Ġ* Ġ@ see ĠParticle Emitter Instance . stop Ċĉ Ġ*/ Ċ ĉ fun Ġstop ( allow Completion : ĠBoolean ) Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. emitter Instances . last Index ) Ġ{ Ċĉĉ ĉ emitter Instances [ i ]. stop ( allow Completion ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRe sets Ġall Ġemitter s . Ċĉ Ġ* Ġ@ see ĠParticle Emitter Instance . reset Ċĉ Ġ*/ Ċ ĉ fun Ġreset () Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. emitter Instances . last Index ) Ġ{ Ċĉĉ ĉ emitter Instances [ i ]. reset () Ċĉ ĉ } Ċ ĉ } Ċ Ċ } Ċ Ċ class ĠParticle Emitter Instance ( ĊĊĉ ĉ val Ġemitter : ĠParticle Emitter , ĊĊĉ ĉ val Ġmax Particles Scale : ĠFloat Ċ ) Ġ{ ĊĊ ĉ val Ġposition Ġ= ĠVector 3 () ĊĊ ĉ val Ġparticles : ĠList < Particle > ĊĊ ĉ private Ġval Ġcount Ġ= Ġceil (( emitter . count Ġ* Ġmax Particles Scale )). toInt () Ċ ĉ private Ġvar Ġ_ active Count : ĠInt Ġ= Ġ 0 ĊĊ ĉ val Ġactive Count : ĠInt Ċĉ ĉ get () Ġ= Ġ_ active Count ĊĊĊ ĉ private Ġvar Ġ_ delay Before Ġ= Ġ 0 f ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġvalue Ġof Ġthe Ġemitter 's Ġ[ Emitter Duration . delay Before ] Ġat Ġthe Ġtime Ġof Ġthe Ġlast Ġreset . Ċĉ Ġ*/ Ċ ĉ val Ġdelay Before : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ delay Before ĊĊ ĉ private Ġvar Ġ_ delay After Ġ= Ġ 0 f ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġvalue Ġof Ġthe Ġemitter 's Ġ[ Emitter Duration . delay After ] Ġat Ġthe Ġtime Ġof Ġthe Ġlast Ġreset . Ċĉ Ġ*/ Ċ ĉ val Ġdelay After : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ delay After ĊĊ ĉ private Ġvar Ġ_ currentTime : ĠFloat Ġ= Ġ 0 f ĊĊ ĉ /** Ċĉ Ġ* ĠThis Ġemitter Ġinstance 's Ġcurrent Ġtime . ĠThis Ġmay Ġbe Ġnegative Ġif Ġthere Ġwas Ġa Ġpositive Ġ[ delay Before ] Ġvalue . Ċĉ Ġ*/ Ċ ĉ val ĠcurrentTime : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ currentTime ĊĊ ĉ private Ġvar Ġ_ duration Ġ= Ġ 0 f ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġduration Ġof Ġthis Ġemitter . Ċĉ Ġ*/ Ċ ĉ val Ġduration : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ duration ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġsum Ġof Ġthe Ġdelay Ġvalues Ġand Ġthe Ġduration . Ċĉ Ġ*/ Ċ ĉ val Ġtotal Time : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ delay Before Ġ+ Ġ_ duration Ġ+ Ġ_ delay After ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġcurrent Ġprogress Ġof Ġthis Ġemitter . ĠThis Ġwill Ġbe Ġa Ġvalue Ġbetween Ġ 0 f Ġand Ġ 1 f Ċĉ Ġ*/ Ċ ĉ val Ġprogress : ĠFloat Ċĉ ĉ get () Ġ= Ġ(_ currentTime Ġ+ Ġ_ delay Before ) Ġ/ Ġmax Of ( 0 . 0 0 1 f , Ġtotal Time ) ĊĊ ĉ private Ġvar Ġ_ duration Inv Ġ= Ġ 0 f ĊĊ ĉ private Ġvar ĠendTime : ĠFloat Ġ= Ġ 0 f Ċ ĉ private Ġvar Ġ_ is Complete Ġ= Ġfalse Ċ ĉ private Ġvar Ġloops Ġ= Ġemitter . loops ĊĊ ĉ private Ġvar Ġaccumulator Ġ= Ġ 0 f ĊĊ ĉ private Ġval Ġemission Rate Value Ġ= ĠProperty Value () Ċ ĉ private Ġval Ġlife Expect ancy Value Ġ= ĠProperty Value () ĊĊ ĉ /** Ċĉ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġemitter Ġis Ġno Ġlonger Ġdoing Ġanything . Ċĉ Ġ*/ Ċ ĉ val Ġis Complete : ĠBoolean Ċĉ ĉ get () Ġ= Ġ_ is Complete ĊĊ ĉ init Ġ{ Ċĉ ĉ particles Ġ= ĠArrayList ( count ) Ġ{ Ċĉĉ ĉ Particle ( timeline Instances Ġ= Ġemitter . property Time lines . map Ġ{ Ġtimeline Instance ( it ) Ġ}) Ċĉ ĉ } ĊĊĉ ĉ rewind () Ċ ĉ } ĊĊ ĉ fun Ġupdate ( tick Time : ĠFloat ) Ġ{ Ċĉ ĉ if Ġ(_ is Complete ) Ġreturn Ċĉ ĉ if Ġ(! emitter . enabled ) Ġreturn ĊĊĉ ĉ _ currentTime Ġ+= Ġtick Time ĊĊĉ ĉ if Ġ(_ currentTime Ġ>= ĠendTime ) Ġ{ Ċĉĉ ĉ if Ġ( loops ) Ġ{ Ċĉĉĉ ĉ val Ġremainder Ġ= Ġ_ currentTime Ġ- ĠendTime Ċĉĉĉ ĉ rewind () Ċĉĉĉ ĉ _ currentTime Ġ+= Ġremainder Ċĉĉ ĉ } Ġelse Ġif Ġ(_ active Count Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ _ is Complete Ġ= Ġtrue Ċĉĉĉ ĉ accumulator Ġ= Ġ 0 f Ċĉĉĉ ĉ return Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ val Ġalpha Ġ= Ġ_ currentTime Ġ* Ġ_ duration Inv ĊĊĉ ĉ emitter . em ission Rate . apply ( em ission Rate Value , Ġalpha ) Ċĉ ĉ emitter . particle Life Expect ancy . apply ( life Expect ancy Value , Ġalpha ) Ċĉ ĉ if Ġ(_ currentTime Ġ< Ġ_ duration Ġ&& Ġ_ currentTime Ġ> Ġ 0 f ) Ġ{ Ċĉĉ ĉ // ĠCreate Ġnew Ġparticles Ġif Ġthe Ġaccumulator Ġsur passes Ġ 1 . Ċĉĉ ĉ accumulator Ġ+= Ġemission Rate Value . current Ġ* Ġmax Particles Scale Ġ* Ġtick Time Ċĉĉ ĉ if Ġ( accumulator Ġ> Ġ 1 f ) Ġ{ Ċĉĉĉ ĉ for Ġ( i Ġin Ġ 0 .. particles . last Index ) Ġ{ Ċĉĉĉĉ ĉ val Ġparticle Ġ= Ġparticles [ i ] Ċĉĉĉĉ ĉ if Ġ(! particle . active ) Ċĉĉĉĉĉ ĉ activate Particle ( particle ) Ċĉĉĉĉ ĉ if Ġ(_ active Count Ġ>= Ġcount ) Ġaccumulator Ġ= Ġ 0 f Ċĉĉĉĉ ĉ if Ġ( accumulator Ġ< Ġ 1 f ) Ġbreak Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ val Ġalpha Clamp ed Ġ= Ġclamp ( alpha , Ġ 0 f , Ġ 1 f ) Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. particles . last Index ) Ġ{ Ċĉĉ ĉ val Ġparticle Ġ= Ġparticles [ i ] Ċĉĉ ĉ if Ġ( particle . active ) Ġ{ Ċĉĉĉ ĉ particle . update ( tick Time , Ġalpha Clamp ed ) Ċĉĉĉ ĉ if Ġ( particle . life Ġ> Ġparticle . life Expect ancy ) Ġ{ Ċĉĉĉĉ ĉ particle . active Ġ= Ġfalse Ċĉĉĉĉ ĉ _ active Count -- Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun Ġactivate Particle ( particle : ĠParticle ) Ġ{ Ċĉ ĉ particle . clear () Ċĉ ĉ particle . active Ġ= Ġtrue Ċĉ ĉ particle . life Expect ancy Ġ= Ġlife Expect ancy Value . current Ċĉ ĉ _ active Count ++ Ċĉ ĉ accumulator -- Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠClear s Ġthe Ġcurrent Ġparticles Ġwithout Ġchanging Ġthe Ġcurrent Ġtime Ġor Ġstate . Ċĉ Ġ*/ Ċ ĉ fun Ġclear Particles () Ġ{ Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. particles . last Index ) Ġ{ Ċĉĉ ĉ particles [ i ]. active Ġ= Ġfalse Ċĉ ĉ } Ċĉ ĉ _ active Count Ġ= Ġ 0 Ċĉ ĉ accumulator Ġ= Ġ 0 f Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠClear s Ġthe Ġcurrent Ġparticles , Ġresets Ġcurrent Ġstate , Ġand Ġre wind s . Ċĉ Ġ*/ Ċ ĉ fun Ġreset () Ġ{ Ċĉ ĉ clear Particles () Ċĉ ĉ rewind () Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠSto ps Ġthe Ġemitter . Ċĉ Ġ* Ġ@ param Ġallow Completion ĠIf Ġtrue , Ġthe Ġemitter Ġwon 't Ġdeactivate Ġexisting Ġparticles , Ġallowing Ġthem Ġto Ġfinish . Ċĉ Ġ*/ Ċ ĉ fun Ġstop ( allow Completion : ĠBoolean ) Ġ{ Ċĉ ĉ loops Ġ= Ġfalse Ċĉ ĉ _ currentTime Ġ= ĠendTime Ċĉ ĉ if Ġ(! allow Completion ) Ġ{ Ċĉĉ ĉ clear Particles () Ċĉĉ ĉ _ is Complete Ġ= Ġtrue Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRew inds Ġthe Ġemitter Ġto Ġthe Ġbeginning . Ċĉ Ġ* ĠThis Ġwill Ġnot Ġclear Ġcurrent Ġparticles , Ġbut Ġcurrent Ġparticles Ġwill Ġbe Ġaffected Ġfor Ġemitter Ġduration Ġtime lines . Ċĉ Ġ*/ Ċ ĉ fun Ġre wind () Ġ{ Ċĉ ĉ _ is Complete Ġ= Ġfalse Ċĉ ĉ loops Ġ= Ġemitter . loops Ċĉ ĉ _ delay Before Ġ= Ġemitter . duration . delay Before . getValue () Ċĉ ĉ _ delay After Ġ= Ġemitter . duration . delay After . getValue () Ċĉ ĉ _ currentTime Ġ= Ġ- _ delay Before Ċĉ ĉ _ duration Ġ= Ġemitter . duration . duration . getValue () Ċĉ ĉ _ duration Inv Ġ= Ġ 1 f Ġ/ Ġ_ duration Ċĉ ĉ endTime Ġ= Ġ_ duration Ġ+ Ġ_ delay After Ċĉ ĉ emitter . em ission Rate . reset ( em ission Rate Value ) Ċĉ ĉ emitter . particle Life Expect ancy . reset ( life Expect ancy Value ) Ċ ĉ } Ċ Ċ } Ċ Ċ class ĠParticle ( Ċĉ ĉ val Ġtimeline Instances : ĠList < Timeline Instance > Ċ ) Ġ: ĠClear able Ġ{ ĊĊ ĉ var Ġactive Ġ= Ġfalse ĊĊ ĉ /** Ċĉ Ġ* ĠWhen Ġlife Ġreaches Ġ[ life Expect ancy ], Ġthe Ġparticle Ġwill Ġbe Ġre cyc led . Ċĉ Ġ*/ Ċ ĉ var Ġlife Ġ= Ġ 0 f ĊĊ ĉ private Ġvar Ġ_ life Expect ancy Ġ= Ġ 0 f Ċ ĉ private Ġvar Ġ_ life Expect ancy Inv Ġ= Ġ 0 f ĊĊ ĉ var Ġlife Expect ancy : ĠFloat Ċĉ ĉ get () Ġ= Ġ_ life Expect ancy Ċĉ ĉ set ( value ) Ġ{ Ċĉĉ ĉ _ life Expect ancy Ġ= Ġvalue Ċĉĉ ĉ _ life Expect ancy Inv Ġ= Ġ 1 f Ġ/ Ġvalue Ċĉ ĉ } ĊĊ ĉ val Ġposition Ġ= ĠVector 3 () Ċ ĉ val Ġvelocity Ġ= ĠVector 3 () ĊĊ ĉ val Ġscale Ġ= ĠVector 3 ( 1 f , Ġ 1 f , Ġ 1 f ) ĊĊ ĉ val Ġrotation Ġ= ĠVector 3 () Ċ ĉ val Ġrot ational Velocity Ġ= ĠVector 3 () ĊĊ ĉ /** Ċĉ Ġ* Ġpitch , Ġyaw , Ġand Ġroll Ġvalues Ġin Ġradians . Ċĉ Ġ*/ Ċ ĉ val Ġforward Direction Ġ= ĠVector 3 () Ċ ĉ val Ġforward Direction Velocity Ġ= ĠVector 3 () Ċ ĉ var Ġforward Velocity Ġ= Ġ 0 f ĊĊ ĉ val Ġcolor Tint : ĠColor Ġ= ĠColor . WHITE . copy () ĊĊ ĉ /** Ċĉ Ġ* ĠThe Ġorigin Ġof Ġthe Ġparticle , Ġwith Ġpercent - based Ġvalues . Ċĉ Ġ* Ġ( Default Ġ 0 . 5 f , Ġ 0 . 5 f , Ġ 0 . 5 f Ġ- Ġthe Ġcenter Ġof Ġthe Ġparticle ) Ċĉ Ġ*/ Ċ ĉ val Ġorigin Ġ= ĠVector 3 ( 0 . 5 f , Ġ 0 . 5 f , Ġ 0 . 5 f ) ĊĊ ĉ var Ġimage Index Ġ= Ġ 0 ĊĊ ĉ fun Ġupdate ( tick Time : ĠFloat , Ġemitter Alpha Clamp ed : ĠFloat ) Ġ{ Ċĉ ĉ life Ġ+= Ġtick Time Ċĉ ĉ val Ġalpha Ġ= Ġlife Ġ* Ġ_ life Expect ancy Inv Ċĉ ĉ val Ġalpha Clamp ed Ġ= Ġclamp ( alpha , Ġ 0 f , Ġ 1 f ) ĊĊĉ ĉ for Ġ( i Ġin Ġ 0 .. timeline Instances . last Index ) Ġ{ Ċĉĉ ĉ timeline Instances [ i ]. apply ( this , Ġalpha Clamp ed , Ġemitter Alpha Clamp ed ) Ċĉ ĉ } ĊĊĉ ĉ position . add ( velocity ) Ċĉ ĉ rotation . add ( rot ational Velocity ) Ċĉ ĉ forward Direction . add ( forward Direction Velocity ) Ċĉ ĉ if Ġ( forward Velocity Ġ!= Ġ 0 f ) Ġ{ Ċĉĉ ĉ if Ġ( forward Direction . y Ġ!= Ġ 0 f Ġ|| Ġforward Direction . x Ġ!= Ġ 0 f ) Ġ{ Ċĉĉĉ ĉ // ĠTODO : Ġ 3 d Ġforward Ġdirection . Ċĉĉ ĉ } Ġelse Ġif Ġ( forward Direction . z Ġ!= Ġ 0 f ) Ġ{ Ċĉĉĉ ĉ val Ġtheta Ġ= Ġforward Direction . z Ċĉĉĉ ĉ position . add ( cos ( theta ) Ġ* Ġforward Velocity , Ġsin ( theta ) Ġ* Ġforward Velocity , Ġ 0 f ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġclear () Ġ{ Ċĉ ĉ active Ġ= Ġfalse Ċĉ ĉ life Ġ= Ġ 0 f Ċĉ ĉ _ life Expect ancy Ġ= Ġ 0 f Ċĉ ĉ _ life Expect ancy Inv Ġ= Ġ 0 f Ċĉ ĉ position . clear () Ċĉ ĉ velocity . clear () Ċĉ ĉ scale . set ( 1 f , Ġ 1 f , Ġ 1 f ) Ċĉ ĉ rotation . clear () Ċĉ ĉ rot ational Velocity . clear () Ċĉ ĉ forward Direction . clear () Ċĉ ĉ forward Direction Velocity . clear () Ċĉ ĉ forward Velocity Ġ= Ġ 0 f Ċĉ ĉ color Tint . set ( Color . WHITE ) Ċĉ ĉ origin . set ( 0 . 5 f , Ġ 0 . 5 f , Ġ 0 . 5 f ) Ċĉ ĉ image Index Ġ= Ġ 0 ĊĊĉ ĉ // ĠSet Ġall Ġproperties Ġto Ġthe Ġlow Ġvalue . Ċĉ ĉ for Ġ( i Ġin Ġ 0 .. timeline Instances . last Index ) Ġ{ Ċĉĉ ĉ timeline Instances [ i ]. reset ( this ) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ interface ĠTimeline Instance Ġ{ ĊĊ ĉ fun Ġapply ( particle : ĠParticle , Ġparticle Alpha Clamp ed : ĠFloat , Ġemitter Alpha Clamp ed : ĠFloat ) Ċ ĉ fun Ġreset ( particle : ĠParticle ) Ċ Ċ } Ċ Ċ fun Ġtimeline Instance ( timeline : ĠProperty Timeline < *> ): ĠTimeline Instance Ġ{ Ċ ĉ return Ġif Ġ( timeline . property Ġ== Ġ" color ") ĠColor Timeline Instance ( timeline Ġas ĠColor Timeline ) Ċ ĉ else ĠFloat Timeline Instance ( timeline Ġas ĠFloat Timeline ) Ċ } Ċ Ċ class ĠFloat Timeline Instance ( Ċĉ ĉ private Ġval Ġtimeline : ĠFloat Timeline Ċ ) Ġ: ĠTimeline Instance Ġ{ ĊĊ ĉ private Ġval Ġvalue Ġ= ĠProperty Value () ĊĊ ĉ private Ġval Ġoffset Ġ= ĠRegistered Particle Set ters . offsets [ timeline . property ] Ġ?: Ġ 0 f ĊĊ ĉ private Ġval Ġupdater : ĠParticle Property Updater Ġ= ĠRegistered Particle Set ters . up dat ers [ timeline . property ] Ċĉĉ ĉ ?: Ġthrow ĠException (" Could Ġnot Ġfind Ġproperty Ġupdater Ġwith Ġthe Ġname Ġ${ timeline . property }") ĊĊ ĉ override Ġfun Ġapply ( particle : ĠParticle , Ġparticle Alpha Clamp ed : ĠFloat , Ġemitter Alpha Clamp ed : ĠFloat ) Ġ{ Ċĉ ĉ if Ġ( timeline . timeline . isEmpty ()) Ġreturn Ċĉ ĉ val Ġprevious Ġ= Ġvalue . current Ċĉ ĉ timeline . apply ( value , Ġif Ġ( timeline . use Emitter Duration ) Ġemitter Alpha Clamp ed Ġelse Ġparticle Alpha Clamp ed ) Ċĉ ĉ updater ( particle , Ġvalue . current Ġ- Ġprevious ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġreset ( particle : ĠParticle ) Ġ{ Ċĉ ĉ timeline . reset ( value ) Ċĉ ĉ updater ( particle , Ġvalue . current Ġ- Ġoffset ) Ċ ĉ } Ċ } Ċ Ċ class ĠColor Timeline Instance ( Ċĉ ĉ private Ġval Ġtimeline : ĠColor Timeline Ċ ) Ġ: ĠTimeline Instance Ġ{ ĊĊ ĉ private Ġval Ġprevious Ġ= ĠColor . WHITE . copy () Ċ ĉ private Ġval Ġvalue Ġ= ĠColor . WHITE . copy () ĊĊ ĉ override Ġfun Ġapply ( particle : ĠParticle , Ġparticle Alpha Clamp ed : ĠFloat , Ġemitter Alpha Clamp ed : ĠFloat ) Ġ{ Ċĉ ĉ previous . set ( value ) Ċĉ ĉ timeline . apply ( value , Ġif Ġ( timeline . use Emitter Duration ) Ġemitter Alpha Clamp ed Ġelse Ġparticle Alpha Clamp ed ) Ċĉ ĉ particle . color Tint . r Ġ+= Ġvalue . r Ġ- Ġprevious . r Ċĉ ĉ particle . color Tint . g Ġ+= Ġvalue . g Ġ- Ġprevious . g Ċĉ ĉ particle . color Tint . b Ġ+= Ġvalue . b Ġ- Ġprevious . b Ċ ĉ } ĊĊ ĉ override Ġfun Ġreset ( particle : ĠParticle ) Ġ{ Ċĉ ĉ value . set ( Color . WHITE ) Ċĉ ĉ particle . color Tint . set ( 1 f , Ġ 1 f , Ġ 1 f , Ġparticle . color Tint . a ) Ċ ĉ } Ċ } Ċ Ċ type alias ĠParticle Property Updater Ġ= Ġ( Particle , ĠFloat ) Ġ-> ĠUnit Ċ Ċ object ĠRegistered Particle Set ters Ġ{ ĊĊ ĉ val Ġoffsets Ġ= Ġhash Map Of ( Ċĉĉ ĉ " scale " Ġto Ġ 1 f , Ċĉĉ ĉ " scale X " Ġto Ġ 1 f , Ċĉĉ ĉ " scale Y " Ġto Ġ 1 f , Ċĉĉ ĉ " scale Z " Ġto Ġ 1 f , ĊĊĉĉ ĉ " origin X " Ġto Ġ 0 . 5 f , Ċĉĉ ĉ " origin Y " Ġto Ġ 0 . 5 f , Ċĉĉ ĉ " origin Z " Ġto Ġ 0 . 5 f , ĊĊĉĉ ĉ " color R " Ġto Ġ 1 f , Ċĉĉ ĉ " color G " Ġto Ġ 1 f , Ċĉĉ ĉ " color B " Ġto Ġ 1 f , Ċĉĉ ĉ " color A " Ġto Ġ 1 f Ċ ĉ ) ĊĊ ĉ val Ġup dat ers : ĠMap < String , ĠParticle Property Updater > Ġ= Ġhash Map Of ( ĊĊĉĉ ĉ " x " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . position . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . position . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . position . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " velocity X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . velocity . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " velocity Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . velocity . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " velocity Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . velocity . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " origin X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . origin . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " origin Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . origin . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " origin Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . origin . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " scale " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . scale . x Ġ+= Ġdelta ; Ġtarget . scale . y Ġ+= Ġdelta ; Ġtarget . scale . z Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " scale X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . scale . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " scale Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . scale . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " scale Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . scale . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " rotation X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rotation . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " rotation Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rotation . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " rotation Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rotation . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " rot ational Velocity X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rot ational Velocity . x Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " rot ational Velocity Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rot ational Velocity . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " rot ational Velocity Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . rot ational Velocity . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " forward Direction X " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ċĉĉĉ ĉ target . forward Direction . x Ġ+= Ġdelta Ċĉĉ ĉ }, Ċĉĉ ĉ " forward Direction Y " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . forward Direction . y Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " forward Direction Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . forward Direction . z Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " forward Direction Velocity Z " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ċĉĉĉ ĉ target . forward Direction Velocity . z Ġ+= Ġdelta Ċĉĉ ĉ }, ĊĊĉĉ ĉ " forward Velocity " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . forward Velocity Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " color R " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . color Tint . r Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " color G " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . color Tint . g Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " color B " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . color Tint . b Ġ+= Ġdelta Ġ}, Ċĉĉ ĉ " color A " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . color Tint . a Ġ+= Ġdelta Ġ}, ĊĊĉĉ ĉ " image Index " Ġto Ġ{ Ġtarget , Ġdelta Ġ-> Ġtarget . image Index Ġ+= Ġdelta . toInt () Ġ} Ċ ĉ ) Ċ Ċ }