diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/core-components/qcamera.cpp | 91 | ||||
-rw-r--r-- | src/core/core-components/qcamera.h | 14 | ||||
-rw-r--r-- | src/core/core-components/qcamera_p.h | 16 | ||||
-rw-r--r-- | src/core/transforms/qtransform.cpp | 72 | ||||
-rw-r--r-- | src/core/transforms/qtransform.h | 16 | ||||
-rw-r--r-- | src/core/transforms/qtransform_p.h | 14 |
6 files changed, 72 insertions, 151 deletions
diff --git a/src/core/core-components/qcamera.cpp b/src/core/core-components/qcamera.cpp index 8812235ac..bfbe90d26 100644 --- a/src/core/core-components/qcamera.cpp +++ b/src/core/core-components/qcamera.cpp @@ -47,9 +47,13 @@ namespace Qt3DCore { */ QCameraPrivate::QCameraPrivate() : QEntityPrivate() + , m_position(0.0f, 0.0f, 0.0f) + , m_viewCenter(0.0f, 0.0f, -100.0f) + , m_upVector(0.0f, 1.0f, 0.0f) + , m_cameraToCenter(m_viewCenter - m_position) + , m_viewMatrixDirty(false) , m_lens(new QCameraLens()) , m_transform(new QTransform()) - , m_lookAt(new QLookAtTransform()) { } @@ -61,8 +65,8 @@ QCameraPrivate::QCameraPrivate() \since 5.5 */ -QCamera::QCamera(QNode *parent) : - QEntity(*new QCameraPrivate, parent) +QCamera::QCamera(QNode *parent) + : QEntity(*new QCameraPrivate, parent) { QObject::connect(d_func()->m_lens, SIGNAL(projectionTypeChanged()), this, SIGNAL(projectionMatrixChanged())); QObject::connect(d_func()->m_lens, SIGNAL(nearPlaneChanged()), this, SIGNAL(nearPlaneChanged())); @@ -74,11 +78,7 @@ QCamera::QCamera(QNode *parent) : QObject::connect(d_func()->m_lens, SIGNAL(bottomChanged()), this, SIGNAL(bottomChanged())); QObject::connect(d_func()->m_lens, SIGNAL(topChanged()), this, SIGNAL(topChanged())); QObject::connect(d_func()->m_lens, SIGNAL(projectionMatrixChanged()), this, SIGNAL(projectionMatrixChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(positionChanged()), this, SIGNAL(positionChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(upVectorChanged()), this, SIGNAL(upVectorChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(viewCenterChanged()), this, SIGNAL(viewCenterChanged())); - QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(matrixChanged())); - d_func()->m_transform->addTransform(d_func()->m_lookAt); + QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(viewMatrixChanged())); addComponent(d_func()->m_lens); addComponent(d_func()->m_transform); } @@ -102,11 +102,7 @@ QCamera::QCamera(QCameraPrivate &dd, QNode *parent) QObject::connect(d_func()->m_lens, SIGNAL(bottomChanged()), this, SIGNAL(bottomChanged())); QObject::connect(d_func()->m_lens, SIGNAL(topChanged()), this, SIGNAL(topChanged())); QObject::connect(d_func()->m_lens, SIGNAL(projectionMatrixChanged()), this, SIGNAL(projectionMatrixChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(positionChanged()), this, SIGNAL(positionChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(upVectorChanged()), this, SIGNAL(upVectorChanged())); - QObject::connect(d_func()->m_lookAt, SIGNAL(viewCenterChanged()), this, SIGNAL(viewCenterChanged())); - QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(matrixChanged())); - d_func()->m_transform->addTransform(d_func()->m_lookAt); + QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(viewMatrixChanged())); addComponent(d_func()->m_lens); addComponent(d_func()->m_transform); } @@ -123,20 +119,13 @@ QTransform *QCamera::transform() const return d->m_transform; } -QLookAtTransform *QCamera::lookAt() const -{ - Q_D(const QCamera); - return d->m_lookAt; -} - -void QCamera::translate( const QVector3D& vLocal, CameraTranslationOption option ) +void QCamera::translate(const QVector3D &vLocal, CameraTranslationOption option) { QVector3D viewVector = viewCenter() - position(); // From "camera" position to view center // Calculate the amount to move by in world coordinates QVector3D vWorld; - if (!qFuzzyIsNull(vLocal.x())) - { + if (!qFuzzyIsNull(vLocal.x())) { // Calculate the vector for the local x axis const QVector3D x = QVector3D::crossProduct(viewVector, upVector()).normalized(); vWorld += vLocal.x() * x; @@ -168,19 +157,19 @@ void QCamera::translate( const QVector3D& vLocal, CameraTranslationOption option setUpVector(QVector3D::crossProduct(x, viewVector).normalized()); } -void QCamera::translateWorld(const QVector3D& vWorld , CameraTranslationOption option ) +void QCamera::translateWorld(const QVector3D &vWorld, CameraTranslationOption option) { // Update the camera position using the calculated world vector setPosition(position() + vWorld); // May be also update the view center coordinates - if ( option == TranslateViewCenter ) + if (option == TranslateViewCenter) setViewCenter(viewCenter() + vWorld); } QQuaternion QCamera::tiltRotation(float angle) const { - const QVector3D viewVector = viewCenter() - position(); + const QVector3D viewVector = viewCenter() - position(); const QVector3D xBasis = QVector3D::crossProduct(upVector(), viewVector.normalized()).normalized(); return QQuaternion::fromAxisAndAngle(xBasis, -angle); } @@ -280,7 +269,6 @@ void QCamera::setProjectionType(QCameraLens::ProjectionType type) \value CameraLens.OrthographicProjection Orthographic projection \value CameraLens.PerspectiveProjection Perspective projection */ - QCameraLens::ProjectionType QCamera::projectionType() const { Q_D(const QCamera); @@ -296,7 +284,6 @@ void QCamera::setNearPlane(float nearPlane) /*! \qmlproperty float Qt3DCore::Camera::nearPlane */ - float QCamera::nearPlane() const { Q_D(const QCamera); @@ -312,7 +299,6 @@ void QCamera::setFarPlane(float farPlane) /*! \qmlproperty float Qt3DCore::Camera::farPlane */ - float QCamera::farPlane() const { Q_D(const QCamera); @@ -328,7 +314,6 @@ void QCamera::setFieldOfView(float fieldOfView) /*! \qmlproperty float Qt3DCore::Camera::fieldOfView */ - float QCamera::fieldOfView() const { Q_D(const QCamera); @@ -344,7 +329,6 @@ void QCamera::setAspectRatio(float aspectRatio) /*! \qmlproperty float Qt3DCore::Camera::aspectRatio */ - float QCamera::aspectRatio() const { Q_D(const QCamera); @@ -360,7 +344,6 @@ void QCamera::setLeft(float left) /*! \qmlproperty float Qt3DCore::Camera::left */ - float QCamera::left() const { Q_D(const QCamera); @@ -376,7 +359,6 @@ void QCamera::setRight(float right) /*! \qmlproperty float Qt3DCore::Camera::right */ - float QCamera::right() const { Q_D(const QCamera); @@ -392,7 +374,6 @@ void QCamera::setBottom(float bottom) /*! \qmlproperty float Qt3DCore::Camera::bottom */ - float QCamera::bottom() const { Q_D(const QCamera); @@ -408,7 +389,6 @@ void QCamera::setTop(float top) /*! \qmlproperty float Qt3DCore::Camera::top */ - float QCamera::top() const { Q_D(const QCamera); @@ -419,7 +399,6 @@ float QCamera::top() const \qmlproperty matrix4x4 Qt3DCore::Camera::projectionMatrix \readonly */ - QMatrix4x4 QCamera::projectionMatrix() const { Q_D(const QCamera); @@ -429,56 +408,74 @@ QMatrix4x4 QCamera::projectionMatrix() const void QCamera::setPosition(const QVector3D &position) { Q_D(QCamera); - d->m_lookAt->setPosition(position); + d->m_position = position; + d->m_cameraToCenter = d->m_viewCenter - position; + d->m_viewMatrixDirty = true; + emit positionChanged(); + emit viewVectorChanged(); + d->updateViewMatrix(); } /*! \qmlproperty vector3d Qt3DCore::Camera::position */ - QVector3D QCamera::position() const { Q_D(const QCamera); - return d->m_lookAt->position(); - + return d->m_position; } void QCamera::setUpVector(const QVector3D &upVector) { Q_D(QCamera); - d->m_lookAt->setUpVector(upVector); + d->m_upVector = upVector; + d->m_viewMatrixDirty = true; + emit upVectorChanged(); + d->updateViewMatrix(); } /*! \qmlproperty vector3d Qt3DCore::Camera::upVector */ - QVector3D QCamera::upVector() const { Q_D(const QCamera); - return d->m_lookAt->upVector(); + return d->m_upVector; } void QCamera::setViewCenter(const QVector3D &viewCenter) { Q_D(QCamera); - d->m_lookAt->setViewCenter(viewCenter); + d->m_viewCenter = viewCenter; + d->m_cameraToCenter = viewCenter - d->m_position; + d->m_viewMatrixDirty = true; + emit viewCenterChanged(); + emit viewVectorChanged(); + d->updateViewMatrix(); } /*! \qmlproperty vector3d Qt3DCore::Camera::viewCenter */ - QVector3D QCamera::viewCenter() const { Q_D(const QCamera); - return d->m_lookAt->viewCenter(); + return d->m_viewCenter; +} + +/*! + \qmlproperty vector3d Qt3DCore::Camera::viewVector +*/ +QVector3D QCamera::viewVector() const +{ + Q_D(const QCamera); + return d->m_cameraToCenter; } /*! - \qmlproperty matrix4x4 Qt3DCore::Camera::matrix + \qmlproperty matrix4x4 Qt3DCore::Camera::viewMatrix */ -QMatrix4x4 QCamera::matrix() const +QMatrix4x4 QCamera::viewMatrix() const { Q_D(const QCamera); return d->m_transform->matrix(); diff --git a/src/core/core-components/qcamera.h b/src/core/core-components/qcamera.h index 305cae930..e44f0778c 100644 --- a/src/core/core-components/qcamera.h +++ b/src/core/core-components/qcamera.h @@ -69,7 +69,8 @@ class QT3DCORESHARED_EXPORT QCamera : public QEntity Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(QVector3D upVector READ upVector WRITE setUpVector NOTIFY upVectorChanged) Q_PROPERTY(QVector3D viewCenter READ viewCenter WRITE setViewCenter NOTIFY viewCenterChanged) - Q_PROPERTY(QMatrix4x4 matrix READ matrix NOTIFY matrixChanged) + Q_PROPERTY(QVector3D viewVector READ viewVector NOTIFY viewVectorChanged) + Q_PROPERTY(QMatrix4x4 viewMatrix READ viewMatrix NOTIFY viewMatrixChanged) public: explicit QCamera(QNode *parent = 0); @@ -83,7 +84,6 @@ public: QCameraLens *lens() const; QTransform *transform() const; - QLookAtTransform *lookAt() const; QQuaternion tiltRotation(float angle) const; QQuaternion panRotation(float angle) const; @@ -91,10 +91,10 @@ public: QQuaternion rotation(float angle, const QVector3D &axis) const; // Translate relative to camera orientation axes - Q_INVOKABLE void translate(const QVector3D& vLocal, CameraTranslationOption option = TranslateViewCenter ); + Q_INVOKABLE void translate(const QVector3D& vLocal, CameraTranslationOption option = TranslateViewCenter); // Translate relative to world axes - Q_INVOKABLE void translateWorld(const QVector3D& vWorld, CameraTranslationOption option = TranslateViewCenter ); + Q_INVOKABLE void translateWorld(const QVector3D& vWorld, CameraTranslationOption option = TranslateViewCenter); Q_INVOKABLE void tilt(float angle); Q_INVOKABLE void pan(float angle); @@ -147,7 +147,8 @@ public: void setViewCenter(const QVector3D &viewCenter); QVector3D viewCenter() const; - QMatrix4x4 matrix() const; + QVector3D viewVector() const; + QMatrix4x4 viewMatrix() const; Q_SIGNALS: void projectionTypeChanged(); @@ -163,7 +164,8 @@ Q_SIGNALS: void positionChanged(); void upVectorChanged(); void viewCenterChanged(); - void matrixChanged(); + void viewVectorChanged(); + void viewMatrixChanged(); protected: Q_DECLARE_PRIVATE(QCamera) diff --git a/src/core/core-components/qcamera_p.h b/src/core/core-components/qcamera_p.h index 995ec7277..bb73a3f4e 100644 --- a/src/core/core-components/qcamera_p.h +++ b/src/core/core-components/qcamera_p.h @@ -64,9 +64,23 @@ public: Q_DECLARE_PUBLIC(QCamera) + void updateViewMatrix() + { + QMatrix4x4 m; + m.lookAt(m_position, m_viewCenter, m_upVector); + m_transform->setMatrix(m); + } + + QVector3D m_position; + QVector3D m_viewCenter; + QVector3D m_upVector; + + QVector3D m_cameraToCenter; // The vector from the camera position to the view center + bool m_viewMatrixDirty; + + // Components QCameraLens *m_lens; QTransform *m_transform; - QLookAtTransform *m_lookAt; }; } // namespace Qt3DCore diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp index 0ca9f61de..2e177e3b2 100644 --- a/src/core/transforms/qtransform.cpp +++ b/src/core/transforms/qtransform.cpp @@ -51,56 +51,18 @@ namespace Qt3DCore { */ QTransformPrivate::QTransformPrivate() : QComponentPrivate() - , m_transformsDirty(false) , m_rotation() , m_scale(1.0f, 1.0f, 1.0f) , m_translation() + , m_matrixDirty(false) { } -void QTransformPrivate::_q_transformDestroyed(QObject *obj) -{ - QAbstractTransform *transform = static_cast<QAbstractTransform *>(obj); - if (m_transforms.removeOne(transform)) { - emit q_func()->transformsChanged(); - _q_update(); - } -} - -void QTransformPrivate::_q_update() -{ - if (!m_transformsDirty) - m_transformsDirty = true; - emit q_func()->matrixChanged(); -} - -QMatrix4x4 QTransformPrivate::applyTransforms() const -{ - QMatrix4x4 matrix; - Q_FOREACH (const QAbstractTransform *t, m_transforms) - matrix = t->transformMatrix() * matrix; - return matrix; -} - - QTransform::QTransform(QNode *parent) : QComponent(*new QTransformPrivate, parent) { } -QTransform::QTransform(QList<QAbstractTransform *> transforms, QNode *parent) - : QComponent(*new QTransformPrivate, parent) -{ - Q_FOREACH (QAbstractTransform *t, transforms) - addTransform(t); -} - -QTransform::QTransform(QAbstractTransform *transform, QNode *parent) - : QComponent(*new QTransformPrivate, parent) -{ - addTransform(transform); -} - /*! \internal */ QTransform::QTransform(QTransformPrivate &dd, QNode *parent) : QComponent(dd, parent) @@ -110,9 +72,6 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent) QTransform::~QTransform() { QNode::cleanup(); - Q_D(QTransform); - // boost destruction by avoiding _q_update()-s - d->m_transforms.clear(); } void QTransform::copy(const QNode *ref) @@ -127,35 +86,6 @@ void QTransform::copy(const QNode *ref) d_func()->m_translation = transform->translation(); } -QList<QAbstractTransform *> QTransform::transforms() const -{ - Q_D(const QTransform); - return d->m_transforms; -} - -void QTransform::addTransform(QAbstractTransform *transform) -{ - Q_D(QTransform); - if (transform == Q_NULLPTR || d->m_transforms.contains(transform)) - return; - d->m_transforms.append(transform); - QObject::connect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); - QObject::connect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*))); - emit transformsChanged(); - d->_q_update(); -} - -void QTransform::removeTransform(QAbstractTransform *transform) -{ - Q_D(QTransform); - if (!d->m_transforms.removeOne(transform)) - return; - QObject::disconnect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update())); - QObject::disconnect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*))); - emit transformsChanged(); - d->_q_update(); -} - void QTransform::setMatrix(const QMatrix4x4 &m) { Q_D(QTransform); diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h index 7a08d272e..80d680b7e 100644 --- a/src/core/transforms/qtransform.h +++ b/src/core/transforms/qtransform.h @@ -47,8 +47,6 @@ QT_BEGIN_NAMESPACE namespace Qt3DCore { -class QAbstractTransform; - class QTransformPrivate; class QT3DCORESHARED_EXPORT QTransform : public QComponent { @@ -61,8 +59,6 @@ class QT3DCORESHARED_EXPORT QTransform : public QComponent public: explicit QTransform(QNode *parent = 0); - QTransform(QList<QAbstractTransform *> transforms, QNode *parent = 0); - QTransform(QAbstractTransform *transform, QNode *parent = 0); ~QTransform(); float scale() const; @@ -84,27 +80,19 @@ public: QMatrix4x4 matrix() const; - QList<QAbstractTransform *> transforms() const; - void addTransform(QAbstractTransform *xform); - void removeTransform(QAbstractTransform *xform); - - public Q_SLOTS: void setScale(float scale); void setScale3D(const QVector3D &scale); void setRotation(const QQuaternion &rotation); void setTranslation(const QVector3D &translation); - void setMatrix(const QMatrix4x4 &matrix); Q_SIGNALS: - void matrixChanged(); - void transformsChanged(); - void scaleChanged(); void scale3DChanged(); void rotationChanged(); void translationChanged(); + void matrixChanged(); protected: QTransform(QTransformPrivate &dd, QNode *parent = 0); @@ -113,8 +101,6 @@ protected: private: Q_DECLARE_PRIVATE(QTransform) QT3D_CLONEABLE(QTransform) - Q_PRIVATE_SLOT(d_func(), void _q_transformDestroyed(QObject *obj)) - Q_PRIVATE_SLOT(d_func(), void _q_update()) }; } // namespace Qt3DCore diff --git a/src/core/transforms/qtransform_p.h b/src/core/transforms/qtransform_p.h index 523842d6e..1d98d901e 100644 --- a/src/core/transforms/qtransform_p.h +++ b/src/core/transforms/qtransform_p.h @@ -54,7 +54,6 @@ QT_BEGIN_NAMESPACE namespace Qt3DCore { -class QTransform; class QTransformPrivate : public QComponentPrivate { Q_DECLARE_PUBLIC(QTransform) @@ -62,22 +61,15 @@ class QTransformPrivate : public QComponentPrivate public: QTransformPrivate(); - void _q_transformDestroyed(QObject *obj); - void _q_update(); - QMatrix4x4 applyTransforms() const; - - mutable bool m_transformsDirty; - QList<QAbstractTransform*> m_transforms; - - mutable bool m_matrixDirty; - mutable QMatrix4x4 m_matrix; - // Stored in this order as QQuaternion is bigger than QVector3D // Operations are applied in the order of: // scale, rotation, translation QQuaternion m_rotation; QVector3D m_scale; QVector3D m_translation; + + mutable QMatrix4x4 m_matrix; + mutable bool m_matrixDirty; }; } // namespace Qt3DCore |