Browse Source

World:rayCastAny and rayCastClosest also return the fixture they hit.

Sasha Szpakowski 1 year ago
parent
commit
da430d5145
2 changed files with 15 additions and 5 deletions
  1. 14 4
      src/modules/physics/box2d/World.cpp
  2. 1 1
      src/modules/physics/box2d/World.h

+ 14 - 4
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);

+ 1 - 1
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;