rj-action-library/Runtime/Animation/Smoothing/Smoothing.cs

129 lines
3.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class Smoothing: Resource
{
float _currentFloat = 0;
Vector2 _currentVector2 = Vector2.Zero;
Vector3 _currentVector3 = Vector3.Zero;
Vector4 _currentVector4 = Vector4.Zero;
Quaternion _currentQuaternion = Quaternion.Identity;
Color _currentColor = Colors.Black;
public float Smooth( float nextValue, float delta )
{
_currentFloat = Mathf.Lerp( _currentFloat, nextValue, _ComputeInterpolationAmount( delta ) );
return _currentFloat;
}
public static float Apply( Smoothing sm, float value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
public Vector2 Smooth( Vector2 nextValue, float delta )
{
_currentVector2 = _currentVector2.Lerp( nextValue, _ComputeInterpolationAmount( delta ) );
return _currentVector2;
}
public static Vector2 Apply( Smoothing sm, Vector2 value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
public Vector3 Smooth( Vector3 nextValue, float delta )
{
_currentVector3 = _currentVector3.Lerp( nextValue, _ComputeInterpolationAmount( delta ) );
return _currentVector3;
}
public static Vector3 Apply( Smoothing sm, Vector3 value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
public Vector4 Smooth( Vector4 nextValue, float delta )
{
_currentVector4 = _currentVector4.Lerp( nextValue, _ComputeInterpolationAmount( delta ) );
return _currentVector4;
}
public static Vector4 Apply( Smoothing sm, Vector4 value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
public Quaternion Smooth( Quaternion nextValue, float delta )
{
_currentQuaternion = _currentQuaternion.Slerp( nextValue, _ComputeInterpolationAmount( delta ) );
return _currentQuaternion;
}
public static Quaternion Apply( Smoothing sm, Quaternion value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
public Color Smooth( Color nextValue, float delta )
{
_currentColor = _currentColor.Lerp( nextValue, _ComputeInterpolationAmount( delta ) );
return _currentColor;
}
public static Color Apply( Smoothing sm, Color value, float delta )
{
if ( sm == null ){ return value; }
return sm.Smooth( value, delta );
}
protected virtual float _ComputeInterpolationAmount( float delta )
{
return 0;
}
public virtual float ComputeDuration( float delta = 1f/240f, float tresholdValue = 0.05f )
{
var cached = _currentFloat;
var value = 1f;
_currentFloat = 1f;
var duration = 0f;
var lastValue = value;
var maxDuration = 30;
while ( value > tresholdValue && duration < maxDuration )
{
lastValue = value;
value = Smooth( 0, delta );
duration += delta;
}
_currentFloat = cached;
return MathX.RemapClamped( tresholdValue, lastValue, value, duration - delta, duration );
}
}
}