Garry's Mod Wiki

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>