diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 8914381fdc37b1c49ec31b472d7aabe987452fd4..1bcea69def425ce20f282b038c5b941206c8f60d 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 75255bb0011e35b98097c818abe418be2f482880..2d773d85b7d4bd2e483b189dc2225cb42dc84e6f 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;
                 }
             }