summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-02-16 18:43:53 +0000
committerSean Harmer <sean.harmer@kdab.com>2017-02-24 11:16:02 +0000
commitddc878f2fc978a3b740b7ccf9258c824c6ba959a (patch)
treecfad9b1ded31b3cb6490fa5128742e8aff0cf1d5 /src/render
parent42af57acc976cf3142623ac2b13dabbfcf9e643a (diff)
QBoundingSphere cleanup
Is now a Q_GADGET value type Added QBoundingSphere creator functions on QLevelOfDetails and Quick3DLevelOfDetailsLoader Note: cannot be a nested type on QLevelOfDetails as moc doesn't support it Task-number: QTBUG-58892 Change-Id: Ic7b6d68c6e1119c1f61a858f49379efc1e9c2104 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r--src/render/backend/levelofdetail.cpp25
-rw-r--r--src/render/backend/levelofdetail_p.h8
-rw-r--r--src/render/frontend/qboundingsphere_p.h76
-rw-r--r--src/render/frontend/qlevelofdetail.cpp46
-rw-r--r--src/render/frontend/qlevelofdetail.h16
-rw-r--r--src/render/frontend/qlevelofdetail_p.h6
-rw-r--r--src/render/frontend/qlevelofdetailboundingsphere.cpp (renamed from src/render/frontend/qboundingsphere.cpp)105
-rw-r--r--src/render/frontend/qlevelofdetailboundingsphere.h (renamed from src/render/frontend/qboundingsphere.h)35
-rw-r--r--src/render/frontend/render-frontend.pri9
-rw-r--r--src/render/jobs/updatelevelofdetailjob.cpp4
10 files changed, 120 insertions, 210 deletions
diff --git a/src/render/backend/levelofdetail.cpp b/src/render/backend/levelofdetail.cpp
index 9ff0ef532..d7806fc4d 100644
--- a/src/render/backend/levelofdetail.cpp
+++ b/src/render/backend/levelofdetail.cpp
@@ -39,7 +39,6 @@
#include "levelofdetail_p.h"
#include <Qt3DRender/QLevelOfDetail>
-#include <Qt3DRender/QBoundingSphere>
#include <Qt3DRender/private/qlevelofdetail_p.h>
#include <Qt3DRender/private/stringtoint_p.h>
#include <Qt3DCore/qpropertyupdatedchange.h>
@@ -56,7 +55,7 @@ LevelOfDetail::LevelOfDetail()
: BackendNode(BackendNode::ReadWrite)
, m_currentIndex(0)
, m_thresholdType(QLevelOfDetail::DistanceToCamera)
- , m_radius(1.f)
+ , m_volumeOverride()
{
}
@@ -73,8 +72,7 @@ void LevelOfDetail::initializeFromPeer(const QNodeCreatedChangeBasePtr &change)
m_currentIndex = data.currentIndex;
m_thresholdType = data.thresholdType;
m_thresholds = data.thresholds;
- m_radius = data.radius;
- m_center = data.center;
+ m_volumeOverride = data.volumeOverride;
}
void LevelOfDetail::cleanup()
@@ -86,23 +84,16 @@ void LevelOfDetail::sceneChangeEvent(const QSceneChangePtr &e)
{
if (e->type() == PropertyUpdated) {
const QPropertyUpdatedChangePtr &propertyChange = qSharedPointerCast<QPropertyUpdatedChange>(e);
- if (propertyChange->propertyName() == QByteArrayLiteral("currentIndex")) {
+ if (propertyChange->propertyName() == QByteArrayLiteral("currentIndex"))
m_currentIndex = propertyChange->value().value<int>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("camera")) {
+ else if (propertyChange->propertyName() == QByteArrayLiteral("camera"))
m_camera = propertyChange->value().value<Qt3DCore::QNodeId>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("thresholdType")) {
+ else if (propertyChange->propertyName() == QByteArrayLiteral("thresholdType"))
m_thresholdType = propertyChange->value().value<QLevelOfDetail::ThresholdType>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("thresholds")) {
+ else if (propertyChange->propertyName() == QByteArrayLiteral("thresholds"))
m_thresholds = propertyChange->value().value<QVector<qreal>>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("center")) {
- m_center = propertyChange->value().value<QVector3D>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("radius")) {
- m_radius = propertyChange->value().value<float>();
- } else if (propertyChange->propertyName() == QByteArrayLiteral("volumeOverride")) {
- auto volumeOverride = propertyChange->value().value<Qt3DRender::QBoundingSphere*>();
- m_center = volumeOverride ? volumeOverride->center() : QVector3D();
- m_radius = volumeOverride ? volumeOverride->radius() : -1.f;
- }
+ else if (propertyChange->propertyName() == QByteArrayLiteral("volumeOverride"))
+ m_volumeOverride = propertyChange->value().value<Qt3DRender::QLevelOfDetailBoundingSphere>();
}
markDirty(AbstractRenderer::GeometryDirty);
diff --git a/src/render/backend/levelofdetail_p.h b/src/render/backend/levelofdetail_p.h
index 83809a631..05f5686bb 100644
--- a/src/render/backend/levelofdetail_p.h
+++ b/src/render/backend/levelofdetail_p.h
@@ -79,8 +79,9 @@ public:
int currentIndex() const { return m_currentIndex; }
QLevelOfDetail::ThresholdType thresholdType() const { return m_thresholdType; }
QVector<qreal> thresholds() const { return m_thresholds; }
- float radius() const { return m_radius; }
- QVector3D center() const { return m_center; }
+ float radius() const { return m_volumeOverride.radius(); }
+ QVector3D center() const { return m_volumeOverride.center(); }
+ bool hasBoundingVolumeOverride() const { return !m_volumeOverride.isEmpty(); }
void setCurrentIndex(int currentIndex);
@@ -90,8 +91,7 @@ private:
int m_currentIndex;
QLevelOfDetail::ThresholdType m_thresholdType;
QVector<qreal> m_thresholds;
- float m_radius;
- QVector3D m_center;
+ QLevelOfDetailBoundingSphere m_volumeOverride;
};
} // namespace Render
diff --git a/src/render/frontend/qboundingsphere_p.h b/src/render/frontend/qboundingsphere_p.h
deleted file mode 100644
index 171e4440f..000000000
--- a/src/render/frontend/qboundingsphere_p.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt3D module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QT3DRENDER_QBOUNDINGSPHERE_P_H
-#define QT3DRENDER_QBOUNDINGSPHERE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <private/qobject_p.h>
-#include <qboundingsphere.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace Qt3DRender {
-
-class QT3DRENDERSHARED_EXPORT QBoundingSpherePrivate : public QObjectPrivate
-{
-public:
- QBoundingSpherePrivate();
-
- Q_DECLARE_PUBLIC(QBoundingSphere)
-
- QVector3D m_center;
- float m_radius;
-};
-
-} // namespace Qt3DRender
-
-QT_END_NAMESPACE
-
-#endif // QT3DRENDER_QBOUNDINGSPHERE_P_H
diff --git a/src/render/frontend/qlevelofdetail.cpp b/src/render/frontend/qlevelofdetail.cpp
index 0d70803ca..b62bf2277 100644
--- a/src/render/frontend/qlevelofdetail.cpp
+++ b/src/render/frontend/qlevelofdetail.cpp
@@ -37,7 +37,6 @@
**
****************************************************************************/
-#include "qboundingsphere.h"
#include "qlevelofdetail.h"
#include "qlevelofdetail_p.h"
#include "qcamera.h"
@@ -52,22 +51,9 @@ QLevelOfDetailPrivate::QLevelOfDetailPrivate()
, m_camera(nullptr)
, m_currentIndex(0)
, m_thresholdType(QLevelOfDetail::DistanceToCamera)
- , m_volumeOverride(nullptr)
+ , m_volumeOverride()
{
Q_Q(QLevelOfDetail);
- m_volumeOverride = new QBoundingSphere(q);
- QObject::connect(m_volumeOverride, SIGNAL(radiusChanged(float)), q, SLOT(_q_radiusChanged(float)));
- QObject::connect(m_volumeOverride, SIGNAL(centerChanged(const QVector3D &)), q, SLOT(_q_centerChanged(const QVector3D&)));
-}
-
-void QLevelOfDetailPrivate::_q_radiusChanged(float radius)
-{
- notifyPropertyChange("radius", radius);
-}
-
-void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D &center)
-{
- notifyPropertyChange("center", center);
}
/*!
@@ -207,9 +193,9 @@ void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D &center)
* Specifies what is used as a proxy for the entity when computing distance
* or size.
*
- * \value BoundingSphere use the bounding sphere specified by the center
+ * \value LevelOfDetailBoundingSphere use the bounding sphere specified by the center
* and radius properties.
- * \value ChildrenBoundingSphere use the bounding sphere of the entity the
+ * \value Children LevelOfDetailBoundingSphere use the bounding sphere of the entity the
* component is attached to.
*/
@@ -220,9 +206,9 @@ void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D &center)
* or size.
*
* \list
- * \li BoundingSphere use the bounding sphere specified by the center
+ * \li LevelOfDetailBoundingSphere use the bounding sphere specified by the center
* and radius properties.
- * \li ChildrenBoundingSphere use the bounding sphere of the entity the
+ * \li Children LevelOfDetailBoundingSphere use the bounding sphere of the entity the
* component is attached to.
* \endlist
* \sa Qt3DRender::QLevelOfDetail::SizeProxyMode
@@ -306,7 +292,7 @@ void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D &center)
* If this value to null, the bounding volume of the entity is used. Care must be
* taken that this bounding volume never becomes invalid.
*
- * \sa BoundingSphere
+ * \sa LevelOfDetailBoundingSphere
*/
/*!
@@ -319,7 +305,7 @@ void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D &center)
* If this value to nullptr, the bounding volume of the entity is used. Care must be
* taken that this bounding volume never becomes invalid.
*
- * \sa QBoundingSphere
+ * \sa LevelOfDetailBoundingSphere
*/
@@ -354,8 +340,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QLevelOfDetail::createNodeCreationChange() c
data.currentIndex = d->m_currentIndex;
data.thresholdType = d->m_thresholdType;
data.thresholds = d->m_thresholds;
- data.radius = d->m_volumeOverride ? d->m_volumeOverride->radius() : -1.f;
- data.center = d->m_volumeOverride ? d->m_volumeOverride->center() : QVector3D();
+ data.volumeOverride = d->m_volumeOverride;
return creationChange;
}
@@ -441,6 +426,11 @@ QVector<qreal> QLevelOfDetail::thresholds() const
return d->m_thresholds;
}
+QLevelOfDetailBoundingSphere QLevelOfDetail::createBoundingSphere(const QVector3D &center, float radius)
+{
+ return QLevelOfDetailBoundingSphere(center, radius);
+}
+
/*!
* Sets the range values.
* \sa Qt3DRender::QLevelOfDetail::thresholdType
@@ -454,23 +444,17 @@ void QLevelOfDetail::setThresholds(QVector<qreal> thresholds)
}
}
-QBoundingSphere *QLevelOfDetail::volumeOverride() const
+QLevelOfDetailBoundingSphere QLevelOfDetail::volumeOverride() const
{
Q_D(const QLevelOfDetail);
return d->m_volumeOverride;
}
-void QLevelOfDetail::setVolumeOverride(QBoundingSphere *volumeOverride)
+void QLevelOfDetail::setVolumeOverride(const QLevelOfDetailBoundingSphere &volumeOverride)
{
Q_D(QLevelOfDetail);
if (d->m_volumeOverride != volumeOverride) {
- if (d->m_volumeOverride)
- disconnect(d->m_volumeOverride);
d->m_volumeOverride = volumeOverride;
- if (d->m_volumeOverride) {
- connect(d->m_volumeOverride, SIGNAL(radiusChanged(float)), this, SLOT(_q_radiusChanged(float)));
- connect(d->m_volumeOverride, SIGNAL(centerChanged(const QVector3D &)), this, SLOT(_q_centerChanged(const QVector3D&)));
- }
emit volumeOverrideChanged(volumeOverride);
}
}
diff --git a/src/render/frontend/qlevelofdetail.h b/src/render/frontend/qlevelofdetail.h
index f3325aea0..c0d56c9cd 100644
--- a/src/render/frontend/qlevelofdetail.h
+++ b/src/render/frontend/qlevelofdetail.h
@@ -42,6 +42,7 @@
#include <Qt3DCore/qcomponent.h>
#include <Qt3DRender/qt3drender_global.h>
+#include <Qt3DRender/qlevelofdetailboundingsphere.h>
#include <QVector3D>
@@ -50,7 +51,6 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
class QCamera;
-class QBoundingSphere;
class QLevelOfDetailPrivate;
class QT3DRENDERSHARED_EXPORT QLevelOfDetail : public Qt3DCore::QComponent
@@ -60,7 +60,7 @@ class QT3DRENDERSHARED_EXPORT QLevelOfDetail : public Qt3DCore::QComponent
Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
Q_PROPERTY(ThresholdType thresholdType READ thresholdType WRITE setThresholdType NOTIFY thresholdTypeChanged)
Q_PROPERTY(QVector<qreal> thresholds READ thresholds WRITE setThresholds NOTIFY thresholdsChanged)
- Q_PROPERTY(Qt3DRender::QBoundingSphere *volumeOverride READ volumeOverride WRITE setVolumeOverride NOTIFY volumeOverrideChanged)
+ Q_PROPERTY(Qt3DRender::QLevelOfDetailBoundingSphere volumeOverride READ volumeOverride WRITE setVolumeOverride NOTIFY volumeOverrideChanged)
public:
enum ThresholdType {
@@ -76,21 +76,23 @@ public:
int currentIndex() const;
ThresholdType thresholdType() const;
QVector<qreal> thresholds() const;
- QBoundingSphere *volumeOverride() const;
+ QLevelOfDetailBoundingSphere volumeOverride() const;
+
+ Q_INVOKABLE QLevelOfDetailBoundingSphere createBoundingSphere(const QVector3D &center, float radius);
public Q_SLOTS:
void setCamera(QCamera *camera);
void setCurrentIndex(int currentIndex);
void setThresholdType(ThresholdType thresholdType);
void setThresholds(QVector<qreal> thresholds);
- void setVolumeOverride(QBoundingSphere *volumeOverride);
+ void setVolumeOverride(const QLevelOfDetailBoundingSphere &volumeOverride);
Q_SIGNALS:
void cameraChanged(QCamera *camera);
void currentIndexChanged(int currentIndex);
void thresholdTypeChanged(ThresholdType thresholdType);
void thresholdsChanged(QVector<qreal> thresholds);
- void volumeOverrideChanged(QBoundingSphere *volumeOverride);
+ void volumeOverrideChanged(const QLevelOfDetailBoundingSphere &volumeOverride);
protected:
explicit QLevelOfDetail(QLevelOfDetailPrivate &dd, Qt3DCore::QNode *parent = nullptr);
@@ -99,12 +101,12 @@ protected:
private:
Q_DECLARE_PRIVATE(QLevelOfDetail)
- Q_PRIVATE_SLOT(d_func(), void _q_radiusChanged(float))
- Q_PRIVATE_SLOT(d_func(), void _q_centerChanged(const QVector3D&))
};
} // namespace Qt3DRender
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(Qt3DRender::QLevelOfDetailBoundingSphere)
+
#endif // QT3DRENDER_QLEVELOFDETAIL_H
diff --git a/src/render/frontend/qlevelofdetail_p.h b/src/render/frontend/qlevelofdetail_p.h
index ab25e9ad3..1d7a05a71 100644
--- a/src/render/frontend/qlevelofdetail_p.h
+++ b/src/render/frontend/qlevelofdetail_p.h
@@ -53,6 +53,7 @@
#include <private/qcomponent_p.h>
#include <qlevelofdetail.h>
+#include <Qt3DRender/qlevelofdetailboundingsphere.h>
#include <QVector3D>
@@ -74,7 +75,7 @@ public:
int m_currentIndex;
QLevelOfDetail::ThresholdType m_thresholdType;
QVector<qreal> m_thresholds;
- QPointer<QBoundingSphere> m_volumeOverride;
+ QLevelOfDetailBoundingSphere m_volumeOverride;
};
struct QLevelOfDetailData
@@ -83,8 +84,7 @@ struct QLevelOfDetailData
int currentIndex;
QLevelOfDetail::ThresholdType thresholdType;
QVector<qreal> thresholds;
- float radius;
- QVector3D center;
+ QLevelOfDetailBoundingSphere volumeOverride;
};
} // namespace Qt3DRender
diff --git a/src/render/frontend/qboundingsphere.cpp b/src/render/frontend/qlevelofdetailboundingsphere.cpp
index 4d8b1aba8..eae92a0d7 100644
--- a/src/render/frontend/qboundingsphere.cpp
+++ b/src/render/frontend/qlevelofdetailboundingsphere.cpp
@@ -37,110 +37,121 @@
**
****************************************************************************/
-#include "qboundingsphere.h"
-#include "qboundingsphere_p.h"
+#include "qlevelofdetailboundingsphere.h"
+#include <QSharedData>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-QBoundingSpherePrivate::QBoundingSpherePrivate()
- : QObjectPrivate()
- , m_radius(1.f)
+class QLevelOfDetailBoundingSpherePrivate: public QSharedData
{
+public:
+ QLevelOfDetailBoundingSpherePrivate()
+ : QSharedData()
+ , m_radius(0.0f)
+ {}
-}
+ QLevelOfDetailBoundingSpherePrivate(const QVector3D &center, float radius)
+ : QSharedData()
+ , m_center(center)
+ , m_radius(radius)
+ {}
+
+ ~QLevelOfDetailBoundingSpherePrivate()
+ {}
+
+ QVector3D m_center;
+ float m_radius;
+};
/*!
- \class Qt3DRender::QBoundingSphere
+ \class Qt3DRender::QLevelOfDetailBoundingSphere
\inmodule Qt3DRender
\since 5.9
- \brief The QBoundingSphere class provides a simple spherical volume, defined by it's center and radius.
+ \brief The QLevelOfDetailBoundingSphere class provides a simple spherical volume, defined by it's center and radius.
*/
/*!
\qmltype LevelOfDetail
- \instantiates Qt3DRender::QLevelOfDetail
+ \instantiates Qt3DRender::QLevelOfDetailBoundingSphere
\inherits Component3D
\inqmlmodule Qt3D.Render
- \brief The BoundingSphere class provides a simple spherical volume, defined by it's center and radius.
+ \brief The LevelOfDetailBoundingSphere class provides a simple spherical volume, defined by it's center and radius.
*/
/*!
- * \qmlproperty QVector3D BoundingSphere::center
+ * \qmlproperty QVector3D LevelOfDetailBoundingSphere::center
*
* Specifies the center of the bounding sphere
*/
/*!
- * \property QBoundingSphere::center
+ * \property QLevelOfDetailBoundingSphere::center
*
* Specifies the center of the bounding sphere
*/
/*!
- * \qmlproperty qreal BoundingSphere::radius
+ * \qmlproperty qreal LevelOfDetailBoundingSphere::radius
*
* Specifies the radius of the bounding sphere
*/
/*!
- * \property QBoundingSphere::radius
+ * \property QLevelOfDetailBoundingSphere::radius
*
* Specifies the radius of the bounding sphere
*/
-/*! \fn Qt3DRender::QBoundingSphere::QBoundingSphere(QObject *parent)
- Constructs a new QBoundingSphere with the specified \a parent.
+/*! \fn Qt3DRender::QLevelOfDetailBoundingSphere::QLevelOfDetailBoundingSphere(const QVector3D &center = QVector3D(), float radius = -1.0f)
+ Constructs a new QLevelOfDetailBoundingSphere with the specified \a center and \a radius.
*/
-QBoundingSphere::QBoundingSphere(QObject *parent)
- : QObject(*new QBoundingSpherePrivate, parent)
+
+
+QLevelOfDetailBoundingSphere::QLevelOfDetailBoundingSphere(const QVector3D &center, float radius)
+ : d_ptr(new QLevelOfDetailBoundingSpherePrivate(center, radius))
{
+}
+QLevelOfDetailBoundingSphere::QLevelOfDetailBoundingSphere(const QLevelOfDetailBoundingSphere &other)
+ : d_ptr(other.d_ptr)
+{
}
-QBoundingSphere::QBoundingSphere(const QVector3D &center, float radius, QObject *parent)
- : QBoundingSphere(parent)
+QLevelOfDetailBoundingSphere::~QLevelOfDetailBoundingSphere()
{
- Q_D(QBoundingSphere);
- d->m_center = center;
- d->m_radius = radius;
}
-QVector3D QBoundingSphere::center() const
+QLevelOfDetailBoundingSphere &QLevelOfDetailBoundingSphere::operator =(const QLevelOfDetailBoundingSphere &other)
{
- Q_D(const QBoundingSphere);
- return d->m_center;
+ d_ptr = other.d_ptr;
+ return *this;
}
-float QBoundingSphere::radius() const
+QVector3D QLevelOfDetailBoundingSphere::center() const
{
- Q_D(const QBoundingSphere);
- return d->m_radius;
+ return d_ptr->m_center;
}
-/*!
- * Sets the radius of the bounding sphere.
- */
-void QBoundingSphere::setRadius(float radius)
+float QLevelOfDetailBoundingSphere::radius() const
{
- Q_D(QBoundingSphere);
- if (d->m_radius != radius) {
- d->m_radius = radius;
- emit radiusChanged(radius);
- }
+ return d_ptr->m_radius;
}
-/*!
- * Sets the center of the bounding sphere.
- */
-void QBoundingSphere::setCenter(const QVector3D &center)
+bool QLevelOfDetailBoundingSphere::isEmpty() const
+{
+ return d_ptr->m_radius <= 0.0f;
+}
+
+bool QLevelOfDetailBoundingSphere::operator ==(const QLevelOfDetailBoundingSphere &other) const
+{
+ return d_ptr->m_center == other.center() && other.d_ptr->m_radius == other.radius();
+}
+
+bool QLevelOfDetailBoundingSphere::operator !=(const QLevelOfDetailBoundingSphere &other) const
{
- Q_D(QBoundingSphere);
- if (d->m_center != center) {
- d->m_center = center;
- emit centerChanged(center);
- }
+ return !(*this == other);
}
} // namespace Qt3DRender
diff --git a/src/render/frontend/qboundingsphere.h b/src/render/frontend/qlevelofdetailboundingsphere.h
index e7f9b7784..659b6c6cc 100644
--- a/src/render/frontend/qboundingsphere.h
+++ b/src/render/frontend/qlevelofdetailboundingsphere.h
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QT3DRENDER_QBOUNDINGSPHERE_H
-#define QT3DRENDER_QBOUNDINGSPHERE_H
+#ifndef QT3DRENDER_QLEVELOFDETAILBOUNDINGSPHERE_H
+#define QT3DRENDER_QLEVELOFDETAILBOUNDINGSPHERE_H
#include <Qt3DCore/qcomponent.h>
#include <Qt3DRender/qt3drender_global.h>
@@ -49,34 +49,33 @@ QT_BEGIN_NAMESPACE
namespace Qt3DRender {
-class QBoundingSpherePrivate;
+class QLevelOfDetailBoundingSpherePrivate;
-class QT3DRENDERSHARED_EXPORT QBoundingSphere : public QObject
+class QT3DRENDERSHARED_EXPORT QLevelOfDetailBoundingSphere
{
- Q_OBJECT
- Q_PROPERTY(QVector3D center READ center WRITE setCenter NOTIFY centerChanged)
- Q_PROPERTY(float radius READ radius WRITE setRadius NOTIFY radiusChanged)
+ Q_GADGET
+ Q_PROPERTY(QVector3D center READ center CONSTANT)
+ Q_PROPERTY(float radius READ radius CONSTANT)
public:
- explicit QBoundingSphere(QObject *parent = nullptr);
- QBoundingSphere(const QVector3D &center, float radius, QObject *parent = nullptr);
+ explicit QLevelOfDetailBoundingSphere(const QVector3D &center = QVector3D(), float radius = 1.0f);
+ QLevelOfDetailBoundingSphere(const QLevelOfDetailBoundingSphere &other);
+ ~QLevelOfDetailBoundingSphere();
+
+ QLevelOfDetailBoundingSphere &operator =(const QLevelOfDetailBoundingSphere &other);
QVector3D center() const;
float radius() const;
-public Q_SLOTS:
- void setRadius(float radius);
- void setCenter(const QVector3D &center);
-
-Q_SIGNALS:
- void radiusChanged(float radius);
- void centerChanged(const QVector3D &center);
+ bool isEmpty() const;
+ bool operator ==(const QLevelOfDetailBoundingSphere &other) const;
+ bool operator !=(const QLevelOfDetailBoundingSphere &other) const;
private:
- Q_DECLARE_PRIVATE(QBoundingSphere)
+ QSharedDataPointer<QLevelOfDetailBoundingSpherePrivate> d_ptr;
};
} // namespace Qt3DRender
QT_END_NAMESPACE
-#endif // QT3DRENDER_QBOUNDINGSPHERE_H
+#endif // QT3DRENDER_QLEVELOFDETAILBOUNDINGSPHERE_H
diff --git a/src/render/frontend/render-frontend.pri b/src/render/frontend/render-frontend.pri
index 7a27ba095..75666a270 100644
--- a/src/render/frontend/render-frontend.pri
+++ b/src/render/frontend/render-frontend.pri
@@ -2,8 +2,6 @@ INCLUDEPATH += $$PWD
HEADERS += \
$$PWD/qabstractfunctor.h \
- $$PWD/qboundingsphere.h \
- $$PWD/qboundingsphere_p.h \
$$PWD/qrenderaspect.h \
$$PWD/qrenderaspect_p.h \
$$PWD/qitemmodelbuffer_p.h \
@@ -29,11 +27,11 @@ HEADERS += \
$$PWD/qcomputecommand.h \
$$PWD/qrenderplugin_p.h \
$$PWD/qrenderpluginfactory_p.h \
- $$PWD/qrenderpluginfactoryif_p.h
+ $$PWD/qrenderpluginfactoryif_p.h \
+ $$PWD/qlevelofdetailboundingsphere.h
SOURCES += \
$$PWD/qabstractfunctor.cpp \
- $$PWD/qboundingsphere.cpp \
$$PWD/qrenderaspect.cpp \
$$PWD/qitemmodelbuffer.cpp \
$$PWD/sphere.cpp \
@@ -48,5 +46,6 @@ SOURCES += \
$$PWD/qrendertargetoutput.cpp \
$$PWD/qcomputecommand.cpp \
$$PWD/qrenderpluginfactory.cpp \
- $$PWD/qrenderpluginfactoryif.cpp
+ $$PWD/qrenderpluginfactoryif.cpp \
+ $$PWD/qlevelofdetailboundingsphere.cpp
diff --git a/src/render/jobs/updatelevelofdetailjob.cpp b/src/render/jobs/updatelevelofdetailjob.cpp
index 940d26850..36b83263a 100644
--- a/src/render/jobs/updatelevelofdetailjob.cpp
+++ b/src/render/jobs/updatelevelofdetailjob.cpp
@@ -162,7 +162,7 @@ void UpdateLevelOfDetailJob::updateEntityLodByDistance(Entity *entity, LevelOfDe
const QVector<qreal> thresholds = lod->thresholds();
QVector3D center = lod->center();
- if (lod->radius() > 0.f || entity->worldBoundingVolume() == nullptr) {
+ if (lod->hasBoundingVolumeOverride() || entity->worldBoundingVolume() == nullptr) {
center = *entity->worldTransform() * center;
} else {
center = entity->worldBoundingVolume()->center();
@@ -198,7 +198,7 @@ void UpdateLevelOfDetailJob::updateEntityLodByScreenArea(Entity *entity, LevelOf
const QVector<qreal> thresholds = lod->thresholds();
Sphere bv(lod->center(), lod->radius());
- if (lod->radius() <= 0.f && entity->worldBoundingVolume() != nullptr) {
+ if (!lod->hasBoundingVolumeOverride() && entity->worldBoundingVolume() != nullptr) {
bv = *(entity->worldBoundingVolume());
} else {
bv.transform(*entity->worldTransform());