diff options
| author | iamcheeseman <[hidden email]> | 2026-02-13 20:42:28 -0500 |
|---|---|---|
| committer | iamcheeseman <[hidden email]> | 2026-02-13 20:42:28 -0500 |
| commit | 1ff729f696c895f81f0cf0d1b8a2cca1d6e43eb8 (patch) | |
| tree | 040bf0ffe933d424951159380af83c927a55a9fe /src/phys/world.odin | |
| parent | c6261cc09f97568ad5ea966662697e01ea17b861 (diff) | |
simple raycasting mmmmmm
Diffstat (limited to 'src/phys/world.odin')
| -rw-r--r-- | src/phys/world.odin | 39 |
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 |
