diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2014-09-19 08:37:03 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2014-09-30 12:16:39 +0200 |
commit | 94bb50fba66435a078f30b1da9cf5507522ab136 (patch) | |
tree | 1c48f4e4463dd0f28fcd38efb259017987bbc8d6 | |
parent | 616e8083872c953a31acc871749e05c621c18bd1 (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>
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 ¢er) 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 ¢er) 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 ¶meterName, 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; } }; |