#pragma once #include #include #include "Common/Sizes.hpp" #include "GFX/Actions.hpp" #include "GFX/Camera.hpp" #include "GFX/Texture.hpp" #include "GFX/Window.hpp" namespace MC { class Render { public: struct Scene { GFX::Actions actions; GFX::Camera camera; }; struct Control { std::mutex mutex; std::condition_variable cv; Bool logic_done = false; Bool render_done = false; Scene scene; void send_render_data(Scene new_scene) { { std::scoped_lock lock(mutex); scene = std::move(new_scene); logic_done = true; } cv.notify_one(); } Scene wait_for_render_data() { Scene new_scene; { std::unique_lock lock(mutex); cv.wait(lock, [&]{ return logic_done; }); new_scene = scene; logic_done = false; render_done = false; } cv.notify_one(); return new_scene; } void wait_for_render_finish() { { std::unique_lock lock(mutex); cv.wait(lock, [&]{ return render_done; }); logic_done = false; render_done = false; } cv.notify_one(); } void finish_render() { { std::scoped_lock lock(mutex); render_done = true; } cv.notify_one(); } }; explicit Render(GFX::Window& window, std::shared_ptr control) : m_window(window) , m_control(std::move(control)) {} void run(); private: void render_scene(Scene const& actions, GFX::Texture const& texture) const; static void setup_gl(); void wait_until_next_frame_start(Real spent_time_budget) const; GFX::Resources m_resources; GFX::Window& m_window; std::shared_ptr m_control; }; }