summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2018-01-22 13:07:20 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2018-01-22 13:22:39 +0000
commit6b662b93048ee29d6684010cee7e59e9c4248bd1 (patch)
tree4b8222307aa44bae32d333d98655c51d158db7f1 /src
parent6c3c744ebd9fabf4eaabaeea0d606648e9e8820c (diff)
parent2d264ae985cf0e83b55959549093aed8c19298aa (diff)
Merge "Merge branch '5.9' into 5.10" into refs/staging/5.10
Diffstat (limited to 'src')
-rw-r--r--src/render/backend/renderview.cpp13
-rw-r--r--src/render/frontend/qcamera.cpp67
-rw-r--r--src/render/frontend/qcamera_p.h8
-rw-r--r--src/render/jobs/loadgeometryjob.cpp1
4 files changed, 65 insertions, 24 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 31de8c1c8..f488b7e44 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -732,7 +732,18 @@ QVector<RenderCommand *> RenderView::buildComputeRenderCommands(const QVector<En
void RenderView::updateMatrices()
{
if (m_data.m_renderCameraNode && m_data.m_renderCameraLens && m_data.m_renderCameraLens->isEnabled()) {
- setViewMatrix(*m_data.m_renderCameraNode->worldTransform());
+ const QMatrix4x4 cameraWorld = *(m_data.m_renderCameraNode->worldTransform());
+
+ const QVector4D position = cameraWorld * QVector4D(0.0f, 0.0f, 0.0f, 1.0f);
+ // OpenGL convention is looking down -Z
+ const QVector4D viewDirection = cameraWorld * QVector4D(0.0f, 0.0f, -1.0f, 0.0f);
+ const QVector4D upVector = cameraWorld * QVector4D(0.0f, 1.0f, 0.0f, 0.0f);
+
+ QMatrix4x4 m;
+ m.lookAt(position.toVector3D(), (position + viewDirection).toVector3D(), upVector.toVector3D());
+
+ setViewMatrix(m);
+
setViewProjectionMatrix(m_data.m_renderCameraLens->projection() * viewMatrix());
//To get the eyePosition of the camera, we need to use the inverse of the
//camera's worldTransform matrix.
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
diff --git a/src/render/frontend/qcamera_p.h b/src/render/frontend/qcamera_p.h
index 2ef53818c..1e8464d05 100644
--- a/src/render/frontend/qcamera_p.h
+++ b/src/render/frontend/qcamera_p.h
@@ -67,12 +67,7 @@ public:
Q_DECLARE_PUBLIC(QCamera)
- void updateViewMatrix()
- {
- QMatrix4x4 m;
- m.lookAt(m_position, m_viewCenter, m_upVector);
- m_transform->setMatrix(m);
- }
+ void updateViewMatrixAndTransform(bool doEmit = true);
QVector3D m_position;
QVector3D m_viewCenter;
@@ -84,6 +79,7 @@ public:
// Components
QCameraLens *m_lens;
Qt3DCore::QTransform *m_transform;
+ QMatrix4x4 m_viewMatrix;
};
} // namespace Qt3DRender
diff --git a/src/render/jobs/loadgeometryjob.cpp b/src/render/jobs/loadgeometryjob.cpp
index 106ccbd86..d28b15a7c 100644
--- a/src/render/jobs/loadgeometryjob.cpp
+++ b/src/render/jobs/loadgeometryjob.cpp
@@ -51,6 +51,7 @@ namespace Render {
LoadGeometryJob::LoadGeometryJob(const HGeometryRenderer &handle)
: QAspectJob()
, m_handle(handle)
+ , m_nodeManagers(nullptr)
{
SET_JOB_RUN_STAT_TYPE(this, JobTypes::LoadGeometry, 0);
}