mirror of
https://github.com/eliasstepanik/voxel-simulation.git
synced 2026-01-24 12:08:31 +00:00
30 lines
1015 B
WebGPU Shading Language
30 lines
1015 B
WebGPU Shading Language
// Computes visible chunk keys based on camera centre and view radius.
|
|
// Input arrays must match in length and are processed per invocation.
|
|
|
|
struct Params {
|
|
centre: vec3<i32>;
|
|
radius: i32;
|
|
count: u32;
|
|
};
|
|
|
|
@group(0) @binding(0) var<storage, read> occupied: array<vec3<i32>>;
|
|
@group(0) @binding(1) var<storage, read> spawned: array<u32>;
|
|
@group(0) @binding(2) var<storage, read_write> out_keys: array<vec3<i32>>;
|
|
@group(0) @binding(3) var<storage, read_write> out_count: atomic<u32>;
|
|
@group(0) @binding(4) var<uniform> params: Params;
|
|
|
|
@compute @workgroup_size(64)
|
|
fn main(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
let idx = id.x;
|
|
if idx >= params.count { return; }
|
|
let key = occupied[idx];
|
|
if spawned[idx] != 0u { return; }
|
|
let dx = key.x - params.centre.x;
|
|
let dy = key.y - params.centre.y;
|
|
let dz = key.z - params.centre.z;
|
|
if dx*dx + dy*dy + dz*dz <= params.radius * params.radius {
|
|
let i = atomicAdd(&out_count, 1u);
|
|
out_keys[i] = key;
|
|
}
|
|
}
|