aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-12-03 14:16:42 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-12-04 09:54:26 +0000
commit4ce7f39e4e0029d5a221b047c151ad1107f1194d (patch)
treea261c6d69ee5cc394584ea8acefb3e662c88c032 /share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
parent056080b59954eba5c2b0e8d20a1594ee47490b61 (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.cpp34
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 &currentPos,
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;
}