@group(0) @binding(0) var positions: array>; @group(0) @binding(1) var velocities: array>; @group(0) @binding(2) var distances: array; @group(0) @binding(3) var indices: array; @group(0) @binding(4) var deltaTimeSeconds: f32; @group(0) @binding(5) var cameraPosition: vec3; @group(0) @binding(6) var updateDistancesAndIndices: u32; @group(0) @binding(7) var cellCount: u32; @group(0) @binding(8) var gravity: f32; @compute @workgroup_size(64) fn computeMain(@builtin(global_invocation_id) globalInvocationId: vec3) { let particleIndex = globalInvocationId.x; if (particleIndex >= arrayLength(&positions)) { return; } let gravityAcceleration = vec3(0.0, gravity, 0.0); var currentPosition = positions[particleIndex]; var currentVelocity = velocities[particleIndex]; let deltaTimeClamped = min(deltaTimeSeconds, 0.01); currentVelocity += gravityAcceleration * deltaTimeClamped; currentPosition += currentVelocity * deltaTimeClamped; let friction = 0.98; currentVelocity *= friction; positions[particleIndex] = currentPosition; velocities[particleIndex] = currentVelocity; if ( updateDistancesAndIndices == 1u ) { let diff = currentPosition - cameraPosition; let dist = length(diff); distances[ particleIndex ] = dist; indices[ particleIndex ] = particleIndex; positions[ particleIndex ] = currentPosition; } }