diff --git a/3rd/box2d/include/box2dw.hpp b/3rd/box2d/include/box2dw.hpp index b2af3376..fbf32cb2 100644 --- a/3rd/box2d/include/box2dw.hpp +++ b/3rd/box2d/include/box2dw.hpp @@ -67,11 +67,11 @@ struct PyBody{ PK_ALWAYS_PASS_BY_POINTER(PyBody) b2Body* body; - b2Fixture* fixture; + b2Fixture* _fixture; PyObject* node_like; bool _is_destroyed; - PyBody(): body(nullptr), fixture(nullptr), node_like(nullptr), _is_destroyed(false){} + PyBody(): body(nullptr), _fixture(nullptr), node_like(nullptr), _is_destroyed(false){} void _gc_mark() { if(node_like != nullptr){ @@ -81,7 +81,18 @@ struct PyBody{ PyBody* _() { return this; } b2Body* _b2Body() { return body; } - b2Fixture* _b2Fixture() { return fixture; } + + b2Fixture* _b2Fixture() { + if(_fixture == nullptr) throw std::runtime_error("`_fixture == nullptr` in PyBody::_b2Fixture()"); + return _fixture; + } + + void _set_b2Fixture(b2Fixture* fixture){ + if(_fixture != nullptr){ + body->DestroyFixture(_fixture); + } + _fixture = fixture; + } static void _register(VM* vm, PyObject* mod, PyObject* type); diff --git a/3rd/box2d/src/box2d_Body.cpp b/3rd/box2d/src/box2d_Body.cpp index d724ff35..9bf7fd7b 100644 --- a/3rd/box2d/src/box2d_Body.cpp +++ b/3rd/box2d/src/box2d_Body.cpp @@ -14,9 +14,7 @@ void PyBody::_register(VM* vm, PyObject* mod, PyObject* type){ // a weak reference to this object def.userData.pointer = reinterpret_cast(obj); body.body = world.world.CreateBody(&def); - body.fixture = nullptr; body.node_like = node; - body._is_destroyed = false; return obj; }); @@ -49,7 +47,7 @@ void PyBody::_register(VM* vm, PyObject* mod, PyObject* type){ float hy = CAST(float, args[2]); b2PolygonShape shape; shape.SetAsBox(hx, hy); - body.fixture = body.body->CreateFixture(&shape, 1.0f); + body._set_b2Fixture(body.body->CreateFixture(&shape, 1.0f)); return vm->None; }); @@ -59,7 +57,7 @@ void PyBody::_register(VM* vm, PyObject* mod, PyObject* type){ float radius = CAST(float, args[1]); b2CircleShape shape; shape.m_radius = radius; - body.fixture = body.body->CreateFixture(&shape, 1.0f); + body._set_b2Fixture(body.body->CreateFixture(&shape, 1.0f)); return vm->None; }); @@ -77,7 +75,7 @@ void PyBody::_register(VM* vm, PyObject* mod, PyObject* type){ vertices.push_back(b2Vec2(vec.x, vec.y)); } shape.Set(vertices.data(), vertices.size()); - body.fixture = body.body->CreateFixture(&shape, 1.0f); + body._set_b2Fixture(body.body->CreateFixture(&shape, 1.0f)); return vm->None; }); @@ -95,7 +93,7 @@ void PyBody::_register(VM* vm, PyObject* mod, PyObject* type){ vertices.push_back(b2Vec2(vec.x, vec.y)); } shape.CreateLoop(vertices.data(), vertices.size()); - body.fixture = body.body->CreateFixture(&shape, 1.0f); + body._set_b2Fixture(body.body->CreateFixture(&shape, 1.0f)); return vm->None; }); diff --git a/3rd/box2d/src/box2d_World.cpp b/3rd/box2d/src/box2d_World.cpp index 4ef06a3d..325f69e6 100644 --- a/3rd/box2d/src/box2d_World.cpp +++ b/3rd/box2d/src/box2d_World.cpp @@ -135,7 +135,7 @@ void PyWorld::_register(VM* vm, PyObject* mod, PyObject* type){ if(body._is_destroyed){ body.body->GetWorld()->DestroyBody(body.body); body.body = nullptr; - body.fixture = nullptr; + body._fixture = nullptr; body.node_like = nullptr; } p = next;