From cb11496752ede6dab15d7ae60e0005e78b77e5bb Mon Sep 17 00:00:00 2001 From: Xander Swan Date: Fri, 5 Dec 2025 21:31:14 -0500 Subject: actual physics system --- src/phys/body.odin | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/phys/body.odin (limited to 'src/phys/body.odin') diff --git a/src/phys/body.odin b/src/phys/body.odin new file mode 100644 index 0000000..fcae697 --- /dev/null +++ b/src/phys/body.odin @@ -0,0 +1,65 @@ +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 +} + +Collision_Type :: enum(u16) { + 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; u16], + layers: bit_set[Layer; u16], + mask: bit_set[Layer; u16], +} + +make_body :: proc( + w: ^World, + rect: Rect, + layers := bit_set[Layer; u16]{.DEFAULT}, + mask := bit_set[Layer; u16]{.DEFAULT}, +) -> (Body_Handle, ^Body) { + b := Body { + rect = rect, + layers = layers, + mask = mask, + active = true, + } + return add_body(w, 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) +} + -- cgit v1.3-2-g0d8e