#pragma once namespace Components { class Renderer : public Component { public: typedef void(Callback)(); typedef void(BackendCallback)(IDirect3DDevice9*); Renderer(); ~Renderer(); static int Width(); static int Height(); static void Once(Utils::Slot callback); static void OnFrame(Utils::Slot callback); static void OnBackendFrame(Utils::Slot callback); static void OnDelay(Utils::Slot callback, std::chrono::nanoseconds delay); static void OnDeviceRecoveryEnd(Utils::Slot callback); static void OnDeviceRecoveryBegin(Utils::Slot callback); private: class DelayedSlot { public: std::chrono::nanoseconds delay; Utils::Time::Interval interval; Utils::Slot callback; }; static void FrameStub(); static void FrameHandler(); static void BackendFrameStub(); static void BackendFrameHandler(); static void DelaySignal(); static Utils::Signal FrameSignal; static Utils::Signal FrameOnceSignal; static Utils::Signal EndRecoverDeviceSignal; static Utils::Signal BeginRecoverDeviceSignal; static Utils::Signal BackendFrameSignal; static std::vector DelayedSlots; }; }