summaryrefslogtreecommitdiffstats
path: root/src/quick3d
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-09-05 09:09:36 +0200
committerPaul Lemire <paul.lemire@kdab.com>2016-11-23 20:22:43 +0000
commitd0fc03f301cb3bbd69d9e43cd6a984cbc8296d05 (patch)
tree1ccf2451e3a26a718d776a1bb728938ee07bf6d0 /src/quick3d
parentf58a99e8bafdd4222f347644b8d88adef87b2433 (diff)
Scene3DItem: no need to destoy the SGNode on size change
This was needed when we were using a QQFBO approach but now we can keep the same SGNode but tell it to recreate the FBO instead which it already does in render by checking if the size has change between the last time it was called Change-Id: I45e2ebb5102126cc9a31485ec87a94365e54a5e1 Reviewed-by: Paul Lemire <paul.lemire@kdab.com> Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com>
Diffstat (limited to 'src/quick3d')
-rw-r--r--src/quick3d/imports/scene3d/scene3ditem.cpp18
1 files changed, 7 insertions, 11 deletions
diff --git a/src/quick3d/imports/scene3d/scene3ditem.cpp b/src/quick3d/imports/scene3d/scene3ditem.cpp
index c03e77018..4a5c959c4 100644
--- a/src/quick3d/imports/scene3d/scene3ditem.cpp
+++ b/src/quick3d/imports/scene3d/scene3ditem.cpp
@@ -273,19 +273,11 @@ void Scene3DItem::setMultisample(bool enable)
QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *)
{
// If the render aspect wasn't created yet, do so now
- if (!m_renderAspect) {
+ if (m_renderAspect == nullptr) {
m_renderAspect = new QRenderAspect(QRenderAspect::Synchronous);
m_aspectEngine->registerAspect(m_renderAspect);
}
- // If the node already exists
- // we delete it and recreate it
- // as we need to resize the FBO
- if (node) {
- delete node;
- node = nullptr;
- }
-
if (m_renderer == nullptr) {
m_renderer = new Scene3DRenderer(this, m_aspectEngine, m_renderAspect);
m_renderer->setCleanerHelper(m_rendererCleaner);
@@ -294,9 +286,13 @@ QSGNode *Scene3DItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNode
// The main thread is blocked, it is now time to sync data between the renderer and the item.
m_renderer->synchronize();
- Scene3DSGNode *fboNode = new Scene3DSGNode();
+ Scene3DSGNode *fboNode = static_cast<Scene3DSGNode *>(node);
+ if (fboNode == nullptr) {
+ fboNode = new Scene3DSGNode();
+ m_renderer->setSGNode(fboNode);
+ }
fboNode->setRect(boundingRect());
- m_renderer->setSGNode(fboNode);
+
return fboNode;
}