Browse Source

Add one sided edge support. Just not sure if the ghost vertices are fine.

Garrett Brown 5 years ago
parent
commit
8f4476ca3d

+ 11 - 2
src/modules/physics/box2d/Physics.cpp

@@ -83,10 +83,19 @@ PolygonShape *Physics::newRectangleShape(float x, float y, float w, float h, flo
 	return new PolygonShape(s);
 }
 
-EdgeShape *Physics::newEdgeShape(float x1, float y1, float x2, float y2)
+EdgeShape *Physics::newEdgeShape(float x1, float y1, float x2, float y2, bool oneSided)
 {
 	b2EdgeShape *s = new b2EdgeShape();
-	s->SetTwoSided(Physics::scaleDown(b2Vec2(x1, y1)), Physics::scaleDown(b2Vec2(x2, y2)));
+	if (oneSided)
+	{
+		b2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1));
+		b2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2));
+		s->SetOneSided(v1, v1, v2, v2);
+	}
+	else
+	{
+		s->SetTwoSided(Physics::scaleDown(b2Vec2(x1, y1)), Physics::scaleDown(b2Vec2(x2, y2)));
+	}
 	return new EdgeShape(s);
 }
 

+ 1 - 1
src/modules/physics/box2d/Physics.h

@@ -140,7 +140,7 @@ public:
 	 * @param x2 The x coordinate of the second point.
 	 * @param y2 The y coordinate of the second point.
 	 **/
-	EdgeShape *newEdgeShape(float x1, float y1, float x2, float y2);
+	EdgeShape *newEdgeShape(float x1, float y1, float x2, float y2, bool oneSided);
 
 	/**
 	 * Creates a new PolygonShape from a variable number of vertices.

+ 2 - 1
src/modules/physics/box2d/wrap_Physics.cpp

@@ -160,8 +160,9 @@ int w_newEdgeShape(lua_State *L)
 	float y1 = (float)luaL_checknumber(L, 2);
 	float x2 = (float)luaL_checknumber(L, 3);
 	float y2 = (float)luaL_checknumber(L, 4);
+	bool oneSided = luax_optboolean(L, 5, false);
 	EdgeShape *shape;
-	luax_catchexcept(L, [&](){ shape = instance()->newEdgeShape(x1, y1, x2, y2); });
+	luax_catchexcept(L, [&](){ shape = instance()->newEdgeShape(x1, y1, x2, y2, oneSided); });
 	luax_pushtype(L, shape);
 	shape->release();
 	return 1;