diff --git a/projects/wobble_bobble/shaders/particle.inc b/projects/wobble_bobble/shaders/particle.inc index 68704b366d56717595858509a80c698d1db5d550..1b7a902dc46417261380f7ee48edda7a0a45f5da 100644 --- a/projects/wobble_bobble/shaders/particle.inc +++ b/projects/wobble_bobble/shaders/particle.inc @@ -1,6 +1,8 @@ #ifndef PARTICLE_INC #define PARTICLE_INC +#define EPSILON 0.0001f + struct ParticleMinimal { vec3 position; float size; diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp index 7e999944ccaa2c8066efd326ac1af09c86dd8276..8914381fdc37b1c49ec31b472d7aabe987452fd4 100644 --- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp +++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp @@ -71,13 +71,9 @@ void main() { memoryBarrierShared(); } - gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w * 0.0f, 0.0f); - gridValue.xyz /= gridValue.w; - - if (any(isnan(gridValue.xyz)) || any(isinf(gridValue.xyz))) { - gridValue.xyz = vec3(0.0f); - } + gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w, 0.0f); + /* bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0)); bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f)); @@ -91,6 +87,7 @@ void main() { ); gridValue.xyz = mix(gridValue.xyz, -gridValue.xyz, collision); + */ barrier(); memoryBarrierShared(); diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp index 1dcf904501984e8f7afdc33f7d40155b492bc220..75255bb0011e35b98097c818abe418be2f482880 100644 --- a/projects/wobble_bobble/shaders/update_particle_velocities.comp +++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp @@ -54,7 +54,11 @@ void main() { vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel); float weight = voxel_particle_weight(voxel, particle.minimal); - vec3 velocity = gridSample.xyz * weight; + vec3 velocity = gridSample.xyz * weight / gridSample.w; + + if (any(isnan(velocity)) || any(isinf(velocity))) { + velocity = vec3(0.0f); + } affine_D += outerProduct(weight * offset, offset); affine_B += outerProduct(velocity, offset); @@ -72,7 +76,7 @@ void main() { mat3 F = mat3(particle.deformation); - if (abs(determinant(affine_D)) > 0.0f) { + if (abs(determinant(affine_D)) >= EPSILON) { mat3 D_inv = inverse(affine_D); float J = determinant(F); @@ -88,22 +92,22 @@ void main() { affine_C = affine_B * D_inv; mls_Q += affine_C * mass; - } - F = (mat3(1.0f) + dts * affine_C) * F; + F = (mat3(1.0f) + dts * affine_C) * F; + } position = position + velocity_pic * dts; for (uint i = 0; i < 3; i++) { if (position[i] - size < 0.0f) { - position[i] = size; + position[i] = -position[i] + 2.0f * size; if (velocity_pic[i] < 0.0f) { velocity_pic[i] *= -1.0f; } } else if (position[i] + size > 1.0f) { - position[i] = 1.0f - size; + position[i] = 2.0f * (1.0f - size) - position[i]; if (velocity_pic[i] > 0.0f) { velocity_pic[i] *= -1.0f; diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp index 557f4dbd6c53cb28f11f8b2597fc99886031f1d0..9e79e2befd96aea35c133bbb38f0ba96a24bef4e 100644 --- a/projects/wobble_bobble/src/main.cpp +++ b/projects/wobble_bobble/src/main.cpp @@ -511,11 +511,11 @@ int main(int argc, const char **argv) { while (vkcv::Window::hasOpenWindow()) { vkcv::Window::pollEvents(); - if(window.getHeight() == 0 || window.getWidth() == 0) + if (window.getHeight() == 0 || window.getWidth() == 0) continue; uint32_t swapchainWidth, swapchainHeight; - if (!core.beginFrame(swapchainWidth, swapchainHeight,windowHandle)) { + if (!core.beginFrame(swapchainWidth, swapchainHeight, windowHandle)) { continue; } @@ -544,70 +544,72 @@ int main(int argc, const char **argv) { physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count())); physics.speedfactor = speed_factor; - vkcv::PushConstants physicsPushConstants (sizeof(physics)); + vkcv::PushConstants physicsPushConstants(sizeof(physics)); physicsPushConstants.appendDrawcall(physics); cameraManager.update(physics.dt); - + glm::mat4 mvp = cameraManager.getActiveCamera().getMVP(); - vkcv::PushConstants cameraPushConstants (sizeof(glm::mat4)); + vkcv::PushConstants cameraPushConstants(sizeof(glm::mat4)); cameraPushConstants.appendDrawcall(mvp); - - auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); - - const uint32_t dispatchSizeGrid [3] = { grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4 }; - const uint32_t dispatchSizeParticles [3] = { static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1 }; - - core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", { 0.78f, 0.89f, 0.94f, 1.0f }); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.prepareImageForSampling(cmdStream, grid.getHandle()); - - core.recordComputeDispatchToCmdStream( - cmdStream, - initParticleWeightsPipeline, - dispatchSizeParticles, - { vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle - ) }, - vkcv::PushConstants(0) - ); - - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.recordEndDebugLabel(cmdStream); - - core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f }); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.prepareImageForStorage(cmdStream, grid.getHandle()); - core.recordComputeDispatchToCmdStream( - cmdStream, - transformParticlesToGridPipeline, - dispatchSizeGrid, - { vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle - ) }, - physicsPushConstants - ); - - core.recordImageMemoryBarrier(cmdStream, grid.getHandle()); - core.recordEndDebugLabel(cmdStream); + auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); - core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.78f, 0.89f, 0.94f, 1.0f }); - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.prepareImageForSampling(cmdStream, grid.getHandle()); + const uint32_t dispatchSizeGrid[3] = {grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4}; + const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1}; - core.recordComputeDispatchToCmdStream( - cmdStream, - updateParticleVelocitiesPipeline, - dispatchSizeParticles, - { vkcv::DescriptorSetUsage( - 0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle - ) }, - physicsPushConstants - ); - - core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); - core.recordEndDebugLabel(cmdStream); + for (int step = 0; step < 1; step++) { + core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", {0.78f, 0.89f, 0.94f, 1.0f}); + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.prepareImageForSampling(cmdStream, grid.getHandle()); + + core.recordComputeDispatchToCmdStream( + cmdStream, + initParticleWeightsPipeline, + dispatchSizeParticles, + {vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle + )}, + vkcv::PushConstants(0) + ); + + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordEndDebugLabel(cmdStream); + + core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", {0.47f, 0.77f, 0.85f, 1.0f}); + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.prepareImageForStorage(cmdStream, grid.getHandle()); + + core.recordComputeDispatchToCmdStream( + cmdStream, + transformParticlesToGridPipeline, + dispatchSizeGrid, + {vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle + )}, + physicsPushConstants + ); + + core.recordImageMemoryBarrier(cmdStream, grid.getHandle()); + core.recordEndDebugLabel(cmdStream); + + core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", {0.78f, 0.89f, 0.94f, 1.0f}); + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.prepareImageForSampling(cmdStream, grid.getHandle()); + + core.recordComputeDispatchToCmdStream( + cmdStream, + updateParticleVelocitiesPipeline, + dispatchSizeParticles, + {vkcv::DescriptorSetUsage( + 0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle + )}, + physicsPushConstants + ); + + core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); + core.recordEndDebugLabel(cmdStream); + } std::vector<vkcv::ImageHandle> renderTargets { vkcv::ImageHandle::createSwapchainImageHandle(),