Browse Source

Add optional category bit mask to World:getFixturesInArea.

Sasha Szpakowski 1 year ago
parent
commit
6cb0287500
2 changed files with 9 additions and 3 deletions
  1. 7 2
      src/modules/physics/box2d/World.cpp
  2. 2 1
      src/modules/physics/box2d/World.h

+ 7 - 2
src/modules/physics/box2d/World.cpp

@@ -174,8 +174,9 @@ bool World::QueryCallback::ReportFixture(b2Fixture *fixture)
 	return true;
 	return true;
 }
 }
 
 
-World::CollectCallback::CollectCallback(World *world, lua_State *L)
+World::CollectCallback::CollectCallback(World *world, uint16 categoryMask, lua_State *L)
 	: world(world)
 	: world(world)
+	, categoryMask(categoryMask)
 	, L(L)
 	, L(L)
 {
 {
 	lua_newtable(L);
 	lua_newtable(L);
@@ -187,6 +188,9 @@ World::CollectCallback::~CollectCallback()
 
 
 bool World::CollectCallback::ReportFixture(b2Fixture *f)
 bool World::CollectCallback::ReportFixture(b2Fixture *f)
 {
 {
+	if (categoryMask != 0xFFFF && (categoryMask & f->GetFilterData().categoryBits) == 0)
+		return true;
+
 	Fixture *fixture = (Fixture *)(f->GetUserData().pointer);
 	Fixture *fixture = (Fixture *)(f->GetUserData().pointer);
 	if (!fixture)
 	if (!fixture)
 		throw love::Exception("A fixture has escaped Memoizer!");
 		throw love::Exception("A fixture has escaped Memoizer!");
@@ -614,10 +618,11 @@ int World::getFixturesInArea(lua_State *L)
 	float ly = (float)luaL_checknumber(L, 2);
 	float ly = (float)luaL_checknumber(L, 2);
 	float ux = (float)luaL_checknumber(L, 3);
 	float ux = (float)luaL_checknumber(L, 3);
 	float uy = (float)luaL_checknumber(L, 4);
 	float uy = (float)luaL_checknumber(L, 4);
+	uint16 categoryMaskBits = (uint16)luaL_optinteger(L, 5, 0xFFFF);
 	b2AABB box;
 	b2AABB box;
 	box.lowerBound = Physics::scaleDown(b2Vec2(lx, ly));
 	box.lowerBound = Physics::scaleDown(b2Vec2(lx, ly));
 	box.upperBound = Physics::scaleDown(b2Vec2(ux, uy));
 	box.upperBound = Physics::scaleDown(b2Vec2(ux, uy));
-	CollectCallback query(this, L);
+	CollectCallback query(this, categoryMaskBits, L);
 	world->QueryAABB(&query, box);
 	world->QueryAABB(&query, box);
 	return 1;
 	return 1;
 }
 }

+ 2 - 1
src/modules/physics/box2d/World.h

@@ -106,11 +106,12 @@ public:
 	class CollectCallback : public b2QueryCallback
 	class CollectCallback : public b2QueryCallback
 	{
 	{
 	public:
 	public:
-		CollectCallback(World *world, lua_State *L);
+		CollectCallback(World *world, uint16 categoryMask, lua_State *L);
 		virtual ~CollectCallback();
 		virtual ~CollectCallback();
 		bool ReportFixture(b2Fixture *fixture) override;
 		bool ReportFixture(b2Fixture *fixture) override;
 	private:
 	private:
 		World *world;
 		World *world;
+		uint16 categoryMask;
 		lua_State *L;
 		lua_State *L;
 		int i = 1;
 		int i = 1;
 	};
 	};