package Ġde . fab max . k ool . util . animation Ċ Ċ import Ġde . fab max . k ool . K ool Context Ċ import Ġde . fab max . k ool . math . clamp Ċ import Ġde . fab max . k ool . math . is F uzzy Zero Ċ import Ġde . fab max . k ool . util . Mutable Color Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* Ġ@ author Ġfab max Ċ Ġ*/ Ċ abstract Ġclass ĠAn imator < V , Ġout ĠT : ĠInterpol ated Value < V >>( val Ġvalue : ĠT ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠON CE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠRE PEAT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġval ĠRE PEAT _ TO GGLE _ DIR Ġ= Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġduration Ġ= Ġ 1 f ĊĠĠĠ Ġvar Ġspeed Ġ= Ġ 1 f ĊĠĠĠ Ġvar Ġrepe ating Ġ= ĠON CE ĊĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 f ĊĊĠĠĠ Ġopen Ġfun Ġtick ( ctx : ĠK ool Context ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! speed . is F uzzy Zero ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ+= Ġctx . delta T Ġ* Ġspeed Ġ/ Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( progress Ġ>= Ġ 1 f Ġ&& Ġspeed Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( repe ating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON CE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġanimation Ġis Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE PEAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrepeat Ġanimation Ġfrom Ġbeginning ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE PEAT _ TO GGLE _ DIR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvert Ġspeed Ġto Ġplay Ġanimation Ġbackwards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ- speed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( progress Ġ<= Ġ 0 f Ġ&& Ġspeed Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( repe ating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠON CE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġanimation Ġis Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE PEAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrepeat Ġanimation Ġfrom Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE PEAT _ TO GGLE _ DIR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvert Ġspeed Ġto Ġplay Ġanimation Ġbackwards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ- speed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġprogress . clamp ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . interpolate ( interpolate ( progress )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinterpolate ( progress : ĠFloat ): ĠFloat Ċ } Ċ Ċ class ĠLinear Animator < V , Ġout ĠT : ĠInterpol ated Value < V >>( value : ĠT ) Ġ: ĠAn imator < V , ĠT >( value ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinterpolate ( progress : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprogress ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSquare Animator < V , Ġout ĠT : ĠInterpol ated Value < V >>( value : ĠT ) Ġ: ĠAn imator < V , ĠT >( value ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinterpolate ( progress : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprogress Ġ* Ġprogress ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠIn verse Square Animator < V , Ġout ĠT : ĠInterpol ated Value < V >>( value : ĠT ) Ġ: ĠAn imator < V , ĠT >( value ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinterpolate ( progress : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 f Ġ- Ġ( 1 f Ġ- Ġprogress ) Ġ* Ġ( 1 f Ġ- Ġprogress ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCos Animator < V , Ġout ĠT : ĠInterpol ated Value < V >>( value : ĠT ) Ġ: ĠAn imator < V , ĠT >( value ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinterpolate ( progress : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 5 f Ġ- Ġcos ( progress Ġ* ĠPI ). toFloat () Ġ* Ġ 0 . 5 f ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠInterpol ated Value < T >( initial : ĠT ) Ġ{ ĊĠĠĠ Ġvar Ġvalue Ġ= Ġinitial ĊĊĠĠĠ Ġvar ĠonUpdate : Ġ(( T ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġopen Ġfun Ġinterpolate ( progress : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Value ( progress ) ĊĠĠĠĠĠĠĠ ĠonUpdate ?. invoke ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġupdate Value ( interpolation Pos : ĠFloat ) Ċ } Ċ Ċ class ĠInterpol ated Float ( var Ġfrom : ĠFloat , Ġvar Ġto : ĠFloat ) Ġ: ĠInterpol ated Value < Float >( from ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġupdate Value ( interpolation Pos : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfrom Ġ+ Ġ( to Ġ- Ġfrom ) Ġ* Ġinterpolation Pos ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInterpol ated Color ( var Ġfrom : ĠMutable Color , Ġvar Ġto : ĠMutable Color ) Ġ: ĠInterpol ated Value < Mutable Color >( Mutable Color ()) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . set ( from ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Value ( interpolation Pos : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . set ( to ). subtract ( from ). scale ( interpolation Pos ). add ( from ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSpring D amper Float ( value : ĠFloat ) Ġ{ ĊĠĠĠ Ġvar Ġdesired Ġ= Ġvalue ĊĠĠĠ Ġvar Ġactual Ġ= Ġvalue ĊĠĠĠ Ġvar Ġspeed Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġd amping Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġst iff ness Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd amping Ġ= Ġ 2 f Ġ* Ġsqrt ( st iff ness . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġst iff ness Ġ= Ġ 1 0 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( value : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdesired Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġactual Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġanimate ( delta T : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( st iff ness Ġ== Ġ 0 f Ġ|| Ġdelta T Ġ> Ġ 0 . 2 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġcare Ġabout Ġsmoothing Ġon Ġlow Ġframe Ġrates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġdesired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactual ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġwhile Ġ( t Ġ< Ġdelta T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdt Ġ= Ġmin ( 0 . 0 5 f , Ġ( delta T Ġ- Ġt )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġdt Ġ+ Ġ 0 . 0 0 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġdesired Ġ- Ġactual ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ+= Ġ( err Ġ* Ġst iff ness Ġ- Ġspeed Ġ* Ġd amping ) Ġ* Ġdt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġspeed Ġ* Ġdt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! abs ( delta ). is F uzzy Zero ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ+= Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġdesired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġactual ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSpring D amper Double ( value : ĠDouble ) Ġ{ ĊĠĠĠ Ġvar Ġdesired Ġ= Ġvalue ĊĠĠĠ Ġvar Ġactual Ġ= Ġvalue ĊĠĠĠ Ġvar Ġspeed Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġd amping Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġst iff ness Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd amping Ġ= Ġ 2 . 0 Ġ* Ġsqrt ( st iff ness ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġst iff ness Ġ= Ġ 1 0 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdesired Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġactual Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġanimate ( delta T : ĠFloat ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( st iff ness Ġ== Ġ 0 . 0 Ġ|| Ġdelta T Ġ> Ġ 0 . 2 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġcare Ġabout Ġsmoothing Ġon Ġlow Ġframe Ġrates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġdesired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactual ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( t Ġ< Ġdelta T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdt Ġ= Ġmin ( 0 . 0 5 , Ġ( delta T Ġ- Ġt )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġdt Ġ+ Ġ 0 . 0 0 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġdesired Ġ- Ġactual ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ+= Ġ( err Ġ* Ġst iff ness Ġ- Ġspeed Ġ* Ġd amping ) Ġ* Ġdt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġspeed Ġ* Ġdt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! abs ( delta ). is F uzzy Zero ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ+= Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Ġ= Ġdesired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġactual ĊĠĠĠ Ġ} Ċ }