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