From da59f0ceb04e9cc778d9729ac919ccb49594c925 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Sun, 6 Feb 2022 21:49:00 +0100
Subject: [PATCH] Added slider for particle count

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../shaders/init_particle_weights.comp        |   4 +-
 projects/wobble_bobble/shaders/particle.inc   |   1 +
 .../shaders/transform_particles_to_grid.comp  |   4 +-
 .../shaders/update_particle_velocities.comp   |   6 +-
 projects/wobble_bobble/src/main.cpp           | 155 +++++++++++++-----
 5 files changed, 123 insertions(+), 47 deletions(-)

diff --git a/projects/wobble_bobble/shaders/init_particle_weights.comp b/projects/wobble_bobble/shaders/init_particle_weights.comp
index 3530bfa1..1ab68813 100644
--- a/projects/wobble_bobble/shaders/init_particle_weights.comp
+++ b/projects/wobble_bobble/shaders/init_particle_weights.comp
@@ -9,8 +9,8 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform texture3D gridImage;
-layout(set=0, binding=2) uniform sampler gridSampler;
+layout(set=1, binding=0) uniform texture3D gridImage;
+layout(set=1, binding=1) uniform sampler gridSampler;
 
 void main()	{
     if (gl_GlobalInvocationID.x < particles.length()) {
diff --git a/projects/wobble_bobble/shaders/particle.inc b/projects/wobble_bobble/shaders/particle.inc
index 92ce70eb..a622485e 100644
--- a/projects/wobble_bobble/shaders/particle.inc
+++ b/projects/wobble_bobble/shaders/particle.inc
@@ -42,6 +42,7 @@ struct Simulation {
 	float gamma;
 	int mode;
 	float gravity;
+	int count;
 };
 
 const float PI = 3.1415926535897932384626433832795;
diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 71d342e1..b37955cc 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -9,11 +9,11 @@ layout(set=0, binding=0, std430) readonly buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform simulationBlock {
+layout(set=1, binding=0) uniform simulationBlock {
     Simulation simulation;
 };
 
-layout(set=0, binding=2, rgba16f) restrict writeonly uniform image3D gridImage;
+layout(set=2, binding=0, rgba16f) restrict writeonly uniform image3D gridImage;
 
 layout( push_constant ) uniform constants {
     float t;
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 60b5a72e..409e7e37 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -10,12 +10,12 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform simulationBlock {
+layout(set=1, binding=0) uniform simulationBlock {
     Simulation simulation;
 };
 
-layout(set=0, binding=2) uniform texture3D gridImage;
-layout(set=0, binding=3) uniform sampler gridSampler;
+layout(set=2, binding=0) uniform texture3D gridImage;
+layout(set=2, binding=1) uniform sampler gridSampler;
 
 layout( push_constant ) uniform constants {
     float t;
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 6fd28707..baba070e 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -42,6 +42,7 @@ struct Simulation {
 	float gamma;
 	int mode;
 	float gravity;
+	int count;
 };
 
 struct Physics {
@@ -235,8 +236,13 @@ vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader
 	return core.createComputePipeline(config);
 }
 
-void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity,
+vkcv::BufferHandle resetParticles(vkcv::Core& core, size_t count, const glm::vec3& velocity,
 					float density, float size, int form, int mode) {
+	vkcv::Buffer<Particle> particles = core.createBuffer<Particle>(
+			vkcv::BufferType::STORAGE,
+			count
+	);
+	
 	std::vector<Particle> particles_vec (particles.getCount());
 	
 	switch (form) {
@@ -267,6 +273,7 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity
 	}
 	
 	particles.fill(particles_vec);
+	return particles.getHandle();
 }
 
 int main(int argc, const char **argv) {
@@ -302,16 +309,11 @@ int main(int argc, const char **argv) {
 			swapchainExtent.height
 	).getHandle();
 	
-	vkcv::Buffer<Particle> particles = core.createBuffer<Particle>(
-			vkcv::BufferType::STORAGE,
-			1024
-	);
-	
 	vkcv::Image grid = core.createImage(
 			vk::Format::eR16G16B16A16Sfloat,
-			64,
-			64,
-			64,
+			32,
+			32,
+			32,
 			false,
 			true
 	);
@@ -344,8 +346,17 @@ int main(int argc, const char **argv) {
 	sim->gamma = 1.330f;
 	sim->mode = SIM_MODE_RANDOM;
 	sim->gravity = 9.81f;
-	
-	resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
+	sim->count = 1024;
+	
+	vkcv::BufferHandle particlesHandle = resetParticles(
+			core,
+			sim->count,
+			initialVelocity,
+			sim->density,
+			sim->size,
+			sim->form,
+			sim->mode
+	);
 	
 	vkcv::shader::GLSLCompiler compiler;
 	
@@ -358,12 +369,17 @@ int main(int argc, const char **argv) {
 	
 	{
 		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));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(initParticleWeightsSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
+		core.writeDescriptorSet(initParticleWeightsSets[1], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> transformParticlesToGridSets;
 	vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline(
 			core, compiler,
@@ -373,12 +389,22 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle()));
-		writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(2, grid.getHandle()));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle()));
+		core.writeDescriptorSet(transformParticlesToGridSets[1], writes);
+	}
+	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(0, grid.getHandle()));
+		core.writeDescriptorSet(transformParticlesToGridSets[2], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> updateParticleVelocitiesSets;
 	vkcv::ComputePipelineHandle updateParticleVelocitiesPipeline = createComputePipeline(
 			core, compiler,
@@ -388,13 +414,23 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle()));
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(2, grid.getHandle()));
-		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(3, gridSampler));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle()));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[1], writes);
+	}
+	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[2], writes);
+	}
+	
 	vkcv::ShaderProgram gfxProgramGrid;
 	
 	compiler.compile(
@@ -510,7 +546,7 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(gfxSetParticles, writes);
 	}
 	
@@ -629,7 +665,7 @@ int main(int argc, const char **argv) {
 	drawcallsParticles.push_back(vkcv::DrawcallInfo(
 			triangleMesh,
 			{ vkcv::DescriptorSetUsage(0, core.getDescriptorSet(gfxSetParticles).vulkanHandle) },
-			particles.getCount()
+			sim->count
 	));
 	
 	std::vector<vkcv::DrawcallInfo> drawcallsLines;
@@ -693,37 +729,50 @@ int main(int argc, const char **argv) {
 		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};
+		const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(sim->count + 63) / 64, 1, 1};
 		
 		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.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.prepareImageForSampling(cmdStream, grid.getHandle());
 			
 			core.recordComputeDispatchToCmdStream(
 					cmdStream,
 					initParticleWeightsPipeline,
 					dispatchSizeParticles,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(initParticleWeightsSets[1]).vulkanHandle
+						)
+					},
 					vkcv::PushConstants(0)
 			);
 			
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordEndDebugLabel(cmdStream);
 			
 			core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", {0.47f, 0.77f, 0.85f, 1.0f});
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.prepareImageForStorage(cmdStream, grid.getHandle());
 			
 			core.recordComputeDispatchToCmdStream(
 					cmdStream,
 					transformParticlesToGridPipeline,
 					dispatchSizeGrid,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(transformParticlesToGridSets[1]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								2, core.getDescriptorSet(transformParticlesToGridSets[2]).vulkanHandle
+						)
+					},
 					physicsPushConstants
 			);
 			
@@ -731,7 +780,7 @@ 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.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordBufferMemoryBarrier(cmdStream, simulation.getHandle());
 			core.prepareImageForSampling(cmdStream, grid.getHandle());
 			
@@ -739,13 +788,21 @@ int main(int argc, const char **argv) {
 					cmdStream,
 					updateParticleVelocitiesPipeline,
 					dispatchSizeParticles,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(updateParticleVelocitiesSets[1]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								2, core.getDescriptorSet(updateParticleVelocitiesSets[2]).vulkanHandle
+						)
+					},
 					physicsPushConstants
 			);
 			
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordEndDebugLabel(cmdStream);
 		}
 		
@@ -772,7 +829,7 @@ int main(int argc, const char **argv) {
 			core.recordEndDebugLabel(cmdStream);
 		} else {
 			core.recordBeginDebugLabel(cmdStream, "RENDER PARTICLES", { 0.13f, 0.20f, 0.22f, 1.0f });
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			
 			core.recordDrawcallsToCmdStream(
 					cmdStream,
@@ -815,6 +872,7 @@ int main(int argc, const char **argv) {
 		
 		ImGui::Spacing();
 		
+		ImGui::SliderInt("Particle Count", &(sim->count), 1, 100000);
 		ImGui::SliderFloat("Density", &(sim->density), std::numeric_limits<float>::epsilon(), 5000.0f);
 		ImGui::SameLine(0.0f, 10.0f);
 		if (ImGui::SmallButton("Reset##density")) {
@@ -847,7 +905,24 @@ int main(int argc, const char **argv) {
 		ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f);
 		ImGui::SameLine(0.0f, 10.0f);
 		if (ImGui::Button("Reset##particle_velocity")) {
-			resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
+			particlesHandle = resetParticles(
+					core,
+					sim->count,
+					initialVelocity,
+					sim->density,
+					sim->size,
+					sim->form,
+					sim->mode
+			);
+			
+			vkcv::DescriptorWrites writes;
+			writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
+			
+			core.writeDescriptorSet(initParticleWeightsSets[0], writes);
+			core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
+			core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
+			
+			core.writeDescriptorSet(gfxSetParticles, writes);
 		}
 		
 		ImGui::SliderFloat("Gravity", &(sim->gravity), 0.0f, 10.0f);
-- 
GitLab