From bfb72af500dd0fd6e1119d7c26377cd87b4b3e61 Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Tue, 13 Feb 2024 10:45:41 -0600 Subject: [PATCH] fix: SearchAllColliders with filter --- .../DynamicTreeCollisionProcessor.ts | 12 ++++++---- src/spec/PhysicsWorldSpec.ts | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/engine/Collision/Detection/DynamicTreeCollisionProcessor.ts b/src/engine/Collision/Detection/DynamicTreeCollisionProcessor.ts index 30d8b607a..1576c9111 100644 --- a/src/engine/Collision/Detection/DynamicTreeCollisionProcessor.ts +++ b/src/engine/Collision/Detection/DynamicTreeCollisionProcessor.ts @@ -97,13 +97,17 @@ export class DynamicTreeCollisionProcessor implements CollisionProcessor { if (options?.filter) { if (options.filter(hit)) { results.push(hit); + if (!searchAllColliders) { + // returning true exits the search + return true; + } } } else { results.push(hit); - } - if (!searchAllColliders) { - // returning true exits the search - return true; + if (!searchAllColliders) { + // returning true exits the search + return true; + } } } return false; diff --git a/src/spec/PhysicsWorldSpec.ts b/src/spec/PhysicsWorldSpec.ts index 9d0816a54..7c1ff5a5d 100644 --- a/src/spec/PhysicsWorldSpec.ts +++ b/src/spec/PhysicsWorldSpec.ts @@ -164,4 +164,28 @@ describe('A physics world', () => { expect(hits[0].distance).toBe(275); expect(hits[0].point).toEqual(ex.vec(275, 0)); }); + + it('can rayCast with filter and search all colliders false, returns 1 hit', () => { + const sut = TestUtils.engine(); + const actor1 = new ex.Actor({x: 100, y: 0, width: 50, height: 50}); + sut.currentScene.add(actor1); + const actor2 = new ex.Actor({x: 200, y: 0, width: 50, height: 50}); + sut.currentScene.add(actor2); + const actor3 = new ex.Actor({x: 300, y: 0, width: 50, height: 50, collisionGroup: new ex.CollisionGroup('test', 0b1, ~0b1)}); + sut.currentScene.add(actor3); + + const ray = new ex.Ray(ex.vec(0, 0), ex.Vector.Right); + const hits = sut.currentScene.physics.rayCast(ray, { + searchAllColliders: false, + filter: (hit) => { + return hit.body.group.name === 'test'; + } + }); + + expect(hits.length).toBe(1); + expect(hits[0].body).toEqual(actor3.body); + expect(hits[0].collider).toEqual(actor3.collider.get()); + expect(hits[0].distance).toBe(275); + expect(hits[0].point).toEqual(ex.vec(275, 0)); + }); }); \ No newline at end of file