Revision Difference
Global.Lerp#528320
<function name="Lerp" parent="Global" type="libraryfunc">
	<description>
Performs a linear interpolation from the start number to the end number.
This function provides a very efficient and easy way to smooth out movements.
<note>This function is not meant to be used with constant value in the first argument, if you're dealing with animation! Use a value that changes over time. See example for **proper** usage of Lerp for animations</note>
	</description>
	<realm>Shared and Menu</realm>
	<file line="239-L246">lua/includes/util.lua</file>
	<args>
		<arg name="t" type="number">The fraction for finding the result. This number is clamped between 0 and 1. Shouldn't be a constant.</arg>
		<arg name="from" type="number">The starting number. The result will be equal to this if delta is 0.</arg>
		<arg name="to" type="number">The ending number. The result will be equal to this if delta is 1.</arg>
	</args>
	<rets>
		<ret name="" type="number">The result of the linear interpolation, `from + (to - from) * t`.</ret>
	</rets>
</function>
<example>
	<description>Example of simple Lerp usage for animations.</description>
	<code>
local start = SysTime()
hook.Add("HUDPaint", "LerpAnimation", function()
	draw.RoundedBox( 4, 100, 100, Lerp( SysTime() - start, 0, 100 ), 20, color_white )
	if SysTime() - start > 2 then
		start = SysTime()
	end
end)
	</code>
</example>
<example>
	<description>Advanced example of Lerp animation. Try to improve this code: If the animation is not finished, start a new one from where it stopped, not from `oldhp` of the previous animation.</description>
	<description>Advanced example of Lerp animation: A health bar that will smooth the health change over 0.5 seconds to reach new health value from the previous value.</description>
	<code>
local start, oldhp, newhp = 0, 0, 0⤶
⤶
hook.Add("HUDPaint", "LerpAnimation", function()⤶
	local hp = LocalPlayer():Health()⤶
	if newhp ~= hp then⤶
local start, oldhp, newhp = 0, -1, -1⤶
local barW = 200⤶
local animationTime = 0.5 -- seconds⤶
⤶
hook.Add( "HUDPaint", "LerpAnimation", function()
	-- Local player still loading, do nothing⤶
	if ( !IsValid( LocalPlayer() ) ) then return end⤶
⤶
	local hp = LocalPlayer():Health()⤶
	local maxhp = LocalPlayer():GetMaxHealth()⤶
⤶
	-- The values are not initialized yet, do so right now⤶
	if ( oldhp == -1 && newhp == -1 ) then⤶
		oldhp = hp⤶
		newhp = hp⤶
	end⤶
⤶
	-- You can use a different smoothing function here⤶
	local smoothHP = Lerp( ( SysTime() - start ) / animationTime, oldhp, newhp )⤶
⤶
	-- Health was changed, initialize the animation⤶
	if newhp ~= hp then⤶
		-- Old animation is still in progress, adjust⤶
		if ( smoothHP != hp ) then⤶
			-- Pretend our current "smooth" position was the target so the animation will⤶
			-- not jump to the old target and start to the new target from there⤶
			newhp = smoothHP⤶
		end⤶
⤶
		oldhp = newhp⤶
		start = SysTime()
		newhp = hp
	elseif SysTime() - start > 0.5 then⤶
		oldhp = hp⤶
	end
	draw.RoundedBox( 4, 100, 200, 200, 100, color_black )
	draw.RoundedBox( 4, 100, 200, math.max(0, Lerp( (SysTime() - start) / 0.5, oldhp, newhp) ) / LocalPlayer():GetMaxHealth() * 200, 100, color_white )
end)
	draw.RoundedBox( 4, 100, 200, barW, 100, color_black )
	draw.RoundedBox( 4, 100, 200, math.max( 0, smoothHP ) / maxhp * barW, 100, color_white )
end )
	</code>
</example>
 Garry's Mod
			Garry's Mod 
		 Rust
			Rust 
		 Steamworks
			Steamworks 
		 Wiki Help
			Wiki Help