From fead8454269e38543a5e60e429b855f546100d2d Mon Sep 17 00:00:00 2001
From: Josh Morgenstern <josh@morgenstern.dev>
Date: Thu, 3 Feb 2022 15:41:23 +0100
Subject: [PATCH] add option for setting simulation speed

---
 projects/wobble_bobble/shaders/update_grid_forces.comp   | 5 ++++-
 .../shaders/update_particle_velocities.comp              | 9 ++++++---
 projects/wobble_bobble/src/main.cpp                      | 7 +++++++
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
index cb9b15d8..59658132 100644
--- a/projects/wobble_bobble/shaders/update_grid_forces.comp
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -18,6 +18,7 @@ layout( push_constant ) uniform constants {
     float beta;
     float t;
     float dt;
+    float speedfactor;
 };
 
 #define SHARED_PARTICLES_BATCH_SIZE 64
@@ -26,6 +27,8 @@ shared Particle shared_particles [SHARED_PARTICLES_BATCH_SIZE];
 
 void main()	{
 
+    float dts = dt * speedfactor;
+
     barrier();
     memoryBarrierShared();
     memoryBarrierImage();
@@ -45,7 +48,7 @@ void main()	{
     memoryBarrierBuffer();
 
     if (mass > 0.0f) {
-        velocity += vec3(0.0f, -9.81f * dt, 0.0f);
+        velocity += vec3(0.0f, -9.81f * dts, 0.0f);
     }
 
     barrier();
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index a00fb7a0..6550c095 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -21,12 +21,15 @@ layout( push_constant ) uniform constants {
     float beta;
     float t;
     float dt;
+    float speedfactor;
 };
 
 void main()	{
     memoryBarrierBuffer();
     memoryBarrierImage();
 
+    float dts = dt * speedfactor;
+
     if (gl_GlobalInvocationID.x < particles.length()) {
         Particle particle = particles[gl_GlobalInvocationID.x];
 
@@ -84,18 +87,18 @@ void main()	{
 
                 mat3 delta = lame2 * (F * F_T - mat3(1.0f)) + lame1 * log(J);
 
-                mls_Q += beta * dt * volume * delta * D_inv;
+                mls_Q -= beta * dts * volume * delta * D_inv;
             }
 
             affine_C = affine_B * D_inv;
             mls_Q += beta * affine_C * mass;
         }
 
-        F = (mat3(1.0f) + dt * affine_C) * F;
+        F = (mat3(1.0f) + dts * affine_C) * F;
 
         vec3 velocity = mix(velocity_pic, velocity_flip, alpha);
 
-        position = position + velocity * dt;
+        position = position + velocity * dts;
 
         for (uint i = 0; i < 3; i++) {
             if (position[i] - size < 0.0f) {
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index e711b734..2ed39b9e 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -27,6 +27,7 @@ struct Physics {
 	float beta;
 	float t;
 	float dt;
+	float speedfactor;
 };
 
 float sphere_volume(float radius) {
@@ -533,6 +534,7 @@ int main(int argc, const char **argv) {
 	
 	float compression_modulus = material.m_compression / 1E9;
 	float elasticity_modulus = material.m_elasticity / 1E9;
+	float speed_factor = 1.0f;
 
 	float alpha = 0.0f;
 	float beta = 1.0f;
@@ -576,6 +578,7 @@ int main(int argc, const char **argv) {
 		physics.beta = beta;
 		physics.t = static_cast<float>(0.000001 * static_cast<double>(time.count()));
 		physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count()));
+		physics.speedfactor = speed_factor;
 		
 		vkcv::PushConstants physicsPushConstants (sizeof(physics));
 		physicsPushConstants.appendDrawcall(physics);
@@ -757,6 +760,10 @@ int main(int argc, const char **argv) {
 		    material.recalculate(elasticity_modulus, compression_modulus);
 		}
 		ImGui::EndGroup();
+
+		ImGui::Spacing();
+
+		ImGui::SliderFloat("Simulation Speed", &speed_factor, 0.0f, 2.0f);
 		
 		ImGui::Spacing();
 		ImGui::Checkbox("Render Grid", &renderGrid);
-- 
GitLab