aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-12-10 13:14:30 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-12-11 10:59:21 +0000
commit783e5d0a8de8c638f44437751618bc3bf6367caa (patch)
tree06092b3fdf935f60a2654864c1a19b159095c911 /share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
parent128c7a34af2fc4e8b75f06979dd810953b9e4c08 (diff)
Use separate MouseArea3D to calculate drag vector
Using the MouseArea3D linked to gizmo to manage the drag leads to slight unwanted drift on the drag plane, as it moves with the gizmo. Fixed by using a helper MouseArea3D to calculate drag vector. Helper area's transform is set at mouse press time and is not changed during the drag. Change-Id: I50d3f738277bd34005c977423d114abc8dbed520 Fixes: QDS-1312 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.cpp36
1 files changed, 30 insertions, 6 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
index 71a67a9577..4c85557634 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp
@@ -83,6 +83,11 @@ QQuick3DNode *MouseArea3D::pickNode() const
return m_pickNode;
}
+MouseArea3D *MouseArea3D::dragHelper() const
+{
+ return m_dragHelper;
+}
+
qreal MouseArea3D::x() const
{
return m_x;
@@ -179,6 +184,15 @@ void MouseArea3D::setPickNode(QQuick3DNode *node)
emit pickNodeChanged();
}
+void MouseArea3D::setDragHelper(MouseArea3D *dragHelper)
+{
+ if (m_dragHelper == dragHelper)
+ return;
+
+ m_dragHelper = dragHelper;
+ emit dragHelperChanged();
+}
+
void MouseArea3D::setX(qreal x)
{
if (qFuzzyCompare(m_x, x))
@@ -433,19 +447,22 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo
node->rotate(degrees, finalAxis, QQuick3DNode::SceneSpace);
}
-QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const
+QVector3D MouseArea3D::getMousePosInPlane(const MouseArea3D *helper,
+ const QPointF &mousePosInView) const
{
+ if (!helper)
+ helper = this;
const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0);
const QVector3D mousePos2(float(mousePosInView.x()), float(mousePosInView.y()), 1);
const QVector3D rayPos0 = m_view3D->mapTo3DScene(mousePos1);
const QVector3D rayPos1 = m_view3D->mapTo3DScene(mousePos2);
- const QVector3D globalPlanePosition = mapPositionToScene(QVector3D(0, 0, 0));
+ const QVector3D globalPlanePosition = helper->mapPositionToScene(QVector3D(0, 0, 0));
const QVector3D intersectGlobalPos = rayIntersectsPlane(rayPos0, rayPos1,
globalPlanePosition, forward());
if (qFuzzyCompare(intersectGlobalPos.z(), -1))
return intersectGlobalPos;
- return mapPositionFromScene(intersectGlobalPos);
+ return helper->mapPositionFromScene(intersectGlobalPos);
}
bool MouseArea3D::eventFilter(QObject *, QEvent *event)
@@ -505,7 +522,13 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
case QEvent::MouseButtonPress: {
auto const mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
- m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ // Reset drag helper area to global transform of this area
+ if (m_dragHelper) {
+ m_dragHelper->setPosition(scenePosition());
+ m_dragHelper->setRotation(sceneRotation());
+ m_dragHelper->setScale(sceneScale());
+ }
+ m_mousePosInPlane = getMousePosInPlane(m_dragHelper, mouseEvent->pos());
if (mouseOnTopOfMouseArea(m_mousePosInPlane, mouseEvent->pos())) {
setDragging(true);
emit pressed(m_mousePosInPlane, mouseEvent->pos(), pickAngle);
@@ -527,7 +550,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
auto const mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
if (m_dragging) {
- QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ QVector3D mousePosInPlane = getMousePosInPlane(m_dragHelper, mouseEvent->pos());
if (qFuzzyCompare(mousePosInPlane.z(), -1))
mousePosInPlane = m_mousePosInPlane;
setDragging(false);
@@ -554,7 +577,8 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
case QEvent::MouseMove:
case QEvent::HoverMove: {
auto const mouseEvent = static_cast<QMouseEvent *>(event);
- const QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
+ const QVector3D mousePosInPlane = getMousePosInPlane(m_dragging ? m_dragHelper : this,
+ mouseEvent->pos());
const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos());
setHovering(hasMouse);