129 lines
3.3 KiB
C#
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 );
|
|
|
|
}
|
|
}
|
|
} |