diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 92ff802d4..701ae21be 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -251,7 +251,12 @@ World::~World() void World::update(float dt) { - world->Step(dt, 8, 6); + update(dt, 8, 3); // Box2D 2.3's recommended defaults. +} + +void World::update(float dt, int velocityIterations, int positionIterations) +{ + world->Step(dt, velocityIterations, positionIterations); // Destroy all objects marked during the time step. for (Body *b : destructBodies) diff --git a/src/modules/physics/box2d/World.h b/src/modules/physics/box2d/World.h index a747ba3b6..30b3c3940 100644 --- a/src/modules/physics/box2d/World.h +++ b/src/modules/physics/box2d/World.h @@ -131,6 +131,7 @@ public: * @param dt The timestep. **/ void update(float dt); + void update(float dt, int velocityIterations, int positionIterations); // From b2ContactListener void BeginContact(b2Contact *contact); diff --git a/src/modules/physics/box2d/wrap_World.cpp b/src/modules/physics/box2d/wrap_World.cpp index bdfa3e2e8..0319b272a 100644 --- a/src/modules/physics/box2d/wrap_World.cpp +++ b/src/modules/physics/box2d/wrap_World.cpp @@ -39,9 +39,19 @@ int w_World_update(lua_State *L) { World *t = luax_checkworld(L, 1); float dt = (float)luaL_checknumber(L, 2); + // Make sure the world callbacks are using the calling Lua thread. t->setCallbacksL(L); - luax_catchexcept(L, [&](){ t->update(dt); }); + + if (lua_isnoneornil(L, 3)) + luax_catchexcept(L, [&](){ t->update(dt); }); + else + { + int velocityiterations = (int) luaL_checknumber(L, 3); + int positioniterations = (int) luaL_checknumber(L, 4); + luax_catchexcept(L, [&](){ t->update(dt, velocityiterations, positioniterations); }); + } + return 0; }