diff --git a/src/pew/main.cpp b/src/pew/main.cpp index 49a37489bfe22b8c52f02135413cc6a8fceb50bb..fe67b22cc9a30448627548b09d020307f1eabdd3 100644 --- a/src/pew/main.cpp +++ b/src/pew/main.cpp @@ -99,21 +99,20 @@ vikingScene(Scene& scene) { int main() { constexpr auto aspect = 16.0 / 9.0; - constexpr auto width = 1920; + constexpr auto width = 300; constexpr auto height = static_cast<int>(width / aspect); - constexpr auto lookFrom = vec3(0, 2, 1); - constexpr auto lookAt = vec3(0, 1, -1); + constexpr auto lookFrom = vec3(13, 2, 3); + constexpr auto lookAt = vec3(0, 0, 0); Scene scene { { width, height } }; - // scene.getRenderPass().setMaxDepth(50).setSampleRate(100).setCamera<DepthCamera>( - // lookFrom, lookAt, vec3(0, 1, 0), 70, aspect, 0.1, (lookAt - lookFrom).length()); - scene.getRenderPass().setMaxDepth(50).setSampleRate(100).setCamera<HitCamera>( - lookFrom, lookAt, vec3(0, 1, 0), 70.0, aspect); - - // populateScene(scene); - triangleScene(scene); - vikingScene(scene); - - scene.render(20, true, true); - scene.waitIdle(); + scene.getRenderPass().setMaxDepth(50).setSampleRate(10).setCamera<HitCamera>( + lookFrom, lookAt, vec3(0, 1, 0), 20.0, aspect); + + while (!scene.shouldClose()) { + scene.clear(); + populateScene(scene); + scene.render(8, false, true); + scene.waitIdle<false>(); + } + scene.closeWindow(); } \ No newline at end of file diff --git a/src/pew/scene/scene.cpp b/src/pew/scene/scene.cpp index 96b00309d33f4f6395906f0dc43a3fec2e7c9855..f889347ec9dd466497bfb8717c3e10416aa3cdad 100644 --- a/src/pew/scene/scene.cpp +++ b/src/pew/scene/scene.cpp @@ -13,28 +13,42 @@ namespace pew { str << "Rendering at " << extent.width << "x" << extent.height; window.setTitle(str.str()); } + void Scene::render(uint32_t threadCount, bool detectEdges, bool showWindow) { - if (showWindow) window.startAndFork(); + static std::thread* window_thread = showWindow ? window.startAndFork() : nullptr; if (detectEdges) { renderPass.renderHitStage(threadCount)->join(); - hitBufferAsColor = renderPass.hitBufferAsColor(); - window.addBuffer(&hitBufferAsColor); + static bool isBufferAdded = false; + if (!isBufferAdded) { + hitBufferAsColor = renderPass.hitBufferAsColor(); + window.addBuffer(&hitBufferAsColor); + isBufferAdded = true; + } } job = renderPass.renderColorStage(threadCount, detectEdges, true); } + void - Scene::waitIdle() { - if (job) job->join(); - window.join(); + Scene::clear() { + collection.collection.clear(); + materials.clear(); + textures.clear(); } + void Scene::onShouldClose() { + m_shouldClose = true; + } + + void + Scene::closeWindow() { window.closeWindow(); if (job) job->stop(); } + void Scene::onKeyInput(SDL_KeyboardEvent event, bool down) { if (down) { diff --git a/src/pew/scene/scene.hpp b/src/pew/scene/scene.hpp index 01f74144293284c09b80e5a59a17fbac0de75b11..cdda0a10be68d00f3a6d6e65e6d30e1eb81c3f47 100644 --- a/src/pew/scene/scene.hpp +++ b/src/pew/scene/scene.hpp @@ -26,6 +26,7 @@ namespace pew { Window window; std::shared_ptr<RenderJob> job; std::vector<Color> hitBufferAsColor; + bool m_shouldClose = false; public: Scene(const Extent2D& extent); @@ -33,8 +34,15 @@ namespace pew { void render(uint32_t threadCount, bool detectEdges, bool showWindow); + template<bool CLOSE_ON_FINISH> void - waitIdle(); + waitIdle() { + if (job) job->join(); + if constexpr (CLOSE_ON_FINISH) { + closeWindow(); + window.join(); + } + } private: void @@ -44,6 +52,9 @@ namespace pew { onKeyInput(SDL_KeyboardEvent event, bool down); public: + void + closeWindow(); + template<typename T, typename... Args> auto& add(Args&&... args) { @@ -69,6 +80,9 @@ namespace pew { renderPass.setCamera<T>(std::forward<Args>(args)...); } + void + clear(); + inline auto& getRenderPass() { return renderPass; @@ -78,6 +92,11 @@ namespace pew { getWindow() { return window; } + + inline auto + shouldClose() { + return m_shouldClose; + } }; } // namespace pew