mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-08-06 10:18:42 +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 {
|
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) {
|
||||||
|
@ -297,12 +303,15 @@ 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,12 +362,15 @@ 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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue