[ui] Viewer3D: TransformGizmo - use one global FrameAction

- Use only one global FrameAction instead of having one per axis
This commit is contained in:
Julien-Haudegond 2020-07-07 12:44:23 +02:00
parent 6a9f229838
commit 29c4be6210
2 changed files with 60 additions and 34 deletions

View file

@ -7,16 +7,16 @@ import Qt3D.Logic 2.0
Entity { Entity {
id: root id: root
property real gizmoScale: 0.15 property real gizmoScale: 0.20
property Camera camera property Camera camera
readonly property Transform objectTransform : Transform {} readonly property Transform objectTransform : Transform {}
signal pickedChanged(bool picked) signal pickedChanged(bool pressed)
components: [gizmoDisplayTransform, mouseHandler] components: [gizmoDisplayTransform, mouseHandler]
/***** ENUM *****/ /***** ENUMS *****/
enum Axis { enum Axis {
X, X,
@ -24,6 +24,12 @@ Entity {
Z Z
} }
enum Type {
POSITION,
ROTATION,
SCALE
}
/***** QUATERNIONS *****/ /***** QUATERNIONS *****/
function multiplyQuaternion(q1, q2) { function multiplyQuaternion(q1, q2) {
@ -298,11 +304,14 @@ Entity {
TransformGizmoPicker { TransformGizmoPicker {
id: scalePicker id: scalePicker
mouseController: mouseHandler mouseController: mouseHandler
objectMaterial : scaleMaterial gizmoMaterial: scaleMaterial
objectBaseColor : baseColor gizmoBaseColor: baseColor
gizmoAxis: axis
gizmoType: TransformGizmo.Type.SCALE
onPickedChanged: { onPickedChanged: {
root.pickedChanged(picked) root.pickedChanged(picker.isPressed) // Used to prevent camera transformations
transformHandler.objectPicker = picker.isPressed ? picker : null // Pass the picker to the global FrameAction
} }
} }
} }
@ -354,11 +363,14 @@ Entity {
TransformGizmoPicker { TransformGizmoPicker {
id: positionPicker id: positionPicker
mouseController: mouseHandler mouseController: mouseHandler
objectMaterial : positionMaterial gizmoMaterial: positionMaterial
objectBaseColor : baseColor gizmoBaseColor: baseColor
gizmoAxis: axis
gizmoType: TransformGizmo.Type.POSITION
onPickedChanged: { onPickedChanged: {
root.pickedChanged(picked) root.pickedChanged(picker.isPressed) // Used to prevent camera transformations
transformHandler.objectPicker = picker.isPressed ? picker : null // Pass the picker to the global FrameAction
} }
} }
} }
@ -396,24 +408,33 @@ Entity {
TransformGizmoPicker { TransformGizmoPicker {
id: rotationPicker id: rotationPicker
mouseController: mouseHandler mouseController: mouseHandler
objectMaterial: rotationMaterial gizmoMaterial: rotationMaterial
objectBaseColor: baseColor gizmoBaseColor: baseColor
gizmoAxis: axis
gizmoType: TransformGizmo.Type.ROTATION
onPickedChanged: { onPickedChanged: {
root.pickedChanged(picked) root.pickedChanged(picker.isPressed) // Used to prevent camera transformations
transformHandler.objectPicker = picker.isPressed ? picker : null // Pass the picker to the global FrameAction
}
}
} }
} }
} }
FrameAction { FrameAction {
id: transformHandler
property var objectPicker: null
onTriggered: { onTriggered: {
// POSITION PICKER if (objectPicker) {
if (positionPicker.isPressed) { switch(objectPicker.gizmoType) {
case TransformGizmo.Type.POSITION: {
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
let pickedAxis let pickedAxis
switch(axis) { switch(objectPicker.gizmoAxis) {
case TransformGizmo.Axis.X: pickedAxis = Qt.vector3d(1,0,0); break case TransformGizmo.Axis.X: pickedAxis = Qt.vector3d(1,0,0); break
case TransformGizmo.Axis.Y: pickedAxis = Qt.vector3d(0,1,0); break case TransformGizmo.Axis.Y: pickedAxis = Qt.vector3d(0,1,0); break
case TransformGizmo.Axis.Z: pickedAxis = Qt.vector3d(0,0,1); break case TransformGizmo.Axis.Z: pickedAxis = Qt.vector3d(0,0,1); break
@ -423,24 +444,26 @@ Entity {
mouseHandler.lastPosition = mouseHandler.currentPosition mouseHandler.lastPosition = mouseHandler.currentPosition
return return
} }
if (rotationPicker.isPressed) {
case TransformGizmo.Type.ROTATION: {
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
// const offset = 0.1*offsetX - 0.1*offsetY // const offset = 0.1*offsetX - 0.1*offsetY
const offset = 1 const offset = 1
doRotation(axis, offset) doRotation(objectPicker.gizmoAxis, offset)
mouseHandler.lastPosition = mouseHandler.currentPosition mouseHandler.lastPosition = mouseHandler.currentPosition
return return
} }
if (scalePicker.isPressed) {
case TransformGizmo.Type.SCALE: {
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
// const offset = 0.1*offsetX - 0.1*offsetY // const offset = 0.1*offsetX - 0.1*offsetY
const offset = 0.05 const offset = 0.05
let pickedAxis let pickedAxis
switch(axis) { switch(objectPicker.gizmoAxis) {
case TransformGizmo.Axis.X: pickedAxis = Qt.vector3d(1,0,0); break case TransformGizmo.Axis.X: pickedAxis = Qt.vector3d(1,0,0); break
case TransformGizmo.Axis.Y: pickedAxis = Qt.vector3d(0,1,0); break case TransformGizmo.Axis.Y: pickedAxis = Qt.vector3d(0,1,0); break
case TransformGizmo.Axis.Z: pickedAxis = Qt.vector3d(0,0,1); break case TransformGizmo.Axis.Z: pickedAxis = Qt.vector3d(0,0,1); break

View file

@ -7,28 +7,31 @@ import Qt3D.Logic 2.0
ObjectPicker { ObjectPicker {
id: root id: root
hoverEnabled: true
property bool isPressed : false property bool isPressed : false
property MouseHandler mouseController property MouseHandler mouseController
property var objectMaterial property var gizmoMaterial
property color objectBaseColor property color gizmoBaseColor
property int gizmoAxis
property int gizmoType
signal pickedChanged(bool picked) signal pickedChanged(var picker)
hoverEnabled: true
onPressed: { onPressed: {
root.isPressed = true root.isPressed = true
pickedChanged(true) pickedChanged(this)
mouseController.currentPosition = mouseController.lastPosition = pick.position mouseController.currentPosition = mouseController.lastPosition = pick.position
} }
onEntered: { onEntered: {
objectMaterial.ambient = "white" gizmoMaterial.ambient = "white"
} }
onExited: { onExited: {
if(!isPressed) objectMaterial.ambient = objectBaseColor if(!isPressed) gizmoMaterial.ambient = gizmoBaseColor
} }
onReleased: { onReleased: {
objectMaterial.ambient = objectBaseColor gizmoMaterial.ambient = gizmoBaseColor
root.isPressed = false root.isPressed = false
pickedChanged(false) pickedChanged(this)
} }
} }