summaryrefslogtreecommitdiffstats
path: root/src/render/jobs
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-11-16 16:50:19 +0100
committerAndy Nichols <andy.nichols@theqtcompany.com>2015-11-24 14:59:42 +0000
commitbc0dcc9ef5885a5dc332fd1330aa7cc5c019f93a (patch)
treeae0aafeb746b2628457fab87483cc7afd8ef692b /src/render/jobs
parent42d7dac9b7f7fbf8aaad123431e973aedf0f34b2 (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.cpp37
-rw-r--r--src/render/jobs/framepreparationjob_p.h6
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;