Skip to content
Snippets Groups Projects
Verified Commit 8d94ea80 authored by Tobias Frisch's avatar Tobias Frisch
Browse files

It works now because of epsilon

parent d660754a
No related branches found
No related tags found
1 merge request!103Added project wobble_bobble and refactored some parts of the framework
#ifndef PARTICLE_INC #ifndef PARTICLE_INC
#define PARTICLE_INC #define PARTICLE_INC
#define EPSILON 0.0001f
struct ParticleMinimal { struct ParticleMinimal {
vec3 position; vec3 position;
float size; float size;
......
...@@ -71,13 +71,9 @@ void main() { ...@@ -71,13 +71,9 @@ void main() {
memoryBarrierShared(); memoryBarrierShared();
} }
gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w * 0.0f, 0.0f); gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w, 0.0f);
gridValue.xyz /= gridValue.w;
if (any(isnan(gridValue.xyz)) || any(isinf(gridValue.xyz))) {
gridValue.xyz = vec3(0.0f);
}
/*
bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0)); bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0));
bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f)); bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f));
...@@ -91,6 +87,7 @@ void main() { ...@@ -91,6 +87,7 @@ void main() {
); );
gridValue.xyz = mix(gridValue.xyz, -gridValue.xyz, collision); gridValue.xyz = mix(gridValue.xyz, -gridValue.xyz, collision);
*/
barrier(); barrier();
memoryBarrierShared(); memoryBarrierShared();
......
...@@ -54,7 +54,11 @@ void main() { ...@@ -54,7 +54,11 @@ void main() {
vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel); vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
float weight = voxel_particle_weight(voxel, particle.minimal); 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_D += outerProduct(weight * offset, offset);
affine_B += outerProduct(velocity, offset); affine_B += outerProduct(velocity, offset);
...@@ -72,7 +76,7 @@ void main() { ...@@ -72,7 +76,7 @@ void main() {
mat3 F = mat3(particle.deformation); mat3 F = mat3(particle.deformation);
if (abs(determinant(affine_D)) > 0.0f) { if (abs(determinant(affine_D)) >= EPSILON) {
mat3 D_inv = inverse(affine_D); mat3 D_inv = inverse(affine_D);
float J = determinant(F); float J = determinant(F);
...@@ -88,22 +92,22 @@ void main() { ...@@ -88,22 +92,22 @@ void main() {
affine_C = affine_B * D_inv; affine_C = affine_B * D_inv;
mls_Q += affine_C * mass; 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; position = position + velocity_pic * dts;
for (uint i = 0; i < 3; i++) { for (uint i = 0; i < 3; i++) {
if (position[i] - size < 0.0f) { if (position[i] - size < 0.0f) {
position[i] = size; position[i] = -position[i] + 2.0f * size;
if (velocity_pic[i] < 0.0f) { if (velocity_pic[i] < 0.0f) {
velocity_pic[i] *= -1.0f; velocity_pic[i] *= -1.0f;
} }
} else } else
if (position[i] + size > 1.0f) { 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) { if (velocity_pic[i] > 0.0f) {
velocity_pic[i] *= -1.0f; velocity_pic[i] *= -1.0f;
......
...@@ -511,11 +511,11 @@ int main(int argc, const char **argv) { ...@@ -511,11 +511,11 @@ int main(int argc, const char **argv) {
while (vkcv::Window::hasOpenWindow()) { while (vkcv::Window::hasOpenWindow()) {
vkcv::Window::pollEvents(); vkcv::Window::pollEvents();
if(window.getHeight() == 0 || window.getWidth() == 0) if (window.getHeight() == 0 || window.getWidth() == 0)
continue; continue;
uint32_t swapchainWidth, swapchainHeight; uint32_t swapchainWidth, swapchainHeight;
if (!core.beginFrame(swapchainWidth, swapchainHeight,windowHandle)) { if (!core.beginFrame(swapchainWidth, swapchainHeight, windowHandle)) {
continue; continue;
} }
...@@ -544,70 +544,72 @@ int main(int argc, const char **argv) { ...@@ -544,70 +544,72 @@ int main(int argc, const char **argv) {
physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count())); physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count()));
physics.speedfactor = speed_factor; physics.speedfactor = speed_factor;
vkcv::PushConstants physicsPushConstants (sizeof(physics)); vkcv::PushConstants physicsPushConstants(sizeof(physics));
physicsPushConstants.appendDrawcall(physics); physicsPushConstants.appendDrawcall(physics);
cameraManager.update(physics.dt); cameraManager.update(physics.dt);
glm::mat4 mvp = cameraManager.getActiveCamera().getMVP(); glm::mat4 mvp = cameraManager.getActiveCamera().getMVP();
vkcv::PushConstants cameraPushConstants (sizeof(glm::mat4)); vkcv::PushConstants cameraPushConstants(sizeof(glm::mat4));
cameraPushConstants.appendDrawcall(mvp); 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( auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
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 }); const uint32_t dispatchSizeGrid[3] = {grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4};
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1};
core.prepareImageForSampling(cmdStream, grid.getHandle());
core.recordComputeDispatchToCmdStream( for (int step = 0; step < 1; step++) {
cmdStream, core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", {0.78f, 0.89f, 0.94f, 1.0f});
updateParticleVelocitiesPipeline, core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
dispatchSizeParticles, core.prepareImageForSampling(cmdStream, grid.getHandle());
{ vkcv::DescriptorSetUsage(
0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle core.recordComputeDispatchToCmdStream(
) }, cmdStream,
physicsPushConstants initParticleWeightsPipeline,
); dispatchSizeParticles,
{vkcv::DescriptorSetUsage(
core.recordBufferMemoryBarrier(cmdStream, particles.getHandle()); 0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
core.recordEndDebugLabel(cmdStream); )},
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 { std::vector<vkcv::ImageHandle> renderTargets {
vkcv::ImageHandle::createSwapchainImageHandle(), vkcv::ImageHandle::createSwapchainImageHandle(),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment