From a2f7c6b7ce2d056a0f7ef88bf762633de1ae1231 Mon Sep 17 00:00:00 2001
From: elom0n <74347790+elom0n@users.noreply.github.com>
Date: Sun, 24 Jul 2022 23:53:18 +0200
Subject: [PATCH] added nested events as well as a sparkler option

---
 projects/fire_works/shaders/event.inc       |   4 +-
 projects/fire_works/shaders/generation.comp |  35 +++-
 projects/fire_works/shaders/motion.comp     |   7 +-
 projects/fire_works/shaders/scale.comp      |   2 +-
 projects/fire_works/src/main.cpp            | 188 ++++++++++++--------
 5 files changed, 150 insertions(+), 86 deletions(-)

diff --git a/projects/fire_works/shaders/event.inc b/projects/fire_works/shaders/event.inc
index 12bf3906..a2ab170c 100644
--- a/projects/fire_works/shaders/event.inc
+++ b/projects/fire_works/shaders/event.inc
@@ -10,12 +10,12 @@ struct event_t {
 	uint count;
 	uint index;
 	uint parent;
-	uint pad0;
+	uint continuous;
 	
 	float lifetime;
 	float mass;
 	float size;
-	float pad1;
+	uint contCount;
 };
 
 #endif // EVENT_INC
\ No newline at end of file
diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp
index 864a9e44..3fdbd3a8 100644
--- a/projects/fire_works/shaders/generation.comp
+++ b/projects/fire_works/shaders/generation.comp
@@ -77,18 +77,35 @@ void main() {
     for (uint i = 0; i < events.length(); i++) {
         const float start = events[i].startTime;
 
-        if (((t - dt * 2) >= start) || (t < start)) {
+        if (events[i].continuous < 1 && (((t - dt * 2) >= start) || (t < start))) {
             continue;
         }
 
         index = atomicAdd(events[i].index, 1);
 
-        if (events[i].count > index) {
-            event_id = i;
-            break;
-        } else {
-            atomicAdd(events[i].index, -1);
+        if(events[i].continuous < 1){
+            if (events[i].count > index) {
+                event_id = i;
+                break;
+            }else{
+                atomicAdd(events[i].index, -1);
+            } 
+        }else{
+            if(events[i].continuous > index){
+                event_id = i;
+                break;
+            }else{
+                if(events[i].contCount > 0){
+                    atomicAdd(events[i].contCount, -1);
+                    events[i].index = 0;
+                    }
+                atomicAdd(events[i].index, -1);
+            }
         }
+        
+        
+
+        
     }
 
     if (event_id >= events.length()) {
@@ -115,8 +132,8 @@ void main() {
     float size = events[event_id].size;
 
     if (events[event_id].parent < events.length()) {
-        const uint spawnId = startIndex[events[event_id].parent];
-
+        const uint spawnId = startIndex[events[event_id].parent];// + int(int(events[events[event_id].parent].count * randomData[events[event_id].index % randomData.length()]) % events[events[event_id].parent].count);
+        
         if (spawnId < particlesCopy.length()) {
             particles[id].position = particlesCopy[spawnId].position;
             velocity += particlesCopy[spawnId].velocity;
@@ -124,7 +141,7 @@ void main() {
         }
     }
 
-    if (0 == index) {
+    if (0 == index && events[event_id].continuous < 1) {
         const uint sid = atomicAdd(smokeIndex, 1) % smokes.length();
 
         smokes[sid].position = particles[id].position;
diff --git a/projects/fire_works/shaders/motion.comp b/projects/fire_works/shaders/motion.comp
index 3e171101..f607d3cf 100644
--- a/projects/fire_works/shaders/motion.comp
+++ b/projects/fire_works/shaders/motion.comp
@@ -36,7 +36,12 @@ void main() {
     const float fading = 1.0f / (1.0f + friction);
 
     position = position + velocity * dt;
-    velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
+    if(particles[id].mass > 0){
+        velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
+    }
+    else{
+        velocity = velocity * fading;
+    }
 
     particles[id].position = position;
     particles[id].lifetime = lifetime;
diff --git a/projects/fire_works/shaders/scale.comp b/projects/fire_works/shaders/scale.comp
index 1f452611..44cfb8e4 100644
--- a/projects/fire_works/shaders/scale.comp
+++ b/projects/fire_works/shaders/scale.comp
@@ -31,7 +31,7 @@ void main() {
     const float fading = 1.0f / (1.0f + friction);
 
     position = position + velocity * dt;
-    velocity = velocity * fading + vec3(0.0f, -g, 0.0f) * dt;
+    velocity = velocity * fading + vec3(0.0f, 0.2f, 0.0f) * dt; //smoke is lighter than air right? + vec3(0.0f, -g, 0.0f) * dt;
     size = size + scaling * dt;
 
     smokes[id].position = position;
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index c4de5a7a..3bf4714d 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -29,12 +29,12 @@ struct event_t {
 	uint32_t count;
 	uint32_t index;
 	uint32_t parent;
-	uint32_t pad0;
+	uint32_t continous;
 	
 	float lifetime;
 	float mass;
 	float size;
-	float pad1;
+	uint32_t contCount;
 };
 
 struct smoke_t {
@@ -79,7 +79,7 @@ struct draw_smoke_t {
 #define RANDOM_DATA_LENGTH (1024)
 #define POINT_COUNT (2048 * 256)
 
-void initializeParticles(std::vector<particle_t> &particles) {
+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,
@@ -95,6 +95,96 @@ void initializeParticles(std::vector<particle_t> &particles) {
 	}
 }
 
+void InitializeFireworkEvents(std::vector<event_t>& events) {
+	events.emplace_back(glm::vec3(0, 1, 0), 0.5f, glm::vec3(0.0f, 1.0f, 0.0f), 12.5f,
+
+						1, 0, UINT_MAX, 0,
+
+						1.0f, 1.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 1.5f, glm::vec3(0.0f, 1.0f, 1.0f), 10.0f,
+
+						100, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+
+	events.emplace_back(glm::vec3(0.5, 1, 0), 0.25f, glm::vec3(0.0f, 1.5f, 0.0f), 15.0f,
+
+						1, 0, UINT_MAX, 0,
+
+						0.5f, 1.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 0.75f, glm::vec3(0.0f, 1.5f, 1.0f), 8.0f,
+
+						150, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+
+	events.emplace_back(glm::vec3(-2.5, 3, 0.5), 1.0f, glm::vec3(246.0f, 189.0f, 255.0f), 12.5f,
+
+						1, 0, UINT_MAX, 0,
+
+						1.0f, 1.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(235.0f, 137.0f, 250.0f), 8.0f,
+
+						75, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+}
+
+void InitializeSparklerEvents(std::vector<event_t> &events) {
+	events.emplace_back(glm::vec3(0, 1, 0), 0.0f, glm::vec3(251.0f, 255.0f, 145.0f), 1.0f,
+
+						1, 0, UINT_MAX, 0,
+
+						8.0f, 0.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 0.0f, glm::vec3(251.0f, 255.0f, 145.0f), 10.0f,
+
+						1000, 1, events.size() - 1, 10,
+
+						0.5f, -1.0f, 0.0f, 100);
+}
+
+void InitializeNestedFireworkEvents(std::vector<event_t>& events) {
+	events.emplace_back(glm::vec3(0, 2, 0), 0.0f, glm::vec3(0.0f, 1.0f, 0.0f), 12.5f,
+
+						1, 0, UINT_MAX, 0,
+
+						1.0f, 1.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 1.0f, glm::vec3(0.0f, 1.0f, 1.0f), 7.0f,
+
+						100, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(0.0f, 0.0f, 0.0f), 10.0f,
+
+						100, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 1.0f, glm::vec3(42.0f,0.0f, 1.0f), 12.5f,
+
+						100, 0, events.size() - 2, 0,
+
+						1.0f, 1.0f, 0.5f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 1.5f, glm::vec3(42.0f, 0.0f, 1.0f), 10.0f,
+
+						100, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+
+	events.emplace_back(glm::vec3(0.0f), 2.0f, glm::vec3(42.0f, 0.0f, 1.0f), 10.0f,
+
+						100, 0, events.size() - 1, 0,
+
+						10.0f, 1.0f, 0.0f, 0);
+}
+
 int main(int argc, const char **argv) {
 	vkcv::Features features;
 	
@@ -263,7 +353,7 @@ int main(int argc, const char **argv) {
 	
 	std::vector<particle_t> particles;
 	particles.resize(PARTICLE_COUNT);
-	initializeParticles(particles);
+	InitializeParticles(particles);
 	
 	vkcv::Buffer<particle_t> particleBuffer = core.createBuffer<particle_t>(
 		vkcv::BufferType::STORAGE,
@@ -304,74 +394,7 @@ int main(int argc, const char **argv) {
 	randomBuffer.fill(randomData);
 	
 	std::vector<event_t> events;
-	
-	events.emplace_back(
-		glm::vec3(0, 1, 0),
-		0.5f,
-		glm::vec3(0.0f, 1.0f, 0.0f),
-		12.5f,
-		
-		1,
-		0,
-		UINT_MAX,
-		0,
-		
-		1.0f,
-		1.0f,
-		0.5f,
-		0.0f
-	);
-	
-	events.emplace_back(
-		glm::vec3(0.0f),
-		1.5f,
-		glm::vec3(0.0f, 1.0f, 1.0f),
-		10.0f,
-		
-		100,
-		0,
-		events.size() - 1,
-		0,
-		
-		10.0f,
-		1.0f,
-		0.0f,
-		0.0f
-	);
-
-	events.emplace_back(
-		glm::vec3(0.5, 1, 0), 
-		0.25f, 
-		glm::vec3(0.0f, 1.5f, 0.0f), 
-		15.0f,
-
-		1, 
-		0, 
-		UINT_MAX, 
-		0,
-
-		0.5f, 
-		1.0f, 
-		0.5f, 
-		0.0f
-	);
-
-	events.emplace_back(
-		glm::vec3(0.0f), 
-		0.75f, 
-		glm::vec3(0.0f, 1.5f, 1.0f), 
-		8.0f,
-
-		150, 
-		0, 
-		events.size() - 1, 
-		0,
-
-		10.0f, 
-		1.0f, 
-		0.0f, 
-		0.0f
-	);
+	InitializeFireworkEvents(events);
 	
 	vkcv::Buffer<event_t> eventBuffer = core.createBuffer<event_t>(
 		vkcv::BufferType::STORAGE,
@@ -934,6 +957,11 @@ int main(int argc, const char **argv) {
 		gui.beginGUI();
 		ImGui::Begin("Settings");
 		
+		bool listbox = ImGui::BeginListBox(" ");
+		bool firework = ImGui::Selectable("Firework");
+		bool sparkler = ImGui::Selectable("Sparkler");
+		bool nested = ImGui::Selectable("Nested Firework");
+		ImGui::EndListBox();
 		bool resetTime = ImGui::Button("Reset");
 		
 		ImGui::End();
@@ -961,10 +989,24 @@ int main(int argc, const char **argv) {
 		}
 
 		startIndexBuffer.fill(startingIndex);
+
+		if (firework) {
+			events.clear();
+			InitializeFireworkEvents(events);
+			resetTime = true;
+		} else if (sparkler) {
+			events.clear();
+			InitializeSparklerEvents(events);
+			resetTime = true;
+		} else if (nested) {
+			events.clear();
+			InitializeNestedFireworkEvents(events);
+			resetTime = true;
+		}
 		
 		if (resetTime) {
 			start = std::chrono::system_clock::now();	
-			initializeParticles(particles);
+			InitializeParticles(particles);
 			particleBuffer.fill(particles);
 			eventBuffer.fill(events);
 			smokeBuffer.fill(smokes);
-- 
GitLab