1#import bevy_pbr::utils::rand_f 4 pos_and_scale: vec4<f32>, 11struct DrawIndexedIndirectArgs { 13 instance_count: atomic<u32>, 19struct CameraCullData { 24 visibility_range: vec4<f32>, 25 world_from_local: mat4x4<f32>, 28@group(0) @binding(0) var<storage, read> source_buffer: array<InstanceData>; 29@group(0) @binding(1) var<storage, read_write> instance_buffer: array<InstanceData>; 30@group(0) @binding(2) var<storage, read_write> indirect_args: DrawIndexedIndirectArgs; 31@group(0) @binding(3) var<uniform> camera: CameraCullData; 32@group(0) @binding(4) var<uniform> lod_data: LodCullData; 35fn hash_noise(index: u32) -> f32 { 37 return rand_f(&state); 40@compute @workgroup_size(64) 41fn main(@builtin(global_invocation_id) global_id: vec3<u32>) { 43 if (i >= arrayLength(&source_buffer)) { return; } 45 let instance = source_buffer[i]; 46 let local_pos = vec4<f32>(instance.pos_and_scale.xyz, 1.0); 47 let world_pos = lod_data.world_from_local * local_pos; 49 let dist = distance(world_pos.xyz, camera.view_pos.xyz); 51 if (dist < lod_data.visibility_range.x || dist > lod_data.visibility_range.w) { 55 let write_index = atomicAdd(&indirect_args.instance_count, 1u); 57 instance_buffer[write_index] = instance;