From 17e3458b6d0f03ec597de8987e35ee7e686d61dc Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Wed, 18 Aug 2021 17:50:31 +0200
Subject: [PATCH] [#106] Add hotkey to freeze frame

---
 projects/indirect_dispatch/src/App.cpp | 48 +++++++++++++++++---------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index ecdbd50e..230ef92c 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -133,11 +133,38 @@ void App::run() {
 	};
 	sceneObjects.push_back(sphere);
 
+	bool spaceWasPressed = false;
+
+	m_window.e_key.add([&](int key, int scancode, int action, int mods) {
+		if (key == GLFW_KEY_SPACE) {
+			if (action == GLFW_PRESS) {
+				if (!spaceWasPressed) {
+					freezeFrame = !freezeFrame;
+				}
+				spaceWasPressed = true;
+			}
+			else if (action == GLFW_RELEASE) {
+				spaceWasPressed = false;
+			}
+		}
+	});
+
 	auto frameEndTime = std::chrono::system_clock::now();
 
 	while (m_window.isWindowOpen()) {
+
 		vkcv::Window::pollEvents();
 
+		if (!freezeFrame) {
+
+			frameStartTime          = frameEndTime;
+			viewProjectionPrevious  = viewProjection;
+
+			for (Object& obj : sceneObjects) {
+				obj.mvpPrevious = obj.mvp;
+			}
+		}
+
 		if (m_window.getHeight() == 0 || m_window.getWidth() == 0)
 			continue;
 
@@ -154,12 +181,13 @@ void App::run() {
 			m_motionBlur.setResolution(m_windowWidth, m_windowHeight);
 		}
 
-		if (!freezeFrame) {
+		if(!freezeFrame)
 			frameEndTime = std::chrono::system_clock::now();
-		}
-		auto deltatime      = std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime);
 
-		m_cameraManager.update(0.000001 * static_cast<double>(deltatime.count()));
+		const float microsecondToSecond = 0.000001;
+		const float fDeltaTimeSeconds = microsecondToSecond * std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime).count();
+
+		m_cameraManager.update(fDeltaTimeSeconds);
 
 		const auto      time                = frameEndTime - appStartTime;
 		const float     fCurrentTime        = std::chrono::duration_cast<std::chrono::milliseconds>(time).count() * 0.001f;
@@ -261,9 +289,6 @@ void App::run() {
 		vkcv::ImageHandle motionBlurOutput;
 
 		if (motionVectorVisualisationMode == eMotionVectorVisualisationMode::None) {
-			const float microsecondToSecond = 0.000001;
-			const float fDeltaTimeSeconds = microsecondToSecond * std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime).count();
-
 			float cameraNear;
 			float cameraFar;
 			m_cameraManager.getActiveCamera().getNearFar(cameraNear, cameraFar);
@@ -362,14 +387,5 @@ void App::run() {
 		gui.endGUI();
 
 		m_core.endFrame();
-
-		if (!freezeFrame) {
-			viewProjectionPrevious = viewProjection;
-			frameStartTime = frameEndTime;
-
-			for (Object& obj : sceneObjects) {
-				obj.mvpPrevious = obj.mvp;
-			}
-		}
 	}
 }
\ No newline at end of file
-- 
GitLab