From da430d514538c6ebf46c2442a5ab6123b2f11797 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski Date: Mon, 2 Oct 2023 14:05:54 -0300 Subject: [PATCH] World:rayCastAny and rayCastClosest also return the fixture they hit. --- src/modules/physics/box2d/World.cpp | 18 ++++++++++++++---- src/modules/physics/box2d/World.h | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 4e79a1cd4..db30fcfec 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -242,7 +242,7 @@ float World::RayCastCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 &po } World::RayCastOneCallback::RayCastOneCallback(uint16 categoryMask, bool any) - : hit(false) + : hitFixture(nullptr) , hitPoint() , hitNormal() , hitFraction(1.0f) @@ -256,7 +256,7 @@ float World::RayCastOneCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 if (categoryMask != 0xFFFF && (categoryMask & fixture->GetFilterData().categoryBits) == 0) return -1; - hit = true; + hitFixture = fixture; hitPoint = point; hitNormal = normal; hitFraction = fraction; @@ -652,8 +652,13 @@ int World::rayCastAny(lua_State *L) b2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2)); RayCastOneCallback raycast(categoryMaskBits, true); world->RayCast(&raycast, v1, v2); - if (raycast.hit) + if (raycast.hitFixture) { + Fixture *f = (Fixture *)(raycast.hitFixture->GetUserData().pointer); + if (f == nullptr) + return luaL_error(L, "A fixture has escaped Memoizer!"); + luax_pushtype(L, f); + b2Vec2 hitPoint = Physics::scaleUp(raycast.hitPoint); lua_pushnumber(L, hitPoint.x); lua_pushnumber(L, hitPoint.y); @@ -676,8 +681,13 @@ int World::rayCastClosest(lua_State *L) b2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2)); RayCastOneCallback raycast(categoryMaskBits, false); world->RayCast(&raycast, v1, v2); - if (raycast.hit) + if (raycast.hitFixture) { + Fixture *f = (Fixture *)(raycast.hitFixture->GetUserData().pointer); + if (f == nullptr) + return luaL_error(L, "A fixture has escaped Memoizer!"); + luax_pushtype(L, f); + b2Vec2 hitPoint = Physics::scaleUp(raycast.hitPoint); lua_pushnumber(L, hitPoint.x); lua_pushnumber(L, hitPoint.y); diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index cd214835b..94d2a1e09 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -136,7 +136,7 @@ public: virtual ~RayCastOneCallback() {}; float ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float fraction) override; - bool hit; + b2Fixture *hitFixture; b2Vec2 hitPoint; b2Vec2 hitNormal; float hitFraction;