diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2015-02-04 16:46:35 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-02-08 15:01:54 +0000 |
commit | 906891f92bcdde3cad6618114689a57899bacb83 (patch) | |
tree | 0285320eb61a83d5ea79d4c052e665044e91fc3e | |
parent | c72f232b572b5b4b2e20622b14fe6d2858c5d465 (diff) |
Make QBackendNode use QBackendNodeFactory
For convenience we also provide a protected createBackendNode in
QBackendNode itself. From now on it should be the preferred way to deal
with node resolving.
Change-Id: I22f490763026848a4dc8b55c98f649c36df258a3
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/core/aspects/qabstractaspect.cpp | 2 | ||||
-rw-r--r-- | src/core/nodes/qbackendnode.cpp | 15 | ||||
-rw-r--r-- | src/core/nodes/qbackendnode.h | 6 | ||||
-rw-r--r-- | src/core/nodes/qbackendnode_p.h | 4 | ||||
-rw-r--r-- | src/input/keyboardcontroller.cpp | 3 | ||||
-rw-r--r-- | src/input/keyboardcontroller_p.h | 2 | ||||
-rw-r--r-- | src/input/keyboardinput.cpp | 3 | ||||
-rw-r--r-- | src/input/keyboardinput_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/framegraph/framegraphnode.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/framegraph/framegraphnode_p.h | 9 | ||||
-rw-r--r-- | src/render/backend/renderentity.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/renderentity_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/rendermesh.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/rendermesh_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/rendernodefunctor_p.h | 3 | ||||
-rw-r--r-- | src/render/backend/renderparameter.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/renderparameter_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/renderscene.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/renderscene_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/rendershaderdata.cpp | 3 | ||||
-rw-r--r-- | src/render/backend/rendershaderdata_p.h | 2 |
21 files changed, 54 insertions, 22 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp index 15b9cd6db..f1290a9d7 100644 --- a/src/core/aspects/qabstractaspect.cpp +++ b/src/core/aspects/qabstractaspect.cpp @@ -108,7 +108,7 @@ QBackendNode *QAbstractAspect::createBackendNode(QNode *frontend) const QBackendNode *backend = functor->get(frontend); if (backend != Q_NULLPTR) return backend; - backend = functor->create(frontend); + backend = functor->create(frontend, this); // backend could be null if the user decides that his functor should only // perform some action when encountering a given type of item but doesn't need to // return a QBackendNode pointer. diff --git a/src/core/nodes/qbackendnode.cpp b/src/core/nodes/qbackendnode.cpp index de59ce3ae..bebd334ef 100644 --- a/src/core/nodes/qbackendnode.cpp +++ b/src/core/nodes/qbackendnode.cpp @@ -41,6 +41,7 @@ #include "qbackendnode.h" #include "qbackendnode_p.h" +#include "qbackendnodefactory.h" #include "qaspectengine.h" #include "qnode.h" @@ -51,6 +52,7 @@ namespace Qt3D { QBackendNodePrivate::QBackendNodePrivate(QBackendNode *qq, QBackendNode::Mode mode) : q_ptr(qq) , m_mode(mode) + , m_factory(Q_NULLPTR) , m_arbiter(Q_NULLPTR) { } @@ -91,6 +93,12 @@ QBackendNode::~QBackendNode() delete d_ptr; } +void QBackendNode::setFactory(const QBackendNodeFactory *factory) +{ + Q_D(QBackendNode); + d->m_factory = factory; +} + void QBackendNode::setPeer(QNode *peer) { Q_D(QBackendNode); @@ -113,6 +121,13 @@ QBackendNode::Mode QBackendNode::mode() const return d->m_mode; } +QBackendNode *QBackendNode::createBackendNode(QNode *frontend) const +{ + Q_D(const QBackendNode); + Q_ASSERT(d->m_factory); + return d->m_factory->createBackendNode(frontend); +} + QBackendNode::QBackendNode(QBackendNodePrivate &dd) : d_ptr(&dd) { diff --git a/src/core/nodes/qbackendnode.h b/src/core/nodes/qbackendnode.h index f237b3773..5a115a1af 100644 --- a/src/core/nodes/qbackendnode.h +++ b/src/core/nodes/qbackendnode.h @@ -50,6 +50,7 @@ QT_BEGIN_NAMESPACE namespace Qt3D { +class QBackendNodeFactory; class QBackendNodePrivate; class QBackendNode; class QAspectEngine; @@ -58,7 +59,7 @@ class QT3DCORESHARED_EXPORT QBackendNodeFunctor { public: virtual ~QBackendNodeFunctor() {} - virtual QBackendNode *create(QNode *frontend) const = 0; + virtual QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const = 0; virtual QBackendNode *get(QNode *frontend) const = 0; virtual void destroy(QNode *frontend) const = 0; }; @@ -76,6 +77,8 @@ public: explicit QBackendNode(Mode mode = ReadOnly); virtual ~QBackendNode(); + void setFactory(const QBackendNodeFactory *factory); + void setPeer(QNode *peer); QNodeId peerUuid() const; @@ -83,6 +86,7 @@ public: virtual void updateFromPeer(QNode *peer) = 0; protected: + QBackendNode *createBackendNode(QNode *frontend) const; void notifyObservers(const QSceneChangePtr &e); virtual void sceneChangeEvent(const QSceneChangePtr &e) = 0; diff --git a/src/core/nodes/qbackendnode_p.h b/src/core/nodes/qbackendnode_p.h index 4c225d456..5dc4113bf 100644 --- a/src/core/nodes/qbackendnode_p.h +++ b/src/core/nodes/qbackendnode_p.h @@ -54,6 +54,8 @@ QT_BEGIN_NAMESPACE namespace Qt3D { +class QBackendNodeFactory; + class QT3DCORE_PRIVATE_EXPORT QBackendNodePrivate : public QObserverInterface , public QObservableInterface @@ -61,6 +63,7 @@ class QT3DCORE_PRIVATE_EXPORT QBackendNodePrivate public: QBackendNodePrivate(QBackendNode *qq, QBackendNode::Mode mode); + void setFactory(const QBackendNodeFactory *factory); void setArbiter(QLockableObserverInterface *arbiter) Q_DECL_OVERRIDE; void notifyObservers(const QSceneChangePtr &e) Q_DECL_OVERRIDE; void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE; @@ -71,6 +74,7 @@ public: QBackendNode *q_ptr; QBackendNode::Mode m_mode; + const QBackendNodeFactory *m_factory; QLockableObserverInterface *m_arbiter; QNodeId m_peerUuid; }; diff --git a/src/input/keyboardcontroller.cpp b/src/input/keyboardcontroller.cpp index 1725cd088..b814cb766 100644 --- a/src/input/keyboardcontroller.cpp +++ b/src/input/keyboardcontroller.cpp @@ -103,9 +103,10 @@ KeyboardControllerFunctor::KeyboardControllerFunctor(InputHandler *handler) { } -QBackendNode *KeyboardControllerFunctor::create(QNode *frontend) const +QBackendNode *KeyboardControllerFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { KeyboardController *controller = m_handler->keyboardControllerManager()->getOrCreateResource(frontend->id()); + controller->setFactory(factory); controller->setInputHandler(m_handler); controller->setPeer(frontend); m_handler->appendKeyboardController(m_handler->keyboardControllerManager()->lookupHandle(frontend->id())); diff --git a/src/input/keyboardcontroller_p.h b/src/input/keyboardcontroller_p.h index 1ba9cf393..7feb7af20 100644 --- a/src/input/keyboardcontroller_p.h +++ b/src/input/keyboardcontroller_p.h @@ -88,7 +88,7 @@ class KeyboardControllerFunctor : public QBackendNodeFunctor public: explicit KeyboardControllerFunctor(InputHandler *handler); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/input/keyboardinput.cpp b/src/input/keyboardinput.cpp index af4a5884c..8bf6da756 100644 --- a/src/input/keyboardinput.cpp +++ b/src/input/keyboardinput.cpp @@ -153,9 +153,10 @@ KeyboardInputFunctor::KeyboardInputFunctor(InputHandler *handler) { } -QBackendNode *KeyboardInputFunctor::create(QNode *frontend) const +QBackendNode *KeyboardInputFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { KeyboardInput *input = m_handler->keyboardInputManager()->getOrCreateResource(frontend->id()); + input->setFactory(factory); input->setInputHandler(m_handler); input->setPeer(frontend); return input; diff --git a/src/input/keyboardinput_p.h b/src/input/keyboardinput_p.h index 66b42654e..b31f6a969 100644 --- a/src/input/keyboardinput_p.h +++ b/src/input/keyboardinput_p.h @@ -85,7 +85,7 @@ class KeyboardInputFunctor : public QBackendNodeFunctor public: explicit KeyboardInputFunctor(InputHandler *handler); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/framegraph/framegraphnode.cpp b/src/render/backend/framegraph/framegraphnode.cpp index 037822f41..034520082 100644 --- a/src/render/backend/framegraph/framegraphnode.cpp +++ b/src/render/backend/framegraph/framegraphnode.cpp @@ -144,7 +144,7 @@ FrameGraphComponentFunctor::FrameGraphComponentFunctor(Renderer *renderer) { } -QBackendNode *FrameGraphComponentFunctor::create(QNode *frontend) const +QBackendNode *FrameGraphComponentFunctor::create(QNode *frontend, const QBackendNodeFactory *) const { // TO DO: Ideally we should have a RenderFrameGraph component and use its setPeer method // to do that diff --git a/src/render/backend/framegraph/framegraphnode_p.h b/src/render/backend/framegraph/framegraphnode_p.h index b0c19b0e1..7c670b25a 100644 --- a/src/render/backend/framegraph/framegraphnode_p.h +++ b/src/render/backend/framegraph/framegraphnode_p.h @@ -116,9 +116,9 @@ public: { } - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE { - return createBackendFrameGraphNode(frontend); + return createBackendFrameGraphNode(frontend, factory); } QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE @@ -135,7 +135,7 @@ public: } protected: - Backend *createBackendFrameGraphNode(QNode *n) const + Backend *createBackendFrameGraphNode(QNode *n, const QBackendNodeFactory *factory) const { Frontend *f = qobject_cast<Frontend *>(n); if (f != Q_NULLPTR) { @@ -144,6 +144,7 @@ protected: handle = m_manager->getOrAcquireHandle(n->id()); Backend *backend = new Backend(); *m_manager->data(handle) = backend; + backend->setFactory(factory); backend->setFrameGraphManager(m_manager); backend->setHandle(handle); backend->setPeer(f); @@ -164,7 +165,7 @@ class FrameGraphComponentFunctor : public QBackendNodeFunctor { public: explicit FrameGraphComponentFunctor(Renderer *renderer); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/renderentity.cpp b/src/render/backend/renderentity.cpp index 8390b19d7..2162363af 100644 --- a/src/render/backend/renderentity.cpp +++ b/src/render/backend/renderentity.cpp @@ -379,10 +379,11 @@ RenderEntityFunctor::RenderEntityFunctor(Renderer *renderer) { } -QBackendNode *RenderEntityFunctor::create(QNode *frontend) const +QBackendNode *RenderEntityFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { HEntity renderNodeHandle = m_renderer->renderNodesManager()->getOrAcquireHandle(frontend->id()); RenderEntity *entity = m_renderer->renderNodesManager()->data(renderNodeHandle); + entity->setFactory(factory); entity->setRenderer(m_renderer); entity->setHandle(renderNodeHandle); entity->setPeer(frontend); diff --git a/src/render/backend/renderentity_p.h b/src/render/backend/renderentity_p.h index f4a4aa3fc..fb691319a 100644 --- a/src/render/backend/renderentity_p.h +++ b/src/render/backend/renderentity_p.h @@ -225,7 +225,7 @@ class RenderEntityFunctor : public QBackendNodeFunctor { public: explicit RenderEntityFunctor(Renderer *renderer); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/rendermesh.cpp b/src/render/backend/rendermesh.cpp index e99f8c23c..b1c60e8ae 100644 --- a/src/render/backend/rendermesh.cpp +++ b/src/render/backend/rendermesh.cpp @@ -147,9 +147,10 @@ RenderMeshCreatorFunctor::RenderMeshCreatorFunctor(MeshManager *meshManager, Mes { } -QBackendNode *RenderMeshCreatorFunctor::create(QNode *frontend) const +QBackendNode *RenderMeshCreatorFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { RenderMesh *mesh = m_meshManager->getOrCreateResource(frontend->id()); + mesh->setFactory(factory); mesh->setMeshDataManager(m_meshDataManager); mesh->setPeer(frontend); return mesh; diff --git a/src/render/backend/rendermesh_p.h b/src/render/backend/rendermesh_p.h index 1f2451968..1d488e09e 100644 --- a/src/render/backend/rendermesh_p.h +++ b/src/render/backend/rendermesh_p.h @@ -100,7 +100,7 @@ class RenderMeshCreatorFunctor : public QBackendNodeFunctor { public: explicit RenderMeshCreatorFunctor(MeshManager *meshManager, MeshDataManager *meshDataManager); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/rendernodefunctor_p.h b/src/render/backend/rendernodefunctor_p.h index 25d461e81..a7a66fc91 100644 --- a/src/render/backend/rendernodefunctor_p.h +++ b/src/render/backend/rendernodefunctor_p.h @@ -60,9 +60,10 @@ public: { } - QBackendNode *create(QNode *frontend) const Q_DECL_FINAL + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_FINAL { Backend *backend = m_manager->getOrCreateResource(frontend->id()); + backend->setFactory(factory); backend->setPeer(frontend); return backend; } diff --git a/src/render/backend/renderparameter.cpp b/src/render/backend/renderparameter.cpp index adcacd4cd..97716e843 100644 --- a/src/render/backend/renderparameter.cpp +++ b/src/render/backend/renderparameter.cpp @@ -122,10 +122,11 @@ RenderParameterFunctor::RenderParameterFunctor(ParameterManager *parameterManage { } -QBackendNode *RenderParameterFunctor::create(QNode *frontend) const +QBackendNode *RenderParameterFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { HParameter parameterNodeHandle = m_parameterManager->getOrAcquireHandle(frontend->id()); RenderParameter *parameter = m_parameterManager->data(parameterNodeHandle); + parameter->setFactory(factory); parameter->setShaderDataManager(m_shaderDataManager); parameter->setTextureManager(m_textureManager); parameter->setPeer(frontend); diff --git a/src/render/backend/renderparameter_p.h b/src/render/backend/renderparameter_p.h index 92e848b68..3c7f5d7f9 100644 --- a/src/render/backend/renderparameter_p.h +++ b/src/render/backend/renderparameter_p.h @@ -85,7 +85,7 @@ public: explicit RenderParameterFunctor(ParameterManager *parameterManager, ShaderDataManager *shaderDataManager, TextureManager *textureManager); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/renderscene.cpp b/src/render/backend/renderscene.cpp index 2b74df3a5..677903e56 100644 --- a/src/render/backend/renderscene.cpp +++ b/src/render/backend/renderscene.cpp @@ -108,9 +108,10 @@ RenderSceneFunctor::RenderSceneFunctor(SceneManager *sceneManager) { } -QBackendNode *RenderSceneFunctor::create(QNode *frontend) const +QBackendNode *RenderSceneFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { RenderScene *scene = m_sceneManager->getOrCreateResource(frontend->id()); + scene->setFactory(factory); scene->setSceneManager(m_sceneManager); scene->setPeer(frontend); return scene; diff --git a/src/render/backend/renderscene_p.h b/src/render/backend/renderscene_p.h index f102d2f2a..598bb5bfe 100644 --- a/src/render/backend/renderscene_p.h +++ b/src/render/backend/renderscene_p.h @@ -77,7 +77,7 @@ class RenderSceneFunctor : public QBackendNodeFunctor { public: explicit RenderSceneFunctor(SceneManager *sceneManager); - QBackendNode *create(QNode *frontend) const Q_DECL_OVERRIDE; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE; QBackendNode *get(QNode *frontend) const Q_DECL_OVERRIDE; void destroy(QNode *frontend) const Q_DECL_OVERRIDE; diff --git a/src/render/backend/rendershaderdata.cpp b/src/render/backend/rendershaderdata.cpp index b8f78aeb5..da573dad7 100644 --- a/src/render/backend/rendershaderdata.cpp +++ b/src/render/backend/rendershaderdata.cpp @@ -294,9 +294,10 @@ RenderShaderDataFunctor::RenderShaderDataFunctor(ShaderDataManager *manager) { } -QBackendNode *RenderShaderDataFunctor::create(QNode *frontend) const +QBackendNode *RenderShaderDataFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const { RenderShaderData *backend = m_manager->getOrCreateResource(frontend->id()); + backend->setFactory(factory); backend->setManager(m_manager); backend->setPeer(frontend); return backend; diff --git a/src/render/backend/rendershaderdata_p.h b/src/render/backend/rendershaderdata_p.h index dc7a1c3c8..6efd4a470 100644 --- a/src/render/backend/rendershaderdata_p.h +++ b/src/render/backend/rendershaderdata_p.h @@ -111,7 +111,7 @@ class RenderShaderDataFunctor : public QBackendNodeFunctor public: explicit RenderShaderDataFunctor(ShaderDataManager *manager); - QBackendNode *create(QNode *frontend) const Q_DECL_FINAL; + QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_FINAL; QBackendNode *get(QNode *frontend) const Q_DECL_FINAL; void destroy(QNode *frontend) const Q_DECL_FINAL; |