File Animation.cs

File List > Render > src > Animation.cs

Go to the documentation of this file.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

namespace Qkmaxware.Rendering {

public interface IAnimator {
    void OnStart() {}
    void OnEarlyUpdate(TimeSpan dt) {}
    void OnUpdate(TimeSpan dt) {}
    void OnLateUpdate(TimeSpan dt) {}
}

public abstract class AnimatedScene : IEnumerable<Color[,]> {

    public Scene Scene;
    public BaseCamera Camera {get; private set;}


    protected abstract TimeSpan DeltaTime();

    public AnimatedScene(Scene scene) : this(new PerspectiveCamera(new Size(640, 480)), scene) {}

    public AnimatedScene(BaseCamera camera, Scene scene) {
        this.Camera = camera;
        this.Scene = scene;
    }

    public virtual IEnumerator<Color[,]> GetEnumerator() {
        // First render
        var initialObjects = Scene.OfType<IAnimator>();
        foreach (var obj in initialObjects) {
            obj.OnStart();
        }
        Camera.Render(Scene);
        yield return Camera.PixelBuffer;

        // Subsequent render loop
        while(true) {
            var objects = Scene.OfType<IAnimator>();
            var dt = this.DeltaTime();
            foreach (var obj in objects) {
                obj.OnEarlyUpdate(dt);
            }
            foreach (var obj in objects) {
                obj.OnUpdate(dt);
            }
            foreach (var obj in objects) {
                obj.OnLateUpdate(dt);
            }
            Camera.Render(Scene);
            yield return Camera.PixelBuffer;
        }
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}

public class FixedFpsAnimatedScene : AnimatedScene {
    public int FPS = 30;

    public FixedFpsAnimatedScene(Scene scene, int fps = 30) : base(scene) {
        this.FPS = fps;
    }

    public FixedFpsAnimatedScene(BaseCamera camera, Scene scene, int fps = 30) : base(camera, scene) {
        this.FPS = fps;
    }

    protected override TimeSpan DeltaTime() {
        return TimeSpan.FromSeconds(1.0/FPS);
    }
}

public class RealtimeAnimatedScene : AnimatedScene {
    public RealtimeAnimatedScene(Scene scene) : base(scene) {}
    public RealtimeAnimatedScene(BaseCamera camera, Scene scene) : base(camera, scene) {}

    private DateTime lastFrame = DateTime.Now;
    protected override TimeSpan DeltaTime() {
        var now = DateTime.Now;
        var dt = now - lastFrame;
        lastFrame = now;
        return dt;
    }
}

}