From 028f4c5ff81ab7e10d611f86c269a3b8d1a8adb2 Mon Sep 17 00:00:00 2001
From: TheJackiMonster <thejackimonster@gmail.com>
Date: Fri, 22 Jul 2022 10:30:16 +0200
Subject: [PATCH] Fixed directional issues with smoke

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 projects/fire_works/shaders/smoke.frag | 11 ++-------
 projects/fire_works/shaders/smoke.vert | 12 +++++-----
 projects/fire_works/shaders/trail.geom | 33 ++++++++++++--------------
 projects/fire_works/src/main.cpp       | 16 +++++++++----
 4 files changed, 34 insertions(+), 38 deletions(-)

diff --git a/projects/fire_works/shaders/smoke.frag b/projects/fire_works/shaders/smoke.frag
index 7339c6ee..ac5740d8 100644
--- a/projects/fire_works/shaders/smoke.frag
+++ b/projects/fire_works/shaders/smoke.frag
@@ -5,7 +5,7 @@
 #include "physics.inc"
 
 layout(location = 0) in vec3 passPos;
-layout(location = 1) in vec3 passView;
+layout(location = 1) in vec3 passDir;
 layout(location = 2) in vec3 passColor;
 layout(location = 3) in float passDensity;
 layout(location = 4) in flat int passSmokeIndex;
@@ -16,11 +16,6 @@ layout(set=1, binding=0, std430) readonly buffer randomBuffer {
     float randomData [];
 };
 
-layout( push_constant ) uniform constants{
-    mat4 view;
-    mat4 projection;
-};
-
 #define NUM_SMOKE_SAMPLES 16
 
 void main()	{
@@ -28,10 +23,8 @@ void main()	{
         discard;
     }
 
-    vec3 dir = -normalize((inverse(view) * vec4(passView, 0)).xyz);
-
     vec3 start = passPos;
-    vec3 end = start + dir * 3.5f;
+    vec3 end = start + normalize(passDir) * 3.5f;
 
     vec4 result = vec4(0);
 
diff --git a/projects/fire_works/shaders/smoke.vert b/projects/fire_works/shaders/smoke.vert
index aa17b3d6..0392deca 100644
--- a/projects/fire_works/shaders/smoke.vert
+++ b/projects/fire_works/shaders/smoke.vert
@@ -10,14 +10,14 @@ layout(set=0, binding=0, std430) readonly buffer smokeBuffer {
 layout(location = 0) in vec3 vertexPos;
 
 layout(location = 0) out vec3 passPos;
-layout(location = 1) out vec3 passView;
+layout(location = 1) out vec3 passDir;
 layout(location = 2) out vec3 passColor;
 layout(location = 3) out float passDensity;
 layout(location = 4) out flat int passSmokeIndex;
 
 layout( push_constant ) uniform constants{
-    mat4 view;
-    mat4 projection;
+    mat4 mvp;
+    vec3 camera;
 };
 
 void main()	{
@@ -25,10 +25,10 @@ void main()	{
     float size = smokes[gl_InstanceIndex].size;
     vec3 color = smokes[gl_InstanceIndex].color;
 
-    vec4 viewPos = view * vec4(position + vertexPos * size, 1);
+    vec3 pos = position + vertexPos * size;
 
     passPos = vertexPos;
-    passView = viewPos.xyz;
+    passDir = pos - camera;
     passColor = color;
 
     if (size > 0.0f) {
@@ -40,5 +40,5 @@ void main()	{
     passSmokeIndex = gl_InstanceIndex;
 
     // transform position into projected view space
-    gl_Position = projection * viewPos;
+    gl_Position = mvp * vec4(pos, 1);
 }
\ No newline at end of file
diff --git a/projects/fire_works/shaders/trail.geom b/projects/fire_works/shaders/trail.geom
index e1d37e9b..864b302d 100644
--- a/projects/fire_works/shaders/trail.geom
+++ b/projects/fire_works/shaders/trail.geom
@@ -22,14 +22,14 @@ layout(location = 3) in uint geomStartIndex [1];
 layout(location = 4) in uint geomUseCount [1];
 
 layout(location = 0) out vec3 passPos;
-layout(location = 1) out vec3 passView;
+layout(location = 1) out vec3 passDir;
 layout(location = 2) out vec3 passColor;
 layout(location = 3) out float passDensity;
 layout(location = 4) out flat int passSmokeIndex;
 
 layout( push_constant ) uniform constants{
-    mat4 view;
-    mat4 projection;
+    mat4 mvp;
+    vec3 camera;
 };
 
 void main() {
@@ -54,7 +54,7 @@ void main() {
         return;
     }
 
-    vec4 viewPositions [2];
+    vec3 positions [2];
     uint viewIndex = instanceIndex;
 
     if (viewIndex > startIndex) {
@@ -63,13 +63,12 @@ void main() {
 
     for (uint i = 0; i < 2; i++) {
         const uint index = (viewIndex + i) % points.length();
-        const vec3 position = points[index].position;
 
-        viewPositions[i] = view * vec4(position, 1);
+        positions[i] = points[index].position;
     }
 
-    vec3 pos = viewPositions[0].xyz;
-    vec3 dir = normalize(cross(viewPositions[1].xyz - pos, viewPositions[0].xyz));
+    vec3 pos = positions[0];
+    vec3 dir = normalize(cross(positions[1] - pos, pos - camera));
 
     const float trailFactor = mediumDensity / friction;
 
@@ -81,35 +80,33 @@ void main() {
         const vec3 position = points[index].position;
         const float size = points[index].size;
 
-        vec4 viewPos = view * vec4(position, 1);
-
         if (i > 0) {
-            dir = normalize(cross(viewPos.xyz - pos, viewPos.xyz));
-            pos = viewPos.xyz;
+            dir = normalize(cross(position - pos, pos - camera));
+            pos = position;
         }
 
         vec3 offset = dir * size;
         float density = trailFactor * (1.0f - u * u) / size;
 
-        vec4 v0 = viewPos - vec4(offset, 0);
-        vec4 v1 = viewPos + vec4(offset, 0);
+        const vec3 p0 = position - offset;
+        const vec3 p1 = position + offset;
 
         passPos = vec3(u, -1.0f, -1.0f);
-        passView = v0.xyz;
+        passDir = vec3(0, 0, 1);
         passColor = mix(color, trailColor, u);
         passDensity = density;
         passSmokeIndex = int(id);
 
-        gl_Position = projection * v0;
+        gl_Position = mvp * vec4(p0, 1);
         EmitVertex();
 
         passPos = vec3(u, +1.0f, -1.0f);
-        passView = v1.xyz;
+        passDir = vec3(0, 0, 1);
         passColor = mix(color, trailColor, u);
         passDensity = density;
         passSmokeIndex = int(id);
 
-        gl_Position = projection * v1;
+        gl_Position = mvp * vec4(p1, 1);
         EmitVertex();
     }
 
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index 3d894904..c4de5a7a 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -68,6 +68,11 @@ struct draw_particles_t {
 	uint32_t height;
 };
 
+struct draw_smoke_t {
+	glm::mat4 mvp;
+	glm::vec3 camera;
+};
+
 #define PARTICLE_COUNT (1024)
 #define SMOKE_COUNT (512)
 #define TRAIL_COUNT (2048)
@@ -838,13 +843,14 @@ int main(int argc, const char **argv) {
 		
 		core.recordBufferMemoryBarrier(cmdStream, smokeBuffer.getHandle());
 		
-		glm::mat4 smokeMatrices [2];
-		smokeMatrices[0] = camera.getView();
-		smokeMatrices[1] = camera.getProjection();
+		draw_smoke_t draw_smoke {
+			camera.getMVP(),
+			camera.getPosition()
+		};
 		
 		core.recordBeginDebugLabel(cmdStream, "Draw smoke", { 1.0f, 0.5f, 1.0f, 1.0f });
-		vkcv::PushConstants pushConstantsDraw1 (sizeof(glm::mat4) * 2);
-		pushConstantsDraw1.appendDrawcall(smokeMatrices);
+		vkcv::PushConstants pushConstantsDraw1 (sizeof(draw_smoke_t));
+		pushConstantsDraw1.appendDrawcall(draw_smoke);
 		
 		core.recordDrawcallsToCmdStream(
 			cmdStream,
-- 
GitLab