From da960ac8bd53075d98086ea450d905980713d6f7 Mon Sep 17 00:00:00 2001
From: TheJackiMonster <thejackimonster@gmail.com>
Date: Thu, 21 Jul 2022 21:50:13 +0200
Subject: [PATCH] Buggy geometry invocations

Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 projects/fire_works/shaders/generation.comp |  2 +-
 projects/fire_works/shaders/trail.geom      | 29 ++++++++++++++++-----
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp
index 83b01677..445c8f49 100644
--- a/projects/fire_works/shaders/generation.comp
+++ b/projects/fire_works/shaders/generation.comp
@@ -148,7 +148,7 @@ void main() {
 
     {
         const uint tid = atomicAdd(trailIndex, 1) % trails.length();
-        const uint trailLen = 16; // 64 + int(randomData[(tid + id) % randomData.length()] * 32);
+        const uint trailLen = 64 + int(randomData[(tid + id) % randomData.length()] * 32);
 
         const uint startIndex = atomicAdd(pointIndex, trailLen) % points.length();
 
diff --git a/projects/fire_works/shaders/trail.geom b/projects/fire_works/shaders/trail.geom
index ce0c66ac..39ab595a 100644
--- a/projects/fire_works/shaders/trail.geom
+++ b/projects/fire_works/shaders/trail.geom
@@ -2,8 +2,11 @@
 #extension GL_ARB_separate_shader_objects : enable
 #extension GL_GOOGLE_include_directive : enable
 
+#define INSTANCE_LEN (16)
+
 layout(points) in;
-layout (triangle_strip, max_vertices = 32) out;
+layout (triangle_strip, max_vertices = (INSTANCE_LEN * 2)) out;
+layout(invocations = 32) in;
 
 #include "physics.inc"
 #include "point.inc"
@@ -38,14 +41,24 @@ void main() {
     const uint startIndex = geomStartIndex[0];
     const uint useCount = geomUseCount[0];
 
-    if (useCount <= 1) {
+    const uint indexOffset = (gl_InvocationID * (INSTANCE_LEN - 1));
+    const uint instanceIndex = startIndex + indexOffset;
+
+    uint count = INSTANCE_LEN;
+
+    if (indexOffset + INSTANCE_LEN > useCount) {
+        count = indexOffset - useCount;
+    }
+
+    if (count <= 1) {
         return;
     }
 
     vec4 viewPositions [2];
 
     for (uint i = 0; i < 2; i++) {
-        const vec3 position = points[startIndex + i].position;
+        const uint index = (instanceIndex + i) % points.length();
+        const vec3 position = points[index].position;
 
         viewPositions[i] = view * vec4(position, 1);
     }
@@ -55,11 +68,13 @@ void main() {
 
     const float trailFactor = mediumDensity / friction;
 
-    for (uint i = 0; i < useCount; i++) {
-        const float u = float(i + 1) / float(useCount);
+    for (uint i = 0; i < count; i++) {
+        const float u = float(indexOffset + i + 1) / float(useCount);
+
+        const uint index = (instanceIndex + i) % points.length();
 
-        const vec3 position = points[startIndex + i].position;
-        const float size = points[startIndex + i].size;
+        const vec3 position = points[index].position;
+        const float size = points[index].size;
 
         vec4 viewPos = view * vec4(position, 1);
 
-- 
GitLab