3const LOD_COUNT: u32 = 5u; 4const CASCADE_COUNT: u32 = LOD_COUNT + 1u; 5const WAVE_COUNT: u32 = 40u; 17 cascades: array<CascadeParams, CASCADE_COUNT>, 20 bed_transform: vec4<f32>, 28 angular_frequency: f32, 32struct AnimWavesUniform { 33 cascade_layout: CascadeLayout, 34 waves: array<GerstnerWave, WAVE_COUNT>, 35 ranges: array<vec4<u32>, LOD_COUNT>, 42@group(0) @binding(0) var raw_waves: texture_2d_array<f32>; 43@group(0) @binding(1) var previous: texture_2d_array<f32>; 44@group(0) @binding(2) var linear_sampler: sampler; 45@group(0) @binding(3) var output: texture_storage_2d_array<rgba16float, write>; 46@group(0) @binding(4) var<uniform> params: AnimWavesUniform; 48fn combine_lod(id: vec3<u32>, slice: u32) { 49 let cascade = params.cascade_layout.cascades[slice]; 50 if id.x >= u32(cascade.texture_res) || id.y >= u32(cascade.texture_res) { 53 var displacement = textureLoad(raw_waves, vec2<i32>(id.xy), i32(slice), 0).xyz; 54 if slice + 1u < LOD_COUNT { 55 let uv = (vec2<f32>(id.xy) + vec2(0.5)) * cascade.inv_texture_res; 56 let coverage = cascade.texel_width * cascade.texture_res; 57 let world_xz = coverage * (uv - vec2(0.5)) + cascade.center; 58 let next = params.cascade_layout.cascades[slice + 1u]; 59 let next_coverage = next.texel_width * next.texture_res; 60 let next_uv = (world_xz - next.center) / next_coverage + vec2(0.5); 61 displacement += textureSampleLevel( 69 textureStore(output, vec2<i32>(id.xy), i32(slice), vec4(displacement, 0.0)); 73@compute @workgroup_size(8, 8, 1) 74fn main(@builtin(global_invocation_id) id: vec3<u32>) { combine_lod(id, 1u); } 77@compute @workgroup_size(8, 8, 1) 78fn main(@builtin(global_invocation_id) id: vec3<u32>) { combine_lod(id, 2u); } 81@compute @workgroup_size(8, 8, 1) 82fn main(@builtin(global_invocation_id) id: vec3<u32>) { combine_lod(id, 3u); } 85@compute @workgroup_size(8, 8, 1) 86fn main(@builtin(global_invocation_id) id: vec3<u32>) { combine_lod(id, 4u); } 89@compute @workgroup_size(8, 8, 1) 90fn main(@builtin(global_invocation_id) id: vec3<u32>) { combine_lod(id, 0u); }