namespace MrGameEng.Core;
///
/// Engine time service: per-frame delta, total elapsed time, time scaling and frame counter.
/// Advanced once per frame (or per fixed tick) by the host.
///
public sealed class GameClock
{
/// Seconds elapsed since the previous frame, multiplied by .
public float DeltaTime { get; private set; }
/// Seconds elapsed since the previous frame, unaffected by .
public float UnscaledDeltaTime { get; private set; }
/// Total scaled time in seconds since the game started.
public double TotalTime { get; private set; }
/// Total unscaled time in seconds since the game started.
public double UnscaledTotalTime { get; private set; }
/// Multiplier applied to . 0 pauses gameplay, 1 is real time. Never negative.
public float TimeScale
{
get => _timeScale;
set => _timeScale = value < 0f ? 0f : value;
}
/// Number of completed frames since the game started.
public long FrameCount { get; private set; }
private float _timeScale = 1f;
/// Advances the clock by one frame. Called by the host; games should not call this.
public void Advance(float unscaledDeltaSeconds)
{
UnscaledDeltaTime = unscaledDeltaSeconds;
DeltaTime = unscaledDeltaSeconds * _timeScale;
UnscaledTotalTime += unscaledDeltaSeconds;
TotalTime += DeltaTime;
FrameCount++;
}
}