summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2015-02-04 16:46:35 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-02-08 15:01:54 +0000
commit906891f92bcdde3cad6618114689a57899bacb83 (patch)
tree0285320eb61a83d5ea79d4c052e665044e91fc3e
parentc72f232b572b5b4b2e20622b14fe6d2858c5d465 (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.cpp2
-rw-r--r--src/core/nodes/qbackendnode.cpp15
-rw-r--r--src/core/nodes/qbackendnode.h6
-rw-r--r--src/core/nodes/qbackendnode_p.h4
-rw-r--r--src/input/keyboardcontroller.cpp3
-rw-r--r--src/input/keyboardcontroller_p.h2
-rw-r--r--src/input/keyboardinput.cpp3
-rw-r--r--src/input/keyboardinput_p.h2
-rw-r--r--src/render/backend/framegraph/framegraphnode.cpp2
-rw-r--r--src/render/backend/framegraph/framegraphnode_p.h9
-rw-r--r--src/render/backend/renderentity.cpp3
-rw-r--r--src/render/backend/renderentity_p.h2
-rw-r--r--src/render/backend/rendermesh.cpp3
-rw-r--r--src/render/backend/rendermesh_p.h2
-rw-r--r--src/render/backend/rendernodefunctor_p.h3
-rw-r--r--src/render/backend/renderparameter.cpp3
-rw-r--r--src/render/backend/renderparameter_p.h2
-rw-r--r--src/render/backend/renderscene.cpp3
-rw-r--r--src/render/backend/renderscene_p.h2
-rw-r--r--src/render/backend/rendershaderdata.cpp3
-rw-r--r--src/render/backend/rendershaderdata_p.h2
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;