using System.Collections.Generic;
namespace Microsoft.Iris.Render.OpenGL
{
///
/// Owns the set of live animations and advances them on each pulse. Pause/step/resume
/// gate whether time flows. Objects are created here so the session stays a thin factory.
///
public sealed class GLAnimationSystem : IAnimationSystem
{
private readonly List m_animations = new List();
private bool m_paused;
public int UpdatesPerSecond { get; set; } = 60;
public float SpeedAdjustment { get; set; } = 1f;
public bool BackCompat { set { /* compatibility flag; no behavioral change */ } }
public IKeyframeAnimation CreateKeyframeAnimation(object objUser, AnimationInput initialValue)
{
var a = new GLKeyframeAnimation(initialValue);
m_animations.Add(a);
return a;
}
public IAnimationGroup CreateAnimationGroup(object objUser)
{
var g = new GLAnimationGroup();
m_animations.Add(g);
return g;
}
public IExternalAnimationInput CreateExternalAnimationInput(object objUser, IAnimationPropertyMap propertyMap)
=> new GLExternalAnimationInput(propertyMap);
public void PulseTimeAdvance(int nAdvanceMs)
{
if (m_paused)
return;
int scaled = (int)(nAdvanceMs * SpeedAdjustment);
foreach (GLAnimation a in m_animations)
{
if (a.IsPlaying)
a.Advance(scaled);
}
}
public void PauseAnimations() => m_paused = true;
public void StepAnimations(int nAdvanceMs)
{
foreach (GLAnimation a in m_animations)
{
if (a.IsPlaying)
a.Advance(nAdvanceMs);
}
}
public void ResumeAnimations() => m_paused = false;
}
}