diff options
31 files changed, 121 insertions, 6 deletions
diff --git a/demos/qt3d/cubehouse/cubeview.cpp b/demos/qt3d/cubehouse/cubeview.cpp index 54f172abe..191fad658 100644 --- a/demos/qt3d/cubehouse/cubeview.cpp +++ b/demos/qt3d/cubehouse/cubeview.cpp @@ -83,6 +83,11 @@ CubeView::CubeView(QWindow *parent) time.start(); } +CubeView::~CubeView() +{ + texture.cleanupResources(); +} + void CubeView::initializeGL(QGLPainter *painter) { QGLBuilder builder; diff --git a/demos/qt3d/cubehouse/cubeview.h b/demos/qt3d/cubehouse/cubeview.h index f07060b20..7194a5a81 100644 --- a/demos/qt3d/cubehouse/cubeview.h +++ b/demos/qt3d/cubehouse/cubeview.h @@ -55,7 +55,7 @@ class CubeView : public QGLView Q_PROPERTY(qreal cubeAngle READ cubeAngle WRITE setCubeAngle) public: CubeView(QWindow *parent = 0); - ~CubeView() {} + ~CubeView(); void setShowFrameRate(bool value) { showFrameRate = value; } void setStereo(bool value) { stereo = value; } diff --git a/demos/qt3d/pageflip/pageflip.cpp b/demos/qt3d/pageflip/pageflip.cpp index 3b9e46d12..a65738ead 100644 --- a/demos/qt3d/pageflip/pageflip.cpp +++ b/demos/qt3d/pageflip/pageflip.cpp @@ -148,6 +148,11 @@ PageFlipView::PageFlipView(QWindow *parent) PageFlipView::~PageFlipView() { + textures[0].cleanupResources(); + textures[1].cleanupResources(); + textures[2].cleanupResources(); + textures[3].cleanupResources(); + gradientTexture.cleanupResources(); delete effect; } diff --git a/demos/qt3d/photobrowser3d/buttons.cpp b/demos/qt3d/photobrowser3d/buttons.cpp index c296dfe10..cf543f57d 100644 --- a/demos/qt3d/photobrowser3d/buttons.cpp +++ b/demos/qt3d/photobrowser3d/buttons.cpp @@ -58,6 +58,7 @@ Buttons::Buttons(QObject *parent, QSharedPointer<QGLMaterialCollection> palette) QImage im(":/controls/arrows-left.png"); m_size = im.size(); QGLTexture2D *tex = new QGLTexture2D(mat); + m_LoadedTextures.push_back(tex); tex->setImage(im); mat->setTexture(tex); @@ -98,6 +99,13 @@ Buttons::Buttons(QObject *parent, QSharedPointer<QGLMaterialCollection> palette) m_left->setOption(QGLSceneNode::CullBoundingBox, false); } +Buttons::~Buttons() +{ + for (int i=0; i<m_LoadedTextures.count(); ++i) { + m_LoadedTextures.at(i)->cleanupResources(); + } +} + void Buttons::draw(QGLPainter *painter) { painter->projectionMatrix().push(); diff --git a/demos/qt3d/photobrowser3d/buttons.h b/demos/qt3d/photobrowser3d/buttons.h index e136f0e6b..654766729 100644 --- a/demos/qt3d/photobrowser3d/buttons.h +++ b/demos/qt3d/photobrowser3d/buttons.h @@ -51,12 +51,14 @@ class Buttons : public QGLSceneNode Q_OBJECT public: explicit Buttons(QObject *parent, QSharedPointer<QGLMaterialCollection> palette); + ~Buttons(); void draw(QGLPainter *painter); void clearPositions(); private: QGLSceneNode *m_left; QGLSceneNode *m_right; QSize m_size; + QList<QGLTexture2D*> m_LoadedTextures; }; #endif // BUTTONS_H diff --git a/demos/qt3d/photobrowser3d/imagedisplay.cpp b/demos/qt3d/photobrowser3d/imagedisplay.cpp index b1180ac7a..79bb3d208 100644 --- a/demos/qt3d/photobrowser3d/imagedisplay.cpp +++ b/demos/qt3d/photobrowser3d/imagedisplay.cpp @@ -128,6 +128,7 @@ ImageDisplay::ImageDisplay(QObject *parent, QSharedPointer<QGLMaterialCollection m_wall->setEffect(QGL::FlatReplaceTexture2D); QGLMaterial *mat = new QGLMaterial(); QGLTexture2D *tex = new QGLTexture2D(mat); + m_LoadedTextures.push_back(tex); tex->setImage(QImage(":/res/images/girder.png")); mat->setTexture(tex); mat->setObjectName("girder material"); @@ -157,6 +158,7 @@ ImageDisplay::ImageDisplay(QObject *parent, QSharedPointer<QGLMaterialCollection m_frameImage = qMakeFrameImage(); mat = new QGLMaterial(); tex = new QGLTexture2D(mat); + m_LoadedTextures.push_back(tex); tex->setHorizontalWrap(QGL::ClampToEdge); tex->setImage(m_frameImage); mat->setTexture(tex); @@ -173,6 +175,9 @@ ImageDisplay::ImageDisplay(QObject *parent, QSharedPointer<QGLMaterialCollection ImageDisplay::~ImageDisplay() { + for (int i=0; i<m_LoadedTextures.count(); ++i) { + m_LoadedTextures.at(i)->cleanupResources(); + } delete m_effect; } diff --git a/demos/qt3d/photobrowser3d/imagedisplay.h b/demos/qt3d/photobrowser3d/imagedisplay.h index 96f092d7c..462b07567 100644 --- a/demos/qt3d/photobrowser3d/imagedisplay.h +++ b/demos/qt3d/photobrowser3d/imagedisplay.h @@ -74,6 +74,7 @@ private: QGLSceneNode *m_currentWall; ThumbnailNode *m_currentFrame; QGLAbstractEffect *m_effect; + QList<QGLTexture2D*> m_LoadedTextures; bool m_imageSetToDefault; int m_count; qreal m_size; diff --git a/demos/qt3d/photobrowser3d/qatlas.cpp b/demos/qt3d/photobrowser3d/qatlas.cpp index 6b6343ec2..200974284 100644 --- a/demos/qt3d/photobrowser3d/qatlas.cpp +++ b/demos/qt3d/photobrowser3d/qatlas.cpp @@ -147,6 +147,8 @@ void QAtlas::paint(QGLPainter *painter) painter->popSurface(); glEnable(GL_DEPTH_TEST); + + t.cleanupResources(); } QRect QAtlas::allocate(const QSize &size, const QImage &image, const QGL::IndexArray &indices) diff --git a/demos/qt3d/photobrowser3d/skybox.cpp b/demos/qt3d/photobrowser3d/skybox.cpp index eaf884ce1..ce13ed7f8 100644 --- a/demos/qt3d/photobrowser3d/skybox.cpp +++ b/demos/qt3d/photobrowser3d/skybox.cpp @@ -141,6 +141,12 @@ SkyBox::SkyBox(QGLView *view, const QString &imagePath) setImagePath(imagePath.isEmpty() ? resourceBase : imagePath); } +SkyBox::~SkyBox() +{ + for (int i=0; i<6; ++i) { + m_faces[i]->material()->texture()->cleanupResources(); + } +} void SkyBox::setImagePath(const QString &imagePath) { diff --git a/demos/qt3d/photobrowser3d/skybox.h b/demos/qt3d/photobrowser3d/skybox.h index 4b31b1855..4e61fda32 100644 --- a/demos/qt3d/photobrowser3d/skybox.h +++ b/demos/qt3d/photobrowser3d/skybox.h @@ -58,6 +58,7 @@ class SkyBox : public QObject Q_OBJECT public: SkyBox(QGLView *view, const QString &imagePath = QString()); + ~SkyBox(); QString imagePath() const { return m_imagePath; } void setImagePath(const QString &imagePath); void draw(QGLPainter *painter) const; diff --git a/demos/qt3d/photobrowser3d/thumbnailableimage.cpp b/demos/qt3d/photobrowser3d/thumbnailableimage.cpp index f44ffb3a1..abed822dd 100644 --- a/demos/qt3d/photobrowser3d/thumbnailableimage.cpp +++ b/demos/qt3d/photobrowser3d/thumbnailableimage.cpp @@ -93,6 +93,8 @@ ThumbnailableImagePrivate::ThumbnailableImagePrivate() ThumbnailableImagePrivate::~ThumbnailableImagePrivate() { + if (tex) + tex->cleanupResources(); } ThumbnailableImage::ThumbnailableImage() diff --git a/demos/qt3d/photobrowser3d/thumbnailnode.cpp b/demos/qt3d/photobrowser3d/thumbnailnode.cpp index f6689006c..d419e6165 100644 --- a/demos/qt3d/photobrowser3d/thumbnailnode.cpp +++ b/demos/qt3d/photobrowser3d/thumbnailnode.cpp @@ -65,6 +65,9 @@ ThumbnailNode::ThumbnailNode(QObject *parent) ThumbnailNode::~ThumbnailNode() { + for (int i=0; i<m_LoadedTextures.count(); ++i) { + m_LoadedTextures.at(i)->cleanupResources(); + } delete m_full; } @@ -121,8 +124,12 @@ void ThumbnailNode::destroyFullNode() if (!m_full) return; QGLMaterial *mat = m_full->material(); - if (m_full->materialIndex() != m_defaultMaterial) + if (m_full->materialIndex() != m_defaultMaterial) { m_full->palette()->removeMaterial(mat); + mat->texture()->cleanupResources(); + m_LoadedTextures.removeAll(mat->texture()); + delete mat; + } delete m_full; m_full = 0; } @@ -140,6 +147,7 @@ void ThumbnailNode::loadFullImage() { QGLMaterial *mat = new QGLMaterial; QGLTexture2D *tex = new QGLTexture2D(mat); + m_LoadedTextures.push_back(tex); tex->setImage(m_image.data()); mat->setTexture(tex); mat->setObjectName(m_image.url().path()); diff --git a/demos/qt3d/photobrowser3d/thumbnailnode.h b/demos/qt3d/photobrowser3d/thumbnailnode.h index d1d63cee1..4a77c907e 100644 --- a/demos/qt3d/photobrowser3d/thumbnailnode.h +++ b/demos/qt3d/photobrowser3d/thumbnailnode.h @@ -91,6 +91,8 @@ private: QSizeF m_max; QObject *m_manager; Distance m_lastDistance; + + QList<QGLTexture2D*> m_LoadedTextures; }; #endif // THUMBNAILNODE_H diff --git a/demos/qt3d/shapes/shapes.cpp b/demos/qt3d/shapes/shapes.cpp index 21e6a50fb..bd32814fe 100644 --- a/demos/qt3d/shapes/shapes.cpp +++ b/demos/qt3d/shapes/shapes.cpp @@ -453,6 +453,7 @@ void ShapesWidget::drawText painter->draw(QGL::TriangleFan, 4); painter->setStandardEffect(QGL::FlatColor); glBindTexture(GL_TEXTURE_2D, 0); + texture.cleanupResources(); } void ShapesWidget::ensureContext() diff --git a/examples/qt3d/basket/basketview.cpp b/examples/qt3d/basket/basketview.cpp index ea91fb14e..b5618455d 100644 --- a/examples/qt3d/basket/basketview.cpp +++ b/examples/qt3d/basket/basketview.cpp @@ -80,6 +80,10 @@ BasketView::BasketView(QWindow *parent) BasketView::~BasketView() { + const QGLMaterialCollection* pPalette = basket->palette().data(); + for (int i=0; i<pPalette->size(); ++i) { + pPalette->material(i)->texture()->cleanupResources(); + } delete basket; } diff --git a/examples/qt3d/builder/builder.cpp b/examples/qt3d/builder/builder.cpp index 07078b8d0..2e1db9842 100644 --- a/examples/qt3d/builder/builder.cpp +++ b/examples/qt3d/builder/builder.cpp @@ -53,6 +53,7 @@ BuilderView::BuilderView(QWindow *parent) : QGLView(parent) , canScene(new QGLSceneNode(this)) + , texture(0) { //! [0] QGLSceneNode *can = buildGeometry(); @@ -97,6 +98,7 @@ BuilderView::BuilderView(QWindow *parent) BuilderView::~BuilderView() { + texture->cleanupResources(); delete canScene; } @@ -132,6 +134,7 @@ QGLSceneNode *BuilderView::buildGeometry() url.setPath(QLatin1String(":/images/qt-soup.png")); url.setScheme(QLatin1String("file")); mat->setTextureUrl(url); + texture = mat->texture(); int canMat = root->palette()->addMaterial(mat); root->setMaterialIndex(canMat); root->setEffect(QGL::LitMaterial); diff --git a/examples/qt3d/builder/builder.h b/examples/qt3d/builder/builder.h index 9bd95128f..014e7c631 100644 --- a/examples/qt3d/builder/builder.h +++ b/examples/qt3d/builder/builder.h @@ -63,6 +63,7 @@ private: QGLSceneNode *buildGeometry(); QGLSceneNode *canScene; + QGLTexture2D *texture; }; #endif diff --git a/examples/qt3d/cube/cubeview.cpp b/examples/qt3d/cube/cubeview.cpp index 6f84996d0..e588305a2 100644 --- a/examples/qt3d/cube/cubeview.cpp +++ b/examples/qt3d/cube/cubeview.cpp @@ -46,6 +46,8 @@ CubeView::CubeView(QWindow *parent) : QGLView(parent) + , cube(0) + , texture(0) { QGLBuilder builder; builder << QGL::Faceted << QGLCube(1.5f); @@ -57,6 +59,7 @@ CubeView::CubeView(QWindow *parent) url.setPath(QLatin1String(":/qtlogo.png")); url.setScheme(QLatin1String("file")); mat->setTextureUrl(url); + texture = mat->texture(); cube->setMaterial(mat); cube->setEffect(QGL::LitDecalTexture2D); @@ -64,6 +67,7 @@ CubeView::CubeView(QWindow *parent) CubeView::~CubeView() { + texture->cleanupResources(); delete cube; } diff --git a/examples/qt3d/cube/cubeview.h b/examples/qt3d/cube/cubeview.h index 3b537aa50..dbe256247 100644 --- a/examples/qt3d/cube/cubeview.h +++ b/examples/qt3d/cube/cubeview.h @@ -59,6 +59,7 @@ protected: private: QGLSceneNode *cube; + QGLTexture2D *texture; }; #endif diff --git a/examples/qt3d/cylinder/cylinderview.cpp b/examples/qt3d/cylinder/cylinderview.cpp index 3cc7b9468..26036bee1 100644 --- a/examples/qt3d/cylinder/cylinderview.cpp +++ b/examples/qt3d/cylinder/cylinderview.cpp @@ -57,6 +57,7 @@ CylinderView::CylinderView(QWindow *parent) urlLid.setPath(QLatin1String(":/latte.png")); urlLid.setScheme(QLatin1String("file")); matLid->setTextureUrl(urlLid); + m_LoadedTextures.push_back(matLid->texture()); QGLMaterial *matSides = new QGLMaterial; matSides->setColor(QColor(170, 202, 0)); @@ -64,6 +65,7 @@ CylinderView::CylinderView(QWindow *parent) urlSides.setPath(QLatin1String(":/cupTexture.png")); urlSides.setScheme(QLatin1String("file")); matSides->setTextureUrl(urlSides); + m_LoadedTextures.push_back(matSides->texture()); QGLSceneNode *root = builder.sceneNode(); @@ -89,6 +91,9 @@ CylinderView::CylinderView(QWindow *parent) CylinderView::~CylinderView() { + for (int i=0; i<m_LoadedTextures.count(); ++i) { + m_LoadedTextures.at(i)->cleanupResources(); + } delete cylinder; } diff --git a/examples/qt3d/cylinder/cylinderview.h b/examples/qt3d/cylinder/cylinderview.h index 124c56c71..7d55fccd1 100644 --- a/examples/qt3d/cylinder/cylinderview.h +++ b/examples/qt3d/cylinder/cylinderview.h @@ -59,6 +59,7 @@ protected: private: QGLSceneNode *cylinder; + QList<QGLTexture2D*> m_LoadedTextures; }; #endif diff --git a/examples/qt3d/geometry/geometry.cpp b/examples/qt3d/geometry/geometry.cpp index f1f89760d..98e8e25cf 100644 --- a/examples/qt3d/geometry/geometry.cpp +++ b/examples/qt3d/geometry/geometry.cpp @@ -52,6 +52,7 @@ const float phi = 1.618033988749894848f; Geometry::Geometry(QObject *parent, QSharedPointer<QGLMaterialCollection> materials) : QGLSceneNode(parent) + , m_texture(0) { setPalette(materials); @@ -198,8 +199,14 @@ Geometry::Geometry(QObject *parent, QSharedPointer<QGLMaterialCollection> materi QGLTexture2D *texture = new QGLTexture2D(mat); texture->setImage(uv); mat->setTexture(texture); + m_texture = texture; setMaterial(mat); QGLSceneNode *n = b.finalizedSceneNode(); addNode(n); } + +Geometry::~Geometry() +{ + m_texture->cleanupResources(); +} diff --git a/examples/qt3d/geometry/geometry.h b/examples/qt3d/geometry/geometry.h index 8504c0254..b83c49918 100644 --- a/examples/qt3d/geometry/geometry.h +++ b/examples/qt3d/geometry/geometry.h @@ -53,6 +53,10 @@ class Geometry : public QGLSceneNode { public: Geometry(QObject *parent, QSharedPointer<QGLMaterialCollection> materials); + ~Geometry(); + +private: + QGLTexture2D *m_texture; }; #endif // GEOMETRY_H diff --git a/examples/qt3d/nesting/cubeview.cpp b/examples/qt3d/nesting/cubeview.cpp index 274b85db6..ae7b8a7b2 100644 --- a/examples/qt3d/nesting/cubeview.cpp +++ b/examples/qt3d/nesting/cubeview.cpp @@ -101,6 +101,7 @@ CubeView::CubeView(QWindow *parent) CubeView::~CubeView() { + qtlogo.cleanupResources(); delete fbo; } diff --git a/examples/qt3d/solarsystem/solarsystem.cpp b/examples/qt3d/solarsystem/solarsystem.cpp index 73c2f159e..baa1e9826 100644 --- a/examples/qt3d/solarsystem/solarsystem.cpp +++ b/examples/qt3d/solarsystem/solarsystem.cpp @@ -106,6 +106,9 @@ SolarSystemView::SolarSystemView(QWindow *parent) SolarSystemView::~SolarSystemView() { + for (int i=0; i<m_LoadedTextures.count(); ++i) { + m_LoadedTextures.at(i)->cleanupResources(); + } delete spaceScene; delete sunEffect; } @@ -146,6 +149,8 @@ QGLSceneNode *SolarSystemView::createScene() url.setPath(QLatin1String(":/solar2.jpg")); url.setScheme(QLatin1String("file")); mat1->setTextureUrl(url, 1); + m_LoadedTextures.push_back(mat1->texture(0)); + m_LoadedTextures.push_back(mat1->texture(1)); //mat1->setEmittedLight(Qt::white); int sunMat = root->palette()->addMaterial(mat1); @@ -154,6 +159,7 @@ QGLSceneNode *SolarSystemView::createScene() url.setPath(QLatin1String(":/planet.jpg")); url.setScheme(QLatin1String("file")); mat2->setTextureUrl(url); + m_LoadedTextures.push_back(mat2->texture()); int planetMat = root->palette()->addMaterial(mat2); //moon surface @@ -161,6 +167,7 @@ QGLSceneNode *SolarSystemView::createScene() url.setPath(QLatin1String(":/moon-texture.jpg")); url.setScheme(QLatin1String("file")); mat3->setTextureUrl(url); + m_LoadedTextures.push_back(mat3->texture()); int moonMat = root->palette()->addMaterial(mat3); //Set the rotation of the solar-system diff --git a/examples/qt3d/solarsystem/solarsystem.h b/examples/qt3d/solarsystem/solarsystem.h index a5aad7a03..53c89674a 100644 --- a/examples/qt3d/solarsystem/solarsystem.h +++ b/examples/qt3d/solarsystem/solarsystem.h @@ -87,6 +87,7 @@ private: QGraphicsRotation3D *moonRotation; QGraphicsRotation3D *systemRotation; QGLSceneNode *spaceScene; + QList<QGLTexture2D*> m_LoadedTextures; QGLShaderProgramEffect* sunEffect; diff --git a/examples/qt3d/tank/quadplane.cpp b/examples/qt3d/tank/quadplane.cpp index 16b416da1..16935c912 100644 --- a/examples/qt3d/tank/quadplane.cpp +++ b/examples/qt3d/tank/quadplane.cpp @@ -70,6 +70,7 @@ QGLMaterial *qCreateFloor() QuadPlane::QuadPlane(QObject *parent, QSizeF size, int level) : QGLSceneNode(parent) + , m_texture(0) { setObjectName("QuadPlane"); if (level > 8) @@ -102,9 +103,18 @@ QuadPlane::QuadPlane(QObject *parent, QSizeF size, int level) } QGLSceneNode *n = builder.finalizedSceneNode(); addNode(n); - n->setMaterial(qCreateFloor()); + QGLMaterial *mat = qCreateFloor(); + m_texture = mat->texture(); + n->setMaterial(mat); QGraphicsRotation3D *rot = new QGraphicsRotation3D(n); rot->setAxis(QVector3D(1, 0, 0)); rot->setAngle(90.0f); n->addTransform(rot); } + +QuadPlane::~QuadPlane() +{ + if (m_texture) + m_texture->cleanupResources(); +} + diff --git a/examples/qt3d/tank/quadplane.h b/examples/qt3d/tank/quadplane.h index db2aee6f3..0bb3f122a 100644 --- a/examples/qt3d/tank/quadplane.h +++ b/examples/qt3d/tank/quadplane.h @@ -50,6 +50,10 @@ class QuadPlane : public QGLSceneNode public: QuadPlane(QObject *parent = 0, QSizeF size = QSizeF(100.0f, 100.0f), int level = 3); + ~QuadPlane(); + +private: + QGLTexture2D *m_texture; }; #endif // QUADPLANE_H diff --git a/examples/qt3d/tank/tank.cpp b/examples/qt3d/tank/tank.cpp index b4e055652..f10daee42 100644 --- a/examples/qt3d/tank/tank.cpp +++ b/examples/qt3d/tank/tank.cpp @@ -87,8 +87,9 @@ static QGLMaterial *qCreateFluid() return mat; } -Tank::Tank(QObject *parent) : - QGLSceneNode(parent) +Tank::Tank(QObject *parent) + : QGLSceneNode(parent) + , m_texture(0) { QSequentialAnimationGroup *seq = new QSequentialAnimationGroup(this); QGraphicsScale3D *scale = new QGraphicsScale3D(this); @@ -110,7 +111,16 @@ Tank::Tank(QObject *parent) : seq->start(); addNode(tankObject()); - setMaterial(qCreateFluid()); + + QGLMaterial *mat = qCreateFluid(); + m_texture = mat->texture(); + setMaterial(mat); +} + +Tank::~Tank() +{ + if (m_texture) + m_texture->cleanupResources(); } QGLSceneNode *Tank::tankObject() diff --git a/examples/qt3d/tank/tank.h b/examples/qt3d/tank/tank.h index ce8badb02..da939bdab 100644 --- a/examples/qt3d/tank/tank.h +++ b/examples/qt3d/tank/tank.h @@ -48,12 +48,15 @@ class Tank : public QGLSceneNode Q_OBJECT public: explicit Tank(QObject *parent = 0); + ~Tank(); signals: public slots: private: static QGLSceneNode *tankObject(); + + QGLTexture2D *m_texture; }; #endif // TANK_H diff --git a/tutorials/qt3d/cube4/cubeview.cpp b/tutorials/qt3d/cube4/cubeview.cpp index 5c05626f0..cae1f7597 100644 --- a/tutorials/qt3d/cube4/cubeview.cpp +++ b/tutorials/qt3d/cube4/cubeview.cpp @@ -60,6 +60,7 @@ CubeView::CubeView(QWindow *parent) CubeView::~CubeView() { + logo.cleanupResources(); delete cube; } |