174 lines
5.6 KiB
C#
174 lines
5.6 KiB
C#
using T3.Core.Utils;
|
|
|
|
namespace Lib.numbers.anim._obsolete;
|
|
|
|
[Guid("c5e39c67-256f-4cb9-a635-b62a0d9c796c")]
|
|
internal sealed class _AnimValueOld : Instance<_AnimValueOld>
|
|
{
|
|
[Output(Guid = "c47e8843-6e8d-4eaf-a554-874b3af9ee63", DirtyFlagTrigger = DirtyFlagTrigger.Animated)]
|
|
public readonly Slot<float> Result = new();
|
|
|
|
public _AnimValueOld()
|
|
{
|
|
Result.UpdateAction += Update;
|
|
}
|
|
|
|
private void Update(EvaluationContext context)
|
|
{
|
|
_phase = Phase.GetValue(context);
|
|
_bias = Bias.GetValue(context);
|
|
_shape = (Shapes)(int)Shape.GetValue(context).Clamp(0, Enum.GetValues(typeof(Shapes)).Length);
|
|
_ratio = Ratio.GetValue(context);
|
|
var f = (SpeedFactors)AllowSpeedFactor.GetValue(context).Clamp(0,2);
|
|
switch (f)
|
|
{
|
|
case SpeedFactors.None:
|
|
_speedFactor = 1;
|
|
break;
|
|
case SpeedFactors.FactorA:
|
|
{
|
|
if (!context.FloatVariables.TryGetValue(SpeedFactorA, out _speedFactor))
|
|
_speedFactor = 1;
|
|
|
|
break;
|
|
}
|
|
case SpeedFactors.FactorB:
|
|
if (!context.FloatVariables.TryGetValue(SpeedFactorB, out _speedFactor))
|
|
_speedFactor = 1;
|
|
|
|
break;
|
|
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
|
|
var time = OverrideTime.HasInputConnections
|
|
? OverrideTime.GetValue(context)
|
|
: context.LocalFxTime;
|
|
|
|
var rate = Rate.GetValue(context);
|
|
|
|
_time = time * rate * _speedFactor;
|
|
LastFraction = (float)MathUtils.Fmod(_time, 1);
|
|
|
|
var normalizedValue = CalcNormalizedValueForFraction(_time);
|
|
Result.Value = normalizedValue * Amplitude.GetValue(context) + Offset.GetValue(context);
|
|
}
|
|
|
|
public float CalcNormalizedValueForFraction(double time)
|
|
{
|
|
var value = 0f;
|
|
|
|
switch (_shape)
|
|
{
|
|
case Shapes.Ramps:
|
|
case Shapes.Saws:
|
|
case Shapes.Wave:
|
|
case Shapes.Square:
|
|
case Shapes.ZigZag:
|
|
case Shapes.KickSaws:
|
|
var fraction = CalcFraction(time);
|
|
value= SchlickBias(MapShapes[(int)_shape](fraction), _bias);
|
|
break;
|
|
|
|
case Shapes.Random:
|
|
value = (float)((double)MathUtils.XxHash((uint)time) / uint.MaxValue);
|
|
break;
|
|
|
|
case Shapes.Endless:
|
|
value = (float)time;
|
|
break;
|
|
|
|
case Shapes.Noise:
|
|
value = MathUtils.PerlinNoise((float)time, 1,5, 42);
|
|
break;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
private float CalcFraction(double t)
|
|
{
|
|
return ((float)MathUtils.Fmod(t + _phase, 1) / _ratio).Clamp(0, 1);
|
|
}
|
|
|
|
private float SchlickBias(float x, float bias)
|
|
{
|
|
return x / ((1 / bias - 2) * (1 - x) + 1);
|
|
}
|
|
|
|
private delegate float MappingFunction(float fraction);
|
|
|
|
|
|
private readonly MappingFunction[] MapShapes =
|
|
{
|
|
f => f, // 0: Ramp
|
|
f => 1 - f, // 1: Saw,
|
|
f => (float)Math.Sin((f + 0.25) * 2 * 3.141592f) / 2 + 0.5f, // 2: Wave
|
|
f => f > 0.5f ? 1 : 0, // 3: Square
|
|
f => f < 0.5f ? (f * 2) : (1 - (f - 0.5f) * 2), // 4: ZigZag,
|
|
f => f, // 5: Random
|
|
f => f, // 6: Endless
|
|
f => f, // 7: Noise
|
|
f => f<=0 ? 0 : (1-f.Clamp(0,1)), // 8: Kick (SraResting at last value)
|
|
};
|
|
|
|
public enum Shapes
|
|
{
|
|
Ramps = 0,
|
|
Saws = 1,
|
|
Wave = 2,
|
|
Square = 3,
|
|
ZigZag = 4,
|
|
Random = 5,
|
|
Endless = 6,
|
|
Noise = 7,
|
|
KickSaws =8,
|
|
}
|
|
|
|
private Shapes _shape;
|
|
private float _bias;
|
|
private float _phase;
|
|
private float _ratio = 1;
|
|
private float _speedFactor = 1;
|
|
private double _time;
|
|
|
|
public float LastFraction;
|
|
|
|
|
|
private enum SpeedFactors
|
|
{
|
|
None,
|
|
FactorA,
|
|
FactorB,
|
|
}
|
|
|
|
private const string SpeedFactorA = "SpeedFactorA";
|
|
private const string SpeedFactorB = "SpeedFactorB";
|
|
|
|
[Input(Guid = "4C38C34C-D992-47F1-BCB5-9BD13FC6474B", MappedType = typeof(Shapes))]
|
|
public readonly InputSlot<int> Shape = new();
|
|
|
|
[Input(Guid = "a4d48d80-936c-4bbb-a2e8-32f86edd4ab2")]
|
|
public readonly InputSlot<float> Rate = new();
|
|
|
|
[Input(Guid = "3b9e7272-ccf3-4fff-a079-5fcbb8a6c7d5")]
|
|
public readonly InputSlot<float> Ratio = new();
|
|
|
|
[Input(Guid = "36ae5b4b-62e9-49c0-b841-97394122cb1e")]
|
|
public readonly InputSlot<float> Phase = new();
|
|
|
|
[Input(Guid = "8a5033c2-7d22-44d7-9472-d23677b11388")]
|
|
public readonly InputSlot<float> Amplitude = new();
|
|
|
|
[Input(Guid = "126511E6-771D-4DD0-8A9D-1861C7B45D23")]
|
|
public readonly InputSlot<float> Offset = new();
|
|
|
|
[Input(Guid = "3396DE1F-03AF-43EE-A43A-55016BEC70AE")]
|
|
public readonly InputSlot<float> Bias = new();
|
|
|
|
[Input(Guid = "76ca8a8b-f252-4687-805e-fb7a86a16567")]
|
|
public readonly InputSlot<float> OverrideTime = new();
|
|
|
|
[Input(Guid = "6ca8a8b2-f252-4687-805e-fb7a86a16567", MappedType = typeof(SpeedFactors))]
|
|
public readonly InputSlot<int> AllowSpeedFactor = new();
|
|
} |