diff --git a/src/display/plane.cpp b/src/display/plane.cpp index 5b834cdc..27e64c22 100644 --- a/src/display/plane.cpp +++ b/src/display/plane.cpp @@ -161,8 +161,13 @@ struct PlanePrivate } }; +static void disposePtr(void *ptr) +{ + ((Plane *)ptr)->dispose(); +} + Plane::Plane(Viewport *viewport) - : ViewportElement(viewport) + : ViewportElement(disposePtr, viewport) { p = new PlanePrivate(); diff --git a/src/display/sprite.cpp b/src/display/sprite.cpp index 81de31fe..af3578f6 100644 --- a/src/display/sprite.cpp +++ b/src/display/sprite.cpp @@ -342,8 +342,13 @@ struct SpritePrivate } }; +static void disposePtr(void *ptr) +{ + ((Sprite *)ptr)->dispose(); +} + Sprite::Sprite(Viewport *viewport) -: ViewportElement(viewport) +: ViewportElement(disposePtr, viewport) { p = new SpritePrivate; onGeometryChange(scene->getGeometry()); diff --git a/src/display/tilemap.cpp b/src/display/tilemap.cpp index 83e6c0b4..dacfa976 100644 --- a/src/display/tilemap.cpp +++ b/src/display/tilemap.cpp @@ -1076,7 +1076,7 @@ struct TilemapPrivate }; GroundLayer::GroundLayer(TilemapPrivate *p, Viewport *viewport) - : ViewportElement(viewport, 0), + : ViewportElement(nullptr, viewport, 0), vboCount(0), p(p) { @@ -1126,7 +1126,7 @@ void GroundLayer::onGeometryChange(const Scene::Geometry &geo) } ZLayer::ZLayer(TilemapPrivate *p, Viewport *viewport) - : ViewportElement(viewport, 0), + : ViewportElement(nullptr, viewport, 0), index(0), vboOffset(0), vboCount(0), diff --git a/src/display/tilemapvx.cpp b/src/display/tilemapvx.cpp index b4260a50..c1144dd5 100644 --- a/src/display/tilemapvx.cpp +++ b/src/display/tilemapvx.cpp @@ -103,7 +103,7 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader TilemapVXPrivate *p; AboveLayer(TilemapVXPrivate *p, Viewport *viewport) - : ViewportElement(viewport, 200), + : ViewportElement(nullptr, viewport, 200), p(p) {} @@ -119,7 +119,7 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader AboveLayer above; TilemapVXPrivate(Viewport *viewport) - : ViewportElement(viewport), + : ViewportElement(nullptr, viewport), mapData(0), flags(0), allocQuads(0), diff --git a/src/display/viewport.cpp b/src/display/viewport.cpp index d8bd75f9..b822e5f4 100644 --- a/src/display/viewport.cpp +++ b/src/display/viewport.cpp @@ -223,9 +223,9 @@ void Viewport::releaseResources() } -ViewportElement::ViewportElement(Viewport *viewport, int z, int spriteY) +ViewportElement::ViewportElement(void (*dispose)(void *), Viewport *viewport, int z, int spriteY) : SceneElement(viewport ? *viewport : *shState->screen(), z, spriteY), - m_viewport(viewport) + m_dispose(dispose), m_viewport(viewport) { if (rgssVer == 1 && viewport) viewportDispCon = viewport->wasDisposed.connect(&ViewportElement::viewportElementDisposal, this); @@ -252,9 +252,8 @@ void ViewportElement::setViewport(Viewport *viewport) void ViewportElement::viewportElementDisposal() { viewportDispCon.disconnect(); - Disposable *self = dynamic_cast(this); - if(self != nullptr) - self->dispose(); + if(m_dispose != nullptr) + m_dispose(this); } ViewportElement::~ViewportElement() diff --git a/src/display/viewport.h b/src/display/viewport.h index 20fdddd7..761eaadc 100644 --- a/src/display/viewport.h +++ b/src/display/viewport.h @@ -70,7 +70,7 @@ private: class ViewportElement : public SceneElement { public: - ViewportElement(Viewport *viewport = 0, int z = 0, int spriteY = 0); + ViewportElement(void (*dispose)(void *), Viewport *viewport = 0, int z = 0, int spriteY = 0); ~ViewportElement(); DECL_ATTR( Viewport, Viewport* ) @@ -79,6 +79,7 @@ protected: virtual void onViewportChange() {} private: + void (*m_dispose)(void *); Viewport *m_viewport; sigslot::connection viewportDispCon; sigslot::connection viewportElementDispCon; diff --git a/src/display/window.cpp b/src/display/window.cpp index 8d35670e..79f93997 100644 --- a/src/display/window.cpp +++ b/src/display/window.cpp @@ -212,7 +212,7 @@ struct WindowPrivate WindowControls(WindowPrivate *p, Viewport *viewport = 0) - : ViewportElement(viewport), + : ViewportElement(nullptr, viewport), p(p) { setZ(2); @@ -695,8 +695,13 @@ struct WindowPrivate } }; +static void disposePtr(void *ptr) +{ + ((Window *)ptr)->dispose(); +} + Window::Window(Viewport *viewport) - : ViewportElement(viewport) + : ViewportElement(disposePtr, viewport) { p = new WindowPrivate(viewport); onGeometryChange(scene->getGeometry()); diff --git a/src/display/windowvx.cpp b/src/display/windowvx.cpp index dc98da1e..d23e3fd6 100644 --- a/src/display/windowvx.cpp +++ b/src/display/windowvx.cpp @@ -832,15 +832,20 @@ struct WindowVXPrivate } }; +static void disposePtr(void *ptr) +{ + ((WindowVX *)ptr)->dispose(); +} + WindowVX::WindowVX(Viewport *viewport) - : ViewportElement(viewport, DEF_Z, DEF_SPRITE_Y) + : ViewportElement(disposePtr, viewport, DEF_Z, DEF_SPRITE_Y) { p = new WindowVXPrivate(0, 0, 0, 0); onGeometryChange(scene->getGeometry()); } WindowVX::WindowVX(int x, int y, int width, int height) - : ViewportElement(0, DEF_Z, DEF_SPRITE_Y) + : ViewportElement(disposePtr, 0, DEF_Z, DEF_SPRITE_Y) { p = new WindowVXPrivate(x, y, width, height); onGeometryChange(scene->getGeometry());