diff options
author | Paul Lemire <paul.lemire350@gmail.com> | 2015-08-02 19:06:52 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-08-07 16:50:46 +0000 |
commit | ecaa9ab2d6172ea97eca096c6b4c0b0f11ba73b1 (patch) | |
tree | d350b12750b6edfc8bbe1843f6eda7408ca892bb | |
parent | b9665acbd3a43784fbc1dd9079d87eefa34e1b3c (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.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/rendergeometryrenderer.cpp | 34 | ||||
-rw-r--r-- | src/render/backend/rendergeometryrenderer_p.h | 15 |
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 |