1#import bevy_hanabi::vfx_common::{EffectMetadata, Spawner} 16 pairs: array<KeyValuePair>, 21struct RawParticleBuffer { 25@group(0) @binding(0) var<storage, read_write> sort_buffer : SortBuffer; 26@group(0) @binding(1) var<storage, read> particle_buffer : RawParticleBuffer; 27@group(0) @binding(2) var<storage, read> indirect_index_buffer : array<u32>; 29@group(0) @binding(3) var<storage, read_write> effect_metadata : EffectMetadata; 30@group(0) @binding(4) var<storage, read> spawner : Spawner; 33@compute @workgroup_size(64) 34fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>) { 35 let thread_index = global_invocation_id.x; 36 let count = atomicLoad(&effect_metadata.alive_count); 37 if (thread_index >= count) { 41 let base_particle = spawner.slab_offset; 46 let read_index = effect_metadata.indirect_write_index; 47 let particle_index = indirect_index_buffer[(base_particle + thread_index) * 3u + read_index]; 49 let particle_offset = (base_particle + particle_index) * effect_metadata.particle_stride; 50 let key_offset = particle_offset + effect_metadata.sort_key_offset; 51 let key2_offset = particle_offset + effect_metadata.sort_key2_offset; 53 let pair_index = atomicAdd(&sort_buffer.count, 1); 54 sort_buffer.pairs[pair_index].key = particle_buffer.data[key_offset]; 55 sort_buffer.pairs[pair_index].key2 = particle_buffer.data[key2_offset]; 56 sort_buffer.pairs[pair_index].value = particle_index;