summaryrefslogtreecommitdiffstats
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 16:50:46 +0000
commitecaa9ab2d6172ea97eca096c6b4c0b0f11ba73b1 (patch)
treed350b12750b6edfc8bbe1843f6eda7408ca892bb
parentb9665acbd3a43784fbc1dd9079d87eefa34e1b3c (diff)
RenderGeometryRenderer: dedicated creation functor
Needed in order to make the RenderGeometryRenderer aware of its manager. That way the geometry renderer will be able to queue up functors whenever a geometry functor changes Change-Id: Ib08bf4c2502bfd4199488681b462207f0ee9b289 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/qrenderaspect.cpp2
-rw-r--r--src/render/backend/rendergeometryrenderer.cpp34
-rw-r--r--src/render/backend/rendergeometryrenderer_p.h15
3 files changed, 50 insertions, 1 deletions
diff --git a/src/render/backend/qrenderaspect.cpp b/src/render/backend/qrenderaspect.cpp
index cd78998c3..4d59dacc1 100644
--- a/src/render/backend/qrenderaspect.cpp
+++ b/src/render/backend/qrenderaspect.cpp
@@ -237,7 +237,7 @@ void QRenderAspect::registerBackendTypes()
registerBackendType<QBuffer>(QBackendNodeFunctorPtr(new Render::RenderBufferFunctor(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 ff40ea337..1b46f3abf 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
@@ -53,6 +54,7 @@ RenderGeometryRenderer::RenderGeometryRenderer()
, m_primitiveRestart(false)
, m_primitiveType(QGeometryRenderer::Triangles)
, m_dirty(false)
+ , m_manager(Q_NULLPTR)
{
}
@@ -74,6 +76,11 @@ void RenderGeometryRenderer::cleanup()
m_functor.reset();
}
+void RenderGeometryRenderer::setManager(GeometryRendererManager *manager)
+{
+ m_manager = manager;
+}
+
void RenderGeometryRenderer::updateFromPeer(QNode *peer)
{
QGeometryRenderer *geometryRenderer = static_cast<QGeometryRenderer *>(peer);
@@ -89,6 +96,7 @@ void RenderGeometryRenderer::updateFromPeer(QNode *peer)
m_geometryId = geometryRenderer->geometry()->id();
m_functor = geometryRenderer->geometryFunctor();
m_dirty = true;
+ // Add to dirty list in the manager
}
}
@@ -148,6 +156,8 @@ void RenderGeometryRenderer::sceneChangeEvent(const QSceneChangePtr &e)
default:
break;
}
+
+ // Add to dirty list in manager
}
void RenderGeometryRenderer::unsetDirty()
@@ -155,6 +165,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 83ac7fc9d..8c77821d1 100644
--- a/src/render/backend/rendergeometryrenderer_p.h
+++ b/src/render/backend/rendergeometryrenderer_p.h
@@ -47,6 +47,8 @@ namespace Qt3D {
namespace Render {
+class GeometryRendererManager;
+
class Q_AUTOTEST_EXPORT RenderGeometryRenderer : public QBackendNode
{
public:
@@ -54,6 +56,7 @@ public:
~RenderGeometryRenderer();
void cleanup();
+ void setManager(GeometryRendererManager *manager);
void updateFromPeer(QNode *peer) Q_DECL_OVERRIDE;
void sceneChangeEvent(const QSceneChangePtr &e) Q_DECL_OVERRIDE;
@@ -80,6 +83,18 @@ private:
QGeometryRenderer::PrimitiveType m_primitiveType;
bool m_dirty;
QGeometryFunctorPtr m_functor;
+ 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