diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp index cb9b15d8cff5c254f584fc8fad600f8a8161c207..596581328e7ca3ed8daad03db51ef60ca528d84c 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 a00fb7a0d0b8ac9efc4b4b91992a5d10fccb6e37..6550c095871aa2c05671d47569aea3528805a788 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 e711b734ea84bb6129c04320ef2b6e456761637f..2ed39b9efd349c0f86dd0bea269f21f48118e7d5 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);