Browse Source

Add second body anchor point to FrictionJoint/WeldJoint constructors

--HG--
branch : box2d-update
Bill Meltsner 14 years ago
parent
commit
f38655a934

+ 3 - 2
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);
 	}

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

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

+ 10 - 6
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.

+ 3 - 2
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);
 	}

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

+ 28 - 8
src/modules/physics/box2d/wrap_Physics.cpp

@@ -234,10 +234,20 @@ namespace box2d
 	{
 		Body * body1 = luax_checktype<Body>(L, 1, "Body", PHYSICS_BODY_T);
 		Body * body2 = luax_checktype<Body>(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<Body>(L, 1, "Body", PHYSICS_BODY_T);
 		Body * body2 = luax_checktype<Body>(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;
 	}