summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2014-09-19 08:37:03 +0200
committerSean Harmer <sean.harmer@kdab.com>2014-09-30 12:16:39 +0200
commit94bb50fba66435a078f30b1da9cf5507522ab136 (patch)
tree1c48f4e4463dd0f28fcd38efb259017987bbc8d6
parent616e8083872c953a31acc871749e05c621c18bd1 (diff)
Improved/Refactored cloning and doClone off all subclasses
Note: As we are using QScene during cloning, it is important that node hierarchy be created and added in the proper order (parent then child). Change-Id: I8fd53f7ca696ec9aca19cc70dc116ccba4154911 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--examples/tessellation-modes/tessellatedquadmesh.cpp4
-rw-r--r--examples/tessellation-modes/tessellatedquadmesh.h2
-rw-r--r--src/bulletphysics/qboxcollider.cpp7
-rw-r--r--src/bulletphysics/qboxcollider.h2
-rw-r--r--src/bulletphysics/qrigidbody.cpp7
-rw-r--r--src/bulletphysics/qrigidbody.h2
-rw-r--r--src/bulletphysics/qspherecollider.cpp7
-rw-r--r--src/bulletphysics/qspherecollider.h2
-rw-r--r--src/core/core-components/qcameralens.cpp7
-rw-r--r--src/core/core-components/qcameralens.h2
-rw-r--r--src/core/nodes/qentity.cpp12
-rw-r--r--src/core/nodes/qentity.h2
-rw-r--r--src/core/nodes/qnode.cpp35
-rw-r--r--src/core/nodes/qnode.h4
-rw-r--r--src/core/qscene.cpp19
-rw-r--r--src/core/qscene.h7
-rw-r--r--src/core/qsceneinterface.h5
-rw-r--r--src/core/transforms/qlookattransform.cpp7
-rw-r--r--src/core/transforms/qlookattransform.h2
-rw-r--r--src/core/transforms/qmatrixtransform.cpp7
-rw-r--r--src/core/transforms/qmatrixtransform.h2
-rw-r--r--src/core/transforms/qrotatetransform.cpp7
-rw-r--r--src/core/transforms/qrotatetransform.h2
-rw-r--r--src/core/transforms/qscaletransform.cpp7
-rw-r--r--src/core/transforms/qscaletransform.h2
-rw-r--r--src/core/transforms/qtransform.cpp6
-rw-r--r--src/core/transforms/qtransform.h2
-rw-r--r--src/core/transforms/qtranslatetransform.cpp7
-rw-r--r--src/core/transforms/qtranslatetransform.h2
-rw-r--r--src/plugins/sceneparsers/assimp/assimpparser.cpp38
-rw-r--r--src/render/backend/renderrenderpass.cpp3
-rw-r--r--src/render/frontend/framegraph-components/qcameraselector.cpp13
-rw-r--r--src/render/frontend/framegraph-components/qcameraselector.h2
-rw-r--r--src/render/frontend/framegraph-components/qclearbuffer.cpp7
-rw-r--r--src/render/frontend/framegraph-components/qclearbuffer.h2
-rw-r--r--src/render/frontend/framegraph-components/qframegraph.cpp8
-rw-r--r--src/render/frontend/framegraph-components/qframegraph.h2
-rw-r--r--src/render/frontend/framegraph-components/qlayerfilter.cpp9
-rw-r--r--src/render/frontend/framegraph-components/qlayerfilter.h2
-rw-r--r--src/render/frontend/framegraph-components/qrenderpassfilter.cpp11
-rw-r--r--src/render/frontend/framegraph-components/qrenderpassfilter.h2
-rw-r--r--src/render/frontend/framegraph-components/qrendertargetselector.cpp9
-rw-r--r--src/render/frontend/framegraph-components/qrendertargetselector.h2
-rw-r--r--src/render/frontend/framegraph-components/qsortcriterion.cpp7
-rw-r--r--src/render/frontend/framegraph-components/qsortcriterion.h2
-rw-r--r--src/render/frontend/framegraph-components/qsortmethod.cpp9
-rw-r--r--src/render/frontend/framegraph-components/qsortmethod.h2
-rw-r--r--src/render/frontend/framegraph-components/qtechniquefilter.cpp11
-rw-r--r--src/render/frontend/framegraph-components/qtechniquefilter.h2
-rw-r--r--src/render/frontend/framegraph-components/qviewport.cpp9
-rw-r--r--src/render/frontend/framegraph-components/qviewport.h2
-rw-r--r--src/render/frontend/qalphatest.cpp7
-rw-r--r--src/render/frontend/qalphatest.h2
-rw-r--r--src/render/frontend/qblendequation.cpp7
-rw-r--r--src/render/frontend/qblendequation.h2
-rw-r--r--src/render/frontend/qblendstate.cpp7
-rw-r--r--src/render/frontend/qblendstate.h2
-rw-r--r--src/render/frontend/qcriterion.cpp7
-rw-r--r--src/render/frontend/qcriterion.h2
-rw-r--r--src/render/frontend/qcuboidmesh.cpp7
-rw-r--r--src/render/frontend/qcuboidmesh.h2
-rw-r--r--src/render/frontend/qcullface.cpp7
-rw-r--r--src/render/frontend/qcullface.h2
-rw-r--r--src/render/frontend/qcylindermesh.cpp4
-rw-r--r--src/render/frontend/qcylindermesh.h2
-rw-r--r--src/render/frontend/qdepthmask.cpp7
-rw-r--r--src/render/frontend/qdepthmask.h2
-rw-r--r--src/render/frontend/qdepthtest.cpp7
-rw-r--r--src/render/frontend/qdepthtest.h2
-rw-r--r--src/render/frontend/qdirectionallight.cpp7
-rw-r--r--src/render/frontend/qdirectionallight.h2
-rw-r--r--src/render/frontend/qdithering.cpp7
-rw-r--r--src/render/frontend/qdithering.h2
-rw-r--r--src/render/frontend/qeffect.cpp11
-rw-r--r--src/render/frontend/qeffect.h2
-rw-r--r--src/render/frontend/qfrontface.cpp7
-rw-r--r--src/render/frontend/qfrontface.h2
-rw-r--r--src/render/frontend/qlayer.cpp7
-rw-r--r--src/render/frontend/qlayer.h2
-rw-r--r--src/render/frontend/qmaterial.cpp11
-rw-r--r--src/render/frontend/qmaterial.h2
-rw-r--r--src/render/frontend/qmesh.cpp7
-rw-r--r--src/render/frontend/qmesh.h2
-rw-r--r--src/render/frontend/qparameter.cpp7
-rw-r--r--src/render/frontend/qparameter.h2
-rw-r--r--src/render/frontend/qparametermapper.cpp7
-rw-r--r--src/render/frontend/qparametermapper.h2
-rw-r--r--src/render/frontend/qplanemesh.cpp7
-rw-r--r--src/render/frontend/qplanemesh.h2
-rw-r--r--src/render/frontend/qpointlight.cpp7
-rw-r--r--src/render/frontend/qpointlight.h2
-rw-r--r--src/render/frontend/qrenderattachment.cpp7
-rw-r--r--src/render/frontend/qrenderattachment.h2
-rw-r--r--src/render/frontend/qrenderpass.cpp15
-rw-r--r--src/render/frontend/qrenderpass.h2
-rw-r--r--src/render/frontend/qrendertarget.cpp9
-rw-r--r--src/render/frontend/qrendertarget.h2
-rw-r--r--src/render/frontend/qsceneloader.cpp15
-rw-r--r--src/render/frontend/qsceneloader.h2
-rw-r--r--src/render/frontend/qscissortest.cpp7
-rw-r--r--src/render/frontend/qscissortest.h2
-rw-r--r--src/render/frontend/qshaderprogram.cpp7
-rw-r--r--src/render/frontend/qshaderprogram.h2
-rw-r--r--src/render/frontend/qspheremesh.cpp7
-rw-r--r--src/render/frontend/qspheremesh.h2
-rw-r--r--src/render/frontend/qspotlight.cpp7
-rw-r--r--src/render/frontend/qspotlight.h2
-rw-r--r--src/render/frontend/qstenciltest.cpp7
-rw-r--r--src/render/frontend/qstenciltest.h2
-rw-r--r--src/render/frontend/qtechnique.cpp13
-rw-r--r--src/render/frontend/qtechnique.h2
-rw-r--r--src/render/frontend/qtexture.cpp7
-rw-r--r--src/render/frontend/qtexture.h2
-rw-r--r--src/render/frontend/qtorusmesh.cpp7
-rw-r--r--src/render/frontend/qtorusmesh.h2
-rw-r--r--src/render/frontend/tag.h9
-rw-r--r--src/render/io/gltfparser.cpp10
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp21
-rw-r--r--tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp7
-rw-r--r--tests/auto/core/qscene/tst_qscene.cpp14
120 files changed, 475 insertions, 236 deletions
diff --git a/examples/tessellation-modes/tessellatedquadmesh.cpp b/examples/tessellation-modes/tessellatedquadmesh.cpp
index d0bb465ba..501eedb2a 100644
--- a/examples/tessellation-modes/tessellatedquadmesh.cpp
+++ b/examples/tessellation-modes/tessellatedquadmesh.cpp
@@ -50,9 +50,9 @@ TessellatedQuadMesh::TessellatedQuadMesh(Qt3D::QNode *parent)
{
}
-TessellatedQuadMesh *TessellatedQuadMesh::doClone(Qt3D::QNode *clonedParent) const
+TessellatedQuadMesh *TessellatedQuadMesh::doClone(bool isClone) const
{
- return new TessellatedQuadMesh(clonedParent);
+ return new TessellatedQuadMesh();
}
class TessellatedQuadMeshFunctor : public Qt3D::QAbstractMeshFunctor
diff --git a/examples/tessellation-modes/tessellatedquadmesh.h b/examples/tessellation-modes/tessellatedquadmesh.h
index f2b04fd54..56221312d 100644
--- a/examples/tessellation-modes/tessellatedquadmesh.h
+++ b/examples/tessellation-modes/tessellatedquadmesh.h
@@ -53,7 +53,7 @@ public:
Qt3D::QAbstractMeshFunctorPtr meshFunctor() const Q_DECL_OVERRIDE;
protected:
- TessellatedQuadMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ TessellatedQuadMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
#endif // TESSELLATEDQUAD_H
diff --git a/src/bulletphysics/qboxcollider.cpp b/src/bulletphysics/qboxcollider.cpp
index 28dd13f48..1686c8c16 100644
--- a/src/bulletphysics/qboxcollider.cpp
+++ b/src/bulletphysics/qboxcollider.cpp
@@ -77,9 +77,12 @@ void QBoxCollider::copy(const QNode *ref)
}
}
-QBoxCollider *QBoxCollider::doClone(QNode *clonedParent) const
+QBoxCollider *QBoxCollider::doClone(bool isClone) const
{
- return new QBoxCollider(clonedParent);
+ QBoxCollider *clone = new QBoxCollider();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QBoxCollider::setCenter(const QVector3D &center)
diff --git a/src/bulletphysics/qboxcollider.h b/src/bulletphysics/qboxcollider.h
index be1c52c94..de5373170 100644
--- a/src/bulletphysics/qboxcollider.h
+++ b/src/bulletphysics/qboxcollider.h
@@ -79,7 +79,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QBoxCollider)
QBoxCollider(QBoxColliderPrivate &dd, QNode *parent = 0);
- QBoxCollider *doClone(QNode *clonedParent = 0) const Q_DECL_OVERRIDE;
+ QBoxCollider *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace BulletPhysics
diff --git a/src/bulletphysics/qrigidbody.cpp b/src/bulletphysics/qrigidbody.cpp
index 6e4c69eea..5039acc10 100644
--- a/src/bulletphysics/qrigidbody.cpp
+++ b/src/bulletphysics/qrigidbody.cpp
@@ -77,9 +77,12 @@ void QRigidBody::copy(const QNode *ref)
}
}
-QRigidBody *QRigidBody::doClone(QNode *clonedParent) const
+QRigidBody *QRigidBody::doClone(bool isClone) const
{
- return new QRigidBody(clonedParent);
+ QRigidBody *clone = new QRigidBody();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QRigidBody::setMass(float mass)
diff --git a/src/bulletphysics/qrigidbody.h b/src/bulletphysics/qrigidbody.h
index 9b647f210..7b1aa35e8 100644
--- a/src/bulletphysics/qrigidbody.h
+++ b/src/bulletphysics/qrigidbody.h
@@ -82,7 +82,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QRigidBody)
QRigidBody(QRigidBodyPrivate &dd, Qt3D::QNode *parent = 0);
- QRigidBody *doClone(QNode *clonedParent = 0) const Q_DECL_OVERRIDE;
+ QRigidBody *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace BulletPhysics
diff --git a/src/bulletphysics/qspherecollider.cpp b/src/bulletphysics/qspherecollider.cpp
index 5e23793cf..4d02cd834 100644
--- a/src/bulletphysics/qspherecollider.cpp
+++ b/src/bulletphysics/qspherecollider.cpp
@@ -77,9 +77,12 @@ void QSphereCollider::copy(const QNode *ref)
}
}
-QSphereCollider *QSphereCollider::doClone(QNode *clonedParent) const
+QSphereCollider *QSphereCollider::doClone(bool isClone) const
{
- return new QSphereCollider(clonedParent);
+ QSphereCollider *clone = new QSphereCollider();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QSphereCollider::setCenter(const QVector3D &center)
diff --git a/src/bulletphysics/qspherecollider.h b/src/bulletphysics/qspherecollider.h
index a0ab09801..ff3d78dd6 100644
--- a/src/bulletphysics/qspherecollider.h
+++ b/src/bulletphysics/qspherecollider.h
@@ -79,7 +79,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QSphereCollider)
QSphereCollider(QSphereColliderPrivate &dd, QNode *parent = 0);
- QSphereCollider *doClone(QNode *clonedParent = 0) const Q_DECL_OVERRIDE;
+ QSphereCollider *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace BulletPhysics
diff --git a/src/core/core-components/qcameralens.cpp b/src/core/core-components/qcameralens.cpp
index addd0a1e5..154ae13b5 100644
--- a/src/core/core-components/qcameralens.cpp
+++ b/src/core/core-components/qcameralens.cpp
@@ -94,9 +94,12 @@ QCameraLens::QCameraLens(QCameraLensPrivate &dd, QNode *parent)
d->updateOrthogonalProjection();
}
-QCameraLens *QCameraLens::doClone(QNode *clonedParent) const
+QCameraLens *QCameraLens::doClone(bool isClone) const
{
- return new QCameraLens(clonedParent);
+ QCameraLens *clone = new QCameraLens();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QCameraLens::setProjectionType(QCameraLens::ProjectionType projectionType)
diff --git a/src/core/core-components/qcameralens.h b/src/core/core-components/qcameralens.h
index ef1259b26..25399c49f 100644
--- a/src/core/core-components/qcameralens.h
+++ b/src/core/core-components/qcameralens.h
@@ -133,7 +133,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QCameraLens)
QCameraLens(QCameraLensPrivate &dd, QNode *parent = 0);
- QCameraLens *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QCameraLens *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/core/nodes/qentity.cpp b/src/core/nodes/qentity.cpp
index 40fd3a79a..4314bdd6a 100644
--- a/src/core/nodes/qentity.cpp
+++ b/src/core/nodes/qentity.cpp
@@ -77,12 +77,16 @@ QEntity::QEntity(QEntityPrivate &dd, QNode *parent)
{
}
-QEntity *QEntity::doClone(QNode *clonedParent) const
+QEntity *QEntity::doClone(bool isClone) const
{
Q_D(const QEntity);
- QEntity *clone = new QEntity(clonedParent);
- Q_FOREACH (QComponent *c, d->m_components)
- clone->d_func()->m_components.append(qobject_cast<QComponent *>(c->clone(clone)));
+ QEntity *clone = new QEntity();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ Q_FOREACH (QComponent *c, d->m_components) {
+ QNode *ccclone = c->clone(isClone);
+ clone->addComponent(qobject_cast<QComponent *>(ccclone));
+ }
return clone;
}
diff --git a/src/core/nodes/qentity.h b/src/core/nodes/qentity.h
index 3974a736e..d937f98f6 100644
--- a/src/core/nodes/qentity.h
+++ b/src/core/nodes/qentity.h
@@ -146,7 +146,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QEntity)
QEntity(QEntityPrivate &dd, QNode *parent = 0);
- QEntity *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QEntity *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/core/nodes/qnode.cpp b/src/core/nodes/qnode.cpp
index c805b0a7d..2d2271432 100644
--- a/src/core/nodes/qnode.cpp
+++ b/src/core/nodes/qnode.cpp
@@ -50,6 +50,7 @@
#include <QMetaObject>
#include <QMetaProperty>
#include "corelogging.h"
+#include <Qt3DCore/QComponent>
QT_BEGIN_NAMESPACE
@@ -189,22 +190,40 @@ void QNode::removeChild(QNode *childNode)
// a real node. If there is a need for a real clone, set isClone to false
// eg When a subtree built in the backend needs to be cloned
// in the main thread to be added to the scene graph
-QNode *QNode::clone(QNode *clonedParent, bool isClone) const
+QNode *QNode::clone(bool isClone)
{
- Q_D(const QNode);
+ Q_D(QNode);
+ static int clearLock = 0;
+
+ clearLock++;
+
+ if (d->m_scene == Q_NULLPTR)
+ return Q_NULLPTR;
+
+ QNode *clonedNode = d->m_scene->lookupClone(uuid());
+ if (clonedNode == Q_NULLPTR) {
+ clonedNode = doClone(isClone);
+ // doClone, returns new instance with content copied
+ // and relationships added
+ d->m_scene->addCloneLookup(clonedNode);
+ }
+ Q_FOREACH (QNode *c, children()) {
+ QNode *cclone = c->clone(isClone);
+ clonedNode->addChild(cclone);
+ }
- QNode *nodeClone = doClone(clonedParent);
- nodeClone->copy(this);
- nodeClone->d_func()->m_isClone = isClone;
- Q_FOREACH (QNode *children, d->m_children)
- nodeClone->addChild(children->clone(nodeClone));
- return nodeClone;
+ if (--clearLock == 0)
+ d->m_scene->clearCloneLookup();
+ return clonedNode;
}
void QNode::copy(const QNode *ref)
{
Q_D(QNode);
d->m_uuid = ref->uuid();
+ d->m_changeArbiter = ref->d_func()->m_changeArbiter;
+ d->m_scene = ref->d_func()->m_scene;
+ setObjectName(ref->objectName());
}
bool QNode::isClone() const
diff --git a/src/core/nodes/qnode.h b/src/core/nodes/qnode.h
index ee6b09ff5..8d80e0d35 100644
--- a/src/core/nodes/qnode.h
+++ b/src/core/nodes/qnode.h
@@ -79,7 +79,7 @@ public:
void addChild(QNode *childNode);
void removeChild(QNode *childNode);
- QNode *clone(QNode *clonedParent = 0, bool isClone = true) const;
+ QNode *clone(bool isClone = true);
virtual void copy(const QNode *ref);
bool isClone() const;
@@ -101,7 +101,7 @@ public:
protected:
void notifyPropertyChange(const QByteArray &name, const QVariant &value);
virtual void notifyObservers(const QSceneChangePtr &change);
- virtual QNode *doClone(QNode *clonedParent = 0) const = 0;
+ virtual QNode *doClone(bool isClone = true) const = 0;
Q_DECLARE_PRIVATE(QNode)
QNode(QNodePrivate &dd, QNode *parent = 0);
diff --git a/src/core/qscene.cpp b/src/core/qscene.cpp
index fe0b8d32d..4715cb961 100644
--- a/src/core/qscene.cpp
+++ b/src/core/qscene.cpp
@@ -65,6 +65,7 @@ public:
QMultiHash<QUuid, QObservableInterface *> m_observablesLookupTable;
QHash<QObservableInterface *, QUuid> m_observableToUuid;
QChangeArbiter *m_arbiter;
+ QHash<QUuid, QNode *> m_clonesLookupTable;
mutable QReadWriteLock m_lock;
};
@@ -178,6 +179,24 @@ void QScene::removeEntityForComponent(const QUuid &componentUuid, const QUuid &e
d->m_componentToEntities.remove(componentUuid, entityUuid);
}
+QNode *QScene::lookupClone(const QUuid &id) const
+{
+ Q_D(const QScene);
+ return d->m_clonesLookupTable.value(id);
+}
+
+void QScene::addCloneLookup(QNode *clone)
+{
+ Q_D(QScene);
+ d->m_clonesLookupTable.insert(clone->uuid(), clone);
+}
+
+void QScene::clearCloneLookup()
+{
+ Q_D(QScene);
+ d->m_clonesLookupTable.clear();
+}
+
} // Qt3D
QT_END_NAMESPACE
diff --git a/src/core/qscene.h b/src/core/qscene.h
index ed8595fa7..fd4c1977c 100644
--- a/src/core/qscene.h
+++ b/src/core/qscene.h
@@ -65,10 +65,17 @@ public:
QNode *lookupNode(const QUuid &uuid) const Q_DECL_OVERRIDE;
QUuid nodeIdFromObservable(QObservableInterface *observable) const Q_DECL_OVERRIDE;
void setArbiter(QChangeArbiter *arbiter) Q_DECL_OVERRIDE;
+
+ // Component -> Entities
QList<QUuid> entitiesForComponent(const QUuid &uuid) const Q_DECL_OVERRIDE;
void addEntityForComponent(const QUuid &componentUuid, const QUuid &entityUuid) Q_DECL_OVERRIDE;
void removeEntityForComponent(const QUuid &componentUuid, const QUuid &entityUuid) Q_DECL_OVERRIDE;
+ // QNode -> QNode *children
+ QNode *lookupClone(const QUuid &id) const Q_DECL_OVERRIDE;
+ void addCloneLookup(QNode *clone) Q_DECL_OVERRIDE;
+ void clearCloneLookup() Q_DECL_OVERRIDE;
+
private:
Q_DECLARE_PRIVATE(QScene)
QScenePrivate *d_ptr;
diff --git a/src/core/qsceneinterface.h b/src/core/qsceneinterface.h
index 94605baad..ea5b8e729 100644
--- a/src/core/qsceneinterface.h
+++ b/src/core/qsceneinterface.h
@@ -70,9 +70,14 @@ public:
virtual QNode *lookupNode(const QUuid &uuid) const = 0;
virtual QUuid nodeIdFromObservable(QObservableInterface *observable) const = 0;
virtual void setArbiter(QChangeArbiter *arbiter) = 0;
+
virtual QList<QUuid> entitiesForComponent(const QUuid &componentUuid) const = 0;
virtual void addEntityForComponent(const QUuid &componentUuid, const QUuid &entityUuid) = 0;
virtual void removeEntityForComponent(const QUuid &componentUuid, const QUuid &entityUuid) = 0;
+
+ virtual QNode *lookupClone(const QUuid &id) const = 0;
+ virtual void addCloneLookup(QNode *clone) = 0;
+ virtual void clearCloneLookup() = 0;
};
} // Qt3D
diff --git a/src/core/transforms/qlookattransform.cpp b/src/core/transforms/qlookattransform.cpp
index f4303a5db..b4ec652fc 100644
--- a/src/core/transforms/qlookattransform.cpp
+++ b/src/core/transforms/qlookattransform.cpp
@@ -76,9 +76,12 @@ QLookAtTransform::QLookAtTransform(QLookAtTransformPrivate &dd, QNode *parent)
{
}
-QLookAtTransform *QLookAtTransform::doClone(QNode *clonedParent) const
+QLookAtTransform *QLookAtTransform::doClone(bool isClone) const
{
- return new QLookAtTransform(clonedParent);
+ QLookAtTransform *clone = new QLookAtTransform();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QMatrix4x4 QLookAtTransform::transformMatrix() const
diff --git a/src/core/transforms/qlookattransform.h b/src/core/transforms/qlookattransform.h
index 79c494c5e..2707a1498 100644
--- a/src/core/transforms/qlookattransform.h
+++ b/src/core/transforms/qlookattransform.h
@@ -88,7 +88,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QLookAtTransform)
QLookAtTransform(QLookAtTransformPrivate &dd, QNode *parent = 0);
- QLookAtTransform *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QLookAtTransform *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/core/transforms/qmatrixtransform.cpp b/src/core/transforms/qmatrixtransform.cpp
index 505e59734..024f03ee9 100644
--- a/src/core/transforms/qmatrixtransform.cpp
+++ b/src/core/transforms/qmatrixtransform.cpp
@@ -56,9 +56,12 @@ QMatrixTransform::QMatrixTransform(QMatrixTransformPrivate &dd, QNode *parent)
{
}
-QMatrixTransform *QMatrixTransform::doClone(QNode *clonedParent) const
+QMatrixTransform *QMatrixTransform::doClone(bool isClone) const
{
- return new QMatrixTransform(clonedParent);
+ QMatrixTransform *clone = new QMatrixTransform();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QMatrixTransform::QMatrixTransform(QNode *parent)
diff --git a/src/core/transforms/qmatrixtransform.h b/src/core/transforms/qmatrixtransform.h
index 6d6c6dcdf..e8fba4aef 100644
--- a/src/core/transforms/qmatrixtransform.h
+++ b/src/core/transforms/qmatrixtransform.h
@@ -74,7 +74,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QMatrixTransform)
QMatrixTransform(QMatrixTransformPrivate &dd, QNode *parent = 0);
- QMatrixTransform *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QMatrixTransform *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/core/transforms/qrotatetransform.cpp b/src/core/transforms/qrotatetransform.cpp
index 72c521d6e..8adb620fb 100644
--- a/src/core/transforms/qrotatetransform.cpp
+++ b/src/core/transforms/qrotatetransform.cpp
@@ -81,9 +81,12 @@ QRotateTransform::QRotateTransform(QRotateTransformPrivate &dd, QNode *parent)
{
}
-QRotateTransform *QRotateTransform::doClone(QNode *clonedParent) const
+QRotateTransform *QRotateTransform::doClone(bool isClone) const
{
- return new QRotateTransform(clonedParent);
+ QRotateTransform *clone = new QRotateTransform();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
float QRotateTransform::angleDeg() const
diff --git a/src/core/transforms/qrotatetransform.h b/src/core/transforms/qrotatetransform.h
index f0dd93d6f..1c6bea033 100644
--- a/src/core/transforms/qrotatetransform.h
+++ b/src/core/transforms/qrotatetransform.h
@@ -82,7 +82,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QRotateTransform)
QRotateTransform(QRotateTransformPrivate &dd, QNode *parent = 0);
- QRotateTransform *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QRotateTransform *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/core/transforms/qscaletransform.cpp b/src/core/transforms/qscaletransform.cpp
index 8152eb8f6..60d711db6 100644
--- a/src/core/transforms/qscaletransform.cpp
+++ b/src/core/transforms/qscaletransform.cpp
@@ -73,9 +73,12 @@ QScaleTransform::QScaleTransform(QScaleTransformPrivate &dd, QNode *parent)
{
}
-QScaleTransform *QScaleTransform::doClone(QNode *clonedParent) const
+QScaleTransform *QScaleTransform::doClone(bool isClone) const
{
- return new QScaleTransform(clonedParent);
+ QScaleTransform *clone = new QScaleTransform();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QVector3D QScaleTransform::scale3D() const
diff --git a/src/core/transforms/qscaletransform.h b/src/core/transforms/qscaletransform.h
index 05051129f..2b6cfd96e 100644
--- a/src/core/transforms/qscaletransform.h
+++ b/src/core/transforms/qscaletransform.h
@@ -76,7 +76,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QScaleTransform)
QScaleTransform(QScaleTransformPrivate &dd, QNode *parent = 0);
- QScaleTransform *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QScaleTransform *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp
index 8a7bcf559..be83559e0 100644
--- a/src/core/transforms/qtransform.cpp
+++ b/src/core/transforms/qtransform.cpp
@@ -97,12 +97,12 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent)
{
}
-QTransform *QTransform::doClone(QNode *clonedParent) const
+QTransform *QTransform::doClone(bool isClone) const
{
Q_D(const QTransform);
- QTransform *clone = new QTransform(clonedParent);
+ QTransform *clone = new QTransform();
Q_FOREACH (QAbstractTransform *t, d->m_transforms)
- clone->appendTransform(qobject_cast<QAbstractTransform *>(t->clone(clone)));
+ clone->appendTransform(qobject_cast<QAbstractTransform *>(t->clone()));
return clone;
}
diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h
index 36dc9bb2f..8cf18a4da 100644
--- a/src/core/transforms/qtransform.h
+++ b/src/core/transforms/qtransform.h
@@ -99,7 +99,7 @@ protected:
Q_DECLARE_PRIVATE(QTransform)
QTransform(QTransformPrivate &dd, QNode *parent = 0);
- QTransform *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QTransform *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/core/transforms/qtranslatetransform.cpp b/src/core/transforms/qtranslatetransform.cpp
index 4c187c30b..0440fa690 100644
--- a/src/core/transforms/qtranslatetransform.cpp
+++ b/src/core/transforms/qtranslatetransform.cpp
@@ -73,9 +73,12 @@ QTranslateTransform::QTranslateTransform(QTranslateTransformPrivate &dd, QNode *
{
}
-QTranslateTransform *QTranslateTransform::doClone(QNode *clonedParent) const
+QTranslateTransform *QTranslateTransform::doClone(bool isClone) const
{
- return new QTranslateTransform(clonedParent);
+ QTranslateTransform *clone = new QTranslateTransform();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
diff --git a/src/core/transforms/qtranslatetransform.h b/src/core/transforms/qtranslatetransform.h
index bbf8ac2b1..6994a05b1 100644
--- a/src/core/transforms/qtranslatetransform.h
+++ b/src/core/transforms/qtranslatetransform.h
@@ -88,7 +88,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QTranslateTransform)
QTranslateTransform(QTranslateTransformPrivate &dd, QNode *parent = 0);
- QTranslateTransform *doClone(QNode *clonedParent) const;
+ QTranslateTransform *doClone(bool isClone) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/plugins/sceneparsers/assimp/assimpparser.cpp b/src/plugins/sceneparsers/assimp/assimpparser.cpp
index 22d0496f0..8f385d48b 100644
--- a/src/plugins/sceneparsers/assimp/assimpparser.cpp
+++ b/src/plugins/sceneparsers/assimp/assimpparser.cpp
@@ -45,6 +45,7 @@
#include <Qt3DCore/qtransform.h>
#include <Qt3DCore/qmatrixtransform.h>
#include <Qt3DCore/qcameralens.h>
+#include <Qt3DCore/private/qabstractmesh_p.h>
#include <Qt3DRenderer/qparameter.h>
#include <Qt3DRenderer/qmesh.h>
#include <Qt3DRenderer/qmaterial.h>
@@ -190,7 +191,7 @@ public :
private:
QMeshDataPtr m_meshData;
- AssimpMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ AssimpMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
class AssimpMeshFunctor : public QAbstractMeshFunctor
{
@@ -695,17 +696,17 @@ void AssimpParser::copyMaterialColorProperties(QMaterial *material, aiMaterial *
{
aiColor3D color;
if (assimpMaterial->Get(AI_MATKEY_COLOR_DIFFUSE, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_DIFFUSE_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_DIFFUSE_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
if (assimpMaterial->Get(AI_MATKEY_COLOR_SPECULAR, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_SPECULAR_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_SPECULAR_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
if (assimpMaterial->Get(AI_MATKEY_COLOR_AMBIENT, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_AMBIENT_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_AMBIENT_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
if (assimpMaterial->Get(AI_MATKEY_COLOR_EMISSIVE, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_EMISSIVE_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_EMISSIVE_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
if (assimpMaterial->Get(AI_MATKEY_COLOR_TRANSPARENT, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_TRANSPARENT_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_TRANSPARENT_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
if (assimpMaterial->Get(AI_MATKEY_COLOR_REFLECTIVE, color) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_REFLECTIVE_COLOR, QColor::fromRgbF(color.r, color.g, color.b), material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_REFLECTIVE_COLOR, QColor::fromRgbF(color.r, color.g, color.b)));
}
/*!
@@ -715,9 +716,9 @@ void AssimpParser::copyMaterialBoolProperties(QMaterial *material, aiMaterial *a
{
int value;
if (assimpMaterial->Get(AI_MATKEY_TWOSIDED, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_IS_TWOSIDED, (value == 0) ? false : true, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_IS_TWOSIDED, (value == 0) ? false : true));
if (assimpMaterial->Get(AI_MATKEY_ENABLE_WIREFRAME, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_IS_WIREFRAME, (value == 0) ? false : true, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_IS_WIREFRAME, (value == 0) ? false : true));
}
void AssimpParser::copyMaterialShadingModel(QMaterial *material, aiMaterial *assimpMaterial)
@@ -791,7 +792,7 @@ void AssimpParser::copyMaterialTextures(QMaterial *material, aiMaterial *assimpM
}
if (textureLoaded) {
material->addParameter(new QParameter(m_textureToParameterName[textureType[i]],
- m_materialTextures[fullPath], material));
+ m_materialTextures[fullPath]));
}
}
}
@@ -804,15 +805,15 @@ void AssimpParser::copyMaterialFloatProperties(QMaterial *material, aiMaterial *
{
float value = 0;
if (assimpMaterial->Get(AI_MATKEY_OPACITY, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_OPACITY, value, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_OPACITY, value));
if (assimpMaterial->Get(AI_MATKEY_SHININESS, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_SHININESS, value, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_SHININESS, value));
if (assimpMaterial->Get(AI_MATKEY_SHININESS_STRENGTH, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_SHININESS_STRENGTH, value, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_SHININESS_STRENGTH, value));
if (assimpMaterial->Get(AI_MATKEY_REFRACTI, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_REFRACTI, value, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_REFRACTI, value));
if (assimpMaterial->Get(AI_MATKEY_REFLECTIVITY, value) == aiReturn_SUCCESS)
- material->addParameter(new QParameter(ASSIMP_MATERIAL_REFLECTIVITY, value, material));
+ material->addParameter(new QParameter(ASSIMP_MATERIAL_REFLECTIVITY, value));
}
AssimpMesh::AssimpMesh(QNode *parent)
@@ -835,9 +836,12 @@ void AssimpMesh::setData(QMeshDataPtr data)
QAbstractMesh::setDirty(this);
}
-AssimpMesh *AssimpMesh::doClone(QNode *clonedParent) const
+AssimpMesh *AssimpMesh::doClone(bool isClone) const
{
- return new AssimpMesh(clonedParent);
+ AssimpMesh *clone = new AssimpMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QAbstractMeshFunctorPtr AssimpMesh::meshFunctor() const
diff --git a/src/render/backend/renderrenderpass.cpp b/src/render/backend/renderrenderpass.cpp
index 81d57199c..9a64618ae 100644
--- a/src/render/backend/renderrenderpass.cpp
+++ b/src/render/backend/renderrenderpass.cpp
@@ -100,8 +100,9 @@ void RenderRenderPass::setPeer(QRenderPass *peer)
if (peer->shaderProgram() != Q_NULLPTR)
m_shaderUuid = peer->shaderProgram()->uuid();
// The RenderPass clones frontend bindings in case the frontend ever removes them
+ // TO DO: We probably need a QParameterMapper manager
Q_FOREACH (QParameterMapper *binding, peer->bindings())
- appendBinding(qobject_cast<QParameterMapper *>(binding->clone()));
+ appendBinding(binding);
Q_FOREACH (QCriterion *c, peer->criteria())
appendCriterion(c);
Q_FOREACH (QRenderState *renderState, peer->renderStates())
diff --git a/src/render/frontend/framegraph-components/qcameraselector.cpp b/src/render/frontend/framegraph-components/qcameraselector.cpp
index ffec9091a..3097e7fac 100644
--- a/src/render/frontend/framegraph-components/qcameraselector.cpp
+++ b/src/render/frontend/framegraph-components/qcameraselector.cpp
@@ -53,16 +53,19 @@ QCameraSelector::QCameraSelector(QCameraSelectorPrivate &dd, QNode *parent)
{
}
-QCameraSelector *QCameraSelector::doClone(QNode *clonedParent) const
+QCameraSelector *QCameraSelector::doClone(bool isClone) const
{
Q_D(const QCameraSelector);
- QCameraSelector *cameraSelector = new QCameraSelector(clonedParent);
+ QCameraSelector *cameraSelector = new QCameraSelector();
- Q_FOREACH (const QFrameGraphItem *fgChild, d->m_fgChildren)
- cameraSelector->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(cameraSelector)));
+ cameraSelector->copy(this);
+ cameraSelector->d_func()->m_isClone = isClone;
+
+ Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
+ cameraSelector->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
if (d->m_camera != Q_NULLPTR)
- cameraSelector->setCamera(qobject_cast<QEntity *>(d->m_camera->clone(cameraSelector)));
+ cameraSelector->setCamera(qobject_cast<QEntity *>(d->m_camera->clone(isClone)));
return cameraSelector;
}
diff --git a/src/render/frontend/framegraph-components/qcameraselector.h b/src/render/frontend/framegraph-components/qcameraselector.h
index 3a182f609..1b26816a9 100644
--- a/src/render/frontend/framegraph-components/qcameraselector.h
+++ b/src/render/frontend/framegraph-components/qcameraselector.h
@@ -69,7 +69,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QCameraSelector)
QCameraSelector(QCameraSelectorPrivate &dd, QNode *parent = 0);
- QCameraSelector *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QCameraSelector *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/render/frontend/framegraph-components/qclearbuffer.cpp b/src/render/frontend/framegraph-components/qclearbuffer.cpp
index 45190aef9..6e9ad4383 100644
--- a/src/render/frontend/framegraph-components/qclearbuffer.cpp
+++ b/src/render/frontend/framegraph-components/qclearbuffer.cpp
@@ -79,9 +79,12 @@ QClearBuffer::BufferType QClearBuffer::buffers() const
}
-QClearBuffer *QClearBuffer::doClone(QNode *clonedParent) const
+QClearBuffer *QClearBuffer::doClone(bool isClone) const
{
- return new QClearBuffer(clonedParent);
+ QClearBuffer *clone = new QClearBuffer();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QClearBuffer::setBuffers(QClearBuffer::BufferType buffers)
diff --git a/src/render/frontend/framegraph-components/qclearbuffer.h b/src/render/frontend/framegraph-components/qclearbuffer.h
index 232978873..492880917 100644
--- a/src/render/frontend/framegraph-components/qclearbuffer.h
+++ b/src/render/frontend/framegraph-components/qclearbuffer.h
@@ -80,7 +80,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QClearBuffer)
QClearBuffer(QClearBufferPrivate &dd, QNode *parent = 0);
- QClearBuffer *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QClearBuffer *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/framegraph-components/qframegraph.cpp b/src/render/frontend/framegraph-components/qframegraph.cpp
index 9018d69a3..090577906 100644
--- a/src/render/frontend/framegraph-components/qframegraph.cpp
+++ b/src/render/frontend/framegraph-components/qframegraph.cpp
@@ -79,12 +79,14 @@ QFrameGraph::QFrameGraph(QFrameGraphPrivate &dd, QNode *parent)
{
}
-QFrameGraph *QFrameGraph::doClone(QNode *clonedParent) const
+QFrameGraph *QFrameGraph::doClone(bool isClone) const
{
Q_D(const QFrameGraph);
- QFrameGraph *frameGraph = new QFrameGraph(clonedParent);
+ QFrameGraph *frameGraph = new QFrameGraph();
+ frameGraph->copy(this);
+ frameGraph->d_func()->m_isClone = isClone;
- frameGraph->setActiveFrameGraph(qobject_cast<QFrameGraphItem *>(d->m_activeFrameGraph->clone(clonedParent)));
+ frameGraph->setActiveFrameGraph(qobject_cast<QFrameGraphItem *>(d->m_activeFrameGraph->clone(isClone)));
return frameGraph;
}
diff --git a/src/render/frontend/framegraph-components/qframegraph.h b/src/render/frontend/framegraph-components/qframegraph.h
index 9ce9baf4f..6a4706c47 100644
--- a/src/render/frontend/framegraph-components/qframegraph.h
+++ b/src/render/frontend/framegraph-components/qframegraph.h
@@ -72,7 +72,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QFrameGraph)
QFrameGraph(QFrameGraphPrivate &dd, QNode *parent = 0);
- QFrameGraph *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QFrameGraph *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} //Qt3D
diff --git a/src/render/frontend/framegraph-components/qlayerfilter.cpp b/src/render/frontend/framegraph-components/qlayerfilter.cpp
index 0e28760fd..2117980a2 100644
--- a/src/render/frontend/framegraph-components/qlayerfilter.cpp
+++ b/src/render/frontend/framegraph-components/qlayerfilter.cpp
@@ -73,13 +73,16 @@ QLayerFilter::QLayerFilter(QLayerFilterPrivate &dd, QNode *parent)
{
}
-QLayerFilter *QLayerFilter::doClone(QNode *clonedParent) const
+QLayerFilter *QLayerFilter::doClone(bool isClone) const
{
Q_D(const QLayerFilter);
- QLayerFilter *filter = new QLayerFilter(clonedParent);
+ QLayerFilter *filter = new QLayerFilter();
+
+ filter->copy(this);
+ filter->d_func()->m_isClone = isClone;
Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
- filter->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(filter)));
+ filter->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
return filter;
}
diff --git a/src/render/frontend/framegraph-components/qlayerfilter.h b/src/render/frontend/framegraph-components/qlayerfilter.h
index 37e4b6ed7..ed6b74e61 100644
--- a/src/render/frontend/framegraph-components/qlayerfilter.h
+++ b/src/render/frontend/framegraph-components/qlayerfilter.h
@@ -68,7 +68,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QLayerFilter)
QLayerFilter(QLayerFilterPrivate &dd, QNode *parent = 0);
- QLayerFilter *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QLayerFilter *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/framegraph-components/qrenderpassfilter.cpp b/src/render/frontend/framegraph-components/qrenderpassfilter.cpp
index 95243ebeb..14f260e05 100644
--- a/src/render/frontend/framegraph-components/qrenderpassfilter.cpp
+++ b/src/render/frontend/framegraph-components/qrenderpassfilter.cpp
@@ -58,15 +58,18 @@ QRenderPassFilter::QRenderPassFilter(QRenderPassFilterPrivate &dd, QNode *parent
{
}
-QRenderPassFilter *QRenderPassFilter::doClone(QNode *clonedParent) const
+QRenderPassFilter *QRenderPassFilter::doClone(bool isClone) const
{
Q_D(const QRenderPassFilter);
- QRenderPassFilter *clone = new QRenderPassFilter(clonedParent);
+ QRenderPassFilter *clone = new QRenderPassFilter();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
- clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(clone)));
+ clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
Q_FOREACH (QCriterion *c, d->m_criteriaList)
- clone->addCriterion(qobject_cast<QCriterion *>(c->clone(clone)));
+ clone->addCriterion(qobject_cast<QCriterion *>(c->clone(isClone)));
return clone;
}
diff --git a/src/render/frontend/framegraph-components/qrenderpassfilter.h b/src/render/frontend/framegraph-components/qrenderpassfilter.h
index c85c15848..cca5d71cf 100644
--- a/src/render/frontend/framegraph-components/qrenderpassfilter.h
+++ b/src/render/frontend/framegraph-components/qrenderpassfilter.h
@@ -68,7 +68,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QRenderPassFilter)
QRenderPassFilter(QRenderPassFilterPrivate &dd, QNode *parent = 0);
- QRenderPassFilter *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QRenderPassFilter *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/render/frontend/framegraph-components/qrendertargetselector.cpp b/src/render/frontend/framegraph-components/qrendertargetselector.cpp
index ba567a2a8..c3f5a21aa 100644
--- a/src/render/frontend/framegraph-components/qrendertargetselector.cpp
+++ b/src/render/frontend/framegraph-components/qrendertargetselector.cpp
@@ -90,13 +90,16 @@ QRenderTargetSelector::QRenderTargetSelector(QRenderTargetSelectorPrivate &dd, Q
{
}
-QRenderTargetSelector *QRenderTargetSelector::doClone(QNode *clonedParent) const
+QRenderTargetSelector *QRenderTargetSelector::doClone(bool isClone) const
{
Q_D(const QRenderTargetSelector);
- QRenderTargetSelector *clone = new QRenderTargetSelector(clonedParent);
+ QRenderTargetSelector *clone = new QRenderTargetSelector();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
- clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(clone)));
+ clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
if (d->m_target != Q_NULLPTR)
clone->setTarget(qobject_cast<QRenderTarget *>(d->m_target->clone(clone)));
diff --git a/src/render/frontend/framegraph-components/qrendertargetselector.h b/src/render/frontend/framegraph-components/qrendertargetselector.h
index 00fafea50..308e09807 100644
--- a/src/render/frontend/framegraph-components/qrendertargetselector.h
+++ b/src/render/frontend/framegraph-components/qrendertargetselector.h
@@ -69,7 +69,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QRenderTargetSelector)
QRenderTargetSelector(QRenderTargetSelectorPrivate &dd, QNode *parent = 0);
- QRenderTargetSelector *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QRenderTargetSelector *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/framegraph-components/qsortcriterion.cpp b/src/render/frontend/framegraph-components/qsortcriterion.cpp
index d2c6bb28f..f219e5d97 100644
--- a/src/render/frontend/framegraph-components/qsortcriterion.cpp
+++ b/src/render/frontend/framegraph-components/qsortcriterion.cpp
@@ -102,9 +102,12 @@ QSortCriterion::QSortCriterion(QSortCriterionPrivate &dd, QNode *parent)
{
}
-QSortCriterion *QSortCriterion::doClone(QNode *clonedParent) const
+QSortCriterion *QSortCriterion::doClone(bool isClone) const
{
- return new QSortCriterion(clonedParent);
+ QSortCriterion *clone = new QSortCriterion();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/framegraph-components/qsortcriterion.h b/src/render/frontend/framegraph-components/qsortcriterion.h
index fd7987c39..39cac29b7 100644
--- a/src/render/frontend/framegraph-components/qsortcriterion.h
+++ b/src/render/frontend/framegraph-components/qsortcriterion.h
@@ -76,7 +76,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QSortCriterion)
QSortCriterion(QSortCriterionPrivate &dd, QNode *parent = 0);
- QSortCriterion *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QSortCriterion *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
diff --git a/src/render/frontend/framegraph-components/qsortmethod.cpp b/src/render/frontend/framegraph-components/qsortmethod.cpp
index ea21ec374..39671af84 100644
--- a/src/render/frontend/framegraph-components/qsortmethod.cpp
+++ b/src/render/frontend/framegraph-components/qsortmethod.cpp
@@ -63,13 +63,16 @@ QSortMethod::QSortMethod(QSortMethodPrivate &dd, QNode *parent)
{
}
-QSortMethod *QSortMethod::doClone(QNode *clonedParent) const
+QSortMethod *QSortMethod::doClone(bool isClone) const
{
Q_D(const QSortMethod);
- QSortMethod *clone = new QSortMethod(clonedParent);
+ QSortMethod *clone = new QSortMethod();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QSortCriterion *c, d->m_criteria)
- clone->addCriterion(qobject_cast<QSortCriterion *>(c));
+ clone->addCriterion(qobject_cast<QSortCriterion *>(c->clone(isClone)));
return clone;
}
diff --git a/src/render/frontend/framegraph-components/qsortmethod.h b/src/render/frontend/framegraph-components/qsortmethod.h
index 7cebd5e5e..5830aae9b 100644
--- a/src/render/frontend/framegraph-components/qsortmethod.h
+++ b/src/render/frontend/framegraph-components/qsortmethod.h
@@ -65,7 +65,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QSortMethod)
QSortMethod(QSortMethodPrivate &dd, QNode *parent = 0);
- QSortMethod *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QSortMethod *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/framegraph-components/qtechniquefilter.cpp b/src/render/frontend/framegraph-components/qtechniquefilter.cpp
index b7f5dae7a..48ee5daa9 100644
--- a/src/render/frontend/framegraph-components/qtechniquefilter.cpp
+++ b/src/render/frontend/framegraph-components/qtechniquefilter.cpp
@@ -65,15 +65,18 @@ QTechniqueFilter::QTechniqueFilter(QTechniqueFilterPrivate &dd, QNode *parent)
{
}
-QTechniqueFilter *QTechniqueFilter::doClone(QNode *clonedParent) const
+QTechniqueFilter *QTechniqueFilter::doClone(bool isClone) const
{
Q_D(const QTechniqueFilter);
- QTechniqueFilter *clone = new QTechniqueFilter(clonedParent);
+ QTechniqueFilter *clone = new QTechniqueFilter();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
- clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(clone)));
+ clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
Q_FOREACH (QCriterion *crit, d->m_criteriaList)
- clone->addCriterion(qobject_cast<QCriterion *>(crit->clone(clonedParent)));
+ clone->addCriterion(qobject_cast<QCriterion *>(crit->clone(isClone)));
return clone;
}
diff --git a/src/render/frontend/framegraph-components/qtechniquefilter.h b/src/render/frontend/framegraph-components/qtechniquefilter.h
index 96ac04cb8..9d7319709 100644
--- a/src/render/frontend/framegraph-components/qtechniquefilter.h
+++ b/src/render/frontend/framegraph-components/qtechniquefilter.h
@@ -65,7 +65,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QTechniqueFilter)
QTechniqueFilter(QTechniqueFilterPrivate &dd, QNode *parent = 0);
- QTechniqueFilter *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QTechniqueFilter *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/render/frontend/framegraph-components/qviewport.cpp b/src/render/frontend/framegraph-components/qviewport.cpp
index 9a5273817..a2d9bd972 100644
--- a/src/render/frontend/framegraph-components/qviewport.cpp
+++ b/src/render/frontend/framegraph-components/qviewport.cpp
@@ -73,13 +73,16 @@ QViewport::QViewport(QViewportPrivate &dd, QNode *parent)
{
}
-QViewport *QViewport::doClone(QNode *clonedParent) const
+QViewport *QViewport::doClone(bool isClone) const
{
Q_D(const QViewport);
- QViewport *clone = new QViewport(clonedParent);
+ QViewport *clone = new QViewport();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QFrameGraphItem *fgChild, d->m_fgChildren)
- clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(clone)));
+ clone->appendFrameGraphItem(qobject_cast<QFrameGraphItem *>(fgChild->clone(isClone)));
return clone;
}
diff --git a/src/render/frontend/framegraph-components/qviewport.h b/src/render/frontend/framegraph-components/qviewport.h
index d4e327410..c1041f3ca 100644
--- a/src/render/frontend/framegraph-components/qviewport.h
+++ b/src/render/frontend/framegraph-components/qviewport.h
@@ -76,7 +76,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QViewport)
QViewport(QViewportPrivate &dd, QNode *parent = 0);
- QViewport *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QViewport *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qalphatest.cpp b/src/render/frontend/qalphatest.cpp
index c979881ca..b8e02f359 100644
--- a/src/render/frontend/qalphatest.cpp
+++ b/src/render/frontend/qalphatest.cpp
@@ -121,9 +121,12 @@ void QAlphaTest::setClamp(float clamp)
}
}
-QNode *QAlphaTest::doClone(QNode *clonedParent) const
+QNode *QAlphaTest::doClone(bool isClone) const
{
- return new QAlphaTest(clonedParent);
+ QAlphaTest *clone = new QAlphaTest();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qalphatest.h b/src/render/frontend/qalphatest.h
index f630d38da..206893b89 100644
--- a/src/render/frontend/qalphatest.h
+++ b/src/render/frontend/qalphatest.h
@@ -86,7 +86,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QAlphaTest)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qblendequation.cpp b/src/render/frontend/qblendequation.cpp
index 86cc18280..898366d62 100644
--- a/src/render/frontend/qblendequation.cpp
+++ b/src/render/frontend/qblendequation.cpp
@@ -96,9 +96,12 @@ void QBlendEquation::setMode(QBlendEquation::BlendMode mode)
}
}
-QNode *QBlendEquation::doClone(QNode *clonedParent) const
+QNode *QBlendEquation::doClone(bool isClone) const
{
- return new QBlendEquation(clonedParent);
+ QBlendEquation *clone = new QBlendEquation();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qblendequation.h b/src/render/frontend/qblendequation.h
index dd3eaff93..c73d351c7 100644
--- a/src/render/frontend/qblendequation.h
+++ b/src/render/frontend/qblendequation.h
@@ -79,7 +79,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QBlendEquation)
- QNode *doClone(QNode *clonedParent) const;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qblendstate.cpp b/src/render/frontend/qblendstate.cpp
index bc6e76d2e..a69397d54 100644
--- a/src/render/frontend/qblendstate.cpp
+++ b/src/render/frontend/qblendstate.cpp
@@ -170,9 +170,12 @@ void QBlendState::setDstAlpha(QBlendState::Blending dstAlpha)
}
}
-QNode *QBlendState::doClone(QNode *clonedParent) const
+QNode *QBlendState::doClone(bool isClone) const
{
- return new QBlendState(clonedParent);
+ QBlendState *clone = new QBlendState();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qblendstate.h b/src/render/frontend/qblendstate.h
index 232316572..1920f557f 100644
--- a/src/render/frontend/qblendstate.h
+++ b/src/render/frontend/qblendstate.h
@@ -109,7 +109,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QBlendState)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qcriterion.cpp b/src/render/frontend/qcriterion.cpp
index 16a5e2b1c..97f814877 100644
--- a/src/render/frontend/qcriterion.cpp
+++ b/src/render/frontend/qcriterion.cpp
@@ -76,9 +76,12 @@ void QCriterion::copy(const QNode *ref)
}
}
-QCriterion *QCriterion::doClone(QNode *clonedParent) const
+QCriterion *QCriterion::doClone(bool isClone) const
{
- return new QCriterion(clonedParent);
+ QCriterion *clone = new QCriterion();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QCriterion::setValue(const QVariant &value)
diff --git a/src/render/frontend/qcriterion.h b/src/render/frontend/qcriterion.h
index 6a14623a3..a6a57e321 100644
--- a/src/render/frontend/qcriterion.h
+++ b/src/render/frontend/qcriterion.h
@@ -74,7 +74,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QCriterion)
- QCriterion *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QCriterion *doClone(bool isClone) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qcuboidmesh.cpp b/src/render/frontend/qcuboidmesh.cpp
index fca789e41..28ba881ee 100644
--- a/src/render/frontend/qcuboidmesh.cpp
+++ b/src/render/frontend/qcuboidmesh.cpp
@@ -89,9 +89,12 @@ QCuboidMesh::QCuboidMesh(QCuboidMeshPrivate &dd, QNode *parent)
setDirty(true);
}
-QCuboidMesh *QCuboidMesh::doClone(QNode *clonedParent) const
+QCuboidMesh *QCuboidMesh::doClone(bool isClone) const
{
- return new QCuboidMesh(clonedParent);
+ QCuboidMesh *clone = new QCuboidMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QCuboidMesh::setXExtent(float xExtent)
diff --git a/src/render/frontend/qcuboidmesh.h b/src/render/frontend/qcuboidmesh.h
index 331615374..f8069bddd 100644
--- a/src/render/frontend/qcuboidmesh.h
+++ b/src/render/frontend/qcuboidmesh.h
@@ -98,7 +98,7 @@ Q_SIGNALS:
protected:
QCuboidMesh(QCuboidMeshPrivate &dd, QNode *parent = 0);
- QCuboidMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QCuboidMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
Q_DECLARE_PRIVATE(QCuboidMesh)
};
diff --git a/src/render/frontend/qcullface.cpp b/src/render/frontend/qcullface.cpp
index a4fee6efa..02ccb4935 100644
--- a/src/render/frontend/qcullface.cpp
+++ b/src/render/frontend/qcullface.cpp
@@ -97,9 +97,12 @@ void QCullFace::setMode(QCullFace::CullingMode mode)
}
}
-QNode *QCullFace::doClone(QNode *clonedParent) const
+QNode *QCullFace::doClone(bool isClone) const
{
- return new QCullFace(clonedParent);
+ QCullFace *clone = new QCullFace();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qcullface.h b/src/render/frontend/qcullface.h
index 2d94bdcf9..c8671fafb 100644
--- a/src/render/frontend/qcullface.h
+++ b/src/render/frontend/qcullface.h
@@ -79,7 +79,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QCullFace)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qcylindermesh.cpp b/src/render/frontend/qcylindermesh.cpp
index e01c6b441..d354cee3e 100644
--- a/src/render/frontend/qcylindermesh.cpp
+++ b/src/render/frontend/qcylindermesh.cpp
@@ -334,9 +334,9 @@ QAbstractMeshFunctorPtr QCylinderMesh::meshFunctor() const
return QAbstractMeshFunctorPtr(new CylinderMeshFunctor(d->m_rings, d->m_slices, d->m_radius, d->m_length));
}
-QCylinderMesh *QCylinderMesh::doClone(QNode *clonedParent) const
+QCylinderMesh *QCylinderMesh::doClone(bool isClone) const
{
- return new QCylinderMesh(clonedParent);
+ return new QCylinderMesh();
}
CylinderMeshFunctor::CylinderMeshFunctor(int rings, int slices, float radius, float length)
diff --git a/src/render/frontend/qcylindermesh.h b/src/render/frontend/qcylindermesh.h
index dd6ff05f5..584803504 100644
--- a/src/render/frontend/qcylindermesh.h
+++ b/src/render/frontend/qcylindermesh.h
@@ -84,7 +84,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QCylinderMesh)
- QCylinderMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QCylinderMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qdepthmask.cpp b/src/render/frontend/qdepthmask.cpp
index 12cc12c88..923a10b9f 100644
--- a/src/render/frontend/qdepthmask.cpp
+++ b/src/render/frontend/qdepthmask.cpp
@@ -97,9 +97,12 @@ void QDepthMask::setMask(bool mask)
}
}
-QNode *QDepthMask::doClone(QNode *clonedParent) const
+QNode *QDepthMask::doClone(bool isClone) const
{
- return new QDepthMask(clonedParent);
+ QDepthMask *clone = new QDepthMask();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qdepthmask.h b/src/render/frontend/qdepthmask.h
index c1a955968..34ea52a99 100644
--- a/src/render/frontend/qdepthmask.h
+++ b/src/render/frontend/qdepthmask.h
@@ -68,7 +68,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QDepthMask)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qdepthtest.cpp b/src/render/frontend/qdepthtest.cpp
index 99e7eb120..bfebb14b0 100644
--- a/src/render/frontend/qdepthtest.cpp
+++ b/src/render/frontend/qdepthtest.cpp
@@ -97,9 +97,12 @@ void QDepthTest::setFunc(QDepthTest::DepthFunc func)
}
}
-QNode *QDepthTest::doClone(QNode *clonedParent) const
+QNode *QDepthTest::doClone(bool isClone) const
{
- return new QDepthTest(clonedParent);
+ QDepthTest *clone = new QDepthTest();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qdepthtest.h b/src/render/frontend/qdepthtest.h
index 5a9c6cc02..7fa9785aa 100644
--- a/src/render/frontend/qdepthtest.h
+++ b/src/render/frontend/qdepthtest.h
@@ -81,7 +81,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QDepthTest)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qdirectionallight.cpp b/src/render/frontend/qdirectionallight.cpp
index 9ff22a83b..346bb3e07 100644
--- a/src/render/frontend/qdirectionallight.cpp
+++ b/src/render/frontend/qdirectionallight.cpp
@@ -91,9 +91,12 @@ QDirectionalLight::QDirectionalLight(QDirectionalLightPrivate &dd, QNode *parent
{
}
-QDirectionalLight *QDirectionalLight::doClone(QNode *clonedParent) const
+QDirectionalLight *QDirectionalLight::doClone(bool isClone) const
{
- return new QDirectionalLight(clonedParent);
+ QDirectionalLight *clone = new QDirectionalLight();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QDirectionalLight::setDirection(const QVector3D &direction)
diff --git a/src/render/frontend/qdirectionallight.h b/src/render/frontend/qdirectionallight.h
index aaeaa5925..fd3e0db4b 100644
--- a/src/render/frontend/qdirectionallight.h
+++ b/src/render/frontend/qdirectionallight.h
@@ -73,7 +73,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QDirectionalLight)
QDirectionalLight(QDirectionalLightPrivate &dd, QNode *parent = 0);
- QDirectionalLight *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QDirectionalLight *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qdithering.cpp b/src/render/frontend/qdithering.cpp
index 3b0bcc341..17f211cfc 100644
--- a/src/render/frontend/qdithering.cpp
+++ b/src/render/frontend/qdithering.cpp
@@ -63,9 +63,12 @@ QDithering::QDithering(QNode *parent)
{
}
-QNode *QDithering::doClone(QNode *clonedParent) const
+QNode *QDithering::doClone(bool isClone) const
{
- return new QDithering(clonedParent);
+ QDithering *clone = new QDithering();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qdithering.h b/src/render/frontend/qdithering.h
index 82d7d62c9..b9ec18c83 100644
--- a/src/render/frontend/qdithering.h
+++ b/src/render/frontend/qdithering.h
@@ -59,7 +59,7 @@ public:
private:
Q_DECLARE_PRIVATE(QDithering)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qeffect.cpp b/src/render/frontend/qeffect.cpp
index e92c8185e..ad2fe21dd 100644
--- a/src/render/frontend/qeffect.cpp
+++ b/src/render/frontend/qeffect.cpp
@@ -69,16 +69,19 @@ QEffect::QEffect(QEffectPrivate &dd, QNode *parent)
{
}
-QEffect *QEffect::doClone(QNode *clonedParent) const
+QEffect *QEffect::doClone(bool isClone) const
{
Q_D(const QEffect);
- QEffect *effect = new QEffect(clonedParent);
+ QEffect *effect = new QEffect();
+
+ effect->copy(this);
+ effect->d_func()->m_isClone = isClone;
Q_FOREACH (QParameter *p, d->m_parameters)
- effect->addParameter(qobject_cast<QParameter *>(p->clone(effect)));
+ effect->addParameter(qobject_cast<QParameter *>(p->clone(isClone)));
Q_FOREACH (QAbstractTechnique *t, d->m_techniques)
- effect->addTechnique(qobject_cast<QAbstractTechnique *>(t->clone(effect)));
+ effect->addTechnique(qobject_cast<QAbstractTechnique *>(t->clone(isClone)));
return effect;
}
diff --git a/src/render/frontend/qeffect.h b/src/render/frontend/qeffect.h
index 163e1a8c5..01285eabf 100644
--- a/src/render/frontend/qeffect.h
+++ b/src/render/frontend/qeffect.h
@@ -69,7 +69,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QEffect)
QEffect(QEffectPrivate &dd, QNode *parent = 0);
- QEffect *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QEffect *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qfrontface.cpp b/src/render/frontend/qfrontface.cpp
index e4c830c18..bd82b7874 100644
--- a/src/render/frontend/qfrontface.cpp
+++ b/src/render/frontend/qfrontface.cpp
@@ -97,9 +97,12 @@ void QFrontFace::setDirection(QFrontFace::FaceDir direction)
}
}
-QNode *QFrontFace::doClone(QNode *clonedParent) const
+QNode *QFrontFace::doClone(bool isClone) const
{
- return new QFrontFace(clonedParent);
+ QFrontFace *clone = new QFrontFace();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qfrontface.h b/src/render/frontend/qfrontface.h
index 7ca54644a..6e63fd97f 100644
--- a/src/render/frontend/qfrontface.h
+++ b/src/render/frontend/qfrontface.h
@@ -76,7 +76,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QFrontFace)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qlayer.cpp b/src/render/frontend/qlayer.cpp
index ca1dbe91b..215fd4689 100644
--- a/src/render/frontend/qlayer.cpp
+++ b/src/render/frontend/qlayer.cpp
@@ -71,9 +71,12 @@ QLayer::QLayer(QLayerPrivate &dd, QNode *parent)
{
}
-QLayer *QLayer::doClone(QNode *clonedParent) const
+QLayer *QLayer::doClone(bool isClone) const
{
- return new QLayer(clonedParent);
+ QLayer *clone = new QLayer();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QString QLayer::name() const
diff --git a/src/render/frontend/qlayer.h b/src/render/frontend/qlayer.h
index fd08fdbd2..3e996afc7 100644
--- a/src/render/frontend/qlayer.h
+++ b/src/render/frontend/qlayer.h
@@ -69,7 +69,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QLayer)
QLayer(QLayerPrivate &dd, QNode *parent = 0);
- QLayer *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QLayer *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qmaterial.cpp b/src/render/frontend/qmaterial.cpp
index b0ab9cdae..ba1102052 100644
--- a/src/render/frontend/qmaterial.cpp
+++ b/src/render/frontend/qmaterial.cpp
@@ -61,16 +61,19 @@ QMaterial::QMaterial(QMaterialPrivate &dd, QNode *parent)
{
}
-QMaterial *QMaterial::doClone(QNode *clonedParent) const
+QMaterial *QMaterial::doClone(bool isClone) const
{
Q_D(const QMaterial);
- QMaterial *mat = new QMaterial(clonedParent);
+ QMaterial *mat = new QMaterial();
+
+ mat->copy(this);
+ mat->d_func()->m_isClone = isClone;
Q_FOREACH (QParameter *p, d->m_parameters)
- mat->clone(qobject_cast<QParameter *>(p->clone(mat)));
+ mat->addParameter(qobject_cast<QParameter *>(p->clone(isClone)));
if (d->m_effect != Q_NULLPTR)
- mat->setEffect(qobject_cast<QAbstractEffect *>(d->m_effect->clone(mat)));
+ mat->setEffect(qobject_cast<QAbstractEffect *>(d->m_effect->clone(isClone)));
return mat;
}
diff --git a/src/render/frontend/qmaterial.h b/src/render/frontend/qmaterial.h
index bbf4d4890..faf6e828e 100644
--- a/src/render/frontend/qmaterial.h
+++ b/src/render/frontend/qmaterial.h
@@ -82,7 +82,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QMaterial)
QMaterial(QMaterialPrivate &dd, QNode *parent = 0);
- QMaterial *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QMaterial *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
}
diff --git a/src/render/frontend/qmesh.cpp b/src/render/frontend/qmesh.cpp
index 89bbe1d0d..ccd77a61d 100644
--- a/src/render/frontend/qmesh.cpp
+++ b/src/render/frontend/qmesh.cpp
@@ -91,9 +91,12 @@ QMesh::QMesh(QMeshPrivate &dd, QNode *parent)
{
}
-QMesh *QMesh::doClone(QNode *clonedParent) const
+QMesh *QMesh::doClone(bool isClone) const
{
- return new QMesh(clonedParent);
+ QMesh *clone = new QMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QMesh::setSource( const QString& source )
diff --git a/src/render/frontend/qmesh.h b/src/render/frontend/qmesh.h
index f00b8b215..5544098fc 100644
--- a/src/render/frontend/qmesh.h
+++ b/src/render/frontend/qmesh.h
@@ -79,7 +79,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QMesh)
QMesh(QMeshPrivate &dd, QNode *parent = 0);
- QMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
}
diff --git a/src/render/frontend/qparameter.cpp b/src/render/frontend/qparameter.cpp
index c771202a4..415c76aa8 100644
--- a/src/render/frontend/qparameter.cpp
+++ b/src/render/frontend/qparameter.cpp
@@ -62,9 +62,12 @@ QParameter::QParameter(QParameterPrivate &dd, QNode *parent)
{
}
-QParameter *QParameter::doClone(QNode *clonedParent) const
+QParameter *QParameter::doClone(bool isClone) const
{
- return new QParameter(clonedParent);
+ QParameter *clone = new QParameter();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QParameter::QParameter(QNode *parent)
diff --git a/src/render/frontend/qparameter.h b/src/render/frontend/qparameter.h
index b60f53488..6aad668f7 100644
--- a/src/render/frontend/qparameter.h
+++ b/src/render/frontend/qparameter.h
@@ -119,7 +119,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QParameter)
QParameter(QParameterPrivate &dd, QNode *parent = 0);
- QParameter *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QParameter *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qparametermapper.cpp b/src/render/frontend/qparametermapper.cpp
index 975b14315..209078254 100644
--- a/src/render/frontend/qparametermapper.cpp
+++ b/src/render/frontend/qparametermapper.cpp
@@ -62,9 +62,12 @@ QParameterMapper::QParameterMapper(QParameterMapperPrivate &dd, QNode *parent)
{
}
-QNode *QParameterMapper::doClone(QNode *clonedParent) const
+QNode *QParameterMapper::doClone(bool isClone) const
{
- return new QParameterMapper(clonedParent);
+ QParameterMapper *clone = new QParameterMapper();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QParameterMapper::QParameterMapper(const QString &parameterName, const QString &shaderParameterName, QParameterMapper::Binding bindingType, QNode *parent)
diff --git a/src/render/frontend/qparametermapper.h b/src/render/frontend/qparametermapper.h
index 72eeff30a..cae9a24f5 100644
--- a/src/render/frontend/qparametermapper.h
+++ b/src/render/frontend/qparametermapper.h
@@ -87,7 +87,7 @@ Q_SIGNALS:
protected:
QParameterMapper(QParameterMapperPrivate &dd, QNode *parent = 0);
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
Q_DECLARE_PRIVATE(QParameterMapper)
};
diff --git a/src/render/frontend/qplanemesh.cpp b/src/render/frontend/qplanemesh.cpp
index b75b7668f..ee1e86e60 100644
--- a/src/render/frontend/qplanemesh.cpp
+++ b/src/render/frontend/qplanemesh.cpp
@@ -84,9 +84,12 @@ QPlaneMesh::QPlaneMesh(QPlaneMeshPrivate &dd, QNode *parent)
}
-QPlaneMesh *QPlaneMesh::doClone(QNode *clonedParent) const
+QPlaneMesh *QPlaneMesh::doClone(bool isClone) const
{
- return new QPlaneMesh(clonedParent);
+ QPlaneMesh *clone = new QPlaneMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QPlaneMesh::setWidth(float width)
diff --git a/src/render/frontend/qplanemesh.h b/src/render/frontend/qplanemesh.h
index 8f7c145e1..c2f9dca7b 100644
--- a/src/render/frontend/qplanemesh.h
+++ b/src/render/frontend/qplanemesh.h
@@ -82,7 +82,7 @@ Q_SIGNALS:
protected:
QPlaneMesh(QPlaneMeshPrivate &dd, QNode *parent = 0);
- QPlaneMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QPlaneMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
Q_DECLARE_PRIVATE(QPlaneMesh)
};
diff --git a/src/render/frontend/qpointlight.cpp b/src/render/frontend/qpointlight.cpp
index e0cd13fb5..a9db0381a 100644
--- a/src/render/frontend/qpointlight.cpp
+++ b/src/render/frontend/qpointlight.cpp
@@ -84,9 +84,12 @@ QPointLight::QPointLight(QPointLightPrivate &dd, QNode *parent)
{
}
-QPointLight *QPointLight::doClone(QNode *clonedParent) const
+QPointLight *QPointLight::doClone(bool isClone) const
{
- return new QPointLight(clonedParent);
+ QPointLight *clone = new QPointLight();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qpointlight.h b/src/render/frontend/qpointlight.h
index 9a55e1dca..12ab4d51c 100644
--- a/src/render/frontend/qpointlight.h
+++ b/src/render/frontend/qpointlight.h
@@ -63,7 +63,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QPointLight)
QPointLight(QPointLightPrivate &dd, QNode *parent);
- QPointLight *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QPointLight *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qrenderattachment.cpp b/src/render/frontend/qrenderattachment.cpp
index 4cb493239..44828ca2d 100644
--- a/src/render/frontend/qrenderattachment.cpp
+++ b/src/render/frontend/qrenderattachment.cpp
@@ -210,9 +210,12 @@ QString QRenderAttachment::name() const
return d->m_name;
}
-QNode *QRenderAttachment::doClone(QNode *clonedParent) const
+QNode *QRenderAttachment::doClone(bool isClone) const
{
- return new QRenderAttachment(clonedParent);
+ QRenderAttachment *clone = new QRenderAttachment();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qrenderattachment.h b/src/render/frontend/qrenderattachment.h
index bb2985cd7..03cab0ef6 100644
--- a/src/render/frontend/qrenderattachment.h
+++ b/src/render/frontend/qrenderattachment.h
@@ -128,7 +128,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QRenderAttachment)
QRenderAttachment(QRenderAttachmentPrivate &dd, QNode *parent = 0);
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qrenderpass.cpp b/src/render/frontend/qrenderpass.cpp
index fd7168f84..8c805992c 100644
--- a/src/render/frontend/qrenderpass.cpp
+++ b/src/render/frontend/qrenderpass.cpp
@@ -67,18 +67,21 @@ QRenderPass::QRenderPass(QRenderPassPrivate &dd, QNode *parent)
{
}
-QRenderPass *QRenderPass::doClone(QNode *clonedParent) const
+QRenderPass *QRenderPass::doClone(bool isClone) const
{
Q_D(const QRenderPass);
- QRenderPass *pass = new QRenderPass(clonedParent);
+ QRenderPass *pass = new QRenderPass();
+
+ pass->copy(this);
+ pass->d_func()->m_isClone = isClone;
Q_FOREACH (QCriterion *crit, d->m_criteriaList)
- pass->addCriterion(qobject_cast<QCriterion *>(crit->clone(pass)));
+ pass->addCriterion(qobject_cast<QCriterion *>(crit->clone(isClone)));
Q_FOREACH (QParameterMapper *binding, d->m_bindings)
- pass->addBinding(qobject_cast<QParameterMapper *>(binding->clone(pass)));
+ pass->addBinding(qobject_cast<QParameterMapper *>(binding->clone(isClone)));
Q_FOREACH (QRenderState *renderState, d->m_renderStates)
- pass->addRenderState(qobject_cast<QRenderState *>(renderState->clone(pass)));
- pass->d_func()->m_shader = qobject_cast<QShaderProgram *>(d->m_shader->clone(pass));
+ pass->addRenderState(qobject_cast<QRenderState *>(renderState->clone(isClone)));
+ pass->d_func()->m_shader = qobject_cast<QShaderProgram *>(d->m_shader->clone(isClone));
return pass;
}
diff --git a/src/render/frontend/qrenderpass.h b/src/render/frontend/qrenderpass.h
index 593787a63..896aafb20 100644
--- a/src/render/frontend/qrenderpass.h
+++ b/src/render/frontend/qrenderpass.h
@@ -96,7 +96,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QRenderPass)
QRenderPass(QRenderPassPrivate &dd, QNode *parent = 0);
- QRenderPass *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QRenderPass *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
}
diff --git a/src/render/frontend/qrendertarget.cpp b/src/render/frontend/qrendertarget.cpp
index ac3e2e756..a211743e2 100644
--- a/src/render/frontend/qrendertarget.cpp
+++ b/src/render/frontend/qrendertarget.cpp
@@ -105,13 +105,16 @@ QList<QRenderAttachment *> QRenderTarget::attachments() const
return d->m_attachments;
}
-QRenderTarget *QRenderTarget::doClone(QNode *clonedParent) const
+QRenderTarget *QRenderTarget::doClone(bool isClone) const
{
Q_D(const QRenderTarget);
- QRenderTarget *clone = new QRenderTarget(clonedParent);
+ QRenderTarget *clone = new QRenderTarget();
+
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
Q_FOREACH (QRenderAttachment *attachment, d->m_attachments)
- clone->addAttachment(qobject_cast<QRenderAttachment *>(attachment->clone()));
+ clone->addAttachment(qobject_cast<QRenderAttachment *>(attachment->clone(isClone)));
return clone;
}
diff --git a/src/render/frontend/qrendertarget.h b/src/render/frontend/qrendertarget.h
index 1502d862c..766f5eedb 100644
--- a/src/render/frontend/qrendertarget.h
+++ b/src/render/frontend/qrendertarget.h
@@ -67,7 +67,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QRenderTarget)
QRenderTarget(QRenderTargetPrivate &dd, QNode *parent = 0);
- QRenderTarget *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QRenderTarget *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qsceneloader.cpp b/src/render/frontend/qsceneloader.cpp
index 2d938fdb5..ecc2c397f 100644
--- a/src/render/frontend/qsceneloader.cpp
+++ b/src/render/frontend/qsceneloader.cpp
@@ -71,9 +71,13 @@ void QSceneLoader::sceneChangeEvent(const QSceneChangePtr &change)
Q_FOREACH (const QUuid &id, entities) {
QEntity *parentEntity = qobject_cast<QEntity *>(d->m_scene->lookupNode(id));
if (parentEntity != Q_NULLPTR) {
- QEntity *cloneScene = qobject_cast<QEntity *>(scene->clone(Q_NULLPTR, false));
+ scene->dumpObjectTree();
+
+ qDebug() << "BUILDING SUBTREE DEEP CLONE";
+ QEntity *cloneScene = qobject_cast<QEntity *>(scene->clone(false));
+ cloneScene->dumpObjectTree();
// TO DO : Make that work
-// qDebug() << QThread::currentThread() << parentEntity->thread() << scene->thread() << cloneScene->thread();
+ qDebug() << "<<<<<<<<<<<<<<<<< " << QThread::currentThread() << parentEntity->thread() << scene->thread() << cloneScene->thread();
// parentEntity->addChild(cloneScene);
}
}
@@ -85,9 +89,12 @@ void QSceneLoader::sceneChangeEvent(const QSceneChangePtr &change)
}
}
-QNode *QSceneLoader::doClone(QNode *clonedParent) const
+QNode *QSceneLoader::doClone(bool isClone) const
{
- return new QSceneLoader(clonedParent);
+ QSceneLoader *clone = new QSceneLoader();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qsceneloader.h b/src/render/frontend/qsceneloader.h
index f0d8d2d06..9dae1c359 100644
--- a/src/render/frontend/qsceneloader.h
+++ b/src/render/frontend/qsceneloader.h
@@ -56,7 +56,7 @@ public:
void sceneChangeEvent(const QSceneChangePtr &change) Q_DECL_OVERRIDE;
protected:
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qscissortest.cpp b/src/render/frontend/qscissortest.cpp
index cd9378915..89d07e33b 100644
--- a/src/render/frontend/qscissortest.cpp
+++ b/src/render/frontend/qscissortest.cpp
@@ -170,9 +170,12 @@ void QScissorTest::setHeight(int height)
}
}
-QNode *QScissorTest::doClone(QNode *clonedParent) const
+QNode *QScissorTest::doClone(bool isClone) const
{
- return new QScissorTest(clonedParent);
+ QScissorTest *clone = new QScissorTest();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qscissortest.h b/src/render/frontend/qscissortest.h
index 6d4849260..b22e79aba 100644
--- a/src/render/frontend/qscissortest.h
+++ b/src/render/frontend/qscissortest.h
@@ -84,7 +84,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QScissorTest)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qshaderprogram.cpp b/src/render/frontend/qshaderprogram.cpp
index e9d4c5c5b..4c39b64aa 100644
--- a/src/render/frontend/qshaderprogram.cpp
+++ b/src/render/frontend/qshaderprogram.cpp
@@ -86,9 +86,12 @@ QShaderProgram::QShaderProgram(QShaderProgramPrivate &dd, QNode *parent)
{
}
-QShaderProgram *QShaderProgram::doClone(QNode *clonedParent) const
+QShaderProgram *QShaderProgram::doClone(bool isClone) const
{
- return new QShaderProgram(clonedParent);
+ QShaderProgram *clone = new QShaderProgram();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
void QShaderProgram::setVertexShaderSourceFile(const QString& vertexShaderSourceFile)
diff --git a/src/render/frontend/qshaderprogram.h b/src/render/frontend/qshaderprogram.h
index 350e25f18..26bbbb605 100644
--- a/src/render/frontend/qshaderprogram.h
+++ b/src/render/frontend/qshaderprogram.h
@@ -146,7 +146,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QShaderProgram)
QShaderProgram(QShaderProgramPrivate &dd, QNode *parent = 0);
- QShaderProgram *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QShaderProgram *doClone(bool isClone) const Q_DECL_OVERRIDE;
};
}
diff --git a/src/render/frontend/qspheremesh.cpp b/src/render/frontend/qspheremesh.cpp
index a88edb7e9..36cb1f28f 100644
--- a/src/render/frontend/qspheremesh.cpp
+++ b/src/render/frontend/qspheremesh.cpp
@@ -158,9 +158,12 @@ QAbstractMeshFunctorPtr QSphereMesh::meshFunctor() const
return QAbstractMeshFunctorPtr(new SphereMeshFunctor(d->m_rings, d->m_slices, d->m_radius, d->m_generateTangents));
}
-QSphereMesh *QSphereMesh::doClone(QNode *clonedParent) const
+QSphereMesh *QSphereMesh::doClone(bool isClone) const
{
- return new QSphereMesh(clonedParent);
+ QSphereMesh *clone = new QSphereMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
int QSphereMesh::rings() const
diff --git a/src/render/frontend/qspheremesh.h b/src/render/frontend/qspheremesh.h
index f432aaa19..e7b4dd73a 100644
--- a/src/render/frontend/qspheremesh.h
+++ b/src/render/frontend/qspheremesh.h
@@ -86,7 +86,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QSphereMesh)
- QSphereMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QSphereMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qspotlight.cpp b/src/render/frontend/qspotlight.cpp
index a7f5bc264..dbe572747 100644
--- a/src/render/frontend/qspotlight.cpp
+++ b/src/render/frontend/qspotlight.cpp
@@ -95,9 +95,12 @@ QSpotLight::QSpotLight(QSpotLightPrivate &dd, QNode *parent)
{
}
-QSpotLight *QSpotLight::doClone(QNode *clonedParent) const
+QSpotLight *QSpotLight::doClone(bool isClone) const
{
- return new QSpotLight(clonedParent);
+ QSpotLight *clone = new QSpotLight();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QVector3D QSpotLight::direction() const
diff --git a/src/render/frontend/qspotlight.h b/src/render/frontend/qspotlight.h
index 5af974460..2449ab8df 100644
--- a/src/render/frontend/qspotlight.h
+++ b/src/render/frontend/qspotlight.h
@@ -78,7 +78,7 @@ Q_SIGNALS:
protected:
Q_DECLARE_PRIVATE(QSpotLight)
QSpotLight(QSpotLightPrivate &dd, QNode *parent = 0);
- QSpotLight *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QSpotLight *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qstenciltest.cpp b/src/render/frontend/qstenciltest.cpp
index bad509c27..2b5c2ab38 100644
--- a/src/render/frontend/qstenciltest.cpp
+++ b/src/render/frontend/qstenciltest.cpp
@@ -146,9 +146,12 @@ void QStencilTest::setFunc(QStencilTest::StencilFunc func)
}
}
-QNode *QStencilTest::doClone(QNode *clonedParent) const
+QNode *QStencilTest::doClone(bool isClone) const
{
- return new QStencilTest(clonedParent);
+ QStencilTest *clone = new QStencilTest();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
} // Qt3D
diff --git a/src/render/frontend/qstenciltest.h b/src/render/frontend/qstenciltest.h
index 14c7be8cb..5e423f396 100644
--- a/src/render/frontend/qstenciltest.h
+++ b/src/render/frontend/qstenciltest.h
@@ -100,7 +100,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QStencilTest)
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/qtechnique.cpp b/src/render/frontend/qtechnique.cpp
index d18c24b23..53f460d02 100644
--- a/src/render/frontend/qtechnique.cpp
+++ b/src/render/frontend/qtechnique.cpp
@@ -85,17 +85,20 @@ QTechnique::QTechnique(QTechniquePrivate &dd, QNode *parent)
QObject::connect(d->m_openGLFilter, SIGNAL(openGLFilterChanged()), this, SLOT(openGLFilterChanged()));
}
-QTechnique *QTechnique::doClone(QNode *clonedParent) const
+QTechnique *QTechnique::doClone(bool isClone) const
{
Q_D(const QTechnique);
- QTechnique *technique = new QTechnique(clonedParent);
+ QTechnique *technique = new QTechnique();
+
+ technique->copy(this);
+ technique->d_func()->m_isClone = isClone;
Q_FOREACH (QCriterion *criterion, d->m_criteriaList)
- technique->addCriterion(qobject_cast<QCriterion *>(criterion->clone(technique)));
+ technique->addCriterion(qobject_cast<QCriterion *>(criterion->clone(isClone)));
Q_FOREACH (QAbstractRenderPass *pass, d->m_renderPasses)
- technique->addPass(qobject_cast<QAbstractRenderPass *>(pass->clone(technique)));
+ technique->addPass(qobject_cast<QAbstractRenderPass *>(pass->clone(isClone)));
Q_FOREACH (QParameter *p, d->m_parameters)
- technique->addParameter(qobject_cast<QParameter *>(p->clone(technique)));
+ technique->addParameter(qobject_cast<QParameter *>(p->clone(isClone)));
return technique;
}
diff --git a/src/render/frontend/qtechnique.h b/src/render/frontend/qtechnique.h
index 339598513..eb0a7a557 100644
--- a/src/render/frontend/qtechnique.h
+++ b/src/render/frontend/qtechnique.h
@@ -85,7 +85,7 @@ public:
protected:
Q_DECLARE_PRIVATE(QTechnique)
QTechnique(QTechniquePrivate &dd, QNode *parent = 0);
- QTechnique *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QTechnique *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
protected Q_SLOTS:
void openGLFilterChanged();
diff --git a/src/render/frontend/qtexture.cpp b/src/render/frontend/qtexture.cpp
index fae5478b5..5e44465be 100644
--- a/src/render/frontend/qtexture.cpp
+++ b/src/render/frontend/qtexture.cpp
@@ -235,10 +235,13 @@ void QTexture::setStatus(Status status)
}
}
-QNode *QTexture::doClone(QNode *clonedParent) const
+QNode *QTexture::doClone(bool isClone) const
{
// TO DO: Copy TexImageDataPtr
- return new QTexture(clonedParent);
+ QTexture *clone = new QTexture();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
QTexture::Status QTexture::status() const
diff --git a/src/render/frontend/qtexture.h b/src/render/frontend/qtexture.h
index f2a58363e..6138716b2 100644
--- a/src/render/frontend/qtexture.h
+++ b/src/render/frontend/qtexture.h
@@ -291,7 +291,7 @@ protected:
Q_DECLARE_PRIVATE(QTexture)
QTexture(QTexturePrivate &dd, QNode *parent = 0);
void setStatus(Status status);
- QNode *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // namespace Qt3D
diff --git a/src/render/frontend/qtorusmesh.cpp b/src/render/frontend/qtorusmesh.cpp
index 29b0f1c72..7e5fbf539 100644
--- a/src/render/frontend/qtorusmesh.cpp
+++ b/src/render/frontend/qtorusmesh.cpp
@@ -267,9 +267,12 @@ QAbstractMeshFunctorPtr QTorusMesh::meshFunctor() const
return QAbstractMeshFunctorPtr(new TorusMeshFunctor(d->m_rings, d->m_slices, d->m_radius, d->m_minorRadius));
}
-QTorusMesh *QTorusMesh::doClone(QNode *clonedParent) const
+QTorusMesh *QTorusMesh::doClone(bool isClone) const
{
- return new QTorusMesh(clonedParent);
+ QTorusMesh *clone = new QTorusMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
TorusMeshFunctor::TorusMeshFunctor(int rings, int slices, float radius, float minorRadius)
diff --git a/src/render/frontend/qtorusmesh.h b/src/render/frontend/qtorusmesh.h
index 55e0a4c72..322486cd8 100644
--- a/src/render/frontend/qtorusmesh.h
+++ b/src/render/frontend/qtorusmesh.h
@@ -85,7 +85,7 @@ Q_SIGNALS:
private:
Q_DECLARE_PRIVATE(QTorusMesh)
- QTorusMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ QTorusMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
} // Qt3D
diff --git a/src/render/frontend/tag.h b/src/render/frontend/tag.h
index 853ba56c3..7b91989c6 100644
--- a/src/render/frontend/tag.h
+++ b/src/render/frontend/tag.h
@@ -102,7 +102,14 @@ Q_SIGNALS:
private:
QString m_name;
QVariant m_value;
- Tag *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE { return new Tag(clonedParent); }
+ Tag *doClone(bool isClone) const Q_DECL_OVERRIDE
+ {
+ Tag *clone = new Tag();
+ clone->copy(this);
+ // TO DO : See if we keep this class
+// clone->d_func()->m_isClone = isClone;
+ return clone;
+ }
};
} // namespace Qt3D
diff --git a/src/render/io/gltfparser.cpp b/src/render/io/gltfparser.cpp
index dee13b261..571f07354 100644
--- a/src/render/io/gltfparser.cpp
+++ b/src/render/io/gltfparser.cpp
@@ -73,6 +73,7 @@
// need to move these to somewhere common?
#include <Qt3DRenderer/private/renderstate_p.h>
#include <Qt3DRenderer/private/blendstate_p.h>
+#include <Qt3DCore/private/qabstractmesh_p.h>
QT_BEGIN_NAMESPACE
@@ -227,7 +228,7 @@ public:
private:
QMeshDataPtr m_meshData;
- GLTFParserMesh *doClone(QNode *clonedParent) const Q_DECL_OVERRIDE;
+ GLTFParserMesh *doClone(bool isClone = true) const Q_DECL_OVERRIDE;
};
GLTFParser::GLTFParser() : AbstractSceneParser(),
@@ -1014,9 +1015,12 @@ QAbstractMeshFunctorPtr GLTFParserMesh::meshFunctor() const
return QAbstractMeshFunctorPtr(new GLTFParserMeshFunctor(m_meshData));
}
-GLTFParserMesh *GLTFParserMesh::doClone(QNode *clonedParent) const
+GLTFParserMesh *GLTFParserMesh::doClone(bool isClone) const
{
- return new GLTFParserMesh(clonedParent);
+ GLTFParserMesh *clone = new GLTFParserMesh();
+ clone->copy(this);
+ clone->d_func()->m_isClone = isClone;
+ return clone;
}
GLTFParserMesh::GLTFParserMeshFunctor::GLTFParserMeshFunctor(QMeshDataPtr meshData)
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp
index ef953465c..c05c5c83c 100644
--- a/tests/auto/core/nodes/tst_nodes.cpp
+++ b/tests/auto/core/nodes/tst_nodes.cpp
@@ -43,6 +43,7 @@
#include <Qt3DCore/qnode.h>
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qcomponent.h>
+#include <Qt3DCore/qscene.h>
class tst_Nodes : public QObject
{
@@ -84,9 +85,12 @@ public:
QString customProperty() const { return m_customProperty; }
protected:
- Qt3D::QNode *doClone(Qt3D::QNode *clonedParent) const Q_DECL_OVERRIDE
+ Qt3D::QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE
{
- return new MyQNode(clonedParent);
+ MyQNode *clone = new MyQNode();
+ clone->copy(this);
+ // clone->d_func()->m_isClone = isClone;
+ return clone;
}
QString m_customProperty;
@@ -102,9 +106,12 @@ public:
// QNode interface
protected:
- Qt3D::QNode *doClone(Qt3D::QNode *clonedParent) const Q_DECL_OVERRIDE
+ Qt3D::QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE
{
- return new MyQComponent(clonedParent);
+ MyQComponent *clone = new MyQComponent();
+ clone->copy(this);
+// clone->d_func()->m_isClone = isClone;
+ return clone;
}
};
@@ -341,8 +348,11 @@ void tst_Nodes::removingComponentsFromEntity()
void tst_Nodes::checkCloning()
{
+ Qt3D::QScene *scene = new Qt3D::QScene();
MyQNode *root = new MyQNode();
+ root->setScene(scene);
Qt3D::QEntity *entity = new Qt3D::QEntity(root);
+ root->addChild(entity);
MyQComponent *comp1 = new MyQComponent();
MyQComponent *comp2 = new MyQComponent();
@@ -350,13 +360,10 @@ void tst_Nodes::checkCloning()
MyQNode *childNode = new MyQNode();
entity->addChild(childNode);
-
-
entity->addComponent(comp1);
entity->addComponent(comp2);
entity->addComponent(comp3);
- root->addChild(entity);
root->setCustomProperty(QStringLiteral("Corvette"));
QVERIFY(root->customProperty() == QStringLiteral("Corvette"));
diff --git a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
index b35e146d5..423166865 100644
--- a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
+++ b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
@@ -139,9 +139,12 @@ public:
// QNode interface
protected:
- Qt3D::QNode *doClone(Qt3D::QNode *clonedParent) const
+ Qt3D::QNode *doClone(bool isClone = true) const
{
- return new tst_Node(clonedParent);
+ tst_Node *clone = new tst_Node();
+ clone->copy(this);
+// clone->d_func()->m_isClone = isClone;
+ return clone;
}
private:
diff --git a/tests/auto/core/qscene/tst_qscene.cpp b/tests/auto/core/qscene/tst_qscene.cpp
index f2e274298..273af3880 100644
--- a/tests/auto/core/qscene/tst_qscene.cpp
+++ b/tests/auto/core/qscene/tst_qscene.cpp
@@ -91,9 +91,12 @@ public:
tst_Node() : Qt3D::QNode()
{}
protected:
- Qt3D::QNode *doClone(Qt3D::QNode *clonedParent) const
+ Qt3D::QNode *doClone(bool isClone = true) const Q_DECL_OVERRIDE
{
- return new tst_Node();
+ tst_Node *clone = new tst_Node();
+ clone->copy(this);
+// clone->d_func()->m_isClone = isClone;
+ return clone;
}
};
@@ -103,9 +106,12 @@ public:
tst_Component() : Qt3D::QComponent()
{}
protected:
- Qt3D::QNode *doClone(Qt3D::QNode *clonedParent) const
+ Qt3D::QNode *doClone(bool isClone = true) const
{
- return new tst_Component;
+ tst_Component *clone = new tst_Component;
+ clone->copy(this);
+// clone->d_func()->m_isClone = isClone;
+ return clone;
}
};