From d0073d0927f458c7084644510181301e8f9e4b5c Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Wed, 18 Aug 2021 12:25:59 +0200
Subject: [PATCH] [#106] Add options for object rotation to stress test motion
 blur under complex movement

---
 .../resources/shaders/mesh.frag                  |  6 +++---
 .../resources/shaders/mesh.vert                  |  9 +++++----
 projects/indirect_dispatch/src/App.cpp           | 16 ++++++++++++----
 3 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/projects/indirect_dispatch/resources/shaders/mesh.frag b/projects/indirect_dispatch/resources/shaders/mesh.frag
index 7da116a5..7e57746e 100644
--- a/projects/indirect_dispatch/resources/shaders/mesh.frag
+++ b/projects/indirect_dispatch/resources/shaders/mesh.frag
@@ -2,13 +2,13 @@
 #extension GL_ARB_separate_shader_objects : enable
 
 layout(location = 0) in vec3 passNormal;
-layout(location = 1) in vec3 passPos;
+layout(location = 1) in vec3 passPosObject;
 
 layout(location = 0) out vec3 outColor;
 
 void main()	{
-    vec3    albedo  = vec3(sin(passPos.y * 100) * 0.5 + 0.5);
+    vec3    albedo  = vec3(sin(passPosObject.y * 100) * 0.5 + 0.5);
     vec3    N       = normalize(passNormal);
     float   light   = max(N.y * 0.5 + 0.5, 0);
-    outColor = light * albedo;
+    outColor        = light * albedo;
 }
\ No newline at end of file
diff --git a/projects/indirect_dispatch/resources/shaders/mesh.vert b/projects/indirect_dispatch/resources/shaders/mesh.vert
index 769867e3..175d88c8 100644
--- a/projects/indirect_dispatch/resources/shaders/mesh.vert
+++ b/projects/indirect_dispatch/resources/shaders/mesh.vert
@@ -5,14 +5,15 @@ layout(location = 0) in vec3 inPosition;
 layout(location = 1) in vec3 inNormal;
 
 layout(location = 0) out vec3 passNormal;
-layout(location = 1) out vec3 passPos;
+layout(location = 1) out vec3 passPosObject;
 
 layout( push_constant ) uniform constants{
     mat4 mvp;
+    mat4 model;
 };
 
 void main()	{
-	gl_Position = mvp * vec4(inPosition, 1.0);
-	passNormal  = inNormal;
-    passPos     = inPosition;
+	gl_Position     = mvp * vec4(inPosition, 1.0);
+	passNormal      = (model * vec4(inNormal, 0)).xyz;
+    passPosObject   = inPosition;
 }
\ No newline at end of file
diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index b27798b6..8fb9031b 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -92,8 +92,10 @@ void App::run() {
 	eMotionVectorMode               motionBlurMotionMode            = eMotionVectorMode::MaxTileNeighbourhood;
 
 	float   objectVerticalSpeed             = 5;
-	float   objectAmplitude                 = 1;
+	float   objectAmplitude                 = 0;
 	float   objectMeanHeight                = 1;
+	float   objectRotationSpeedX            = 5;
+	float   objectRotationSpeedY            = 5;
 	int     cameraShutterSpeedInverse       = 24;
 	float   motionVectorVisualisationRange  = 0.008;
 
@@ -116,7 +118,10 @@ void App::run() {
 	sphere.meshResources = m_cubeMesh;
 	sphere.modelMatrixUpdate = [&](float time, Object& obj) {
 		const float currentHeight   = objectMeanHeight + objectAmplitude * glm::sin(time * objectVerticalSpeed);
-		obj.modelMatrix             = glm::translate(glm::mat4(1), glm::vec3(0, currentHeight, 0));
+		const glm::mat4 translation = glm::translate(glm::mat4(1), glm::vec3(0, currentHeight, 0));
+		const glm::mat4 rotationX   = glm::rotate(glm::mat4(1), objectRotationSpeedX * time, glm::vec3(1, 0, 0));
+		const glm::mat4 rotationY   = glm::rotate(glm::mat4(1), objectRotationSpeedY * time, glm::vec3(0, 1, 0));
+		obj.modelMatrix             = translation * rotationX * rotationY;
 	};
 	sceneObjects.push_back(sphere);
 
@@ -203,9 +208,10 @@ void App::run() {
 			m_renderTargets.colorBuffer, 
 			m_renderTargets.depthBuffer };
 
-		vkcv::PushConstants meshPushConstants(sizeof(glm::mat4));
+		vkcv::PushConstants meshPushConstants(2 * sizeof(glm::mat4));
 		for (const Object& obj : sceneObjects) {
-			meshPushConstants.appendDrawcall(obj.mvp);
+			glm::mat4 matrices[2] = { obj.mvp, obj.modelMatrix };
+			meshPushConstants.appendDrawcall(matrices);
 		}
 
 		m_core.recordDrawcallsToCmdStream(
@@ -322,6 +328,8 @@ void App::run() {
 		ImGui::InputFloat("Object movement speed",      &objectVerticalSpeed);
 		ImGui::InputFloat("Object movement amplitude",  &objectAmplitude);
 		ImGui::InputFloat("Object mean height",         &objectMeanHeight);
+		ImGui::InputFloat("Object rotation speed X",    &objectRotationSpeedX);
+		ImGui::InputFloat("Object rotation speed Y",    &objectRotationSpeedY);
 
 		ImGui::End();
 		gui.endGUI();
-- 
GitLab