Browse Source

Merge pull request #1622 from thegrb93/add-getsetstate

Add Body.getKinematicState and Body.setKinematicState
Alex Szpakowski 4 years ago
parent
commit
0fa0d39a5d

+ 15 - 0
src/modules/physics/box2d/Body.cpp

@@ -112,6 +112,14 @@ float Body::getAngularVelocity() const
 	return body->GetAngularVelocity();
 }
 
+void Body::getKinematicState(b2Vec2 &pos_o, float &a_o, b2Vec2 &vel_o, float &da_o) const
+{
+	pos_o = Physics::scaleUp(body->GetPosition());
+	a_o = body->GetAngle();
+	vel_o = Physics::scaleUp(body->GetLinearVelocity());
+	da_o = body->GetAngularVelocity();
+}
+
 float Body::getMass() const
 {
 	return body->GetMass();
@@ -225,6 +233,13 @@ void Body::setAngularVelocity(float r)
 	body->SetAngularVelocity(r);
 }
 
+void Body::setKinematicState(b2Vec2 pos, float a, b2Vec2 vel, float da)
+{
+	body->SetTransform(Physics::scaleDown(pos), a);
+	body->SetLinearVelocity(Physics::scaleDown(vel));
+	body->SetAngularVelocity(da);
+}
+
 void Body::setPosition(float x, float y)
 {
 	body->SetTransform(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle());

+ 10 - 0
src/modules/physics/box2d/Body.h

@@ -129,6 +129,11 @@ public:
 	 **/
 	float getAngularVelocity() const;
 
+	/**
+	 * Get the current Body kinematic state. (Position, angle, velocity, angle velocity).
+	 **/
+	void getKinematicState(b2Vec2 &pos_o, float &a_o, b2Vec2& vel_o, float &da_o) const;
+
 	/**
 	 * Gets the Body's mass.
 	 **/
@@ -219,6 +224,11 @@ public:
 	 **/
 	void setAngularVelocity(float r);
 
+	/**
+	 * Set the current Body kinematic state. (Position, angle, velocity, angle velocity).
+	 **/
+	void setKinematicState(b2Vec2 pos, float a, b2Vec2 vel, float da);
+
 	/**
 	 * Sets the current position of the Body.
 	 **/

+ 30 - 0
src/modules/physics/box2d/wrap_Body.cpp

@@ -125,6 +125,21 @@ int w_Body_getAngularVelocity(lua_State *L)
 	return 1;
 }
 
+int w_Body_getKinematicState(lua_State *L)
+{
+	Body *t = luax_checkbody(L, 1);
+	b2Vec2 pos_o, vel_o;
+	float a_o, da_o;
+	t->getKinematicState(pos_o, a_o, vel_o, da_o);
+	lua_pushnumber(L, pos_o.x);
+	lua_pushnumber(L, pos_o.y);
+	lua_pushnumber(L, a_o);
+	lua_pushnumber(L, vel_o.x);
+	lua_pushnumber(L, vel_o.y);
+	lua_pushnumber(L, da_o);
+	return 6;
+}
+
 int w_Body_getMass(lua_State *L)
 {
 	Body *t = luax_checkbody(L, 1);
@@ -313,6 +328,19 @@ int w_Body_setPosition(lua_State *L)
 	return 0;
 }
 
+int w_Body_setKinematicState(lua_State *L)
+{
+	Body *t = luax_checkbody(L, 1);
+	float x = (float)luaL_checknumber(L, 2);
+	float y = (float)luaL_checknumber(L, 3);
+	float a = (float)luaL_checknumber(L, 4);
+	float dx = (float)luaL_checknumber(L, 5);
+	float dy = (float)luaL_checknumber(L, 6);
+	float da = (float)luaL_checknumber(L, 7);
+	luax_catchexcept(L, [&](){ t->setKinematicState(b2Vec2(x, y), a, b2Vec2(dx, dy), da); });
+	return 0;
+}
+
 int w_Body_resetMassData(lua_State *L)
 {
 	Body *t = luax_checkbody(L, 1);
@@ -631,6 +659,7 @@ static const luaL_Reg w_Body_functions[] =
 	{ "getWorldCenter", w_Body_getWorldCenter },
 	{ "getLocalCenter", w_Body_getLocalCenter },
 	{ "getAngularVelocity", w_Body_getAngularVelocity },
+	{ "getKinematicState", w_Body_getKinematicState },
 	{ "getMass", w_Body_getMass },
 	{ "getInertia", w_Body_getInertia },
 	{ "getMassData", w_Body_getMassData },
@@ -648,6 +677,7 @@ static const luaL_Reg w_Body_functions[] =
 	{ "setAngle", w_Body_setAngle },
 	{ "setAngularVelocity", w_Body_setAngularVelocity },
 	{ "setPosition", w_Body_setPosition },
+	{ "setKinematicState", w_Body_setKinematicState },
 	{ "resetMassData", w_Body_resetMassData },
 	{ "setMassData", w_Body_setMassData },
 	{ "setMass", w_Body_setMass },