diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-11-16 16:50:19 +0100 |
---|---|---|
committer | Andy Nichols <andy.nichols@theqtcompany.com> | 2015-11-24 14:59:42 +0000 |
commit | bc0dcc9ef5885a5dc332fd1330aa7cc5c019f93a (patch) | |
tree | ae0aafeb746b2628457fab87483cc7afd8ef692b /src/render/jobs | |
parent | 42d7dac9b7f7fbf8aaad123431e973aedf0f34b2 (diff) |
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 <andy.nichols@theqtcompany.com>
Diffstat (limited to 'src/render/jobs')
-rw-r--r-- | src/render/jobs/framepreparationjob.cpp | 37 | ||||
-rw-r--r-- | src/render/jobs/framepreparationjob_p.h | 6 |
2 files changed, 36 insertions, 7 deletions
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 <Qt3DRender/private/renderer_p.h> +#include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/entity_p.h> #include <Qt3DRender/private/shaderdata_p.h> #include <Qt3DRender/private/sphere_p.h> +#include <Qt3DRender/private/attribute_p.h> #include <Qt3DRender/private/geometryrenderer_p.h> #include <Qt3DRender/private/geometry_p.h> #include <Qt3DRender/private/attribute_p.h> #include <Qt3DRender/private/buffer_p.h> #include <Qt3DRender/private/managers_p.h> #include <Qt3DRender/private/buffermanager_p.h> +#include <Qt3DRender/private/geometryrenderermanager_p.h> 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<GeometryRenderer>(); + const Qt3DCore::QNodeId geomRendererId = node->componentUuid<GeometryRenderer>(); + Geometry *geom = Q_NULLPTR; + if (geomRenderer && + (geom = m_manager->lookupResource<Geometry, GeometryManager>(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<Entity *> 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<FramePreparationJob> FramePreparationJobPtr; |