From f6bb006afc9de705c150ce8fd03edf7f1898a9d8 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sat, 5 Feb 2022 12:48:45 +0100
Subject: [PATCH] Added position guards to stay in the grid

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../shaders/transform_particles_to_grid.comp  |  2 --
 .../shaders/update_particle_velocities.comp   | 28 ++++++++++++++++---
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 8914381f..1bcea69d 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -73,7 +73,6 @@ void main()	{
 
     gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w, 0.0f);
 
-    /*
     bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0));
     bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f));
 
@@ -87,7 +86,6 @@ void main()	{
     );
 
     gridValue.xyz = mix(gridValue.xyz, -gridValue.xyz, collision);
-    */
 
     barrier();
     memoryBarrierShared();
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 75255bb0..2d773d85 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -98,18 +98,38 @@ void main()	{
 
         position = position + velocity_pic * dts;
 
+        const float gridRange = (1.0f - 2.0f * size);
+
         for (uint i = 0; i < 3; i++) {
             if (position[i] - size < 0.0f) {
-                position[i] = -position[i] + 2.0f * size;
+                float a = (size - position[i]) / gridRange;
+                int b = int(floor(a));
+
+                a = (a - b) * gridRange;
+
+                if (b % 2 == 0) {
+                    position[i] = size + a;
+                } else {
+                    position[i] = 1.0f - size - a;
+                }
 
-                if (velocity_pic[i] < 0.0f) {
+                if ((velocity_pic[i] < 0.0f) == (b % 2 == 0)) {
                     velocity_pic[i] *= -1.0f;
                 }
             } else
             if (position[i] + size > 1.0f) {
-                position[i] = 2.0f * (1.0f - size) - position[i];
+                float a = (position[i] + size - 1.0f) / gridRange;
+                int b = int(floor(a));
+
+                a = (a - b) * gridRange;
+
+                if (b % 2 == 0) {
+                    position[i] = 1.0f - size - a;
+                } else {
+                    position[i] = size + a;
+                }
 
-                if (velocity_pic[i] > 0.0f) {
+                if ((velocity_pic[i] > 0.0f) == (b % 2 == 0)) {
                     velocity_pic[i] *= -1.0f;
                 }
             }
-- 
GitLab