Luau Easing Styles Implementation

Went out of my way to hand optimize all these functions. I’ve tested and guaranteed all of them are equal to the old functions and TweenService/GetValue.

Some functions in my benchmarks ran 3x faster than before, making a 7.5x speed difference to GetValue.

I left out Hexic-Octic since they aren’t in normal TweenService, but it should be easy for anyone to add them in.

--!strict
--!native

local Easing = {
	Linear = {
		In = function(Value: number): number
			return Value
		end,
		
		Out = function(Value: number): number
			return Value
		end,
		
		InOut = function(Value: number): number
			return Value
		end,
	},
	
	Quad = {
		In = function(Value: number): number
			return Value * Value
		end,
		
		Out = function(Value: number): number
			local Base = 1 - Value
			return 1 - Base * Base
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return 2 * Value * Value
			end
			
			local Base = -2 * Value + 2
			return 1 - Base * Base * 0.5
		end,
	},
	
	Cubic = {
		In = function(Value: number): number
			return Value * Value * Value
		end,
		
		Out = function(Value: number): number
			local Base = 1 - Value
			return 1 - Base * Base * Base
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return 4 * Value * Value * Value
			end
			
			local Base = -2 * Value + 2
			return 1 - Base * Base * Base * 0.5
		end,
	},
	
	Quart = {
		In = function(Value: number): number
			return Value * Value * Value * Value
		end,
		
		Out = function(Value: number): number
			local Base = 1 - Value
			return 1 - Base * Base * Base * Base
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return 8 * Value * Value * Value * Value
			end
			
			local Base = -2 * Value + 2
			return 1 - Base * Base * Base * Base * 0.5
		end,
	},
	
	Quint = {
		In = function(Value: number): number
			return Value * Value * Value * Value * Value
		end,
		
		Out = function(Value: number): number
			local Base = 1 - Value
			return 1 - Base * Base * Base * Base * Base
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return 16 * Value * Value * Value * Value * Value
			end
			
			local Base = -2 * Value + 2
			return 1 - Base * Base * Base * Base * Base * 0.5
		end,
	},
	
	Circular = {
		In = function(Value: number): number
			return 1 - (1 - Value * Value) ^ 0.5
		end,
		
		Out = function(Value: number): number
			local Base = Value - 1
			return (1 - Base * Base) ^ 0.5
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return (1 - (1 - 4 * Value * Value) ^ 0.5) * 0.5
			end
			
			local Base = -2 * Value + 2
			return (1 + (1 - Base * Base) ^ 0.5) * 0.5
		end,
	},
	
	Exponential = {
		In = function(Value: number): number
			return 2 ^ (10 * Value - 10)
		end,
		Out = function(Value: number): number
			return 1 - 2 ^ (-10 * Value)
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return 2 ^ (20 * Value - 11)
			end
			
			return 1 - 2 ^ (-20 * Value + 9)
		end,
	},
	
	Sine = {
		In = function(Value: number): number
			return 1 - math.cos(Value * 1.5707963267948966)
		end,
		
		Out = function(Value: number): number
			return math.sin(Value * 1.5707963267948966)
		end,
		
		InOut = function(Value: number): number
			return (math.cos(3.141592653589793 * Value) - 1) * -0.5
		end,
	},
	
	Back = {
		In = function(Value: number): number
			return 2.70158 * Value * Value * Value - 1.70158 * Value * Value
		end,
		
		Out = function(Value: number): number
			local Base = Value - 1
			return 1 + 2.70158 * Base * Base * Base + 1.70158 * Base * Base
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				local Base = 2 * Value
				return Base * Base * (3.5949095 * Base - 2.5949095) * 0.5
			end
			
			local Base = 2 * Value - 2
			return Base * Base * (3.5949095 * Base + 2.5949095) + 2 * 0.5
		end,
	},
	
	Bounce = {
		In = function(Value: number): number
			local Compliment = 1 - Value
			
			if Compliment < 0.36363636363636365 then
				return 1 - 7.5625 * Compliment * Compliment
			end
			
			if Compliment < 0.7272727272727273 then
				local Base = Compliment - 0.5454545454545454
				return 1 - 7.5625 * Base * Base + 0.75
			end
			
			if Compliment < 0.9090909090909091 then
				local Base = Compliment - 0.9090909090909091
				return 1 - 7.5625 * Base * Base + 0.9375
			end
			
			local Base = Compliment - 0.9545454545454546
			return 1 - 7.5625 * Base * Base + 0.984375
		end,
		
		Out = function(Value: number): number
			if Value < 0.36363636363636365 then
				return 7.5625 * Value * Value
			end
			
			if Value < 0.7272727272727273 then
				local Base = Value - 0.5454545454545454
				return 7.5625 * Base * Base + 0.75
			end
			
			if Value < 0.9090909090909091 then
				local Base = Value - 0.9090909090909091
				return 7.5625 * Base * Base + 0.9375
			end
			
			local Base = Value - 0.9545454545454546
			return 7.5625 * Base * Base + 0.984375
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				local Compliment = 1 - 2 * Value
				
				if Compliment < 0.36363636363636365 then
					return (1 - 7.5625 * Compliment * Compliment) * 0.5
				end
				
				if Compliment < 0.7272727272727273 then
					local Base = Compliment - 0.5454545454545454
					return (1 - 7.5625 * Base * Base + 0.75) * 0.5
				end
				
				if Compliment < 0.9090909090909091 then
					local Base = Compliment - 0.9090909090909091
					return (1 - 7.5625 * Base * Base + 0.9375) * 0.5
				end
				
				local Base = Compliment - 0.9545454545454546
				return (1 - 7.5625 * Base * Base + 0.984375) * 0.5
			end
			
			local Compliment = 2 * Value - 1
			
			if Compliment < 0.36363636363636365 then
				return (1 + 7.5625 * Compliment * Compliment) * 0.5
			end
			
			if Compliment < 0.7272727272727273 then
				local Base = Compliment - 0.5454545454545454
				return (1 + 7.5625 * Base * Base + 0.75) * 0.5
			end
			
			if Compliment < 0.9090909090909091 then
				local Base = Compliment - 0.9090909090909091
				return (1 + 7.5625 * Base * Base + 0.9375) * 0.5
			end
			
			local Base = Compliment - 0.9545454545454546
			return (1 + 7.5625 * Base * Base + 0.984375) * 0.5
		end,
	},
	
	Elastic = {
		In = function(Value: number): number
			return -2 ^ (10 * Value - 10) * math.sin((Value * 10 - 10.75) * 2.0943951023931953)
		end,
		
		Out = function(Value: number): number
			return 2 ^ (-10 * Value) * math.sin((Value * 10 - 0.75) * 2.0943951023931953) + 1
		end,
		
		InOut = function(Value: number): number
			if Value < 0.5 then
				return -2 ^ (20 * Value - 10) * math.sin((20 * Value - 11.125) * 1.3962634015954636) * 0.5
			end
			
			return 2 ^ -20 * Value + 10 * math.sin(20 * Value - 11.125 * 1.3962634015954636) * 0.5 + 1
		end,
	},
}

return Easing
5 Likes