diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-12-03 14:16:42 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-12-04 09:54:26 +0000 |
commit | 4ce7f39e4e0029d5a221b047c151ad1107f1194d (patch) | |
tree | a261c6d69ee5cc394584ea8acefb3e662c88c032 /share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp | |
parent | 056080b59954eba5c2b0e8d20a1594ee47490b61 (diff) |
QmlDesigner: Fix 3D edit gizmos orientation and rotation order
When selected node has non-default rotation order or orientation,
gizmos need to account for that.
Change-Id: Ie3817fd057b43f708ac1feea3e98e1e44f56d66a
Fixes: QDS-1290
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp')
-rw-r--r-- | share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index d571b24dcb..3dd360e1ea 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -344,11 +344,17 @@ qreal QmlDesigner::Internal::MouseArea3D::getNewRotationAngle( QQuick3DNode *node, const QVector3D &pressPos, const QVector3D ¤tPos, const QVector3D &nodePos, qreal prevAngle, bool trackBall) { - const QVector3D cameraToNodeDir = getCameraToNodeDir(node); + // Get camera to node direction in node orientation + QVector3D cameraToNodeDir = getCameraToNodeDir(node); if (trackBall) { // Only the distance in plane direction is relevant in trackball drag QVector3D dragDir = QVector3D::crossProduct(getNormal(), cameraToNodeDir).normalized(); - QVector3D screenDragDir = m_view3D->mapFrom3DScene(node->scenePosition() + dragDir); + QVector3D scenePos = node->scenePosition(); + if (node->orientation() == QQuick3DNode::RightHanded) { + scenePos.setZ(-scenePos.z()); + dragDir = -dragDir; + } + QVector3D screenDragDir = m_view3D->mapFrom3DScene(scenePos + dragDir); screenDragDir.setZ(0); dragDir = (screenDragDir - nodePos).normalized(); const QVector3D pressToCurrent = (currentPos - pressPos); @@ -361,7 +367,9 @@ qreal QmlDesigner::Internal::MouseArea3D::getNewRotationAngle( qreal angle = qAcos(qreal(QVector3D::dotProduct(nodeToPress, nodeToCurrent))); // Determine drag direction left/right - const QVector3D dragNormal = QVector3D::crossProduct(nodeToPress, nodeToCurrent).normalized(); + QVector3D dragNormal = QVector3D::crossProduct(nodeToPress, nodeToCurrent).normalized(); + if (node->orientation() == QQuick3DNode::RightHanded) + dragNormal = -dragNormal; angle *= QVector3D::dotProduct(QVector3D(0.f, 0.f, 1.f), dragNormal) < 0 ? -1.0 : 1.0; // Determine drag ring orientation relative to camera @@ -392,7 +400,10 @@ void QmlDesigner::Internal::MouseArea3D::applyRotationAngleToNode( { if (!qFuzzyIsNull(angle)) { node->setRotation(startRotation); - node->rotate(qRadiansToDegrees(angle), getNormal(), QQuick3DNode::SceneSpace); + QVector3D normal = getNormal(); + if (orientation() != node->orientation()) + normal.setZ(-normal.z()); + node->rotate(qRadiansToDegrees(angle), normal, QQuick3DNode::SceneSpace); } } @@ -407,6 +418,10 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo const float *dataPtr(sceneTransform().data()); QVector3D xAxis = QVector3D(-dataPtr[0], -dataPtr[1], -dataPtr[2]).normalized(); QVector3D yAxis = QVector3D(-dataPtr[4], -dataPtr[5], -dataPtr[6]).normalized(); + if (node->orientation() == QQuick3DNode::RightHanded) { + xAxis = QVector3D(-xAxis.x(), -xAxis.y(), xAxis.z()); + yAxis = QVector3D(-yAxis.x(), -yAxis.y(), yAxis.z()); + } QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis); @@ -596,11 +611,14 @@ QVector3D MouseArea3D::getCameraToNodeDir(QQuick3DNode *node) const { QVector3D dir; if (qobject_cast<QQuick3DOrthographicCamera *>(m_view3D->camera())) { - dir = m_view3D->camera()->cameraNode()->getDirection(); - // Camera direction has x and y flipped - dir = QVector3D(-dir.x(), -dir.y(), dir.z()); + dir = -m_view3D->camera()->cameraNode()->getDirection(); + dir.setZ(-dir.z()); } else { - dir = (node->scenePosition() - m_view3D->camera()->scenePosition()).normalized(); + QVector3D camPos = m_view3D->camera()->scenePosition(); + QVector3D nodePos = node->scenePosition(); + if (node->orientation() == QQuick3DNode::RightHanded) + nodePos.setZ(-nodePos.z()); + dir = (node->scenePosition() - camPos).normalized(); } return dir; } |