diff --git a/projects/fire_works/shaders/event.inc b/projects/fire_works/shaders/event.inc index 12bf39065e2d6f3f967352cfec825804e0923147..a2ab170c0894da68638b0e61e4af90a7a5fcdd64 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 864a9e44e5806394225cec7a769049eaea4eda35..3fdbd3a869c9121340ae8d2ebe2efda4b7bc2020 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 3e1711011ceefaaf9f14aa71e1d5ffaeb7b6a7be..f607d3cf912869b25ffcb490e7d05747e2a93caa 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 1f452611c5ad83d61a323487918aa85c7bbbb75a..44cfb8e48ad078f5ee8f63785b513a20f27ef542 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 c4de5a7ac88c89db3fa2ca419a6503414926cbfe..3bf4714d8241466345534fb5162a6f6c0fe9f3d6 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);