Page 1 of 1

Easing

Posted: Tue Jul 10, 2018 2:02 pm
by poshu
Hey o/
Easing formulas are necessary to do games, animations and quite a lot of other stuff, so here we go with the basic Robert Penner's Easing formulas :
( /!\ I haven't tested all of them, some might be wrong! /!\ )

Code: Select all

DeclareModule Ease
	Declare.f linear(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InQuad(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutQuad(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutQuad(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InCubic(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutCubic(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutCubic(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InQuart(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutQuart(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutQuart(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InQuint(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutQuint(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutQuint(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InSine(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutSine(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutSine(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InExpo(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f) 
	Declare.f OutExpo(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutExpo(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InCirc(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f OutCirc(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
	Declare.f InOutCirc(CurrentTime.f, InitialValue.f, TargetValue.f, Duration.f)
EndDeclareModule

Module Ease
	Procedure.f linear(t.f, b.f, c.f, d.f)
		ProcedureReturn c*t/d + b
	EndProcedure
	
	Procedure.f InQuad(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn c*t*t + b
	EndProcedure
	
	Procedure.f OutQuad(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn -c * t*(t-2) + b
	EndProcedure
	
	Procedure.f InOutQuad(t.f, b.f, c.f, d.f)
		t = t/(d/2)
		If (t < 1)
			ProcedureReturn c/2*t*t + b
		EndIf
		t - 1
		ProcedureReturn -c/2 * (t*(t-2) - 1) + b
		
	EndProcedure
	
	Procedure.f InCubic(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn c*t*t*t + b
	EndProcedure
	
	Procedure.f OutCubic(t.f, b.f, c.f, d.f)
		t / d
		t - 1		
		ProcedureReturn c*(t*t*t + 1) + b
	EndProcedure
	
	Procedure.f InOutCubic(t.f, b.f, c.f, d.f)
		t = t / (d/2)
		If (t < 1)
			ProcedureReturn c/2*t*t*t + b
		EndIf
		t - 2																
		ProcedureReturn c/2*(t*t*t + 2) + b		
		
	EndProcedure
	
	Procedure.f InQuart(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn c*t*t*t*t + b
	EndProcedure
	
	Procedure.f OutQuart(t.f, b.f, c.f, d.f)
		t / d
		t- 1		
		ProcedureReturn -c * (t*t*t*t - 1) + b
	EndProcedure
	
	Procedure.f InOutQuart(t.f, b.f, c.f, d.f)
		t = t / (d/2)
		If (t < 1)
			ProcedureReturn c/2*t*t*t*t + b
		EndIf
		t - 2																	
		ProcedureReturn -c/2 * (t*t*t*t - 2) + b
		
	EndProcedure
	
	Procedure.f InQuint(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn c*t*t*t*t*t + b
	EndProcedure
	
	Procedure.f OutQuint(t.f, b.f, c.f, d.f)
		t / d
		t - 1		
		ProcedureReturn c*(t*t*t*t*t + 1) + b
	EndProcedure
	
	Procedure.f InOutQuint(t.f, b.f, c.f, d.f)
		t = t / (d/2)
		If (t < 1)
			ProcedureReturn c/2*t*t*t*t*t + b
		EndIf
		t - 2																		
		ProcedureReturn c/2*(t*t*t*t*t + 2) + b		
		
	EndProcedure
	
	Procedure.f InSine(t.f, b.f, c.f, d.f)
		ProcedureReturn -c * Cos(t/d * (#PI/2)) + c + b
	EndProcedure
	
	Procedure.f OutSine(t.f, b.f, c.f, d.f)
		ProcedureReturn c * Sin(t/d * (#PI/2)) + b
	EndProcedure
	
	Procedure.f InOutSine(t.f, b.f, c.f, d.f)
		ProcedureReturn -c/2 * (Cos(#PI*t/d) - 1) + b
	EndProcedure
	
	Procedure.f InExpo(t.f, b.f, c.f, d.f) 
		ProcedureReturn c * Pow( 2, 10 * (t/d - 1) ) + b
	EndProcedure
	
	Procedure.f OutExpo(t.f, b.f, c.f, d.f)
		ProcedureReturn c * ( -Pow( 2, -10 * t/d ) + 1 ) + b
	EndProcedure
	
	Procedure.f InOutExpo(t.f, b.f, c.f, d.f)
		t =t / (d/2)
		If (t < 1)
			ProcedureReturn c/2 * Pow( 2, 10 * (t - 1) ) + b
		EndIf
		t-1																													
		ProcedureReturn c/2 * ( -Pow( 2, -10 * t) + 2 ) + b			
		
	EndProcedure
	
	Procedure.f InCirc(t.f, b.f, c.f, d.f)
		t / d
		ProcedureReturn -c * (Sqr(1 - t*t) - 1) + b
	EndProcedure
	
	Procedure.f OutCirc(t.f, b.f, c.f, d.f)
		t / d
		t-1
		ProcedureReturn c * Sqr(1 - t*t) + b
	EndProcedure
	
	Procedure.f InOutCirc(t.f, b.f, c.f, d.f)
		t = t /(d/2)
		If (t < 1)
			ProcedureReturn -c/2 * (Sqr(1 - t*t) - 1) + b
		EndIf
		t - 2																											
		ProcedureReturn c/2 * (Sqr(1 - t*t) + 1) + b					
		
	EndProcedure
	
EndModule