mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-08-03 08:48:40 +02:00
[ui] Viewer3D: TransformGizmo - use one global FrameAction
- Use only one global FrameAction instead of having one per axis
This commit is contained in:
parent
6a9f229838
commit
29c4be6210
2 changed files with 60 additions and 34 deletions
|
@ -7,16 +7,16 @@ import Qt3D.Logic 2.0
|
|||
|
||||
Entity {
|
||||
id: root
|
||||
property real gizmoScale: 0.15
|
||||
property real gizmoScale: 0.20
|
||||
property Camera camera
|
||||
readonly property Transform objectTransform : Transform {}
|
||||
|
||||
signal pickedChanged(bool picked)
|
||||
signal pickedChanged(bool pressed)
|
||||
|
||||
components: [gizmoDisplayTransform, mouseHandler]
|
||||
|
||||
|
||||
/***** ENUM *****/
|
||||
/***** ENUMS *****/
|
||||
|
||||
enum Axis {
|
||||
X,
|
||||
|
@ -24,6 +24,12 @@ Entity {
|
|||
Z
|
||||
}
|
||||
|
||||
enum Type {
|
||||
POSITION,
|
||||
ROTATION,
|
||||
SCALE
|
||||
}
|
||||
|
||||
/***** QUATERNIONS *****/
|
||||
|
||||
function multiplyQuaternion(q1, q2) {
|
||||
|
@ -297,12 +303,15 @@ Entity {
|
|||
|
||||
TransformGizmoPicker {
|
||||
id: scalePicker
|
||||
mouseController : mouseHandler
|
||||
objectMaterial : scaleMaterial
|
||||
objectBaseColor : baseColor
|
||||
|
||||
mouseController: mouseHandler
|
||||
gizmoMaterial: scaleMaterial
|
||||
gizmoBaseColor: baseColor
|
||||
gizmoAxis: axis
|
||||
gizmoType: TransformGizmo.Type.SCALE
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -353,12 +362,15 @@ Entity {
|
|||
|
||||
TransformGizmoPicker {
|
||||
id: positionPicker
|
||||
mouseController : mouseHandler
|
||||
objectMaterial : positionMaterial
|
||||
objectBaseColor : baseColor
|
||||
mouseController: mouseHandler
|
||||
gizmoMaterial: positionMaterial
|
||||
gizmoBaseColor: baseColor
|
||||
gizmoAxis: axis
|
||||
gizmoType: TransformGizmo.Type.POSITION
|
||||
|
||||
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 {
|
||||
id: rotationPicker
|
||||
mouseController: mouseHandler
|
||||
objectMaterial: rotationMaterial
|
||||
objectBaseColor: baseColor
|
||||
gizmoMaterial: rotationMaterial
|
||||
gizmoBaseColor: baseColor
|
||||
gizmoAxis: axis
|
||||
gizmoType: TransformGizmo.Type.ROTATION
|
||||
|
||||
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 {
|
||||
onTriggered: {
|
||||
// POSITION PICKER
|
||||
if (positionPicker.isPressed) {
|
||||
FrameAction {
|
||||
id: transformHandler
|
||||
property var objectPicker: null
|
||||
|
||||
onTriggered: {
|
||||
if (objectPicker) {
|
||||
switch(objectPicker.gizmoType) {
|
||||
case TransformGizmo.Type.POSITION: {
|
||||
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
|
||||
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
|
||||
|
||||
let pickedAxis
|
||||
switch(axis) {
|
||||
switch(objectPicker.gizmoAxis) {
|
||||
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.Z: pickedAxis = Qt.vector3d(0,0,1); break
|
||||
|
@ -423,24 +444,26 @@ Entity {
|
|||
mouseHandler.lastPosition = mouseHandler.currentPosition
|
||||
return
|
||||
}
|
||||
if (rotationPicker.isPressed) {
|
||||
|
||||
case TransformGizmo.Type.ROTATION: {
|
||||
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
|
||||
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
|
||||
// const offset = 0.1*offsetX - 0.1*offsetY
|
||||
const offset = 1
|
||||
|
||||
doRotation(axis, offset)
|
||||
doRotation(objectPicker.gizmoAxis, offset)
|
||||
mouseHandler.lastPosition = mouseHandler.currentPosition
|
||||
return
|
||||
}
|
||||
if (scalePicker.isPressed) {
|
||||
|
||||
case TransformGizmo.Type.SCALE: {
|
||||
const offsetX = mouseHandler.currentPosition.x - mouseHandler.lastPosition.x
|
||||
const offsetY = mouseHandler.currentPosition.y - mouseHandler.lastPosition.y
|
||||
// const offset = 0.1*offsetX - 0.1*offsetY
|
||||
const offset = 0.05
|
||||
|
||||
let pickedAxis
|
||||
switch(axis) {
|
||||
switch(objectPicker.gizmoAxis) {
|
||||
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.Z: pickedAxis = Qt.vector3d(0,0,1); break
|
||||
|
@ -448,7 +471,7 @@ Entity {
|
|||
|
||||
doScale(pickedAxis.times(offset))
|
||||
mouseHandler.lastPosition = mouseHandler.currentPosition
|
||||
return
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,28 +7,31 @@ import Qt3D.Logic 2.0
|
|||
|
||||
ObjectPicker {
|
||||
id: root
|
||||
hoverEnabled: true
|
||||
property bool isPressed : false
|
||||
property MouseHandler mouseController
|
||||
property var objectMaterial
|
||||
property color objectBaseColor
|
||||
property var gizmoMaterial
|
||||
property color gizmoBaseColor
|
||||
property int gizmoAxis
|
||||
property int gizmoType
|
||||
|
||||
signal pickedChanged(bool picked)
|
||||
signal pickedChanged(var picker)
|
||||
|
||||
hoverEnabled: true
|
||||
|
||||
onPressed: {
|
||||
root.isPressed = true
|
||||
pickedChanged(true)
|
||||
pickedChanged(this)
|
||||
mouseController.currentPosition = mouseController.lastPosition = pick.position
|
||||
}
|
||||
onEntered: {
|
||||
objectMaterial.ambient = "white"
|
||||
gizmoMaterial.ambient = "white"
|
||||
}
|
||||
onExited: {
|
||||
if(!isPressed) objectMaterial.ambient = objectBaseColor
|
||||
if(!isPressed) gizmoMaterial.ambient = gizmoBaseColor
|
||||
}
|
||||
onReleased: {
|
||||
objectMaterial.ambient = objectBaseColor
|
||||
gizmoMaterial.ambient = gizmoBaseColor
|
||||
root.isPressed = false
|
||||
pickedChanged(false)
|
||||
pickedChanged(this)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue