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

93 lines
2.1 KiB
C#
Raw Normal View History

2025-01-03 12:09:23 +00:00
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class AnimationCurve3D:Resource
{
[Export]
public float duration = 1;
[Export]
public float durationRandomRange = 0;
[Export]
public float delay = 0;
[Export]
public float delayRandomRange = 0;
[Export]
public Curve xCurve = MathX.Curve( 0, 0, -1, 1 );
[Export]
public Curve yCurve = MathX.Curve( 0, 0, -1, 1 );
[Export]
public Curve zCurve = MathX.Curve( 0, 0, -1, 1 );
[Export]
public float scaleAll = 1;
[Export]
public float scaleAllRandomRange = 0;
public float GetRandomizedDuration( Vector3 random )
{
return duration + random.X;
}
public float GetRandomizedDelay( Vector3 random )
{
return delay + random.Y;
}
public float GetRandomizedEndTime( Vector3 random )
{
return GetRandomizedDuration( random ) + GetRandomizedDelay( random );
}
public float GetRandomizedScale( Vector3 random )
{
return scaleAll + random.Z;
}
public Vector3 Randomize( RandomEngine random = null )
{
random = random == null ? GodotRandom.Get() : random;
return new Vector3(
random.Polar() * durationRandomRange,
random.Polar() * delayRandomRange,
random.Polar() * scaleAllRandomRange
);
}
public Vector3 Sample( float time, float durationOffset = 0, float delayOffset = 0, float scaleOffset = 0 )
{
time -= Mathf.Max( 0f, delay + delayOffset );
var phase = MathX.Clamp01( time / ( Mathf.Max( 0.001f, duration + durationOffset ) ) );
var x = xCurve.Sample( phase ) * ( scaleAll + scaleOffset );
var y = yCurve.Sample( phase ) * ( scaleAll + scaleOffset );
var z = zCurve.Sample( phase ) * ( scaleAll + scaleOffset );
return new Vector3( x, y, z );
}
public Vector3 Sample( float time, Vector3 randomization )
{
return Sample( time, randomization.X, randomization.Y, randomization.Z );
}
}
}