diff options
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 |
