summaryrefslogtreecommitdiffstats
path: root/src/render/jobs/calcboundingvolumejob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/jobs/calcboundingvolumejob.cpp')
-rw-r--r--src/render/jobs/calcboundingvolumejob.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/render/jobs/calcboundingvolumejob.cpp b/src/render/jobs/calcboundingvolumejob.cpp
index dc58eb6b9..b906bf9af 100644
--- a/src/render/jobs/calcboundingvolumejob.cpp
+++ b/src/render/jobs/calcboundingvolumejob.cpp
@@ -53,6 +53,7 @@
#include <Qt3DRender/private/buffervisitor_p.h>
#include <Qt3DRender/private/entityvisitor_p.h>
#include <Qt3DCore/private/qaspectmanager_p.h>
+#include <Qt3DRender/private/qgeometry_p.h>
#include <QtCore/qmath.h>
#if QT_CONFIG(concurrent)
@@ -399,8 +400,33 @@ public:
} // anonymous
+class CalculateBoundingVolumeJobPrivate : public Qt3DCore::QAspectJobPrivate
+{
+public:
+ CalculateBoundingVolumeJobPrivate(CalculateBoundingVolumeJob *q) : q_ptr(q) {}
+ ~CalculateBoundingVolumeJobPrivate() override = default;
+
+ void postFrame(Qt3DCore::QAspectManager *aspectManager) override
+ {
+ for (Geometry *backend : m_updatedGeometries) {
+ Qt3DRender::QGeometry *node = qobject_cast<Qt3DRender::QGeometry *>(aspectManager->lookupNode(backend->peerId()));
+ if (!node)
+ continue;
+ Qt3DRender::QGeometryPrivate *dNode = static_cast<Qt3DRender::QGeometryPrivate *>(Qt3DCore::QNodePrivate::get(node));
+ dNode->setExtent(backend->min(), backend->max());
+ }
+
+ m_updatedGeometries.clear();
+ }
+
+ QVector<Geometry *> m_updatedGeometries;
+ CalculateBoundingVolumeJob *q_ptr;
+ Q_DECLARE_PUBLIC(CalculateBoundingVolumeJob)
+};
+
CalculateBoundingVolumeJob::CalculateBoundingVolumeJob()
- : m_manager(nullptr)
+ : Qt3DCore::QAspectJob(*new CalculateBoundingVolumeJobPrivate(this))
+ , m_manager(nullptr)
, m_node(nullptr)
{
SET_JOB_RUN_STAT_TYPE(this, JobTypes::CalcBoundingVolume, 0)
@@ -429,9 +455,8 @@ void CalculateBoundingVolumeJob::run()
updatedGeometries += calculateLocalBoundingVolume(m_manager, data);
}
- // Send extent updates to frontend
- for (Geometry *geometry : updatedGeometries)
- geometry->notifyExtentChanged();
+ Q_D(CalculateBoundingVolumeJob);
+ d->m_updatedGeometries = std::move(updatedGeometries);
}
void CalculateBoundingVolumeJob::setRoot(Entity *node)