From 775f8163041ba99711fe56c26eb0115ec1e7004e Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Wed, 12 Nov 2014 17:18:50 -0400 Subject: [PATCH] Added Joint:getBodies (see issue #922.) --- src/modules/physics/box2d/Joint.cpp | 26 +++++++++++++++++++ src/modules/physics/box2d/Joint.h | 4 ++- .../physics/box2d/wrap_DistanceJoint.cpp | 1 + .../physics/box2d/wrap_FrictionJoint.cpp | 1 + src/modules/physics/box2d/wrap_GearJoint.cpp | 1 + src/modules/physics/box2d/wrap_Joint.cpp | 18 +++++++++++++ src/modules/physics/box2d/wrap_Joint.h | 1 + src/modules/physics/box2d/wrap_MotorJoint.cpp | 1 + src/modules/physics/box2d/wrap_MouseJoint.cpp | 1 + .../physics/box2d/wrap_PrismaticJoint.cpp | 1 + .../physics/box2d/wrap_PulleyJoint.cpp | 1 + .../physics/box2d/wrap_RevoluteJoint.cpp | 1 + src/modules/physics/box2d/wrap_RopeJoint.cpp | 1 + src/modules/physics/box2d/wrap_WeldJoint.cpp | 1 + src/modules/physics/box2d/wrap_WheelJoint.cpp | 1 + 15 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/modules/physics/box2d/Joint.cpp b/src/modules/physics/box2d/Joint.cpp index ee48d202f..31aa481ea 100644 --- a/src/modules/physics/box2d/Joint.cpp +++ b/src/modules/physics/box2d/Joint.cpp @@ -95,6 +95,32 @@ Joint::Type Joint::getType() const } } +Body *Joint::getBodyA() const +{ + b2Body *b2body = joint->GetBodyA(); + if (b2body == nullptr) + return nullptr; + + Body *body = (Body *) Memoizer::find(b2body); + if (body == nullptr) + throw love::Exception("A body has escaped Memoizer!"); + + return body; +} + +Body *Joint::getBodyB() const +{ + b2Body *b2body = joint->GetBodyB(); + if (b2body == nullptr) + return nullptr; + + Body *body = (Body *) Memoizer::find(b2body); + if (body == nullptr) + throw love::Exception("A body has escaped Memoizer!"); + + return body; +} + bool Joint::isValid() const { return joint != 0; diff --git a/src/modules/physics/box2d/Joint.h b/src/modules/physics/box2d/Joint.h index ba266808b..fef54ce18 100644 --- a/src/modules/physics/box2d/Joint.h +++ b/src/modules/physics/box2d/Joint.h @@ -79,12 +79,14 @@ public: **/ bool isValid() const; - /** * Gets the type of joint. **/ Type getType() const; + Body *getBodyA() const; + Body *getBodyB() const; + /** * Gets the anchor positions of the Joint in world * coordinates. This is useful for debugdrawing the joint. diff --git a/src/modules/physics/box2d/wrap_DistanceJoint.cpp b/src/modules/physics/box2d/wrap_DistanceJoint.cpp index 219196b03..c98e74055 100644 --- a/src/modules/physics/box2d/wrap_DistanceJoint.cpp +++ b/src/modules/physics/box2d/wrap_DistanceJoint.cpp @@ -90,6 +90,7 @@ static const luaL_Reg functions[] = { "getDampingRatio", w_DistanceJoint_getDampingRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_FrictionJoint.cpp b/src/modules/physics/box2d/wrap_FrictionJoint.cpp index cc202e3b8..40e68c6bd 100644 --- a/src/modules/physics/box2d/wrap_FrictionJoint.cpp +++ b/src/modules/physics/box2d/wrap_FrictionJoint.cpp @@ -74,6 +74,7 @@ static const luaL_Reg functions[] = { "getMaxTorque", w_FrictionJoint_getMaxTorque }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_GearJoint.cpp b/src/modules/physics/box2d/wrap_GearJoint.cpp index 114045e13..477761aaf 100644 --- a/src/modules/physics/box2d/wrap_GearJoint.cpp +++ b/src/modules/physics/box2d/wrap_GearJoint.cpp @@ -57,6 +57,7 @@ static const luaL_Reg functions[] = { "getRatio", w_GearJoint_getRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_Joint.cpp b/src/modules/physics/box2d/wrap_Joint.cpp index 4e2727e7c..fe790f072 100644 --- a/src/modules/physics/box2d/wrap_Joint.cpp +++ b/src/modules/physics/box2d/wrap_Joint.cpp @@ -21,6 +21,7 @@ // LOVE #include "wrap_Joint.h" #include "common/StringMap.h" +#include "Body.h" namespace love { @@ -46,6 +47,22 @@ int w_Joint_getType(lua_State *L) return 1; } +int w_Joint_getBodies(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + Body *b1 = nullptr; + Body *b2 = nullptr; + + luax_catchexcept(L, [&]() { + b1 = t->getBodyA(); + b2 = t->getBodyB(); + }); + + luax_pushtype(L, "Body", PHYSICS_BODY_T, b1); + luax_pushtype(L, "Body", PHYSICS_BODY_T, b2); + return 2; +} + int w_Joint_getAnchors(lua_State *L) { Joint *t = luax_checkjoint(L, 1); @@ -99,6 +116,7 @@ int w_Joint_destroy(lua_State *L) static const luaL_Reg functions[] = { { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_Joint.h b/src/modules/physics/box2d/wrap_Joint.h index 63d4537ec..75e8a7852 100644 --- a/src/modules/physics/box2d/wrap_Joint.h +++ b/src/modules/physics/box2d/wrap_Joint.h @@ -34,6 +34,7 @@ namespace box2d Joint *luax_checkjoint(lua_State *L, int idx); int w_Joint_getType(lua_State *L); +int w_Joint_getBodies(lua_State *L); int w_Joint_getAnchors(lua_State *L); int w_Joint_getReactionForce(lua_State *L); int w_Joint_getReactionTorque(lua_State *L); diff --git a/src/modules/physics/box2d/wrap_MotorJoint.cpp b/src/modules/physics/box2d/wrap_MotorJoint.cpp index 17d1501a0..8baa9809b 100644 --- a/src/modules/physics/box2d/wrap_MotorJoint.cpp +++ b/src/modules/physics/box2d/wrap_MotorJoint.cpp @@ -124,6 +124,7 @@ static const luaL_Reg functions[] = { "getCorrectionFactor", w_MotorJoint_getCorrectionFactor }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_MouseJoint.cpp b/src/modules/physics/box2d/wrap_MouseJoint.cpp index 38cf46b26..29b574328 100644 --- a/src/modules/physics/box2d/wrap_MouseJoint.cpp +++ b/src/modules/physics/box2d/wrap_MouseJoint.cpp @@ -108,6 +108,7 @@ static const luaL_Reg functions[] = { "getDampingRatio", w_MouseJoint_getDampingRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index e820d38d8..7c5e9ec41 100644 --- a/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -185,6 +185,7 @@ static const luaL_Reg functions[] = { "getLimits", w_PrismaticJoint_getLimits }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/src/modules/physics/box2d/wrap_PulleyJoint.cpp index 25c41758c..d3ffaefaf 100644 --- a/src/modules/physics/box2d/wrap_PulleyJoint.cpp +++ b/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -71,6 +71,7 @@ static const luaL_Reg functions[] = { "getRatio", w_PulleyJoint_getRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index 13d3468f9..3f72c41c6 100644 --- a/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -185,6 +185,7 @@ static const luaL_Reg functions[] = { "getLimits", w_RevoluteJoint_getLimits }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_RopeJoint.cpp b/src/modules/physics/box2d/wrap_RopeJoint.cpp index 45fecce2b..5b57bfe0d 100644 --- a/src/modules/physics/box2d/wrap_RopeJoint.cpp +++ b/src/modules/physics/box2d/wrap_RopeJoint.cpp @@ -47,6 +47,7 @@ static const luaL_Reg functions[] = { "getMaxLength", w_RopeJoint_getMaxLength }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_WeldJoint.cpp b/src/modules/physics/box2d/wrap_WeldJoint.cpp index 0937c044b..7c597dcca 100644 --- a/src/modules/physics/box2d/wrap_WeldJoint.cpp +++ b/src/modules/physics/box2d/wrap_WeldJoint.cpp @@ -73,6 +73,7 @@ static const luaL_Reg functions[] = { "getDampingRatio", w_WeldJoint_getDampingRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque }, diff --git a/src/modules/physics/box2d/wrap_WheelJoint.cpp b/src/modules/physics/box2d/wrap_WheelJoint.cpp index 31b1c5b84..ad30fea2b 100644 --- a/src/modules/physics/box2d/wrap_WheelJoint.cpp +++ b/src/modules/physics/box2d/wrap_WheelJoint.cpp @@ -149,6 +149,7 @@ static const luaL_Reg functions[] = { "getSpringDampingRatio", w_WheelJoint_getSpringDampingRatio }, // From Joint. { "getType", w_Joint_getType }, + { "getBodies", w_Joint_getBodies }, { "getAnchors", w_Joint_getAnchors }, { "getReactionForce", w_Joint_getReactionForce }, { "getReactionTorque", w_Joint_getReactionTorque },