From 3b4f857230aee0fc2a59f8073408daebbad7bc2d Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Mon, 24 Jan 2022 19:22:21 +0100
Subject: [PATCH] Updating velocities with data from grid

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../shaders/update_particle_velocities.comp   | 23 ++++++++++++++++
 projects/wobble_bobble/src/main.cpp           | 27 ++++++++++++++++---
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 7277e586..5b16b415 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -1,6 +1,29 @@
 #version 450
+#extension GL_GOOGLE_include_directive : enable
 
 layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
 
+#include "particle.inc"
+
+layout(set=0, binding=0, std430) buffer particleBuffer {
+    Particle particles [];
+};
+
+layout(set=0, binding=1) uniform texture3D gridImage;
+layout(set=0, binding=2) uniform sampler gridSampler;
+
 void main()	{
+    if (gl_GlobalInvocationID.x < particles.length()) {
+        vec3 position = particles[gl_GlobalInvocationID.x].minimal.position;
+        float mass = particles[gl_GlobalInvocationID.x].minimal.mass;
+
+        vec3 offset = position;
+
+        vec4 gridSample = texture(sampler3D(gridImage, gridSampler), offset);
+
+        vec3 gridVelocity = gridSample.xyz;
+        float gridMass = gridSample.w;
+
+        particles[gl_GlobalInvocationID.x].minimal.velocity = gridVelocity * mass / gridMass;
+    }
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 9148b3c8..ea685607 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -35,7 +35,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.1f);
+		particles[i].velocity = glm::vec3(0.0f);
 		
 		volume += size;
 	}
@@ -154,7 +154,12 @@ int main(int argc, const char **argv) {
 	grid.fill(grid_vec.data()); // FIXME: gets limited by staging buffer size...
 	 */
 	
-	grid.switchLayout(vk::ImageLayout::eGeneral);
+	vkcv::SamplerHandle gridSampler = core.createSampler(
+			vkcv::SamplerFilterType::LINEAR,
+			vkcv::SamplerFilterType::LINEAR,
+			vkcv::SamplerMipmapMode::NEAREST,
+			vkcv::SamplerAddressMode::REPEAT
+	);
 	
 	vkcv::shader::GLSLCompiler compiler;
 	
@@ -207,6 +212,14 @@ int main(int argc, const char **argv) {
 			updateParticleVelocitiesSets
 	);
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> updateParticlePositionsSets;
 	vkcv::ComputePipelineHandle updateParticlePositionsPipeline = createComputePipeline(
 			core, compiler,
@@ -357,6 +370,8 @@ int main(int argc, const char **argv) {
 		const uint32_t dispatchSize [3] = { 1, 1, 1 };
 		
 		core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f });
+		core.prepareImageForStorage(cmdStream, grid.getHandle());
+		
 		core.recordComputeDispatchToCmdStream(
 				cmdStream,
 				transformParticlesToGridPipeline,
@@ -414,13 +429,19 @@ int main(int argc, const char **argv) {
 		core.recordEndDebugLabel(cmdStream);
 		
 		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.78f, 0.89f, 0.94f, 1.0f });
+		core.prepareImageForSampling(cmdStream, grid.getHandle());
+		
 		core.recordComputeDispatchToCmdStream(
 				cmdStream,
 				updateParticleVelocitiesPipeline,
 				dispatchSizeUpdateParticles,
-				{},
+				{ vkcv::DescriptorSetUsage(
+						0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
+				) },
 				vkcv::PushConstants(0)
 		);
+		
+		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
 		core.recordEndDebugLabel(cmdStream);
 		
 		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE POSITIONS", { 0.78f, 0.89f, 0.94f, 1.0f });
-- 
GitLab