summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire350@gmail.com>2015-08-02 19:06:52 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-08-07 09:38:45 +0000
commit0023bfecacc9eb71abefe2f325a09ebb2280f831 (patch)
tree488ec3e8c53f94d121a545808cfcc976bc94842e /src
parent168fc7d2cfecd97f3c58b828639e604260d2f74c (diff)
RenderGeometryRenderer using dedicated functor
Needed in order to make the RenderGeometryRenderer aware of its manager. This way it will be later able to add itself to the manager when set to dirty in order to be processed by some aspect jobs. Change-Id: Id7778e30286e9a0f14150e5b2c43a675b2372154 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/qrenderaspect.cpp2
-rw-r--r--src/render/backend/rendergeometryrenderer.cpp34
-rw-r--r--src/render/backend/rendergeometryrenderer_p.h16
3 files changed, 50 insertions, 2 deletions
diff --git a/src/render/backend/qrenderaspect.cpp b/src/render/backend/qrenderaspect.cpp
index a0dbc7852..c92580bbe 100644
--- a/src/render/backend/qrenderaspect.cpp
+++ b/src/render/backend/qrenderaspect.cpp
@@ -236,7 +236,7 @@ void QRenderAspect::registerBackendTypes()
registerBackendType<QBuffer>(QBackendNodeFunctorPtr(new Render::RenderNodeFunctor<Render::RenderBuffer, Render::BufferManager>(d->m_renderer->bufferManager())));
registerBackendType<QAttribute>(QBackendNodeFunctorPtr(new Render::RenderNodeFunctor<Render::RenderAttribute, Render::AttributeManager>(d->m_renderer->attributeManager())));
registerBackendType<QGeometry>(QBackendNodeFunctorPtr(new Render::RenderNodeFunctor<Render::RenderGeometry, Render::GeometryManager>(d->m_renderer->geometryManager())));
- registerBackendType<QGeometryRenderer>(QBackendNodeFunctorPtr(new Render::RenderNodeFunctor<Render::RenderGeometryRenderer, Render::GeometryRendererManager>(d->m_renderer->geometryRendererManager())));
+ registerBackendType<QGeometryRenderer>(QBackendNodeFunctorPtr(new Render::RenderGeometryRendererFunctor(d->m_renderer->geometryRendererManager())));
}
void QRenderAspect::renderInitialize(QOpenGLContext *context)
diff --git a/src/render/backend/rendergeometryrenderer.cpp b/src/render/backend/rendergeometryrenderer.cpp
index 1e26578ef..6b75410d5 100644
--- a/src/render/backend/rendergeometryrenderer.cpp
+++ b/src/render/backend/rendergeometryrenderer.cpp
@@ -36,6 +36,7 @@
#include "rendergeometryrenderer_p.h"
#include <Qt3DCore/qscenepropertychange.h>
+#include <Qt3DRenderer/private/geometryrenderermanager_p.h>
QT_BEGIN_NAMESPACE
@@ -52,6 +53,7 @@ RenderGeometryRenderer::RenderGeometryRenderer()
, m_primitiveRestart(false)
, m_primitiveType(QGeometryRenderer::Triangles)
, m_dirty(false)
+ , m_manager(Q_NULLPTR)
{
}
@@ -72,6 +74,11 @@ void RenderGeometryRenderer::cleanup()
m_dirty = false;
}
+void RenderGeometryRenderer::setManager(GeometryRendererManager *manager)
+{
+ m_manager = manager;
+}
+
void RenderGeometryRenderer::updateFromPeer(QNode *peer)
{
QGeometryRenderer *geometryRenderer = static_cast<QGeometryRenderer *>(peer);
@@ -85,6 +92,7 @@ void RenderGeometryRenderer::updateFromPeer(QNode *peer)
if (geometryRenderer->geometry() != Q_NULLPTR)
m_geometryId = geometryRenderer->geometry()->id();
m_dirty = true;
+ // Add to dirty list in the manager
}
}
@@ -137,6 +145,8 @@ void RenderGeometryRenderer::sceneChangeEvent(const QSceneChangePtr &e)
default:
break;
}
+
+ // Add to dirty list in manager
}
void RenderGeometryRenderer::unsetDirty()
@@ -144,6 +154,30 @@ void RenderGeometryRenderer::unsetDirty()
m_dirty = false;
}
+RenderGeometryRendererFunctor::RenderGeometryRendererFunctor(GeometryRendererManager *manager)
+ : m_manager(manager)
+{
+}
+
+QBackendNode *RenderGeometryRendererFunctor::create(QNode *frontend, const QBackendNodeFactory *factory) const
+{
+ RenderGeometryRenderer *geometryRenderer = m_manager->getOrCreateResource(frontend->id());
+ geometryRenderer->setFactory(factory);
+ geometryRenderer->setManager(m_manager);
+ geometryRenderer->setPeer(frontend);
+ return geometryRenderer;
+}
+
+QBackendNode *RenderGeometryRendererFunctor::get(const QNodeId &id) const
+{
+ return m_manager->lookupResource(id);
+}
+
+void RenderGeometryRendererFunctor::destroy(const QNodeId &id) const
+{
+ return m_manager->releaseResource(id);
+}
+
} // Render
} // Qt3D
diff --git a/src/render/backend/rendergeometryrenderer_p.h b/src/render/backend/rendergeometryrenderer_p.h
index e765c7734..7a3ca4552 100644
--- a/src/render/backend/rendergeometryrenderer_p.h
+++ b/src/render/backend/rendergeometryrenderer_p.h
@@ -46,6 +46,8 @@ namespace Qt3D {
namespace Render {
+class GeometryRendererManager;
+
class Q_AUTOTEST_EXPORT RenderGeometryRenderer : public QBackendNode
{
public:
@@ -53,7 +55,7 @@ public:
~RenderGeometryRenderer();
void cleanup();
-
+ void setManager(GeometryRendererManager *manager);
void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE;
void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE;
@@ -76,6 +78,18 @@ private:
bool m_primitiveRestart;
QGeometryRenderer::PrimitiveType m_primitiveType;
bool m_dirty;
+ GeometryRendererManager *m_manager;
+};
+
+class RenderGeometryRendererFunctor : public QBackendNodeFunctor
+{
+public:
+ explicit RenderGeometryRendererFunctor(GeometryRendererManager *manager);
+ QBackendNode *create(QNode *frontend, const QBackendNodeFactory *factory) const Q_DECL_OVERRIDE;
+ QBackendNode *get(const QNodeId &id) const Q_DECL_OVERRIDE;
+ void destroy(const QNodeId &id) const Q_DECL_OVERRIDE;
+private:
+ GeometryRendererManager *m_manager;
};
} // Render