package phys Vec2 :: [2]f32 Rect :: struct { start: Vec2, size: Vec2, } Layer :: enum (u16) { Default, Hard, // hard collisions; don't let bodies intersect at all Soft, // soft collisions; push away other bodies with a force Enemy, // enemy hitboxes Player, // player hitboxes Enemy_Projectile, Player_Projectile, } Collision_Type :: enum (u8) { Up, Down, Right, Left, Horizontal, Vertical, } Body :: struct { handle: Body_Handle, bin_idx: i32, rect: Rect, active: bool, pos: Vec2, vel: Vec2, collisions: bit_set[Collision_Type;u8], layers: bit_set[Layer;u16], mask: bit_set[Layer;u16], } make_body :: proc( rect: Rect, layers := bit_set[Layer;u16]{.Default}, mask := bit_set[Layer;u16]{.Default}, ) -> Body_Handle { b := Body { rect = rect, layers = layers, mask = mask, active = true, } return add_body(b) } aabb_hori :: proc(a: Rect, b: Rect) -> bool { return a.start.x < b.start.x + b.size.x && b.start.x < a.start.x + a.size.x } aabb_vert :: proc(a: Rect, b: Rect) -> bool { return a.start.y < b.start.y + b.size.y && b.start.y < a.start.y + a.size.y } aabb :: proc(a: Rect, b: Rect) -> bool { return aabb_hori(a, b) && aabb_vert(a, b) }