From c5da28dac21aa5b627a8e4a5a08a003281ebfc99 Mon Sep 17 00:00:00 2001
From: Vanessa Karolek <vaka1997@uni-koblenz.de>
Date: Wed, 26 Jan 2022 19:27:08 +0100
Subject: [PATCH] align particles to face the camera

I used [1] as reference and for understanding :D

[1] http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/billboards/
---
 projects/wobble_bobble/shaders/particle.vert | 9 ++++++++-
 projects/wobble_bobble/src/main.cpp          | 8 ++++++--
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/projects/wobble_bobble/shaders/particle.vert b/projects/wobble_bobble/shaders/particle.vert
index bb864e07..bebf2143 100644
--- a/projects/wobble_bobble/shaders/particle.vert
+++ b/projects/wobble_bobble/shaders/particle.vert
@@ -12,6 +12,10 @@ layout(location = 0) in vec2 vertexPos;
 layout(location = 0) out vec2 passPos;
 layout(location = 1) out float passMass;
 
+layout( push_constant ) uniform constants{
+    mat4 mvp;
+};
+
 void main()	{
     vec3 position = particles[gl_InstanceIndex].minimal.position;
     float size = particles[gl_InstanceIndex].minimal.size;
@@ -20,5 +24,8 @@ void main()	{
 
     passPos = vertexPos;
     passMass = mass;
-    gl_Position = vec4(position + vec3(vertexPos * size * 2.0f, 0), 1);
+
+    // align particle to face camera
+    gl_Position = mvp * vec4(position, 1);      // transform position into projected view space
+    gl_Position.xy += vertexPos * size * 2.0f;  // move position directly in view space
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index e4000544..a9df5187 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -384,7 +384,11 @@ int main(int argc, const char **argv) {
 		timePushConstants.appendDrawcall(static_cast<float>(dt));
 		
 		cameraManager.update(dt);
-		
+
+		glm::mat4 mvp = cameraManager.getActiveCamera().getMVP();
+		vkcv::PushConstants cameraPushConstants (sizeof(glm::mat4));
+		cameraPushConstants.appendDrawcall(mvp);
+
 		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		
 		const uint32_t dispatchSizeGrid [3] = { 16, 16, 16 };
@@ -496,7 +500,7 @@ int main(int argc, const char **argv) {
 				cmdStream,
 				gfxPass,
 				gfxPipeline,
-				vkcv::PushConstants(0),
+				cameraPushConstants,
 				drawcalls,
 				renderTargets,
 				windowHandle
-- 
GitLab