rokojori_action_library/Runtime/Godot/Extensions/CurveExtensions.cs

79 lines
1.7 KiB
C#

using Godot;
using System.Collections.Generic;
namespace Rokojori
{
public static class CurveExtensions
{
public static Curve WithPoints( this Curve curve, params Vector2[] points )
{
curve.ClearPoints();
points.ForEach( p => curve.AddPoint( p ) );
return curve;
}
public static Curve WithValues( this Curve curve, params float[] values )
{
curve.ClearPoints();
for ( int i = 0; i < values.Length; i++ )
{
float x = i / (float) ( values.Length - 1f );
curve.AddPoint( new Vector2( x, values[ i ] ) );
}
return curve;
}
public static Curve WithDomainRange( this Curve curve, float min, float max )
{
curve.MinDomain = min;
curve.MaxDomain = max;
return curve;
}
public static Curve WithValueRange( this Curve curve, float min, float max )
{
curve.MinValue = min;
curve.MaxValue = max;
return curve;
}
public static Curve WithLinearTangents( this Curve curve )
{
var points = curve.PointCount;
for ( int i = 0; i < points; i++ )
{
if ( i > 0 )
{
curve.SetPointLeftTangent( i, curve.GetPointPosition( i ).Y - curve.GetPointPosition( i - 1 ).Y );
}
if ( i < ( points - 1 ) )
{
curve.SetPointRightTangent( i, curve.GetPointPosition( i + 1 ).Y - curve.GetPointPosition( i ).Y );
}
}
for ( int i = 0; i < points; i++ )
{
if ( i > 0 )
{
curve.SetPointLeftMode( i, Curve.TangentMode.Linear );
}
if ( i < ( points - 1 ) )
{
curve.SetPointRightMode( i, Curve.TangentMode.Linear );
}
}
return curve;
}
}
}