From b8f4b347d7446f4a8aa1fbd3d54a5f0146ac4584 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sun, 30 Jan 2022 23:33:37 +0100
Subject: [PATCH] Used flip and added collisions for particles as well

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 projects/wobble_bobble/shaders/grid.frag      |  5 ++++-
 .../shaders/update_grid_forces.comp           |  8 ++++----
 .../shaders/update_particle_positions.comp    | 18 +++++++++++++++++-
 .../shaders/update_particle_velocities.comp   | 19 ++++++++-----------
 projects/wobble_bobble/src/main.cpp           |  2 +-
 5 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/projects/wobble_bobble/shaders/grid.frag b/projects/wobble_bobble/shaders/grid.frag
index d2048432..00c405d1 100644
--- a/projects/wobble_bobble/shaders/grid.frag
+++ b/projects/wobble_bobble/shaders/grid.frag
@@ -16,7 +16,10 @@ void main()	{
     float z = sqrt(0.25 - value * value);
 
     if (value < 0.5f) {
-        outColor = (passVelocity.xyz - passVelocity.yzx) * 100.0f; // vec3(passPos.x + 0.5f, passPos.y + 0.5f, z * 2.0f);
+        vec3 surface = vec3(passPos.x + 0.5f, passPos.y + 0.5f, z * 2.0f);
+        vec3 velocity = vec3(0.5f) + 0.5f * normalize(passVelocity.xyz);
+
+        outColor = surface;
     } else {
         discard;
     }
diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
index 2010bf16..752c3eff 100644
--- a/projects/wobble_bobble/shaders/update_grid_forces.comp
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -23,7 +23,7 @@ shared Particle shared_particles [SHARED_PARTICLES_BATCH_SIZE];
 
 void main()	{
     const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / imageSize(gridImage);
-    const float elasticity_module = 12.5f * 1000000.0f; // 10..15 = Wood
+    const float elasticity_module = 1200.5f * 1000000.0f; // 10..15 = Wood
 
     memoryBarrierImage();
 
@@ -68,11 +68,11 @@ void main()	{
                 voxel_particle_grad_weight(position, shared_particles[gl_LocalInvocationIndex].minimal)
             );
 
-            /*force -= (
+            force -= (
                 volume *
                 delta_cauchy *
                 weight_gradient
-            );*/
+            );
         }
     }
 
@@ -90,7 +90,7 @@ void main()	{
         (lowerID.z && negativeVelocity.z) || (greaterID.z && positiveVelocity.z)
     );
 
-    velocity = mix(velocity, -velocity, invert);
+    velocity = mix(velocity, -velocity, invert) - gridSample.xyz;
 
     imageStore(
         gridImage,
diff --git a/projects/wobble_bobble/shaders/update_particle_positions.comp b/projects/wobble_bobble/shaders/update_particle_positions.comp
index 270c2108..96dd7300 100644
--- a/projects/wobble_bobble/shaders/update_particle_positions.comp
+++ b/projects/wobble_bobble/shaders/update_particle_positions.comp
@@ -19,8 +19,24 @@ void main()	{
 
     if (gl_GlobalInvocationID.x < particles.length()) {
         vec3 position = particles[gl_GlobalInvocationID.x].minimal.position;
-        position = position + particles[gl_GlobalInvocationID.x].minimal.velocity * dt;
+        float size = particles[gl_GlobalInvocationID.x].minimal.size;
+        vec3 velocity = particles[gl_GlobalInvocationID.x].minimal.velocity;
+
+        position = position + velocity * dt;
+
+        for (uint i = 0; i < 3; i++) {
+            if (position[i] - size < 0.0f) {
+                position[i] = -position[i] + 2.0f * size;
+                velocity[i] *= -1.0f;
+            } else
+            if (position[i] + size > 1.0f) {
+                position[i] = 2.0f * (1.0f - size) - position[i];
+                velocity[i] *= -1.0f;
+            }
+        }
+
         particles[gl_GlobalInvocationID.x].minimal.position = position;
+        particles[gl_GlobalInvocationID.x].minimal.velocity = velocity;
     }
 
     memoryBarrierBuffer();
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 14a65bf9..2c4f9e4f 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -20,30 +20,27 @@ void main()	{
         ParticleMinimal minimal = particles[gl_GlobalInvocationID.x].minimal;
 
         ivec3 gridResolution = textureSize(sampler3D(gridImage, gridSampler), 0);
-        ivec3 gridWindow = ivec3(minimal.size * 2.0f * gridResolution);
+        ivec3 gridWindow = ivec3(minimal.size * 4.0f * gridResolution);
+
+        vec3 velocity = vec3(minimal.velocity);
 
-        vec3 velocity_pic = vec3(0.0f);
         uint i, j, k;
 
-        //for (i = 0; i < gridResolution.x; i++) {
-        //    for (j = 0; j < gridResolution.y; j++) {
-        //        for (k = 0; k < gridResolution.z; k++) {
-        //          vec3 voxel = vec3(i, j, k) / gridResolution;
         for (i = -gridWindow.x; i <= gridWindow.x; i++) {
             for (j = -gridWindow.y; j <= gridWindow.y; j++) {
                 for (k = -gridWindow.z; k <= gridWindow.z; k++) {
-                    vec3 voxel = minimal.position + vec3(i, j, k) / gridResolution;
+                    vec3 offset = vec3(i, j, k) / gridResolution;
+                    vec3 voxel = minimal.position + offset;
 
-                    if (distance(voxel, minimal.position) < minimal.size * 2.0f) {
+                    if (length(offset) < minimal.size * 2.0f) {
                         vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
-
-                        velocity_pic += voxel_particle_weight(voxel, minimal) * gridSample.xyz;
+                        velocity += voxel_particle_weight(voxel, minimal) * gridSample.xyz;
                     }
                 }
             }
         }
 
-        //particles[gl_GlobalInvocationID.x].minimal.velocity = velocity_pic;
+        particles[gl_GlobalInvocationID.x].minimal.velocity = velocity;
     }
 
     memoryBarrierBuffer();
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index f4ce59aa..b7ab85c6 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -40,7 +40,7 @@ void distributeParticles(Particle *particles, size_t count, const glm::vec3& cen
 		
 		particles[i].position = center + offset;
 		particles[i].size = size;
-		particles[i].velocity = glm::vec3(0.0f, 0.01f, 0.0f);
+		particles[i].velocity = glm::vec3(0.0f, 1.0f, 0.0f);
 		
 		volume += size;
 	}
-- 
GitLab