diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-02-16 18:43:53 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-02-24 11:16:02 +0000 |
commit | ddc878f2fc978a3b740b7ccf9258c824c6ba959a (patch) | |
tree | cfad9b1ded31b3cb6490fa5128742e8aff0cf1d5 /src/render | |
parent | 42af57acc976cf3142623ac2b13dabbfcf9e643a (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.cpp | 25 | ||||
-rw-r--r-- | src/render/backend/levelofdetail_p.h | 8 | ||||
-rw-r--r-- | src/render/frontend/qboundingsphere_p.h | 76 | ||||
-rw-r--r-- | src/render/frontend/qlevelofdetail.cpp | 46 | ||||
-rw-r--r-- | src/render/frontend/qlevelofdetail.h | 16 | ||||
-rw-r--r-- | src/render/frontend/qlevelofdetail_p.h | 6 | ||||
-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.pri | 9 | ||||
-rw-r--r-- | src/render/jobs/updatelevelofdetailjob.cpp | 4 |
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 ¢er) -{ - notifyPropertyChange("center", center); } /*! @@ -207,9 +193,9 @@ void QLevelOfDetailPrivate::_q_centerChanged(const QVector3D ¢er) * 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 ¢er) * 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 ¢er) * 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 ¢er) * 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 ¢er, 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 ¢er, 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 ¢er, 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 ¢er = 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 ¢er, float radius) + : d_ptr(new QLevelOfDetailBoundingSpherePrivate(center, radius)) { +} +QLevelOfDetailBoundingSphere::QLevelOfDetailBoundingSphere(const QLevelOfDetailBoundingSphere &other) + : d_ptr(other.d_ptr) +{ } -QBoundingSphere::QBoundingSphere(const QVector3D ¢er, 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 ¢er) +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 ¢er, float radius, QObject *parent = nullptr); + explicit QLevelOfDetailBoundingSphere(const QVector3D ¢er = 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 ¢er); - -Q_SIGNALS: - void radiusChanged(float radius); - void centerChanged(const QVector3D ¢er); + 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()); |