From e2b832015b3db75310ad20b1fb3edf20b9f402b4 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 24 Sep 2011 16:15:09 -0400 Subject: [PATCH] Add World:queryBoundingBox --HG-- branch : box2d-update --- src/modules/physics/box2d/World.cpp | 43 +++++++++++++++++++++++- src/modules/physics/box2d/World.h | 15 +++++++++ src/modules/physics/box2d/wrap_World.cpp | 8 +++++ src/modules/physics/box2d/wrap_World.h | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 110a1b80a..7d6671767 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -142,6 +142,32 @@ namespace box2d } return true; } + + World::QueryCallback::QueryCallback() + : ref(0) + { + } + + World::QueryCallback::~QueryCallback() + { + if(ref != 0) + delete ref; + } + + bool World::QueryCallback::ReportFixture(b2Fixture * fixture) + { + if (ref != 0) + { + lua_State * L = ref->getL(); + ref->push(); + Fixture * f = (Fixture *)Memoizer::find(fixture); + if (!f) throw love::Exception("A fixture has escaped Memoizer!"); + luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void*)f); + lua_call(L, 1, 1); + return luax_toboolean(L, -1); + } + return true; + } World::World() : world(NULL) @@ -176,7 +202,6 @@ namespace box2d { world->Step(dt, 8, 6); - begin.process(); end.process(); presolve.process(); @@ -298,6 +323,22 @@ namespace box2d { return groundBody; } + + int World::queryBoundingBox(lua_State * L) + { + luax_assert_argc(L, 5); + b2AABB box; + float lx = (float)luaL_checknumber(L, 1); + float ly = (float)luaL_checknumber(L, 2); + float ux = (float)luaL_checknumber(L, 3); + float uy = (float)luaL_checknumber(L, 4); + box.lowerBound = Physics::scaleDown(b2Vec2(lx, ly)); + box.upperBound = Physics::scaleDown(b2Vec2(ux, uy)); + if (query.ref) delete query.ref; + query.ref = luax_refif(L, LUA_TFUNCTION); + world->QueryAABB(&query, box); + return 0; + } } // box2d } // physics diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index 1798372af..f2508a6c5 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -86,6 +86,15 @@ namespace box2d ~ContactFilter(); bool process(Fixture * a, Fixture * b); }; + + class QueryCallback : public b2QueryCallback + { + public: + Reference * ref; + QueryCallback(); + ~QueryCallback(); + virtual bool ReportFixture(b2Fixture * fixture); + }; private: @@ -98,6 +107,7 @@ namespace box2d // Contact callbacks. ContactCallback begin, end, presolve, postsolve; ContactFilter filter; + QueryCallback query; public: @@ -200,6 +210,11 @@ namespace box2d * @return The ground body. **/ b2Body * getGroundBody(); + + /** + * Gets all fixtures that overlap a given bounding box. + **/ + int queryBoundingBox(lua_State * L); }; diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index febfcfcb4..39b846e15 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -112,6 +112,13 @@ namespace box2d lua_pushinteger(L, t->getJointCount()); return 1; } + + int w_World_queryBoundingBox(lua_State * L) + { + World * t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->queryBoundingBox(L); + } static const luaL_Reg functions[] = { { "update", w_World_update }, @@ -125,6 +132,7 @@ namespace box2d { "getAllowSleeping", w_World_getAllowSleeping }, { "getBodyCount", w_World_getBodyCount }, { "getJointCount", w_World_getJointCount }, + { "queryBoundingBox", w_World_queryBoundingBox }, { 0, 0 } }; diff --git a/src/modules/physics/box2d/wrap_World.h b/src/modules/physics/box2d/wrap_World.h index 372928c22..4c2192842 100644 --- a/src/modules/physics/box2d/wrap_World.h +++ b/src/modules/physics/box2d/wrap_World.h @@ -43,6 +43,7 @@ namespace box2d int w_World_getAllowSleeping(lua_State * L); int w_World_getBodyCount(lua_State * L); int w_World_getJointCount(lua_State * L); + int w_World_queryBoundingBox(lua_State * L); int luaopen_world(lua_State * L); } // box2d