From 294eefef0f8cfdba2edd73b5bd2ba7435b102ce5 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 17 Oct 2017 13:10:29 +0200 Subject: Fix SortPolicy sorting key generation Change-Id: Ib06d84088d93e00ffdcaa6baa9d34e03358943cb Reviewed-by: Svenn-Arne Dragly Reviewed-by: Andy Nichols --- src/render/backend/renderview.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/render/backend/renderview.cpp') diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 71968e0d8..8c9737689 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -557,7 +557,12 @@ QVector RenderView::buildDrawRenderCommands(const QVectorm_depth = m_data.m_eyePos.distanceToPoint(node->worldBoundingVolume()->center()); + + // Project the camera-to-object-center vector onto the camera + // view vector. This gives a depth value suitable as the key + // for BackToFront sorting. + command->m_depth = QVector3D::dotProduct(node->worldBoundingVolume()->center() - m_data.m_eyePos, m_data.m_eyeViewDir); + command->m_geometry = geometryHandle; command->m_geometryRenderer = geometryRendererHandle; command->m_material = materialHandle; @@ -716,6 +721,12 @@ void RenderView::updateMatrices() const QMatrix4x4 inverseWorldTransform = viewMatrix().inverted(); const QVector3D eyePosition(inverseWorldTransform.column(3)); setEyePosition(eyePosition); + + // Get the viewing direction of the camera. Use the normal matrix to + // ensure non-uniform scale works too. + QMatrix3x3 normalMat = m_data.m_viewMatrix.normalMatrix(); + // dir = normalize(QVector3D(0, 0, -1) * normalMat) + setEyeViewDirection(QVector3D(-normalMat(2, 0), -normalMat(2, 1), -normalMat(2, 2)).normalized()); } } -- cgit v1.2.3