summaryrefslogtreecommitdiffstats
path: root/src/render/frontend/qcamera.cpp
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2018-01-22 12:37:25 +0000
committerSean Harmer <sean.harmer@kdab.com>2018-01-22 12:37:25 +0000
commit2d264ae985cf0e83b55959549093aed8c19298aa (patch)
treedc6b8553c433d9fa109ff02befa82ab9c1289699 /src/render/frontend/qcamera.cpp
parent2b19bde378e084331b1b7ba9aa076270492999bb (diff)
parent10d54271444d8a8de6a25cbf18fcd78f073a5a68 (diff)
Merge branch '5.9' into 5.10
Conflicts: src/render/frontend/qcamera.cpp tests/auto/render/render.pro Change-Id: I8f848a1f863d07eecb328965fbe27d74b8d442f1
Diffstat (limited to 'src/render/frontend/qcamera.cpp')
-rw-r--r--src/render/frontend/qcamera.cpp67
1 files changed, 50 insertions, 17 deletions
diff --git a/src/render/frontend/qcamera.cpp b/src/render/frontend/qcamera.cpp
index 13d689e0e..73ec2c71f 100644
--- a/src/render/frontend/qcamera.cpp
+++ b/src/render/frontend/qcamera.cpp
@@ -59,7 +59,28 @@ QCameraPrivate::QCameraPrivate()
, m_lens(new QCameraLens())
, m_transform(new Qt3DCore::QTransform())
{
- updateViewMatrix();
+ updateViewMatrixAndTransform(false);
+}
+
+void QCameraPrivate::updateViewMatrixAndTransform(bool doEmit)
+{
+ Q_Q(QCamera);
+
+ const QVector3D viewDirection = (m_viewCenter - m_position).normalized();
+
+ QMatrix4x4 transformMatrix;
+ transformMatrix.translate(m_position);
+
+ // Negative viewDirection because OpenGL convention is looking down -Z
+ transformMatrix.rotate(QQuaternion::fromDirection(-viewDirection, m_upVector.normalized()));
+
+ m_transform->setMatrix(transformMatrix);
+
+ QMatrix4x4 viewMatrix;
+ viewMatrix.lookAt(m_position, m_viewCenter, m_upVector);
+ m_viewMatrix = viewMatrix;
+ if (doEmit)
+ emit q->viewMatrixChanged();
}
/*!
@@ -292,29 +313,35 @@ QCameraPrivate::QCameraPrivate()
/*!
* \qmlproperty vector3d Qt3D.Render::Camera::position
- * Holds the current position of the camera.
+ * Holds the current position of the camera in coordinates relative to
+ * the parent entity.
*/
/*!
* \qmlproperty vector3d Qt3D.Render::Camera::upVector
- * Holds the current up vector of the camera.
+ * Holds the current up vector of the camera in coordinates relative to
+ * the parent entity.
*/
/*!
* \qmlproperty vector3d Qt3D.Render::Camera::viewCenter
- * Holds the current view center of the camera.
+ * Holds the current view center of the camera in coordinates relative to
+ * the parent entity.
* \readonly
*/
/*!
* \qmlproperty vector3d Qt3D.Render::Camera::viewVector
- * Holds the camera's view vector.
+ * Holds the camera's view vector in coordinates relative to
+ * the parent entity.
* \readonly
*/
/*!
* \qmlproperty matrix4x4 Qt3D.Render::Camera::viewMatrix
- * Holds the camera's view matrix.
+ * \deprecated
+ * Holds the camera's view matrix in coordinates relative
+ * to the parent entity.
* \readonly
*/
@@ -384,27 +411,33 @@ QCameraPrivate::QCameraPrivate()
/*!
* \property QCamera::position
- * Holds the camera's position.
+ * Holds the camera's position in coordinates relative to
+ * the parent entity.
*/
/*!
* \property QCamera::upVector
- * Holds the camera's up vector.
+ * Holds the camera's up vector in coordinates relative to
+ * the parent entity.
*/
/*!
* \property QCamera::viewCenter
- * Holds the camera's view center.
+ * Holds the camera's view center in coordinates relative to
+ * the parent entity.
*/
/*!
* \property QCamera::viewVector
- * Holds the camera's view vector.
+ * Holds the camera's view vector in coordinates relative to
+ * the parent entity.
*/
/*!
* \property QCamera::viewMatrix
- * Holds the camera's view matrix.
+ * \deprecated
+ * Holds the camera's view matrix in coordinates relative to
+ * the parent entity.
*/
/*!
@@ -426,7 +459,7 @@ QCamera::QCamera(Qt3DCore::QNode *parent)
QObject::connect(d_func()->m_lens, SIGNAL(projectionMatrixChanged(const QMatrix4x4 &)), this, SIGNAL(projectionMatrixChanged(const QMatrix4x4 &)));
QObject::connect(d_func()->m_lens, SIGNAL(exposureChanged(float)), this, SIGNAL(exposureChanged(float)));
QObject::connect(d_func()->m_lens, &QCameraLens::viewSphere, this, &QCamera::viewSphere);
- QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(viewMatrixChanged()));
+
addComponent(d_func()->m_lens);
addComponent(d_func()->m_transform);
}
@@ -455,7 +488,7 @@ QCamera::QCamera(QCameraPrivate &dd, Qt3DCore::QNode *parent)
QObject::connect(d_func()->m_lens, SIGNAL(topChanged(float)), this, SIGNAL(topChanged(float)));
QObject::connect(d_func()->m_lens, SIGNAL(projectionMatrixChanged(const QMatrix4x4 &)), this, SIGNAL(projectionMatrixChanged(const QMatrix4x4 &)));
QObject::connect(d_func()->m_lens, &QCameraLens::viewSphere, this, &QCamera::viewSphere);
- QObject::connect(d_func()->m_transform, SIGNAL(matrixChanged()), this, SIGNAL(viewMatrixChanged()));
+
addComponent(d_func()->m_lens);
addComponent(d_func()->m_transform);
}
@@ -894,7 +927,7 @@ void QCamera::setPosition(const QVector3D &position)
d->m_viewMatrixDirty = true;
emit positionChanged(position);
emit viewVectorChanged(d->m_cameraToCenter);
- d->updateViewMatrix();
+ d->updateViewMatrixAndTransform();
}
}
@@ -914,7 +947,7 @@ void QCamera::setUpVector(const QVector3D &upVector)
d->m_upVector = upVector;
d->m_viewMatrixDirty = true;
emit upVectorChanged(upVector);
- d->updateViewMatrix();
+ d->updateViewMatrixAndTransform();
}
}
@@ -936,7 +969,7 @@ void QCamera::setViewCenter(const QVector3D &viewCenter)
d->m_viewMatrixDirty = true;
emit viewCenterChanged(viewCenter);
emit viewVectorChanged(d->m_cameraToCenter);
- d->updateViewMatrix();
+ d->updateViewMatrixAndTransform();
}
}
@@ -955,7 +988,7 @@ QVector3D QCamera::viewVector() const
QMatrix4x4 QCamera::viewMatrix() const
{
Q_D(const QCamera);
- return d->m_transform->matrix();
+ return d->m_viewMatrix;
}
} // Qt3DRender