@group(0) @binding(0) var<uniform> params: StepParams;
@group(0) @binding(1) var<storage, read> body_states: array<BodyState>;
@group(0) @binding(2) var<storage, read> colliders: array<Collider>;
@group(0) @binding(3) var<storage, read_write> aabbs: array<Aabb>;
@compute @workgroup_size(WORKGROUP_SIZE)
fn main(@builtin(global_invocation_id) gid: vec3u) {
let index = gid.y * (WORKGROUPS_PER_ROW * WORKGROUP_SIZE) + gid.x;
if (index >= params.dynamic_count) {
return;
}
let state = body_states[index];
for (var i = 0u; i < MAX_COLLIDERS_PER_BODY; i = i + 1u) {
let collider_index = index * MAX_COLLIDERS_PER_BODY + i;
let collider = colliders[collider_index];
if (collider.kind == SHAPE_NONE) {
var empty: Aabb;
empty.min = vec3f(3.402823466e38);
empty.max = vec3f(-3.402823466e38);
aabbs[collider_index] = empty;
continue;
}
let world = world_collider(state, collider);
var aabb = world_aabb_of(world);
let extent = (aabb.max - aabb.min) * 0.5;
let prev_center = state.prev_position + quat_rotate(state.orientation, collider.local_offset);
aabb.min = min(aabb.min, prev_center - extent);
aabb.max = max(aabb.max, prev_center + extent);
aabbs[collider_index] = aabb;
}
}