forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -35,6 +35,7 @@ Model {
|
|||||||
property Node targetNode: null
|
property Node targetNode: null
|
||||||
property bool dragging: mouseAreaYZ.dragging || mouseAreaXZ.dragging
|
property bool dragging: mouseAreaYZ.dragging || mouseAreaXZ.dragging
|
||||||
property bool active: false
|
property bool active: false
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
|
|
||||||
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
|
readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ Model {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var maskedPosition = Qt.vector3d(scenePos.x, 0, 0);
|
var maskedPosition = Qt.vector3d(scenePos.x, 0, 0);
|
||||||
_pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition);
|
_pointerPosPressed = mouseArea.dragHelper.mapPositionToScene(maskedPosition);
|
||||||
if (targetNode.orientation === Node.RightHanded)
|
if (targetNode.orientation === Node.RightHanded)
|
||||||
_pointerPosPressed.z = -_pointerPosPressed.z;
|
_pointerPosPressed.z = -_pointerPosPressed.z;
|
||||||
var sp = targetNode.scenePosition;
|
var sp = targetNode.scenePosition;
|
||||||
@@ -68,7 +69,7 @@ Model {
|
|||||||
function calcRelativeDistance(mouseArea, scenePos)
|
function calcRelativeDistance(mouseArea, scenePos)
|
||||||
{
|
{
|
||||||
var maskedPosition = Qt.vector3d(scenePos.x, 0, 0);
|
var maskedPosition = Qt.vector3d(scenePos.x, 0, 0);
|
||||||
var scenePointerPos = mouseArea.mapPositionToScene(maskedPosition);
|
var scenePointerPos = mouseArea.dragHelper.mapPositionToScene(maskedPosition);
|
||||||
if (targetNode.orientation === Node.RightHanded)
|
if (targetNode.orientation === Node.RightHanded)
|
||||||
scenePointerPos.z = -scenePointerPos.z;
|
scenePointerPos.z = -scenePointerPos.z;
|
||||||
return scenePointerPos.minus(_pointerPosPressed);
|
return scenePointerPos.minus(_pointerPosPressed);
|
||||||
@@ -100,6 +101,8 @@ Model {
|
|||||||
rotation: Qt.vector3d(0, 0, 90)
|
rotation: Qt.vector3d(0, 0, 90)
|
||||||
grabsMouse: targetNode
|
grabsMouse: targetNode
|
||||||
active: rootModel.active
|
active: rootModel.active
|
||||||
|
dragHelper: rootModel.dragHelper
|
||||||
|
|
||||||
onPressed: rootModel.handlePressed(mouseAreaYZ, scenePos)
|
onPressed: rootModel.handlePressed(mouseAreaYZ, scenePos)
|
||||||
onDragged: rootModel.handleDragged(mouseAreaYZ, scenePos)
|
onDragged: rootModel.handleDragged(mouseAreaYZ, scenePos)
|
||||||
onReleased: rootModel.handleReleased(mouseAreaYZ, scenePos)
|
onReleased: rootModel.handleReleased(mouseAreaYZ, scenePos)
|
||||||
@@ -115,6 +118,8 @@ Model {
|
|||||||
rotation: Qt.vector3d(0, 90, 90)
|
rotation: Qt.vector3d(0, 90, 90)
|
||||||
grabsMouse: targetNode
|
grabsMouse: targetNode
|
||||||
active: rootModel.active
|
active: rootModel.active
|
||||||
|
dragHelper: rootModel.dragHelper
|
||||||
|
|
||||||
onPressed: rootModel.handlePressed(mouseAreaXZ, scenePos)
|
onPressed: rootModel.handlePressed(mouseAreaXZ, scenePos)
|
||||||
onDragged: rootModel.handleDragged(mouseAreaXZ, scenePos)
|
onDragged: rootModel.handleDragged(mouseAreaXZ, scenePos)
|
||||||
onReleased: rootModel.handleReleased(mouseAreaXZ, scenePos)
|
onReleased: rootModel.handleReleased(mouseAreaXZ, scenePos)
|
||||||
|
@@ -28,6 +28,7 @@ import QtQuick.Window 2.12
|
|||||||
import QtQuick3D 1.0
|
import QtQuick3D 1.0
|
||||||
import QtQuick.Controls 2.0
|
import QtQuick.Controls 2.0
|
||||||
import QtGraphicalEffects 1.0
|
import QtGraphicalEffects 1.0
|
||||||
|
import MouseArea3D 1.0
|
||||||
|
|
||||||
Window {
|
Window {
|
||||||
id: viewWindow
|
id: viewWindow
|
||||||
@@ -183,6 +184,11 @@ Window {
|
|||||||
scale: editOrthoCamera.scale
|
scale: editOrthoCamera.scale
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MouseArea3D {
|
||||||
|
id: gizmoDragHelper
|
||||||
|
view3D: overlayView
|
||||||
|
}
|
||||||
|
|
||||||
MoveGizmo {
|
MoveGizmo {
|
||||||
id: moveGizmo
|
id: moveGizmo
|
||||||
scale: autoScale.getScale(Qt.vector3d(5, 5, 5))
|
scale: autoScale.getScale(Qt.vector3d(5, 5, 5))
|
||||||
@@ -191,6 +197,7 @@ Window {
|
|||||||
globalOrientation: btnLocalGlobal.toggled
|
globalOrientation: btnLocalGlobal.toggled
|
||||||
visible: selectedNode && btnMove.selected
|
visible: selectedNode && btnMove.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
|
onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
|
||||||
onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position")
|
onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position")
|
||||||
@@ -204,6 +211,7 @@ Window {
|
|||||||
globalOrientation: false
|
globalOrientation: false
|
||||||
visible: selectedNode && btnScale.selected
|
visible: selectedNode && btnScale.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale")
|
onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale")
|
||||||
onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale")
|
onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale")
|
||||||
@@ -217,6 +225,7 @@ Window {
|
|||||||
globalOrientation: btnLocalGlobal.toggled
|
globalOrientation: btnLocalGlobal.toggled
|
||||||
visible: selectedNode && btnRotate.selected
|
visible: selectedNode && btnRotate.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation")
|
onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation")
|
||||||
onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation")
|
onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation")
|
||||||
|
@@ -33,7 +33,7 @@ Node {
|
|||||||
property View3D view3D
|
property View3D view3D
|
||||||
property bool highlightOnHover: true
|
property bool highlightOnHover: true
|
||||||
property Node targetNode: null
|
property Node targetNode: null
|
||||||
property var selectedNodes: null
|
property var selectedNodes: []
|
||||||
readonly property bool selected: {
|
readonly property bool selected: {
|
||||||
for (var i = 0; i < selectedNodes.length; ++i) {
|
for (var i = 0; i < selectedNodes.length; ++i) {
|
||||||
if (selectedNodes[i] === targetNode)
|
if (selectedNodes[i] === targetNode)
|
||||||
|
@@ -37,6 +37,8 @@ Node {
|
|||||||
readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging
|
readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging
|
||||||
|| planeX.dragging || planeY.dragging || planeZ.dragging
|
|| planeX.dragging || planeY.dragging || planeZ.dragging
|
||||||
|| centerBall.dragging
|
|| centerBall.dragging
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
|
|
||||||
position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
|
position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
|
||||||
orientation: targetNode ? targetNode.orientation : Node.LeftHanded
|
orientation: targetNode ? targetNode.orientation : Node.LeftHanded
|
||||||
|
|
||||||
@@ -57,6 +59,7 @@ Node {
|
|||||||
: Qt.rgba(1, 0, 0, 1)
|
: Qt.rgba(1, 0, 0, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -70,6 +73,7 @@ Node {
|
|||||||
: Qt.rgba(0, 0.6, 0, 1)
|
: Qt.rgba(0, 0.6, 0, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -83,6 +87,7 @@ Node {
|
|||||||
: Qt.rgba(0, 0, 1, 1)
|
: Qt.rgba(0, 0, 1, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -100,6 +105,7 @@ Node {
|
|||||||
: Qt.rgba(1, 0, 0, 1)
|
: Qt.rgba(1, 0, 0, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -117,6 +123,7 @@ Node {
|
|||||||
: Qt.rgba(0, 0.6, 0, 1)
|
: Qt.rgba(0, 0.6, 0, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -134,6 +141,7 @@ Node {
|
|||||||
: Qt.rgba(0, 0, 1, 1)
|
: Qt.rgba(0, 0, 1, 1)
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
@@ -152,6 +160,7 @@ Node {
|
|||||||
|
|
||||||
view3D: moveGizmo.view3D
|
view3D: moveGizmo.view3D
|
||||||
active: moveGizmo.visible
|
active: moveGizmo.visible
|
||||||
|
dragHelper: moveGizmo.dragHelper
|
||||||
|
|
||||||
onPositionCommit: moveGizmo.positionCommit()
|
onPositionCommit: moveGizmo.positionCommit()
|
||||||
onPositionMove: moveGizmo.positionMove()
|
onPositionMove: moveGizmo.positionMove()
|
||||||
|
@@ -36,11 +36,12 @@ Model {
|
|||||||
property Node targetNode: null
|
property Node targetNode: null
|
||||||
property bool dragging: mouseArea.dragging
|
property bool dragging: mouseArea.dragging
|
||||||
property bool active: false
|
property bool active: false
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
|
|
||||||
readonly property bool hovering: mouseArea.hovering
|
readonly property bool hovering: mouseArea.hovering
|
||||||
|
|
||||||
property var _pointerPosPressed
|
property vector3d _pointerPosPressed
|
||||||
property var _targetStartPos
|
property vector3d _targetStartPos
|
||||||
|
|
||||||
signal pressed(var mouseArea)
|
signal pressed(var mouseArea)
|
||||||
signal dragged(var mouseArea, vector3d sceneRelativeDistance)
|
signal dragged(var mouseArea, vector3d sceneRelativeDistance)
|
||||||
@@ -62,7 +63,7 @@ Model {
|
|||||||
if (!targetNode)
|
if (!targetNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_pointerPosPressed = mouseArea.mapPositionToScene(scenePos);
|
_pointerPosPressed = mouseArea.dragHelper.mapPositionToScene(scenePos);
|
||||||
if (targetNode.orientation === Node.RightHanded)
|
if (targetNode.orientation === Node.RightHanded)
|
||||||
_pointerPosPressed.z = -_pointerPosPressed.z;
|
_pointerPosPressed.z = -_pointerPosPressed.z;
|
||||||
var sp = targetNode.scenePosition;
|
var sp = targetNode.scenePosition;
|
||||||
@@ -72,7 +73,7 @@ Model {
|
|||||||
|
|
||||||
function calcRelativeDistance(mouseArea, scenePos)
|
function calcRelativeDistance(mouseArea, scenePos)
|
||||||
{
|
{
|
||||||
var scenePointerPos = mouseArea.mapPositionToScene(scenePos);
|
var scenePointerPos = mouseArea.dragHelper.mapPositionToScene(scenePos);
|
||||||
if (targetNode.orientation === Node.RightHanded)
|
if (targetNode.orientation === Node.RightHanded)
|
||||||
scenePointerPos.z = -scenePointerPos.z;
|
scenePointerPos.z = -scenePointerPos.z;
|
||||||
return scenePointerPos.minus(_pointerPosPressed);
|
return scenePointerPos.minus(_pointerPosPressed);
|
||||||
@@ -103,6 +104,8 @@ Model {
|
|||||||
height: 120
|
height: 120
|
||||||
grabsMouse: targetNode
|
grabsMouse: targetNode
|
||||||
active: rootModel.active
|
active: rootModel.active
|
||||||
|
dragHelper: rootModel.dragHelper
|
||||||
|
|
||||||
onPressed: rootModel.handlePressed(mouseArea, scenePos)
|
onPressed: rootModel.handlePressed(mouseArea, scenePos)
|
||||||
onDragged: rootModel.handleDragged(mouseArea, scenePos)
|
onDragged: rootModel.handleDragged(mouseArea, scenePos)
|
||||||
onReleased: rootModel.handleReleased(mouseArea, scenePos)
|
onReleased: rootModel.handleReleased(mouseArea, scenePos)
|
||||||
|
@@ -36,7 +36,7 @@ PlanarDraggable {
|
|||||||
signal scaleCommit()
|
signal scaleCommit()
|
||||||
signal scaleChange()
|
signal scaleChange()
|
||||||
|
|
||||||
property var _startScale
|
property vector3d _startScale
|
||||||
|
|
||||||
onPressed: {
|
onPressed: {
|
||||||
// Recreate vector so we don't follow the changes in targetNode.sceneScale
|
// Recreate vector so we don't follow the changes in targetNode.sceneScale
|
||||||
|
@@ -36,6 +36,7 @@ Node {
|
|||||||
property bool globalOrientation: true
|
property bool globalOrientation: true
|
||||||
readonly property bool dragging: cameraRing.dragging
|
readonly property bool dragging: cameraRing.dragging
|
||||||
|| rotRingX.dragging || rotRingY.dragging || rotRingZ.dragging
|
|| rotRingX.dragging || rotRingY.dragging || rotRingZ.dragging
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
property real currentAngle
|
property real currentAngle
|
||||||
property point currentMousePos
|
property point currentMousePos
|
||||||
|
|
||||||
@@ -88,6 +89,7 @@ Node {
|
|||||||
priority: 40
|
priority: 40
|
||||||
view3D: rotateGizmo.view3D
|
view3D: rotateGizmo.view3D
|
||||||
active: rotateGizmo.visible
|
active: rotateGizmo.visible
|
||||||
|
dragHelper: rotateGizmo.dragHelper
|
||||||
|
|
||||||
onRotateCommit: rotateGizmo.rotateCommit()
|
onRotateCommit: rotateGizmo.rotateCommit()
|
||||||
onRotateChange: rotateGizmo.rotateChange()
|
onRotateChange: rotateGizmo.rotateChange()
|
||||||
@@ -107,6 +109,7 @@ Node {
|
|||||||
priority: 30
|
priority: 30
|
||||||
view3D: rotateGizmo.view3D
|
view3D: rotateGizmo.view3D
|
||||||
active: rotateGizmo.visible
|
active: rotateGizmo.visible
|
||||||
|
dragHelper: rotateGizmo.dragHelper
|
||||||
|
|
||||||
onRotateCommit: rotateGizmo.rotateCommit()
|
onRotateCommit: rotateGizmo.rotateCommit()
|
||||||
onRotateChange: rotateGizmo.rotateChange()
|
onRotateChange: rotateGizmo.rotateChange()
|
||||||
@@ -126,6 +129,7 @@ Node {
|
|||||||
priority: 20
|
priority: 20
|
||||||
view3D: rotateGizmo.view3D
|
view3D: rotateGizmo.view3D
|
||||||
active: rotateGizmo.visible
|
active: rotateGizmo.visible
|
||||||
|
dragHelper: rotateGizmo.dragHelper
|
||||||
|
|
||||||
onRotateCommit: rotateGizmo.rotateCommit()
|
onRotateCommit: rotateGizmo.rotateCommit()
|
||||||
onRotateChange: rotateGizmo.rotateChange()
|
onRotateChange: rotateGizmo.rotateChange()
|
||||||
@@ -145,6 +149,7 @@ Node {
|
|||||||
priority: 10
|
priority: 10
|
||||||
view3D: rotateGizmo.view3D
|
view3D: rotateGizmo.view3D
|
||||||
active: rotateGizmo.visible
|
active: rotateGizmo.visible
|
||||||
|
dragHelper: rotateGizmo.dragHelper
|
||||||
|
|
||||||
onRotateCommit: rotateGizmo.rotateCommit()
|
onRotateCommit: rotateGizmo.rotateCommit()
|
||||||
onRotateChange: rotateGizmo.rotateChange()
|
onRotateChange: rotateGizmo.rotateChange()
|
||||||
@@ -226,6 +231,8 @@ Node {
|
|||||||
circlePickArea: Qt.point(25, 50)
|
circlePickArea: Qt.point(25, 50)
|
||||||
grabsMouse: rotateGizmo.targetNode
|
grabsMouse: rotateGizmo.targetNode
|
||||||
active: rotateGizmo.visible
|
active: rotateGizmo.visible
|
||||||
|
dragHelper: rotateGizmo.dragHelper
|
||||||
|
|
||||||
onPressed: freeRotator.handlePressed(screenPos)
|
onPressed: freeRotator.handlePressed(screenPos)
|
||||||
onDragged: freeRotator.handleDragged(screenPos)
|
onDragged: freeRotator.handleDragged(screenPos)
|
||||||
onReleased: freeRotator.handleReleased(screenPos)
|
onReleased: freeRotator.handleReleased(screenPos)
|
||||||
|
@@ -39,6 +39,7 @@ Model {
|
|||||||
property alias priority: mouseAreaMain.priority
|
property alias priority: mouseAreaMain.priority
|
||||||
property real currentAngle
|
property real currentAngle
|
||||||
property point currentMousePos
|
property point currentMousePos
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
|
|
||||||
property vector3d _pointerPosPressed
|
property vector3d _pointerPosPressed
|
||||||
property vector3d _targetPosOnScreen
|
property vector3d _targetPosOnScreen
|
||||||
@@ -132,6 +133,8 @@ Model {
|
|||||||
active: rotateRing.active
|
active: rotateRing.active
|
||||||
pickNode: pickModel
|
pickNode: pickModel
|
||||||
minAngle: 0.05
|
minAngle: 0.05
|
||||||
|
dragHelper: rotateRing.dragHelper
|
||||||
|
|
||||||
onPressed: rotateRing.handlePressed(screenPos, angle)
|
onPressed: rotateRing.handlePressed(screenPos, angle)
|
||||||
onDragged: rotateRing.handleDragged(screenPos)
|
onDragged: rotateRing.handleDragged(screenPos)
|
||||||
onReleased: rotateRing.handleReleased(screenPos)
|
onReleased: rotateRing.handleReleased(screenPos)
|
||||||
|
@@ -37,6 +37,7 @@ Node {
|
|||||||
readonly property bool dragging: scaleRodX.dragging || scaleRodY.dragging || scaleRodZ.dragging
|
readonly property bool dragging: scaleRodX.dragging || scaleRodY.dragging || scaleRodZ.dragging
|
||||||
|| planeX.dragging || planeY.dragging || planeZ.dragging
|
|| planeX.dragging || planeY.dragging || planeZ.dragging
|
||||||
|| centerMouseArea.dragging
|
|| centerMouseArea.dragging
|
||||||
|
property MouseArea3D dragHelper: null
|
||||||
|
|
||||||
position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
|
position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
|
||||||
orientation: targetNode ? targetNode.orientation : Node.LeftHanded
|
orientation: targetNode ? targetNode.orientation : Node.LeftHanded
|
||||||
@@ -58,6 +59,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -72,6 +74,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -86,6 +89,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -104,6 +108,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -122,6 +127,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -140,6 +146,7 @@ Node {
|
|||||||
view3D: scaleGizmo.view3D
|
view3D: scaleGizmo.view3D
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
globalOrientation: scaleGizmo.globalOrientation
|
globalOrientation: scaleGizmo.globalOrientation
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
onScaleCommit: scaleGizmo.scaleCommit()
|
onScaleCommit: scaleGizmo.scaleCommit()
|
||||||
onScaleChange: scaleGizmo.scaleChange()
|
onScaleChange: scaleGizmo.scaleChange()
|
||||||
@@ -171,15 +178,16 @@ Node {
|
|||||||
grabsMouse: scaleGizmo.targetNode
|
grabsMouse: scaleGizmo.targetNode
|
||||||
priority: 1
|
priority: 1
|
||||||
active: scaleGizmo.visible
|
active: scaleGizmo.visible
|
||||||
|
dragHelper: scaleGizmo.dragHelper
|
||||||
|
|
||||||
property var _startScale
|
property vector3d _startScale
|
||||||
property var _startScreenPos
|
property point _startScreenPos
|
||||||
|
|
||||||
function localScale(screenPos)
|
function localScale(screenPos)
|
||||||
{
|
{
|
||||||
var yDelta = screenPos.y - _startScreenPos.y;
|
var yDelta = screenPos.y - _startScreenPos.y;
|
||||||
if (yDelta === 0)
|
if (yDelta === 0)
|
||||||
return;
|
return _startScale;
|
||||||
var scaler = 1.0 + (yDelta * 0.025);
|
var scaler = 1.0 + (yDelta * 0.025);
|
||||||
if (scaler === 0)
|
if (scaler === 0)
|
||||||
scaler = 0.0001;
|
scaler = 0.0001;
|
||||||
@@ -203,7 +211,6 @@ Node {
|
|||||||
onDragged: {
|
onDragged: {
|
||||||
if (!scaleGizmo.targetNode)
|
if (!scaleGizmo.targetNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scaleGizmo.targetNode.scale = localScale(screenPos);
|
scaleGizmo.targetNode.scale = localScale(screenPos);
|
||||||
scaleGizmo.scaleChange();
|
scaleGizmo.scaleChange();
|
||||||
}
|
}
|
||||||
|
@@ -36,7 +36,7 @@ DirectionalDraggable {
|
|||||||
signal scaleCommit()
|
signal scaleCommit()
|
||||||
signal scaleChange()
|
signal scaleChange()
|
||||||
|
|
||||||
property var _startScale
|
property vector3d _startScale
|
||||||
|
|
||||||
Model {
|
Model {
|
||||||
source: "#Cube"
|
source: "#Cube"
|
||||||
|
@@ -83,6 +83,11 @@ QQuick3DNode *MouseArea3D::pickNode() const
|
|||||||
return m_pickNode;
|
return m_pickNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MouseArea3D *MouseArea3D::dragHelper() const
|
||||||
|
{
|
||||||
|
return m_dragHelper;
|
||||||
|
}
|
||||||
|
|
||||||
qreal MouseArea3D::x() const
|
qreal MouseArea3D::x() const
|
||||||
{
|
{
|
||||||
return m_x;
|
return m_x;
|
||||||
@@ -179,6 +184,15 @@ void MouseArea3D::setPickNode(QQuick3DNode *node)
|
|||||||
emit pickNodeChanged();
|
emit pickNodeChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MouseArea3D::setDragHelper(MouseArea3D *dragHelper)
|
||||||
|
{
|
||||||
|
if (m_dragHelper == dragHelper)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_dragHelper = dragHelper;
|
||||||
|
emit dragHelperChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void MouseArea3D::setX(qreal x)
|
void MouseArea3D::setX(qreal x)
|
||||||
{
|
{
|
||||||
if (qFuzzyCompare(m_x, x))
|
if (qFuzzyCompare(m_x, x))
|
||||||
@@ -433,19 +447,22 @@ void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRo
|
|||||||
node->rotate(degrees, finalAxis, QQuick3DNode::SceneSpace);
|
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 mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0);
|
||||||
const QVector3D mousePos2(float(mousePosInView.x()), float(mousePosInView.y()), 1);
|
const QVector3D mousePos2(float(mousePosInView.x()), float(mousePosInView.y()), 1);
|
||||||
const QVector3D rayPos0 = m_view3D->mapTo3DScene(mousePos1);
|
const QVector3D rayPos0 = m_view3D->mapTo3DScene(mousePos1);
|
||||||
const QVector3D rayPos1 = m_view3D->mapTo3DScene(mousePos2);
|
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,
|
const QVector3D intersectGlobalPos = rayIntersectsPlane(rayPos0, rayPos1,
|
||||||
globalPlanePosition, forward());
|
globalPlanePosition, forward());
|
||||||
if (qFuzzyCompare(intersectGlobalPos.z(), -1))
|
if (qFuzzyCompare(intersectGlobalPos.z(), -1))
|
||||||
return intersectGlobalPos;
|
return intersectGlobalPos;
|
||||||
|
|
||||||
return mapPositionFromScene(intersectGlobalPos);
|
return helper->mapPositionFromScene(intersectGlobalPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
||||||
@@ -505,7 +522,13 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
|||||||
case QEvent::MouseButtonPress: {
|
case QEvent::MouseButtonPress: {
|
||||||
auto const mouseEvent = static_cast<QMouseEvent *>(event);
|
auto const mouseEvent = static_cast<QMouseEvent *>(event);
|
||||||
if (mouseEvent->button() == Qt::LeftButton) {
|
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())) {
|
if (mouseOnTopOfMouseArea(m_mousePosInPlane, mouseEvent->pos())) {
|
||||||
setDragging(true);
|
setDragging(true);
|
||||||
emit pressed(m_mousePosInPlane, mouseEvent->pos(), pickAngle);
|
emit pressed(m_mousePosInPlane, mouseEvent->pos(), pickAngle);
|
||||||
@@ -527,7 +550,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
|||||||
auto const mouseEvent = static_cast<QMouseEvent *>(event);
|
auto const mouseEvent = static_cast<QMouseEvent *>(event);
|
||||||
if (mouseEvent->button() == Qt::LeftButton) {
|
if (mouseEvent->button() == Qt::LeftButton) {
|
||||||
if (m_dragging) {
|
if (m_dragging) {
|
||||||
QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
|
QVector3D mousePosInPlane = getMousePosInPlane(m_dragHelper, mouseEvent->pos());
|
||||||
if (qFuzzyCompare(mousePosInPlane.z(), -1))
|
if (qFuzzyCompare(mousePosInPlane.z(), -1))
|
||||||
mousePosInPlane = m_mousePosInPlane;
|
mousePosInPlane = m_mousePosInPlane;
|
||||||
setDragging(false);
|
setDragging(false);
|
||||||
@@ -554,7 +577,8 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
|
|||||||
case QEvent::MouseMove:
|
case QEvent::MouseMove:
|
||||||
case QEvent::HoverMove: {
|
case QEvent::HoverMove: {
|
||||||
auto const mouseEvent = static_cast<QMouseEvent *>(event);
|
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());
|
const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos());
|
||||||
|
|
||||||
setHovering(hasMouse);
|
setHovering(hasMouse);
|
||||||
|
@@ -55,6 +55,7 @@ class MouseArea3D : public QQuick3DNode
|
|||||||
Q_PROPERTY(QPointF circlePickArea READ circlePickArea WRITE setCirclePickArea NOTIFY circlePickAreaChanged)
|
Q_PROPERTY(QPointF circlePickArea READ circlePickArea WRITE setCirclePickArea NOTIFY circlePickAreaChanged)
|
||||||
Q_PROPERTY(qreal minAngle READ minAngle WRITE setMinAngle NOTIFY minAngleChanged)
|
Q_PROPERTY(qreal minAngle READ minAngle WRITE setMinAngle NOTIFY minAngleChanged)
|
||||||
Q_PROPERTY(QQuick3DNode *pickNode READ pickNode WRITE setPickNode NOTIFY pickNodeChanged)
|
Q_PROPERTY(QQuick3DNode *pickNode READ pickNode WRITE setPickNode NOTIFY pickNodeChanged)
|
||||||
|
Q_PROPERTY(MouseArea3D *dragHelper READ dragHelper WRITE setDragHelper NOTIFY dragHelperChanged)
|
||||||
|
|
||||||
Q_INTERFACES(QQmlParserStatus)
|
Q_INTERFACES(QQmlParserStatus)
|
||||||
|
|
||||||
@@ -76,6 +77,7 @@ public:
|
|||||||
QPointF circlePickArea() const;
|
QPointF circlePickArea() const;
|
||||||
qreal minAngle() const;
|
qreal minAngle() const;
|
||||||
QQuick3DNode *pickNode() const;
|
QQuick3DNode *pickNode() const;
|
||||||
|
MouseArea3D *dragHelper() const;
|
||||||
|
|
||||||
static qreal mouseDragMultiplier() { return .02; }
|
static qreal mouseDragMultiplier() { return .02; }
|
||||||
|
|
||||||
@@ -86,6 +88,7 @@ public slots:
|
|||||||
void setCirclePickArea(const QPointF &pickArea);
|
void setCirclePickArea(const QPointF &pickArea);
|
||||||
void setMinAngle(qreal angle);
|
void setMinAngle(qreal angle);
|
||||||
void setPickNode(QQuick3DNode *node);
|
void setPickNode(QQuick3DNode *node);
|
||||||
|
void setDragHelper(MouseArea3D *dragHelper);
|
||||||
|
|
||||||
void setX(qreal x);
|
void setX(qreal x);
|
||||||
void setY(qreal y);
|
void setY(qreal y);
|
||||||
@@ -126,6 +129,7 @@ signals:
|
|||||||
void circlePickAreaChanged();
|
void circlePickAreaChanged();
|
||||||
void minAngleChanged();
|
void minAngleChanged();
|
||||||
void pickNodeChanged();
|
void pickNodeChanged();
|
||||||
|
void dragHelperChanged();
|
||||||
|
|
||||||
// angle parameter is only set if circlePickArea is specified
|
// angle parameter is only set if circlePickArea is specified
|
||||||
void pressed(const QVector3D &scenePos, const QPoint &screenPos, qreal angle);
|
void pressed(const QVector3D &scenePos, const QPoint &screenPos, qreal angle);
|
||||||
@@ -156,7 +160,7 @@ private:
|
|||||||
bool m_dragging = false;
|
bool m_dragging = false;
|
||||||
bool m_active = false;
|
bool m_active = false;
|
||||||
|
|
||||||
QVector3D getMousePosInPlane(const QPointF &mousePosInView) const;
|
QVector3D getMousePosInPlane(const MouseArea3D *helper, const QPointF &mousePosInView) const;
|
||||||
|
|
||||||
static MouseArea3D *s_mouseGrab;
|
static MouseArea3D *s_mouseGrab;
|
||||||
bool m_grabsMouse = false;
|
bool m_grabsMouse = false;
|
||||||
@@ -164,6 +168,7 @@ private:
|
|||||||
QPointF m_circlePickArea;
|
QPointF m_circlePickArea;
|
||||||
qreal m_minAngle = 0.;
|
qreal m_minAngle = 0.;
|
||||||
QQuick3DNode *m_pickNode = nullptr;
|
QQuick3DNode *m_pickNode = nullptr;
|
||||||
|
MouseArea3D *m_dragHelper = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user