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