Allow ViewportElement to compile with -fno-rtti

This commit is contained in:
刘皓 2025-05-15 13:34:09 -04:00
parent 53f42adb89
commit 94e0f99643
No known key found for this signature in database
GPG key ID: 7901753DB465B711
8 changed files with 36 additions and 16 deletions

View file

@ -161,8 +161,13 @@ struct PlanePrivate
} }
}; };
static void disposePtr(void *ptr)
{
((Plane *)ptr)->dispose();
}
Plane::Plane(Viewport *viewport) Plane::Plane(Viewport *viewport)
: ViewportElement(viewport) : ViewportElement(disposePtr, viewport)
{ {
p = new PlanePrivate(); p = new PlanePrivate();

View file

@ -342,8 +342,13 @@ struct SpritePrivate
} }
}; };
static void disposePtr(void *ptr)
{
((Sprite *)ptr)->dispose();
}
Sprite::Sprite(Viewport *viewport) Sprite::Sprite(Viewport *viewport)
: ViewportElement(viewport) : ViewportElement(disposePtr, viewport)
{ {
p = new SpritePrivate; p = new SpritePrivate;
onGeometryChange(scene->getGeometry()); onGeometryChange(scene->getGeometry());

View file

@ -1076,7 +1076,7 @@ struct TilemapPrivate
}; };
GroundLayer::GroundLayer(TilemapPrivate *p, Viewport *viewport) GroundLayer::GroundLayer(TilemapPrivate *p, Viewport *viewport)
: ViewportElement(viewport, 0), : ViewportElement(nullptr, viewport, 0),
vboCount(0), vboCount(0),
p(p) p(p)
{ {
@ -1126,7 +1126,7 @@ void GroundLayer::onGeometryChange(const Scene::Geometry &geo)
} }
ZLayer::ZLayer(TilemapPrivate *p, Viewport *viewport) ZLayer::ZLayer(TilemapPrivate *p, Viewport *viewport)
: ViewportElement(viewport, 0), : ViewportElement(nullptr, viewport, 0),
index(0), index(0),
vboOffset(0), vboOffset(0),
vboCount(0), vboCount(0),

View file

@ -103,7 +103,7 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
TilemapVXPrivate *p; TilemapVXPrivate *p;
AboveLayer(TilemapVXPrivate *p, Viewport *viewport) AboveLayer(TilemapVXPrivate *p, Viewport *viewport)
: ViewportElement(viewport, 200), : ViewportElement(nullptr, viewport, 200),
p(p) p(p)
{} {}
@ -119,7 +119,7 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
AboveLayer above; AboveLayer above;
TilemapVXPrivate(Viewport *viewport) TilemapVXPrivate(Viewport *viewport)
: ViewportElement(viewport), : ViewportElement(nullptr, viewport),
mapData(0), mapData(0),
flags(0), flags(0),
allocQuads(0), allocQuads(0),

View file

@ -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), : SceneElement(viewport ? *viewport : *shState->screen(), z, spriteY),
m_viewport(viewport) m_dispose(dispose), m_viewport(viewport)
{ {
if (rgssVer == 1 && viewport) if (rgssVer == 1 && viewport)
viewportDispCon = viewport->wasDisposed.connect(&ViewportElement::viewportElementDisposal, this); viewportDispCon = viewport->wasDisposed.connect(&ViewportElement::viewportElementDisposal, this);
@ -252,9 +252,8 @@ void ViewportElement::setViewport(Viewport *viewport)
void ViewportElement::viewportElementDisposal() void ViewportElement::viewportElementDisposal()
{ {
viewportDispCon.disconnect(); viewportDispCon.disconnect();
Disposable *self = dynamic_cast<Disposable*>(this); if(m_dispose != nullptr)
if(self != nullptr) m_dispose(this);
self->dispose();
} }
ViewportElement::~ViewportElement() ViewportElement::~ViewportElement()

View file

@ -70,7 +70,7 @@ private:
class ViewportElement : public SceneElement class ViewportElement : public SceneElement
{ {
public: 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(); ~ViewportElement();
DECL_ATTR( Viewport, Viewport* ) DECL_ATTR( Viewport, Viewport* )
@ -79,6 +79,7 @@ protected:
virtual void onViewportChange() {} virtual void onViewportChange() {}
private: private:
void (*m_dispose)(void *);
Viewport *m_viewport; Viewport *m_viewport;
sigslot::connection viewportDispCon; sigslot::connection viewportDispCon;
sigslot::connection viewportElementDispCon; sigslot::connection viewportElementDispCon;

View file

@ -212,7 +212,7 @@ struct WindowPrivate
WindowControls(WindowPrivate *p, WindowControls(WindowPrivate *p,
Viewport *viewport = 0) Viewport *viewport = 0)
: ViewportElement(viewport), : ViewportElement(nullptr, viewport),
p(p) p(p)
{ {
setZ(2); setZ(2);
@ -695,8 +695,13 @@ struct WindowPrivate
} }
}; };
static void disposePtr(void *ptr)
{
((Window *)ptr)->dispose();
}
Window::Window(Viewport *viewport) Window::Window(Viewport *viewport)
: ViewportElement(viewport) : ViewportElement(disposePtr, viewport)
{ {
p = new WindowPrivate(viewport); p = new WindowPrivate(viewport);
onGeometryChange(scene->getGeometry()); onGeometryChange(scene->getGeometry());

View file

@ -832,15 +832,20 @@ struct WindowVXPrivate
} }
}; };
static void disposePtr(void *ptr)
{
((WindowVX *)ptr)->dispose();
}
WindowVX::WindowVX(Viewport *viewport) 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); p = new WindowVXPrivate(0, 0, 0, 0);
onGeometryChange(scene->getGeometry()); onGeometryChange(scene->getGeometry());
} }
WindowVX::WindowVX(int x, int y, int width, int height) 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); p = new WindowVXPrivate(x, y, width, height);
onGeometryChange(scene->getGeometry()); onGeometryChange(scene->getGeometry());