From 20f4e567b35d3e13724e227e3f2ffdaa81809c0c Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sun, 5 Feb 2012 19:22:33 -0500 Subject: [PATCH] Fix Fixture:getShape(), for real this time. All the Memoizer stuff was pointless: when you create a Fixture, it clones the b2Shape, so there was never going to be a memoized Shape to find. And cloning the Shape is incorrect as well, since you should able to modify the Shape retrieved through getShape and have it affect the Fixture. Everything's much simpler now. --- src/modules/physics/box2d/ChainShape.cpp | 7 ++----- src/modules/physics/box2d/ChainShape.h | 2 +- src/modules/physics/box2d/CircleShape.cpp | 7 ++----- src/modules/physics/box2d/CircleShape.h | 2 +- src/modules/physics/box2d/EdgeShape.cpp | 7 ++----- src/modules/physics/box2d/EdgeShape.h | 2 +- src/modules/physics/box2d/Fixture.cpp | 11 ++--------- src/modules/physics/box2d/PolygonShape.cpp | 7 ++----- src/modules/physics/box2d/PolygonShape.h | 2 +- src/modules/physics/box2d/Shape.cpp | 12 +++++++----- src/modules/physics/box2d/Shape.h | 3 ++- 11 files changed, 23 insertions(+), 39 deletions(-) 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();