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