From 562cc6b1cbbba34a6d9db100a4cb563d56993cee Mon Sep 17 00:00:00 2001 From: Qais Patankar Date: Wed, 30 Dec 2020 04:27:48 +0000 Subject: [PATCH] Fix #1614: add Body:getLocalPoints --- src/modules/physics/box2d/Body.cpp | 24 ++++++++++++++++++++++++ src/modules/physics/box2d/Body.h | 6 ++++++ src/modules/physics/box2d/wrap_Body.cpp | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 2f8301be0..446be6b8b 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -346,6 +346,30 @@ void Body::getLocalVector(float x, float y, float &x_o, float &y_o) y_o = v.y; } +int Body::getLocalPoints(lua_State *L) +{ + int argc = lua_gettop(L); + int vcount = (int)argc/2; + // at least one point + love::luax_assert_argc(L, 2); + + for (int i = 0; iGetLocalPoint(Physics::scaleDown(b2Vec2(x, y)))); + // And then we push the result + lua_pushnumber(L, point.x); + lua_pushnumber(L, point.y); + } + + return argc; +} + void Body::getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o) { b2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromWorldPoint(Physics::scaleDown(b2Vec2(x, y)))); diff --git a/src/modules/physics/box2d/Body.h b/src/modules/physics/box2d/Body.h index 6c2edcc62..b279fa0d6 100644 --- a/src/modules/physics/box2d/Body.h +++ b/src/modules/physics/box2d/Body.h @@ -317,6 +317,12 @@ public: **/ void getLocalVector(float x, float y, float &x_o, float &y_o); + /** + * Transforms a series of points (x, y) from world coordinates + * to local coordinates. + **/ + int getLocalPoints(lua_State *L); + /** * Gets the velocity on the Body for the given world point. * @param x The x-coordinate of the world point. diff --git a/src/modules/physics/box2d/wrap_Body.cpp b/src/modules/physics/box2d/wrap_Body.cpp index af57ce766..2b303a63d 100644 --- a/src/modules/physics/box2d/wrap_Body.cpp +++ b/src/modules/physics/box2d/wrap_Body.cpp @@ -444,6 +444,13 @@ int w_Body_getLocalVector(lua_State *L) return 2; } +int w_Body_getLocalPoints(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_remove(L, 1); + return t->getLocalPoints(L); +} + int w_Body_getLinearVelocityFromWorldPoint(lua_State *L) { Body *t = luax_checkbody(L, 1); @@ -679,6 +686,7 @@ static const luaL_Reg w_Body_functions[] = { "getWorldPoints", w_Body_getWorldPoints }, { "getLocalPoint", w_Body_getLocalPoint }, { "getLocalVector", w_Body_getLocalVector }, + { "getLocalPoints", w_Body_getLocalPoints }, { "getLinearVelocityFromWorldPoint", w_Body_getLinearVelocityFromWorldPoint }, { "getLinearVelocityFromLocalPoint", w_Body_getLinearVelocityFromLocalPoint }, { "isBullet", w_Body_isBullet },