1#import bevy_hanabi::vfx_common::{ 2 ChildInfo, ChildInfoBuffer, 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, 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>; 18@group(1) @binding(2) var<storage, read_write> draw_indirect_buffer : array<u32>; 20@group(2) @binding(0) var<storage, read_write> spawner_buffer : array<Spawner>; 22#ifdef HAS_GPU_SPAWN_EVENTS 23@group(3) @binding(0) var<storage, read_write> child_info_buffer : ChildInfoBuffer; 27@compute @workgroup_size(64) 28fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) { 29 let thread_index = global_invocation_id.x; 31#ifdef HAS_GPU_SPAWN_EVENTS 34 if (thread_index < arrayLength(&child_info_buffer.rows)) { 35 child_info_buffer.rows[thread_index].event_count = 0; 40 let effect_index = thread_index; 41 if (effect_index >= sim_params.num_effects) { 45 let effect_metadata_index = spawner_buffer[effect_index].effect_metadata_index; 46 let em_base = EFFECT_METADATA_STRIDE * effect_metadata_index; 50 let draw_indirect_index = spawner_buffer[effect_index].draw_indirect_index; 51 let dri_base = DRAW_INDEXED_INDIRECT_STRIDE * draw_indirect_index; 52 draw_indirect_buffer[dri_base + 1u] = 0u; 54 let capacity = effect_metadata_buffer[em_base + EM_OFFSET_CAPACITY]; 55 let alive_count = effect_metadata_buffer[em_base + EM_OFFSET_ALIVE_COUNT]; 56 let dead_count = capacity - alive_count; 61 effect_metadata_buffer[em_base + EM_OFFSET_MAX_UPDATE] = alive_count; 68 effect_metadata_buffer[em_base + EM_OFFSET_MAX_SPAWN] = dead_count; 72 let indirect_dispatch_index = effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_DISPATCH_INDEX]; 73 let di_base = DISPATCH_INDIRECT_STRIDE * indirect_dispatch_index; 74 dispatch_indirect_buffer[di_base] = (alive_count + 63u) >> 6u; 75 dispatch_indirect_buffer[di_base + 1u] = 1u; 76 dispatch_indirect_buffer[di_base + 2u] = 1u; 80 let ping = effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_WRITE_INDEX]; 82 effect_metadata_buffer[em_base + EM_OFFSET_INDIRECT_WRITE_INDEX] = pong; 86 spawner_buffer[effect_index].render_indirect_read_index = pong;