Engine

// Top level control. Engine usage must be after the API is created and before the API is destroyed.
class Engine : public EngCfg
{
public:
    // Check if display was resized this frame.
    RVAPI bool IsResize() const;

    // Check if currently in full screen mode.
    RVAPI bool IsFullScreen() const;

    // Get global.
    RVAPI static Engine &GetGlobal();

    // Get monitor count.
    RVAPI uint GetMonitorCount() const;

    // Get window rectangle.
    RVAPI B2i GetWindowRect() const;

    // Get elapsed seconds since last frame.
    RVAPI double GetElapsed() const;

    // Get current scene.
    template<typename K = Scene>
    K &GetScene() const { return *(K *)scene(); }

    // Start engine.
    RVAPI void Start();

    // Allocate scene memory. Usage: new (engine.AllocScene<SceneType>()) SceneType().
    template<typename K = Scene>
    void *AllocScene() { return scene.Alloc<K>(); }

    // Constructor.
    RVAPI Engine();

    // Destructor.
    RVAPI ~Engine();

private:
    SafePtr<Scene> scene;
};

inline Engine &ENG() { return Engine::GetGlobal(); }

template<typename K = Scene>
K &SCN() { return (K &)(ENG().GetScene()); }

template<typename K = Overlay>
K &OVL() { return (K &)(ENG().GetScene().GetOverlay()); }