1#import bevy_hanabi::vfx_common::{ 2 ChildInfo, ChildInfoBuffer, SimParams, Spawner, 3 EM_OFFSET_ALIVE_COUNT, EM_OFFSET_MAX_UPDATE, EM_OFFSET_DEAD_COUNT, 4 EM_OFFSET_MAX_SPAWN, EM_OFFSET_INSTANCE_COUNT, EM_OFFSET_INDIRECT_DISPATCH_INDEX, 5 EM_OFFSET_PING, DISPATCH_INDIRECT_STRIDE, EFFECT_METADATA_STRIDE 8@group(0) @binding(0) var<uniform> sim_params : SimParams; 11@group(1) @binding(0) var<storage, read_write> effect_metadata_buffer : array<u32>; 13@group(1) @binding(1) var<storage, read_write> dispatch_indirect_buffer : array<u32>; 15@group(2) @binding(0) var<storage, read_write> spawner_buffer : array<Spawner>; 17#ifdef HAS_GPU_SPAWN_EVENTS 18@group(3) @binding(0) var<storage, read_write> child_info_buffer : ChildInfoBuffer; 22@compute @workgroup_size(64) 23fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) { 24 let thread_index = global_invocation_id.x; 26#ifdef HAS_GPU_SPAWN_EVENTS 29 if (thread_index < arrayLength(&child_info_buffer.rows)) { 30 child_info_buffer.rows[thread_index].event_count = 0; 35 let effect_index = thread_index; 36 if (effect_index >= sim_params.num_effects) { 40 let effect_metadata_index = spawner_buffer[effect_index].effect_metadata_index; 41 let em_base = EFFECT_METADATA_STRIDE * effect_metadata_index; 45 effect_metadata_buffer[em_base + EM_OFFSET_INSTANCE_COUNT] = 0u; 47 let alive_count = effect_metadata_buffer[em_base + EM_OFFSET_ALIVE_COUNT]; 48 let dead_count = effect_metadata_buffer[em_base + EM_OFFSET_DEAD_COUNT]; 53 effect_metadata_buffer[em_base + EM_OFFSET_MAX_UPDATE] = alive_count; 60 effect_metadata_buffer[em_base + EM_OFFSET_MAX_SPAWN] = dead_count; 64 let indirect_dispatch_index = effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_DISPATCH_INDEX]; 65 let di_base = DISPATCH_INDIRECT_STRIDE * indirect_dispatch_index; 66 dispatch_indirect_buffer[di_base] = (alive_count + 63u) >> 6u; 70 let ping = effect_metadata_buffer[em_base + EM_OFFSET_PING]; 72 effect_metadata_buffer[em_base + EM_OFFSET_PING] = pong; 76 spawner_buffer[effect_index].render_pong = pong;