Files
2026-07-13 13:13:17 +08:00

77 lines
2.6 KiB
C#

using T3.Core.Animation;
using T3.Core.Utils;
namespace Lib.numbers.anim.time;
[Guid("485af23d-543e-44a7-b29f-693ed9533ab5")]
internal sealed class StopWatch : Instance<StopWatch>
{
[Output(Guid = "617afbbc-8199-43c0-b630-4563e65959ef", DirtyFlagTrigger = DirtyFlagTrigger.Animated)]
public readonly Slot<float> Delta = new();
[Output(Guid = "195CDCD3-6F02-471A-96E4-3F44A1D03CC2", DirtyFlagTrigger = DirtyFlagTrigger.Animated)]
public readonly Slot<float> LastDuration = new();
public StopWatch()
{
LastDuration.UpdateAction += Update;
Delta.UpdateAction += Update;
}
private void Update(EvaluationContext context)
{
var resetHit = MathUtils.WasTriggered(ResetTrigger.GetValue(context), ref _wasResetTrigger);
var runTimeInSecs = Playback.RunTimeInSecs;
if (resetHit)
{
LastDuration.Value = (float)(runTimeInSecs - _startTime);
_startTime = runTimeInSecs;
_accumulatedDuration = 0;
}
if (context.Playback.PlaybackSpeed != 0)
_accumulatedDuration += runTimeInSecs - _lastUpdateTime;
_lastUpdateTime = runTimeInSecs;
var timeInSecs = PauseWithPlayback.GetValue(context) switch
{
false => (float)(runTimeInSecs - _startTime),
true => _accumulatedDuration
};
Delta.Value = ConvertTime(timeInSecs, DurationIn.GetEnumValue<TimeModes>(context), context.Playback);
LastDuration.DirtyFlag.Clear();
}
private static float ConvertTime(double timeInSecs, TimeModes mode, Playback contextPlayback)
{
return mode switch
{
TimeModes.TimeInSecs => (float)timeInSecs,
TimeModes.BeatTime => (float)contextPlayback.BarsFromSeconds(timeInSecs),
_ => (float)contextPlayback.BarsFromSeconds(timeInSecs)
};
}
private double _startTime;
private bool _wasResetTrigger;
private double _accumulatedDuration;
private double _lastUpdateTime;
private enum TimeModes
{
TimeInSecs,
BeatTime,
}
[Input(Guid = "38754151-704A-4374-817E-98DFACA62E49")]
public readonly InputSlot<bool> ResetTrigger = new();
[Input(Guid = "C19343B2-7534-43A9-A9A6-CE9019437C62", MappedType = typeof(TimeModes))]
public readonly InputSlot<int> DurationIn = new();
[Input(Guid = "BF89D8B2-D8FE-4A3C-9255-67944EC831CB")]
public readonly InputSlot<bool> PauseWithPlayback = new();
}