diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp index a5368eebdc713bbd70d2329656ea0da7be0905d4..445c8f492d221cabaca855ff533817ca609af86c 100644 --- a/projects/fire_works/shaders/generation.comp +++ b/projects/fire_works/shaders/generation.comp @@ -11,6 +11,10 @@ layout(set=0, binding=0, std430) buffer particleBuffer { particle_t particles []; }; +layout(set=0, binding=1, std430) readonly buffer particleBufferCopy { + particle_t particlesCopy []; +}; + layout(set=1, binding=0, std430) readonly buffer randomBuffer { float randomData []; }; @@ -113,10 +117,10 @@ void main() { if (events[event_id].parent < events.length()) { const uint spawnId = startIndex[events[event_id].parent]; - if (spawnId < particles.length()) { - particles[id].position = particles[spawnId].position; - velocity += particles[spawnId].velocity; - size = particles[spawnId].size; + if (spawnId < particlesCopy.length()) { + particles[id].position = particlesCopy[spawnId].position; + velocity += particlesCopy[spawnId].velocity; + size = particlesCopy[spawnId].size; } } @@ -155,6 +159,4 @@ void main() { trails[tid].color = mix(color, vec3(1.0f), 0.75f); trails[tid].lifetime = lifetime + (dt * trailLen) * 0.5f; } - - events[event_id].pad0 = id; } diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp index f70adaa038a60b3f884fdc7b9e75fadf712a04ca..435bfc62512044356225b00a1b2487e4fced9775 100644 --- a/projects/fire_works/src/main.cpp +++ b/projects/fire_works/src/main.cpp @@ -130,8 +130,18 @@ int main(int argc, const char **argv) { false, false }; + vkcv::DescriptorBinding binding1 { + 1, + vkcv::DescriptorType::STORAGE_BUFFER, + + 1, + vkcv::ShaderStage::COMPUTE, + false, + false + }; descriptorBindings0.insert(std::make_pair(0, binding0)); + descriptorBindings0.insert(std::make_pair(1, binding1)); vkcv::DescriptorSetLayoutHandle descriptorSetLayout = core.createDescriptorSetLayout(descriptorBindings0); vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorSetLayout); @@ -151,14 +161,6 @@ int main(int argc, const char **argv) { vkcv::DescriptorSetHandle generationDescriptorSet = core.createDescriptorSet(generationDescriptorLayout); vkcv::DescriptorBindings descriptorBindings1; - vkcv::DescriptorBinding binding1 { - 1, - vkcv::DescriptorType::STORAGE_BUFFER, - 1, - vkcv::ShaderStage::COMPUTE, - false, - false - }; descriptorBindings1.insert(std::make_pair(0, binding0)); descriptorBindings1.insert(std::make_pair(1, binding1)); @@ -269,9 +271,16 @@ int main(int argc, const char **argv) { particleBuffer.fill(particles); + vkcv::Buffer<particle_t> particleBufferCopy = + core.createBuffer<particle_t>(vkcv::BufferType::STORAGE, particles.size()); + + particleBufferCopy.fill(particles); + + { vkcv::DescriptorWrites writes; writes.writeStorageBuffer(0, particleBuffer.getHandle()); + writes.writeStorageBuffer(1, particleBufferCopy.getHandle()); core.writeDescriptorSet(descriptorSet, writes); } @@ -948,6 +957,7 @@ int main(int argc, const char **argv) { if (resetTime) { start = std::chrono::system_clock::now(); initializeParticles(particles); + particleBuffer.fill(particles); eventBuffer.fill(events); smokeBuffer.fill(smokes); trailBuffer.fill(trails); @@ -956,7 +966,7 @@ int main(int argc, const char **argv) { memset(smokeIndices, 0, smokeIndexBuffer.getSize()); } - particleBuffer.fill(particles); + particleBufferCopy.fill(particles); } smokeIndexBuffer.unmap();