From 72ac0b5f6290459c555316fe8360984d7b31440a Mon Sep 17 00:00:00 2001
From: elom0n <74347790+elom0n@users.noreply.github.com>
Date: Thu, 21 Jul 2022 20:11:32 +0200
Subject: [PATCH] added startIndex assignment

---
 projects/fire_works/shaders/generation.comp |  6 +-
 projects/fire_works/src/main.cpp            | 73 +++++++++++++++------
 2 files changed, 57 insertions(+), 22 deletions(-)

diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp
index 13c21d31..a5368eeb 100644
--- a/projects/fire_works/shaders/generation.comp
+++ b/projects/fire_works/shaders/generation.comp
@@ -21,6 +21,10 @@ layout(set=1, binding=1, std430) buffer eventBuffer {
     event_t events [];
 };
 
+layout(set=1, binding=2, std430) buffer startIndexBuffer {
+    uint startIndex [];
+};
+
 #include "smoke.inc"
 
 layout(set=2, binding=0, std430) writeonly buffer smokeBuffer {
@@ -107,7 +111,7 @@ void main() {
     float size = events[event_id].size;
 
     if (events[event_id].parent < events.length()) {
-        const uint spawnId = events[events[event_id].parent].pad0;
+        const uint spawnId = startIndex[events[event_id].parent];
 
         if (spawnId < particles.length()) {
             particles[id].position = particles[spawnId].position;
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index c42b2302..f70adaa0 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -74,6 +74,22 @@ struct draw_particles_t {
 #define RANDOM_DATA_LENGTH (1024)
 #define POINT_COUNT (2048 * 256)
 
+void initializeParticles(std::vector<particle_t> &particles) {
+	for (size_t i = 0; i < particles.size(); i++) {
+		particle_t particle;
+		particle.position = glm::vec3(2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f,
+									  2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f,
+									  2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f);
+
+		particle.lifetime = 0.0f;
+		particle.velocity = glm::vec3(0.0f);
+		particle.size = 0.01f;
+		particle.color = glm::vec3(1.0f, 0.0f, 0.0f);
+
+		particles [i] = particle;
+	}
+}
+
 int main(int argc, const char **argv) {
 	vkcv::Features features;
 	
@@ -239,27 +255,16 @@ int main(int argc, const char **argv) {
 	});
 	
 	std::vector<particle_t> particles;
-	particles.reserve(PARTICLE_COUNT);
+	particles.resize(PARTICLE_COUNT);
+	initializeParticles(particles);
 	
-	for (size_t i = 0; i < PARTICLE_COUNT; i++) {
-		particle_t particle;
-		particle.position = glm::vec3(
-			2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f,
-			2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f,
-			2.0f * (std::rand() % RAND_MAX) / RAND_MAX - 1.0f
-		);
-		
-		particle.lifetime = 0.0f;
-		particle.velocity = glm::vec3(0.0f);
-		particle.size = 0.01f;
-		particle.color = glm::vec3(1.0f, 0.0f, 0.0f);
-		
-		particles.push_back(particle);
-	}
 	
 	vkcv::Buffer<particle_t> particleBuffer = core.createBuffer<particle_t>(
 		vkcv::BufferType::STORAGE,
-		particles.size()
+		particles.size(),
+		vkcv::BufferMemoryType::DEVICE_LOCAL,
+		false,
+		true
 	);
 	
 	particleBuffer.fill(particles);
@@ -369,7 +374,17 @@ int main(int argc, const char **argv) {
 		writes.writeStorageBuffer(1, eventBuffer.getHandle());
 		core.writeDescriptorSet(generationDescriptorSet, writes);
 	}
-	
+
+	vkcv::Buffer<uint32_t> startIndexBuffer =
+		core.createBuffer<uint32_t>(vkcv::BufferType::STORAGE, eventBuffer.getCount());
+
+	{
+		vkcv::DescriptorWrites writes;
+		writes.writeStorageBuffer(2, startIndexBuffer.getHandle());
+		core.writeDescriptorSet(generationDescriptorSet, writes);
+	}
+
+
 	std::vector<smoke_t> smokes;
 	smokes.reserve(SMOKE_COUNT);
 	
@@ -914,11 +929,25 @@ int main(int argc, const char **argv) {
 			 [](const particle_t p1, const particle_t p2) {
 				 return p1.eventId < p2.eventId;
 			 });
+
+		std::vector<uint32_t> startingIndex;
+		startingIndex.resize(events.size());
+		uint32_t eventIdCheck = std::numeric_limits<uint32_t>::max();
+
+		for (size_t i = 0; i < particles.size(); i++) {
+			if (particles[i].eventId != eventIdCheck) {
+				eventIdCheck = particles [i].eventId;
+				if (eventIdCheck < startingIndex.size()) {
+					startingIndex [eventIdCheck] = i;
+				}
+			}
+		}
+
+		startIndexBuffer.fill(startingIndex);
 		
 		if (resetTime) {
-			start = std::chrono::system_clock::now();
-			
-			particleBuffer.fill(particles);
+			start = std::chrono::system_clock::now();	
+			initializeParticles(particles);
 			eventBuffer.fill(events);
 			smokeBuffer.fill(smokes);
 			trailBuffer.fill(trails);
@@ -926,6 +955,8 @@ int main(int argc, const char **argv) {
 			
 			memset(smokeIndices, 0, smokeIndexBuffer.getSize());
 		}
+
+		particleBuffer.fill(particles);
 	}
 	
 	smokeIndexBuffer.unmap();
-- 
GitLab