1#import bevy_hanabi::vfx_common::{ 2 ChildInfo, ChildInfoBuffer, DispatchIndirectArgs, SimParams, Spawner, 3 EM_OFFSET_ALIVE_COUNT, EM_OFFSET_MAX_UPDATE, EM_OFFSET_CAPACITY, 4 EM_OFFSET_MAX_SPAWN, EM_OFFSET_INDIRECT_DISPATCH_INDEX, DRAW_INDEXED_INDIRECT_STRIDE, 5 EM_OFFSET_INDIRECT_WRITE_INDEX, 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>; 12@group(1) @binding(1) var<storage, read_write> dispatch_indirect_buffer : array<DispatchIndirectArgs>; 17@group(1) @binding(2) var<storage, read_write> draw_indirect_buffer : array<u32>; 19@group(2) @binding(0) var<storage, read_write> spawner_buffer : array<Spawner>; 21#ifdef HAS_GPU_SPAWN_EVENTS 22@group(3) @binding(0) var<storage, read_write> child_info_buffer : ChildInfoBuffer; 26@compute @workgroup_size(64) 27fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) { 28 let thread_index = global_invocation_id.x; 30#ifdef HAS_GPU_SPAWN_EVENTS 33 if (thread_index < arrayLength(&child_info_buffer.rows)) { 34 child_info_buffer.rows[thread_index].event_count = 0; 39 let effect_index = thread_index; 40 if (effect_index >= sim_params.num_effects) { 44 let effect_metadata_index = spawner_buffer[effect_index].effect_metadata_index; 45 let em_base = EFFECT_METADATA_STRIDE * effect_metadata_index; 49 let draw_indirect_index = spawner_buffer[effect_index].draw_indirect_index; 50 let dri_base = DRAW_INDEXED_INDIRECT_STRIDE * draw_indirect_index; 51 draw_indirect_buffer[dri_base + 1u] = 0u; 53 let capacity = effect_metadata_buffer[em_base + EM_OFFSET_CAPACITY]; 54 let alive_count = effect_metadata_buffer[em_base + EM_OFFSET_ALIVE_COUNT]; 55 let dead_count = capacity - alive_count; 60 effect_metadata_buffer[em_base + EM_OFFSET_MAX_UPDATE] = alive_count; 67 effect_metadata_buffer[em_base + EM_OFFSET_MAX_SPAWN] = dead_count; 71 let indirect_dispatch_index = effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_DISPATCH_INDEX]; 72 dispatch_indirect_buffer[indirect_dispatch_index].x = (alive_count + 63u) >> 6u; 73 dispatch_indirect_buffer[indirect_dispatch_index].y = 1u; 74 dispatch_indirect_buffer[indirect_dispatch_index].z = 1u; 78 let ping = effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_WRITE_INDEX]; 80 effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_WRITE_INDEX] = pong; 84 spawner_buffer[effect_index].render_indirect_read_index = pong;