diff --git a/src/modules/physics/box2d/FrictionJoint.cpp b/src/modules/physics/box2d/FrictionJoint.cpp index 7449aab19..524c746f7 100644 --- a/src/modules/physics/box2d/FrictionJoint.cpp +++ b/src/modules/physics/box2d/FrictionJoint.cpp @@ -33,11 +33,12 @@ namespace physics { namespace box2d { - FrictionJoint::FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + FrictionJoint::FrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2FrictionJointDef def; - def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); def.collideConnected = collideConnected; joint = (b2FrictionJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/FrictionJoint.h b/src/modules/physics/box2d/FrictionJoint.h index d334c4799..e0dbb2f60 100644 --- a/src/modules/physics/box2d/FrictionJoint.h +++ b/src/modules/physics/box2d/FrictionJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new FrictionJoint connecting body1 and body2. **/ - FrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + FrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); virtual ~FrictionJoint(); diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 37aa766a0..55cb889f2 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -182,14 +182,14 @@ namespace box2d return new GearJoint(joint1, joint2, ratio, collideConnected); } - FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + FrictionJoint * Physics::newFrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) { - return new FrictionJoint(body1, body2, x, y, collideConnected); + return new FrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); } - WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + WeldJoint * Physics::newWeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) { - return new WeldJoint(body1, body2, x, y, collideConnected); + return new WeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); } WheelJoint * Physics::newWheelJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected) diff --git a/src/modules/physics/box2d/Physics.h b/src/modules/physics/box2d/Physics.h index 2c4491d3f..d04dc2755 100644 --- a/src/modules/physics/box2d/Physics.h +++ b/src/modules/physics/box2d/Physics.h @@ -215,19 +215,23 @@ namespace box2d /** * Creates a new FrictionJoint connecting body1 with body2. - * @param x Anchor along the x-axis. (World coordinates) - * @param y Anchor along the y-axis. (World coordinates) + * @param xA Anchor for body 1 along the x-axis. (World coordinates) + * @param yA Anchor for body 1 along the y-axis. (World coordinates) + * @param xB Anchor for body 2 along the x-axis. (World coordinates) + * @param yB Anchor for body 2 along the y-axis. (World coordinates) * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. **/ - FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + FrictionJoint * newFrictionJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); /** * Creates a new WeldJoint connecting body1 with body2. - * @param x Anchor along the x-axis. (World coordinates) - * @param y Anchor along the y-axis. (World coordinates) + * @param xA Anchor for body 1 along the x-axis. (World coordinates) + * @param yA Anchor for body 1 along the y-axis. (World coordinates) + * @param xB Anchor for body 2 along the x-axis. (World coordinates) + * @param yB Anchor for body 2 along the y-axis. (World coordinates) * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. **/ - WeldJoint * newWeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + WeldJoint * newWeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); /** * Creates a new WheelJoint connecting body1 with body2. diff --git a/src/modules/physics/box2d/WeldJoint.cpp b/src/modules/physics/box2d/WeldJoint.cpp index b2882d0be..7e437437a 100644 --- a/src/modules/physics/box2d/WeldJoint.cpp +++ b/src/modules/physics/box2d/WeldJoint.cpp @@ -33,11 +33,12 @@ namespace physics { namespace box2d { - WeldJoint::WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected) + WeldJoint::WeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected) : Joint(body1, body2), joint(NULL) { b2WeldJointDef def; - def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = Physics::scaleDown(b2Vec2(xB, yB)); def.collideConnected = collideConnected; joint = (b2WeldJoint*)createJoint(&def); } diff --git a/src/modules/physics/box2d/WeldJoint.h b/src/modules/physics/box2d/WeldJoint.h index e8469dac2..c62b1912c 100644 --- a/src/modules/physics/box2d/WeldJoint.h +++ b/src/modules/physics/box2d/WeldJoint.h @@ -45,7 +45,7 @@ namespace box2d /** * Creates a new WeldJoint connecting body1 and body2. **/ - WeldJoint(Body * body1, Body * body2, float x, float y, bool collideConnected); + WeldJoint(Body * body1, Body * body2, float xA, float yA, float xB, float yB, bool collideConnected); virtual ~WeldJoint(); diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index b1af0a61d..d9cb427c8 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -234,10 +234,20 @@ namespace box2d { Body * body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); Body * body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); - float x = (float)luaL_checknumber(L, 3); - float y = (float)luaL_checknumber(L, 4); - bool collideConnected = luax_optboolean(L, 5, false); - FrictionJoint * j = instance->newFrictionJoint(body1, body2, x, y, collideConnected); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB; + bool collideConnected; + if (lua_gettop(L) >= 6) { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } else { + xB = xA; + yB = yA; + collideConnected = luax_optboolean(L, 5, false); + } + FrictionJoint * j = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void*)j); return 1; } @@ -246,10 +256,20 @@ namespace box2d { Body * body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); Body * body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); - float x = (float)luaL_checknumber(L, 3); - float y = (float)luaL_checknumber(L, 4); - bool collideConnected = luax_optboolean(L, 5, false); - WeldJoint * j = instance->newWeldJoint(body1, body2, x, y, collideConnected); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB; + bool collideConnected; + if (lua_gettop(L) >= 6) { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } else { + xB = xA; + yB = yA; + collideConnected = luax_optboolean(L, 5, false); + } + WeldJoint * j = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void*)j); return 1; }