summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/core-components/qcamera.cpp91
-rw-r--r--src/core/core-components/qcamera.h14
-rw-r--r--src/core/core-components/qcamera_p.h16
-rw-r--r--src/core/transforms/qtransform.cpp72
-rw-r--r--src/core/transforms/qtransform.h16
-rw-r--r--src/core/transforms/qtransform_p.h14
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