struct Settings { agentCount: u32, eraserMaskAlphaThreshold: f32, maskWidth: u32, maskHeight: u32, boundsMin: vec2, boundsMax: vec2, }; @group(1) @binding(0) var settings: Settings; @group(1) @binding(2) var eraserMask: texture_2d; @compute @workgroup_size(agentWorkgroupSize) fn main( @builtin(global_invocation_id) global_id: vec3 ) { let id = get_id(global_id); if id >= settings.agentCount { return; } let colorIndex = agents[id].colorIndex; if colorIndex < 0.0 { return; } let position = agents[id].position; if any(position < settings.boundsMin) || any(position > settings.boundsMax) { return; } let maskSize = vec2(i32(settings.maskWidth), i32(settings.maskHeight)); let maskPosition = clamp( vec2(position), vec2(0, 0), maskSize - vec2(1, 1) ); let maskSample = textureLoad(eraserMask, maskPosition, 0); if maskSample.r < settings.eraserMaskAlphaThreshold { agents[id].colorIndex = -1.0; } }