From 550764ca57d7166790afc8e37856752206117b1d Mon Sep 17 00:00:00 2001 From: Jesus Fernandez Date: Tue, 23 Jan 2018 12:54:27 +0100 Subject: Replace Q_DECL_OVERRIDE with override keyword Change-Id: I153ff68ac60f88d3db8815e133c8851b05e1c130 Reviewed-by: Sean Harmer --- src/render/jobs/loadgeometryjob_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/jobs/loadgeometryjob_p.h b/src/render/jobs/loadgeometryjob_p.h index 2b0331d1c..c02739647 100644 --- a/src/render/jobs/loadgeometryjob_p.h +++ b/src/render/jobs/loadgeometryjob_p.h @@ -72,7 +72,7 @@ public: void setNodeManagers(NodeManagers *nodeManagers) { m_nodeManagers = nodeManagers; } protected: - void run() Q_DECL_OVERRIDE; + void run() override; HGeometryRenderer m_handle; NodeManagers *m_nodeManagers; }; -- cgit v1.2.1 From 849d85af835be1592d7d2cd2c5afa5f183ad04f1 Mon Sep 17 00:00:00 2001 From: Mike Krus Date: Tue, 23 Jan 2018 18:24:01 +0000 Subject: Fix issues due to changes in camera view matrix Picking relied on the transform matrix of the camera being the same as the view matrix. This has changed but picking and lod code was not update to use the new convention. Change-Id: I3250d3409d15e78a5c0b56eb3b1e74bce1e22843 Reviewed-by: Sean Harmer --- src/render/backend/cameralens.cpp | 12 ++++++++++++ src/render/backend/cameralens_p.h | 4 +++- src/render/backend/renderview.cpp | 11 +---------- src/render/jobs/pickboundingvolumejob.cpp | 2 +- src/render/jobs/updatelevelofdetailjob.cpp | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/render/backend/cameralens.cpp b/src/render/backend/cameralens.cpp index 3d0e7fdaf..9870dbf63 100644 --- a/src/render/backend/cameralens.cpp +++ b/src/render/backend/cameralens.cpp @@ -68,6 +68,18 @@ void CameraLens::cleanup() QBackendNode::setEnabled(false); } +QMatrix4x4 CameraLens::viewMatrix(const QMatrix4x4 &worldTransform) +{ + const QVector4D position = worldTransform * QVector4D(0.0f, 0.0f, 0.0f, 1.0f); + // OpenGL convention is looking down -Z + const QVector4D viewDirection = worldTransform * QVector4D(0.0f, 0.0f, -1.0f, 0.0f); + const QVector4D upVector = worldTransform * QVector4D(0.0f, 1.0f, 0.0f, 0.0f); + + QMatrix4x4 m; + m.lookAt(position.toVector3D(), (position + viewDirection).toVector3D(), upVector.toVector3D()); + return m; +} + void CameraLens::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) { const auto typedChange = qSharedPointerCast>(change); diff --git a/src/render/backend/cameralens_p.h b/src/render/backend/cameralens_p.h index 72282a88b..790d0ed64 100644 --- a/src/render/backend/cameralens_p.h +++ b/src/render/backend/cameralens_p.h @@ -63,13 +63,15 @@ namespace Render { class CameraManager; -class CameraLens : public BackendNode +class QT3DRENDERSHARED_PRIVATE_EXPORT CameraLens : public BackendNode { public: CameraLens(); ~CameraLens(); void cleanup(); + QMatrix4x4 viewMatrix(const QMatrix4x4 &worldTransform); + void setProjection(const QMatrix4x4 &projection); inline QMatrix4x4 projection() const { return m_projection; } diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 4ee92a54a..27bc0cb0d 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -717,16 +717,7 @@ void RenderView::updateMatrices() { if (m_data.m_renderCameraNode && m_data.m_renderCameraLens && m_data.m_renderCameraLens->isEnabled()) { 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); + setViewMatrix(m_data.m_renderCameraLens->viewMatrix(cameraWorld)); setViewProjectionMatrix(m_data.m_renderCameraLens->projection() * viewMatrix()); //To get the eyePosition of the camera, we need to use the inverse of the diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index 616ee0ca8..0e751a6e0 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -433,7 +433,7 @@ void PickBoundingVolumeJob::viewMatrixForCamera(Qt3DCore::QNodeId cameraId, if (camNode != nullptr && (lens = camNode->renderComponent()) != nullptr && lens->isEnabled()) { - viewMatrix = *camNode->worldTransform(); + viewMatrix = lens->viewMatrix(*camNode->worldTransform()); projectionMatrix = lens->projection(); } } diff --git a/src/render/jobs/updatelevelofdetailjob.cpp b/src/render/jobs/updatelevelofdetailjob.cpp index 24891f9b8..709c73cf1 100644 --- a/src/render/jobs/updatelevelofdetailjob.cpp +++ b/src/render/jobs/updatelevelofdetailjob.cpp @@ -104,7 +104,7 @@ bool UpdateLevelOfDetailJob::viewMatrixForCamera(const Qt3DCore::QNodeId &camera if (camNode != nullptr && (lens = camNode->renderComponent()) != nullptr && lens->isEnabled()) { - viewMatrix = *camNode->worldTransform(); + viewMatrix = lens->viewMatrix(*camNode->worldTransform()); projectionMatrix = lens->projection(); return true; } -- cgit v1.2.1 From 1dc0ddf0534180b94c56084117c78232350223b0 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 24 Jan 2018 14:22:15 +0100 Subject: multiviewport: Adapt SimpleCamera to viewMatrix changes Change-Id: I3e276e8cd7d754905ed41a80ace19b72eb50175f Reviewed-by: Mike Krus --- examples/qt3d/multiviewport/SimpleCamera.qml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/qt3d/multiviewport/SimpleCamera.qml b/examples/qt3d/multiviewport/SimpleCamera.qml index e1cb95426..20741ae20 100644 --- a/examples/qt3d/multiviewport/SimpleCamera.qml +++ b/examples/qt3d/multiviewport/SimpleCamera.qml @@ -65,8 +65,15 @@ Entity { id: transform matrix: { var m = Qt.matrix4x4(); - m.lookAt(root.position, root.viewCenter, root.upVector); - return m; + m.translate(root.position) + var zAxis = root.position.minus(root.viewCenter).normalized() + var xAxis = root.upVector.crossProduct(zAxis).normalized(); + var yAxis = zAxis.crossProduct(xAxis); + var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1) + return m.times(r); } } } -- cgit v1.2.1 From 42a8d30929a3dd3bd81c12a1b5ba289b1c3897bb Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 24 Jan 2018 15:09:27 +0100 Subject: anaglyph-rendering: Fix StereoCamera following viewMatrix changes Change-Id: I42d0091368914e0f3f8cb76c707d576227d7b5f2 Reviewed-by: Mike Krus --- examples/qt3d/anaglyph-rendering/StereoCamera.qml | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/examples/qt3d/anaglyph-rendering/StereoCamera.qml b/examples/qt3d/anaglyph-rendering/StereoCamera.qml index c8db4c0a9..ea013c0b0 100644 --- a/examples/qt3d/anaglyph-rendering/StereoCamera.qml +++ b/examples/qt3d/anaglyph-rendering/StereoCamera.qml @@ -62,6 +62,7 @@ Entity { property vector3d viewCenter: Qt.vector3d(0.0, 0.0, 0.0) property vector3d position: Qt.vector3d(0.0, 0.0, 1.0) + property vector3d upVector: Qt.vector3d(0.0, 1.0, 0.0) readonly property real _fov2: Math.tan(fieldOfView * Math.PI / 180 * 0.5) readonly property real top: nearPlane * _fov2 @@ -94,23 +95,26 @@ Entity { matrix: { var m = Qt.matrix4x4(); - m.lookAt(root.position, root.viewCenter, Qt.vector3d(0.0, 1.0, 0.0)); - return m; + m.translate(root.position) + var zAxis = root.position.minus(root.viewCenter).normalized() + var xAxis = root.upVector.crossProduct(zAxis).normalized(); + var yAxis = zAxis.crossProduct(xAxis); + var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1) + return m.times(r); } } + components: [ eyeTransform ] + property Entity leftCamera: Entity { - components: [ - leftEyeLens, - eyeTransform - ] + components: [ leftEyeLens ] } property Entity rightCamera: Entity { id: rightCameraEntity - components: [ - rightEyeLens, - eyeTransform - ] + components: [ rightEyeLens ] } } -- cgit v1.2.1 From 1d449ab5027abe297b01aa5f276d21dcb57af94c Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 24 Jan 2018 15:09:45 +0100 Subject: qardboard: Fix QardboardCamera following viewMatrix changes Bonus: also remove the binding loop on the matrix property that was being reported. Change-Id: I2489a1f7ac5f65b4061ce069796d5afeab1811de Reviewed-by: Mike Krus --- examples/qt3d/qardboard/QardboardCamera.qml | 48 +++++++++++++++---------- examples/qt3d/qardboard/QardboardRootEntity.qml | 25 ------------- 2 files changed, 30 insertions(+), 43 deletions(-) diff --git a/examples/qt3d/qardboard/QardboardCamera.qml b/examples/qt3d/qardboard/QardboardCamera.qml index 1912b8a22..4832aeadc 100644 --- a/examples/qt3d/qardboard/QardboardCamera.qml +++ b/examples/qt3d/qardboard/QardboardCamera.qml @@ -50,6 +50,7 @@ import Qt3D.Core 2.0 import Qt3D.Render 2.0 +import Qardboard 1.0 Entity { id: root @@ -63,12 +64,17 @@ Entity { property vector3d position: Qt.vector3d(0.0, 0.0, 0.0) property vector3d viewDirection: Qt.vector3d(0.0, 0.0, 1.0) property vector3d viewUp: Qt.vector3d(0.0, 1.0, 0.0) - property alias viewMatrix: leftEyeTransform.matrix + property alias viewMatrix: eyeTransform.matrix readonly property real _fov2: Math.tan(fieldOfView * Math.PI / 180 * 0.5) readonly property real top: nearPlane * _fov2 readonly property real a: aspectRatio * _fov2 * convergence + DeviceOrientation { + id: orientation + enabled: true + } + CameraLens { id: leftEyeLens projectionType: CameraLens.FrustumProjection @@ -92,33 +98,39 @@ Entity { } Transform { - id: leftEyeTransform + id: eyeTransform + + function computeMatrix(roll, pitch, yaw) { + var n = Qt.matrix4x4() + n.rotate(-roll, Qt.vector3d(1, 0, 0)) + n.rotate(yaw, Qt.vector3d(0, 1, 0)) + var vd = n.times(stereoCamera.viewDirection) + var vu = n.times(stereoCamera.viewUp) + var vc = stereoCamera.position.minus(vd) - matrix: { var m = Qt.matrix4x4(); - m.lookAt(root.position, root.position + root.viewDirection, root.viewUp); - return m; + m.translate(stereoCamera.position) + var zAxis = stereoCamera.position.minus(vc).normalized() + var xAxis = vu.crossProduct(zAxis).normalized(); + var yAxis = zAxis.crossProduct(xAxis); + var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1) + return m.times(r); } - } - Transform { - id: rightEyeTransform - - matrix: leftEyeTransform.matrix + matrix: computeMatrix(orientation.roll, orientation.pitch, orientation.yaw) } + components: [ eyeTransform ] + property Entity leftCamera: Entity { - components: [ - leftEyeLens, - leftEyeTransform - ] + components: [ leftEyeLens ] } property Entity rightCamera: Entity { id: rightCameraEntity - components: [ - rightEyeLens, - rightEyeTransform - ] + components: [ rightEyeLens ] } } diff --git a/examples/qt3d/qardboard/QardboardRootEntity.qml b/examples/qt3d/qardboard/QardboardRootEntity.qml index 85e4fbc7e..004ebadc5 100644 --- a/examples/qt3d/qardboard/QardboardRootEntity.qml +++ b/examples/qt3d/qardboard/QardboardRootEntity.qml @@ -51,7 +51,6 @@ import Qt3D.Core 2.0 import Qt3D.Render 2.0 import Qt3D.Input 2.0 -import Qardboard 1.0 Entity { id: root @@ -75,31 +74,7 @@ Entity { } ] - DeviceOrientation { - id: orientation - enabled: true - } - QardboardCamera { id: stereoCamera - viewMatrix: computeMatrix(orientation.roll, orientation.pitch, orientation.yaw) - - property vector3d vc - property vector3d vd - property vector3d vu - - function computeMatrix(roll, pitch, yaw) { - var m = Qt.matrix4x4() - m.rotate(-roll, Qt.vector3d(1, 0, 0)) - m.rotate(yaw, Qt.vector3d(0, 1, 0)) - vd = m.times(stereoCamera.viewDirection) - vu = m.times(stereoCamera.viewUp) - var r = Qt.matrix4x4() - vc = stereoCamera.position.minus(vd) - r.lookAt(stereoCamera.position, vc, vu) -// console.log(roll.toFixed(2), pitch.toFixed(2), yaw.toFixed(2), stereoCamera.position, vd, vc, vu) -// console.log(r) - return r - } } } -- cgit v1.2.1 From e680fe041700296be5e6e4a132e2cfc6f54d4e77 Mon Sep 17 00:00:00 2001 From: Svenn-Arne Dragly Date: Thu, 7 Dec 2017 19:15:38 +0100 Subject: Doc: Add examples and enumeration to QCullFace documentation Change-Id: I0196e0305d205b7499c77644c0fdd42eb671a309 Reviewed-by: Paul Lemire --- src/render/renderstates/qcullface.cpp | 73 +++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/src/render/renderstates/qcullface.cpp b/src/render/renderstates/qcullface.cpp index e96346287..4be395464 100644 --- a/src/render/renderstates/qcullface.cpp +++ b/src/render/renderstates/qcullface.cpp @@ -50,7 +50,7 @@ namespace Qt3DRender { /*! \class Qt3DRender::QCullFace \brief The QCullFace class specifies whether front or back face culling - are enabled + is enabled. \since 5.7 \inmodule Qt3DRender \ingroup renderstates @@ -58,13 +58,43 @@ namespace Qt3DRender { QCullFace sets whether the front or back facets are culled. Facets include triangles, quadrilaterals, polygons and rectangles. + It can be added by calling the addRenderState() method on a QRenderPass: + + \code + // using namespace Qt3DRender; + + QRenderPass *renderPass = new QRenderPass(); + + // Create a front face culling render state + QCullFace *cullFront = new QCullFace(); + cullFront->setMode(QCullFace::Front); + + // Add the render state to the render pass + renderPass->addRenderState(cullFront); + \endcode + + Or by calling the addRenderState() method on a QRenderStateSet: + + \code + // using namespace Qt3DRender; + + QRenderStateSet *renderStateSet = new QRenderStateSet(); + + // Create a front face culling render state + QCullFace *cullFront = new QCullFace(); + cullFront->setMode(QCullFace::Front); + + // Add the render state to the render pass + renderStateSet->addRenderState(cullFront); + \endcode + \sa QFrontFace */ /*! \qmltype CullFace \brief The CullFace type specifies whether front or back face culling - are enabled + is enabled. \since 5.7 \inqmlmodule Qt3D.Render \instantiates Qt3DRender::QCullFace @@ -74,6 +104,33 @@ namespace Qt3DRender { CullFace sets whether the front or back facets are culled. Facets include triangles, quadrilaterals, polygons and rectangles. + It can be added to the renderStates property of a RenderPass: + + \qml + RenderPass { + shaderProgram: ShaderProgram { + // ... + } + renderStates: [ + CullFace { + mode: CullFace.Front + } + ] + } + \endqml + + Or added to the renderStates property of a RenderStateSet: + + \qml + RenderStateSet { + renderStates: [ + CullFace { + mode: CullFace.Front + } + ] + } + \endqml + \sa FrontFace */ @@ -81,15 +138,23 @@ namespace Qt3DRender { \enum Qt3DRender::QCullFace::CullingMode This enumeration specifies values for the culling mode. - \value NoCulling culling is disabled + + \value NoCulling Culling is disabled \value Front Culling is enabled for front facing polygons \value Back Culling is enabled for back facing polygons - \value FrontAndBack Culling is enabled for all polygons, points and lines are drawn. + \value FrontAndBack Culling is enabled for all polygons, points and lines are drawn */ /*! \qmlproperty enumeration CullFace::mode Holds the culling mode used by CullFace. Default is set to QCullFace.Back. + + \list + \li CullFace.NoCulling - culling is disabled + \li CullFace.Front - culling is enabled for front facing polygons + \li CullFace.Back - culling is enabled for back facing polygons + \li CullFace.FrontAndBack - culling is enabled for all polygons, but points and lines are drawn + \endlist */ /*! -- cgit v1.2.1