aboutsummaryrefslogtreecommitdiff
path: root/src/phys/world.odin
diff options
context:
space:
mode:
authoriamcheeseman <[hidden email]>2026-02-13 20:42:28 -0500
committeriamcheeseman <[hidden email]>2026-02-13 20:42:28 -0500
commit1ff729f696c895f81f0cf0d1b8a2cca1d6e43eb8 (patch)
tree040bf0ffe933d424951159380af83c927a55a9fe /src/phys/world.odin
parentc6261cc09f97568ad5ea966662697e01ea17b861 (diff)
simple raycasting mmmmmm
Diffstat (limited to 'src/phys/world.odin')
-rw-r--r--src/phys/world.odin39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/phys/world.odin b/src/phys/world.odin
index 5207622..b760f51 100644
--- a/src/phys/world.odin
+++ b/src/phys/world.odin
@@ -157,7 +157,40 @@ remove_body :: proc(h: Body_Handle) {
world.bodies[h.idx] = {}
}
-get_colliding_bodies :: proc(
+get_colliding_bodies :: proc{
+ get_colliding_bodies_body_vs_body,
+ get_colliding_bodies_raycast_vs_body,
+}
+
+get_colliding_bodies_raycast_vs_body :: proc(
+ rc: Raycast,
+ allocator := context.allocator
+) -> []Body_Handle {
+ bodies := make([dynamic]Body_Handle, allocator)
+
+ bin_list := get_surrounding_bins(rc.start)
+
+ for bin in bin_list {
+ for b_h in bin {
+ b := _get_body(b_h)
+
+ if b.layers & rc.mask == nil {
+ continue
+ }
+
+ b_rect := b.rect
+ b_rect.start += b.pos
+
+ if raycast_to_aabb(rc, b^) {
+ append(&bodies, b_h)
+ }
+ }
+ }
+
+ return bodies[:]
+}
+
+get_colliding_bodies_body_vs_body :: proc(
h: Body_Handle,
allocator := context.allocator
) -> []Body_Handle {
@@ -178,6 +211,10 @@ get_colliding_bodies :: proc(
c := _get_body(c_h)
+ if b.mask & c.layers == nil {
+ continue
+ }
+
c_rect := c.rect
c_rect.start += c.pos