diff --git a/src/modules/physics/box2d/ChainShape.cpp b/src/modules/physics/box2d/ChainShape.cpp index 27e2d27f6..dbc247f22 100644 --- a/src/modules/physics/box2d/ChainShape.cpp +++ b/src/modules/physics/box2d/ChainShape.cpp @@ -33,16 +33,13 @@ namespace physics { namespace box2d { - ChainShape::ChainShape(b2ChainShape * c, bool loop) - : Shape(c), loop(loop) + ChainShape::ChainShape(b2ChainShape * c, bool loop, bool own) + : Shape(c, own), loop(loop) { } ChainShape::~ChainShape() { - Memoizer::remove(shape); - delete shape; - shape = NULL; } void ChainShape::setNextVertex(float x, float y) diff --git a/src/modules/physics/box2d/ChainShape.h b/src/modules/physics/box2d/ChainShape.h index 81f5c3782..483262b0e 100644 --- a/src/modules/physics/box2d/ChainShape.h +++ b/src/modules/physics/box2d/ChainShape.h @@ -46,7 +46,7 @@ namespace box2d * Create a new ChainShape from a Box2D chain shape. * @param c The chain shape. **/ - ChainShape(b2ChainShape * c, bool loop = false); + ChainShape(b2ChainShape * c, bool loop = false, bool own = true); virtual ~ChainShape(); diff --git a/src/modules/physics/box2d/CircleShape.cpp b/src/modules/physics/box2d/CircleShape.cpp index 2773420ac..6eba33fd0 100644 --- a/src/modules/physics/box2d/CircleShape.cpp +++ b/src/modules/physics/box2d/CircleShape.cpp @@ -33,16 +33,13 @@ namespace physics { namespace box2d { - CircleShape::CircleShape(b2CircleShape * c) - : Shape(c) + CircleShape::CircleShape(b2CircleShape * c, bool own) + : Shape(c, own) { } CircleShape::~CircleShape() { - Memoizer::remove(shape); - delete shape; - shape = NULL; } float CircleShape::getRadius() const diff --git a/src/modules/physics/box2d/CircleShape.h b/src/modules/physics/box2d/CircleShape.h index 91ab65a83..bca862ad2 100644 --- a/src/modules/physics/box2d/CircleShape.h +++ b/src/modules/physics/box2d/CircleShape.h @@ -49,7 +49,7 @@ namespace box2d * @param body The parent body. * @param def The CircleShape definition. **/ - CircleShape(b2CircleShape * c); + CircleShape(b2CircleShape * c, bool own = true); virtual ~CircleShape(); diff --git a/src/modules/physics/box2d/EdgeShape.cpp b/src/modules/physics/box2d/EdgeShape.cpp index 235ec8e57..68b807023 100644 --- a/src/modules/physics/box2d/EdgeShape.cpp +++ b/src/modules/physics/box2d/EdgeShape.cpp @@ -33,16 +33,13 @@ namespace physics { namespace box2d { - EdgeShape::EdgeShape(b2EdgeShape * e) - : Shape(e) + EdgeShape::EdgeShape(b2EdgeShape * e, bool own) + : Shape(e, own) { } EdgeShape::~EdgeShape() { - Memoizer::remove(shape); - delete shape; - shape = NULL; } int EdgeShape::getPoints(lua_State * L) diff --git a/src/modules/physics/box2d/EdgeShape.h b/src/modules/physics/box2d/EdgeShape.h index 6c8d6feb2..8956d45b6 100644 --- a/src/modules/physics/box2d/EdgeShape.h +++ b/src/modules/physics/box2d/EdgeShape.h @@ -42,7 +42,7 @@ namespace box2d * Create a new EdgeShape from a Box2D edge shape. * @param e The edge shape. **/ - EdgeShape(b2EdgeShape * e); + EdgeShape(b2EdgeShape * e, bool own = true); virtual ~EdgeShape(); diff --git a/src/modules/physics/box2d/Fixture.cpp b/src/modules/physics/box2d/Fixture.cpp index b3bd3e40d..56d59e462 100644 --- a/src/modules/physics/box2d/Fixture.cpp +++ b/src/modules/physics/box2d/Fixture.cpp @@ -126,15 +126,8 @@ namespace box2d { if (!fixture->GetShape()) return NULL; - Shape * s = (Shape *)Memoizer::find(fixture->GetShape()); - if (!s) - { - b2BlockAllocator a; - s = new Shape(fixture->GetShape()->Clone(&a)); - } - else - s->retain(); - return s; + + return new Shape(fixture->GetShape(), false); } bool Fixture::isValid() const diff --git a/src/modules/physics/box2d/PolygonShape.cpp b/src/modules/physics/box2d/PolygonShape.cpp index d2621dbd6..cb1d37367 100644 --- a/src/modules/physics/box2d/PolygonShape.cpp +++ b/src/modules/physics/box2d/PolygonShape.cpp @@ -33,16 +33,13 @@ namespace physics { namespace box2d { - PolygonShape::PolygonShape(b2PolygonShape * p) - : Shape(p) + PolygonShape::PolygonShape(b2PolygonShape * p, bool own) + : Shape(p, own) { } PolygonShape::~PolygonShape() { - Memoizer::remove(shape); - delete shape; - shape = NULL; } int PolygonShape::getPoints(lua_State * L) diff --git a/src/modules/physics/box2d/PolygonShape.h b/src/modules/physics/box2d/PolygonShape.h index 75161b4b2..41c6af036 100644 --- a/src/modules/physics/box2d/PolygonShape.h +++ b/src/modules/physics/box2d/PolygonShape.h @@ -47,7 +47,7 @@ namespace box2d * @param body The parent Body. * @param def The polygon definition. **/ - PolygonShape(b2PolygonShape * p); + PolygonShape(b2PolygonShape * p, bool own = true); virtual ~PolygonShape(); diff --git a/src/modules/physics/box2d/Shape.cpp b/src/modules/physics/box2d/Shape.cpp index 8bf6a3f4c..e7be203b3 100644 --- a/src/modules/physics/box2d/Shape.cpp +++ b/src/modules/physics/box2d/Shape.cpp @@ -37,18 +37,20 @@ namespace physics namespace box2d { Shape::Shape() - : shape(NULL) + : shape(NULL), own(false) { } - Shape::Shape(b2Shape * shape) - : shape(shape) + + Shape::Shape(b2Shape * shape, bool own) + : shape(shape), own(own) { - Memoizer::add(shape, this); + if (own) + Memoizer::add(shape, this); } Shape::~Shape() { - if (shape) + if (shape && own) { Memoizer::remove(shape); delete shape; diff --git a/src/modules/physics/box2d/Shape.h b/src/modules/physics/box2d/Shape.h index 5538ca379..8777eab06 100644 --- a/src/modules/physics/box2d/Shape.h +++ b/src/modules/physics/box2d/Shape.h @@ -50,6 +50,7 @@ namespace box2d // The Box2D shape. b2Shape * shape; + bool own; public: @@ -57,7 +58,7 @@ namespace box2d * Creates a Shape. **/ Shape(); - Shape(b2Shape * shape); + Shape(b2Shape * shape, bool own = true); virtual ~Shape();