diff --git a/projects/wobble_bobble/shaders/grid.frag b/projects/wobble_bobble/shaders/grid.frag index d204843203422f5d0668e1c0470eafd7f266ac0f..00c405d1dac0e86abc433d281d032bd9ea49ef08 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 2010bf16e23901089f3a92a80754e925f687a070..752c3effc590a945ecf0b69806d960734404afa2 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 270c2108715b1d6829b9bd51627b3e7ad1448a2b..96dd7300ccf556ffdcb51d2ac3a842be6c6b7d5a 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 14a65bf9e186c831d834e74d954d769b0f08f21e..2c4f9e4fb9953d36d781698b101aa46f46a219b1 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 f4ce59aae398352d1fa30ae032980d0c5378341d..b7ab85c6c02c1089e472fa933e4e9082f0cd11ba 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; }