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)
: ViewportElement(viewport)
: ViewportElement(disposePtr, viewport)
{
p = new PlanePrivate();

View file

@ -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());

View file

@ -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),

View file

@ -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),

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),
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<Disposable*>(this);
if(self != nullptr)
self->dispose();
if(m_dispose != nullptr)
m_dispose(this);
}
ViewportElement::~ViewportElement()

View file

@ -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;

View file

@ -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());

View file

@ -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());