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 09:38:45 +0000 |
commit | 0023bfecacc9eb71abefe2f325a09ebb2280f831 (patch) | |
tree | 488ec3e8c53f94d121a545808cfcc976bc94842e /src | |
parent | 168fc7d2cfecd97f3c58b828639e604260d2f74c (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.cpp | 2 | ||||
-rw-r--r-- | src/render/backend/rendergeometryrenderer.cpp | 34 | ||||
-rw-r--r-- | src/render/backend/rendergeometryrenderer_p.h | 16 |
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 |