From bc0dcc9ef5885a5dc332fd1330aa7cc5c019f93a Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Mon, 16 Nov 2015 16:50:19 +0100 Subject: FramePreparationJob: check geometryrenderer to compute triangle data This will allow to keep the triangle volumes on the GeometryRenderer and have them updated only when the attributes or buffer change Change-Id: Ia616189f7f1e68bd25a850f5b12198eac3a030ec Reviewed-by: Andy Nichols --- src/render/jobs/framepreparationjob.cpp | 37 +++++++++++++++++++++++++++++---- src/render/jobs/framepreparationjob_p.h | 6 +++--- 2 files changed, 36 insertions(+), 7 deletions(-) (limited to 'src/render/jobs') diff --git a/src/render/jobs/framepreparationjob.cpp b/src/render/jobs/framepreparationjob.cpp index 02908d335..02fbe98ae 100644 --- a/src/render/jobs/framepreparationjob.cpp +++ b/src/render/jobs/framepreparationjob.cpp @@ -35,31 +35,32 @@ ****************************************************************************/ #include "framepreparationjob_p.h" -#include +#include #include #include #include +#include #include #include #include #include #include #include +#include QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { -FramePreparationJob::FramePreparationJob(Renderer *renderer) +FramePreparationJob::FramePreparationJob(NodeManagers *manager) : m_root(Q_NULLPTR) - , m_renderer(renderer) + , m_manager(manager) { } FramePreparationJob::~FramePreparationJob() { - } void FramePreparationJob::setRoot(Entity *root) @@ -80,6 +81,34 @@ void FramePreparationJob::parseNodeTree(Entity *node) r->updateTransformedProperties(*node->worldTransform()); } + // Look if for the GeometryRender/Geometry the attributes and or buffers are dirty + // in which case we need to recompute the triangle list + GeometryRenderer *geomRenderer = node->renderComponent(); + const Qt3DCore::QNodeId geomRendererId = node->componentUuid(); + Geometry *geom = Q_NULLPTR; + if (geomRenderer && + (geom = m_manager->lookupResource(geomRenderer->geometryId())) != Q_NULLPTR) { + if (!m_manager->geometryRendererManager()->isGeometryRendererScheduledForTriangleDataRefresh(geomRendererId)) { + // Check if the attributes or buffers are dirty + bool dirty = geomRenderer->isDirty(); + Attribute *attr = Q_NULLPTR; + Q_FOREACH (const Qt3DCore::QNodeId attrId, geom->attributes()) { + if ((attr = m_manager->attributeManager()->lookupResource(attrId)) != Q_NULLPTR) { + dirty |= attr->isDirty(); + if (!dirty) { + Buffer *buffer = Q_NULLPTR; + if ((buffer = m_manager->bufferManager()->lookupResource(attr->bufferId())) != Q_NULLPTR) + dirty = buffer->isDirty(); + } + if (dirty) + break; + } + } + if (dirty) + m_manager->geometryRendererManager()->requestTriangleDataRefreshForGeometryRenderer(geomRendererId); + } + } + const QVector children = node->children(); Q_FOREACH (Entity *c, children) parseNodeTree(c); diff --git a/src/render/jobs/framepreparationjob_p.h b/src/render/jobs/framepreparationjob_p.h index 263f9b87e..133a1e8d3 100644 --- a/src/render/jobs/framepreparationjob_p.h +++ b/src/render/jobs/framepreparationjob_p.h @@ -57,13 +57,13 @@ namespace Qt3DRender { namespace Render { -class Renderer; +class NodeManagers; class Entity; class QT3DRENDERSHARED_PRIVATE_EXPORT FramePreparationJob : public Qt3DCore::QAspectJob { public: - FramePreparationJob(Renderer *renderer); + FramePreparationJob(NodeManagers *manager); ~FramePreparationJob(); void setRoot(Entity *root); @@ -75,7 +75,7 @@ private: void parseNodeTree(Entity *node); Entity *m_root; - Renderer *m_renderer; + NodeManagers *m_manager; }; typedef QSharedPointer FramePreparationJobPtr; -- cgit v1.2.3