1#import bevy_hanabi::vfx_common::{ 2 ChildInfo, ChildInfoBuffer, EventBuffer, IndirectDispatch, IndirectBuffer, 3 EffectMetadata, RenderGroupIndirect, SimParams, Spawner, 4 seed, tau, pcg_hash, to_float01, frand, frand2, frand3, frand4, 5 rand_uniform_f, rand_uniform_vec2, rand_uniform_vec3, rand_uniform_vec4, 6 rand_normal_f, rand_normal_vec2, rand_normal_vec3, rand_normal_vec4, proj 13struct ParticleBuffer { 14 particles: array<Particle>, 17#ifdef READ_PARENT_PARTICLE 19struct ParentParticle { 23struct ParentParticleBuffer { 24 particles: array<ParentParticle>, 31@group(0) @binding(0) var<uniform> sim_params : SimParams; 34@group(1) @binding(0) var<storage, read_write> particle_buffer : ParticleBuffer; 35@group(1) @binding(1) var<storage, read_write> indirect_buffer : IndirectBuffer; 36#ifdef READ_PARENT_PARTICLE 37@group(1) @binding(2) var<storage, read> parent_particle_buffer : ParentParticleBuffer; 41@group(2) @binding(0) var<storage, read> spawner : Spawner; 45@group(3) @binding(0) var<storage, read_write> effect_metadata : EffectMetadata; 46#ifdef EMITS_GPU_SPAWN_EVENTS 47{{EMIT_EVENT_BUFFER_BINDINGS}} 52#ifdef EMITS_GPU_SPAWN_EVENTS 53{{EMIT_EVENT_BUFFER_APPEND_FUNCS}} 56@compute @workgroup_size(64) 57fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) { 58 let thread_index = global_invocation_id.x; 61 if (thread_index >= effect_metadata.max_update) { 66 let write_index = effect_metadata.ping; 67 let read_index = 1u - write_index; 69 let particle_index = indirect_buffer.indices[3u * thread_index + read_index]; 72 seed = pcg_hash(particle_index ^ spawner.seed); 74 var particle: Particle = particle_buffer.particles[particle_index]; 84 let dead_index = atomicAdd(&effect_metadata.dead_count, 1u); 85 indirect_buffer.indices[3u * dead_index + 2u] = particle_index; 89 atomicAdd(&effect_metadata.max_spawn, 1u); 90 atomicSub(&effect_metadata.alive_count, 1u); 93 let indirect_index = atomicAdd(&effect_metadata.instance_count, 1u); 94 indirect_buffer.indices[3u * indirect_index + write_index] = particle_index;