summaryrefslogtreecommitdiff
path: root/src/quick3d/imports/scene3d/scene3dview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick3d/imports/scene3d/scene3dview.cpp')
-rw-r--r--src/quick3d/imports/scene3d/scene3dview.cpp38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/quick3d/imports/scene3d/scene3dview.cpp b/src/quick3d/imports/scene3d/scene3dview.cpp
index f38d135f0..ddf58ccad 100644
--- a/src/quick3d/imports/scene3d/scene3dview.cpp
+++ b/src/quick3d/imports/scene3d/scene3dview.cpp
@@ -118,6 +118,10 @@ namespace Qt3DRender {
There are no restriction on the sharing of elements between different scenes
in different Scene3DView instances.
+
+ By default, you are in charge of ensuring the lifetime of the referenced
+ Entity. If you wish to transfer this duty to the Scene3DView, the
+ ownsEntity property can be set to true (defaults to false).
*/
namespace {
@@ -146,6 +150,7 @@ Scene3DView::Scene3DView(QQuickItem *parent)
, m_holderViewport(new Qt3DRender::QViewport())
, m_dirtyFlags(DirtyNode|DirtyTexture)
, m_texture(nullptr)
+ , m_ownsEntity(false)
{
setFlag(QQuickItem::ItemHasContents, true);\
@@ -157,8 +162,11 @@ Scene3DView::Scene3DView(QQuickItem *parent)
Scene3DView::~Scene3DView()
{
- if (m_entity)
- abandonSubtree(m_entity);
+ if (m_entity) {
+ abandonSubtree(m_entity.data());
+ if (m_ownsEntity)
+ m_entity->deleteLater();
+ }
if (m_scene3D)
m_scene3D->removeView(this);
@@ -166,7 +174,7 @@ Scene3DView::~Scene3DView()
Qt3DCore::QEntity *Scene3DView::entity() const
{
- return m_entity;
+ return m_entity.data();
}
Scene3DItem *Scene3DView::scene3D() const
@@ -197,6 +205,11 @@ QSGTexture *Scene3DView::texture() const
return m_texture;
}
+bool Scene3DView::ownsEntity() const
+{
+ return m_ownsEntity;
+}
+
// Called by Scene3DRender::beforeSynchronizing in RenderThread
void Scene3DView::markSGNodeDirty()
{
@@ -207,17 +220,20 @@ void Scene3DView::markSGNodeDirty()
// Main Thread
void Scene3DView::setEntity(Qt3DCore::QEntity *entity)
{
- if (m_entity == entity)
+ if (m_entity.data() == entity)
return;
- if (m_entity)
- abandonSubtree(m_entity);
+ if (m_entity) {
+ abandonSubtree(m_entity.data());
+ if (m_ownsEntity)
+ m_entity->deleteLater();
+ }
m_entity = entity;
emit entityChanged();
if (m_entity)
- adoptSubtree(m_entity);
+ adoptSubtree(m_entity.data());
}
// Main Thread
@@ -247,6 +263,14 @@ void Scene3DView::setScene3D(Scene3DItem *scene3D)
}
}
+void Scene3DView::setOwnsEntity(bool ownsEntity)
+{
+ if (ownsEntity == m_ownsEntity)
+ return;
+ m_ownsEntity = ownsEntity;
+ emit ownsEntityChanged();
+}
+
// Render Thread
QSGNode *Scene3DView::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *)
{