diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-01-09 13:31:42 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2020-01-09 13:17:27 +0000 |
commit | 7ad96a967f4476d86dee9b6451130437051343dc (patch) | |
tree | be39d782e2a26cb3d5e07b4bf3b8c9fe349c3bcf /share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp | |
parent | c93a9a9347628490cdcafaffaf7d3754ab609687 (diff) |
QmlDesigner: Show 3D edit view gizmos at pivot point of node
Change-Id: I6eb6b2674868d9251e568249cfabc105d0c715d7
Fixes: QDS-1354
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 | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index a0f54d1cc0..2e4d22a12c 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -32,6 +32,7 @@ #include <QtQuick3D/private/qquick3dcamera_p.h> #include <QtQuick3D/private/qquick3dorthographiccamera_p.h> #include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h> +#include <QtQuick3DUtils/private/qssgutils_p.h> namespace QmlDesigner { namespace Internal { @@ -296,7 +297,7 @@ QVector3D MouseArea3D::getNewScale(QQuick3DNode *node, const QVector3D &startSca }; const float nonZeroValue = 0.0001f; - const QVector3D scenePos = node->scenePosition(); + const QVector3D scenePos = pivotScenePosition(node); const QMatrix4x4 parentTransform = node->parentNode()->sceneTransform(); QMatrix4x4 newTransform = node->sceneTransform(); const QVector3D nodeToPressPos = pressPos - scenePos; @@ -368,7 +369,7 @@ qreal QmlDesigner::Internal::MouseArea3D::getNewRotationAngle( if (trackBall) { // Only the distance in plane direction is relevant in trackball drag QVector3D dragDir = QVector3D::crossProduct(getNormal(), cameraToNodeDir).normalized(); - QVector3D scenePos = node->scenePosition(); + QVector3D scenePos = pivotScenePosition(node); if (node->orientation() == QQuick3DNode::RightHanded) { scenePos.setZ(-scenePos.z()); dragDir = -dragDir; @@ -452,6 +453,25 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo node->rotate(degrees, finalAxis, QQuick3DNode::SceneSpace); } +// Calculate scene position of the node's pivot point, which in practice is just the position +// of the node without applying the pivot offset. +QVector3D MouseArea3D::pivotScenePosition(QQuick3DNode *node) const +{ + if (!node) + return {}; + + QQuick3DNode *parent = node->parentNode(); + if (!parent) + return node->position(); + + QMatrix4x4 localTransform; + localTransform.translate(node->position()); + + const QMatrix4x4 sceneTransform = parent->sceneTransform() * localTransform; + + return mat44::getPosition(sceneTransform); +} + QVector3D MouseArea3D::getMousePosInPlane(const MouseArea3D *helper, const QPointF &mousePosInView) const { @@ -644,10 +664,10 @@ QVector3D MouseArea3D::getCameraToNodeDir(QQuick3DNode *node) const dir.setZ(-dir.z()); } else { QVector3D camPos = m_view3D->camera()->scenePosition(); - QVector3D nodePos = node->scenePosition(); + QVector3D nodePos = pivotScenePosition(node); if (node->orientation() == QQuick3DNode::RightHanded) nodePos.setZ(-nodePos.z()); - dir = (node->scenePosition() - camPos).normalized(); + dir = (nodePos - camPos).normalized(); } return dir; } |