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