66 lines
1.6 KiB
C#
66 lines
1.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class FrameSmoothing: Smoothing
|
|
{
|
|
[Export( PropertyHint.Range, "0,600")]
|
|
public float frames = 10;
|
|
|
|
protected override float _ComputeInterpolationAmount( float delta )
|
|
{
|
|
frames = Mathf.Clamp( frames, 0, 600 );
|
|
|
|
if ( frames <= 0 )
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
var coefficient = GetLerpedCoefficientForFrames( frames );
|
|
return 1f - Mathf.Exp( -coefficient * delta );
|
|
}
|
|
|
|
public static float ComputeCoefficient( float delta, float frames )
|
|
{
|
|
int floored = Mathf.FloorToInt( frames );
|
|
|
|
float low = ComputeCoefficientInt( delta, floored );
|
|
float high = ComputeCoefficientInt( delta, floored + 1 );
|
|
|
|
return Mathf.Lerp( low, high, frames - floored );
|
|
}
|
|
|
|
public static float ComputeCoefficientInt( float delta, int frames )
|
|
{
|
|
frames = Mathf.Clamp( frames, 0, 600 );
|
|
|
|
if ( frames <= 0 )
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
var coefficient = GetCoefficientForFrames( frames );
|
|
return 1f - Mathf.Exp( -coefficient * delta );
|
|
}
|
|
|
|
public static float GetLerpedCoefficientForFrames( float frames )
|
|
{
|
|
int floored = Mathf.FloorToInt( frames );
|
|
|
|
float low = GetCoefficientForFrames( floored );
|
|
float high = GetCoefficientForFrames( floored + 1 );
|
|
|
|
return Mathf.Lerp( low, high, frames - floored );
|
|
}
|
|
|
|
public static float GetCoefficientForFrames( int frames )
|
|
{
|
|
return FrameSmoothingTable.Get( frames );
|
|
}
|
|
|
|
}
|
|
} |