Easing

Share your advanced knowledge/code with the community.
poshu
Posts: 96
Joined: Mon Feb 24, 2014 11:46 pm

Easing

Post 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