aboutsummaryrefslogtreecommitdiffstats
path: root/share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ParticleEmitterGizmo.qml
blob: 829556ecb2a3a390b09ca9c49bc615c7e420daea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0

import QtQuick
import QtQuick3D
import QtQuick3D.Particles3D

// Note: This gizmo is also used to visualize Attractor3D in addition to ParticleEmitter3D,
//       as the two are very similar.

Node {
    id: root

    property Node targetNode: null
    property var selectedNodes: []
    property Node activeParticleSystem: null
    property Node scene: null
    property Node activeScene: null
    property bool hidden: false
    property bool systemHidden: false
    property Node shapeModel: null
    property bool globalShow: false
    property bool canBeVisible: activeScene === scene && targetNode && !hidden && !systemHidden
    property bool partOfActiveSystem: root.targetNode && root.targetNode.system === activeParticleSystem
    property bool isEmitter: targetNode && targetNode instanceof ParticleEmitter3D

    opacity: 0.15

    readonly property bool selected: selectedNodes.includes(targetNode)

    visible: canBeVisible && (globalShow || selected)

    position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0)
    rotation: targetNode ? targetNode.sceneRotation : Qt.quaternion(1, 0, 0, 0)
    scale: targetNode ? targetNode.sceneScale : Qt.vector3d(1, 1, 1)

    function basicShape()
    {
        if (targetNode && targetNode.shape && targetNode.shape instanceof ParticleShape3D) {
            if (targetNode.shape.type === ParticleShape3D.Cube)
                return "#Cube";
            else if (targetNode.shape.type === ParticleShape3D.Cylinder)
                return "#Cylinder";
        }
        return "#Sphere";
    }

    function updateShape()
    {
        if (shapeModel)
            shapeModel.destroy();

        if (!targetNode)
            return;

        if (targetNode.shape instanceof ParticleModelShape3D) {
            shapeModel = _generalHelper.createParticleEmitterGizmoModel(targetNode, defaultMaterial);
            shapeModel.parent = root;
        }
    }

    Component.onCompleted: {
        updateShape();
    }

    Connections {
        target: targetNode
        function onSystemChanged() { systemHidden = _generalHelper.isHidden(system); }
    }

    Connections {
        target: targetNode
        function onShapeChanged() { updateShape(); }
    }

    Connections {
        target: targetNode.shape instanceof ParticleModelShape3D ? targetNode.shape
                                                                 :null
        function onDelegateChanged() { updateShape(); }
    }

    Connections {
        target: targetNode.shape instanceof ParticleModelShape3D ? targetNode.shape.delegate
                                                                 : null
        function onSourceChanged() { updateShape(); }
    }

    Model {
        readonly property Node _pickTarget: root.targetNode
        materials: [defaultMaterial]
        source: basicShape()
        scale: root.targetNode && root.targetNode.shape && targetNode.shape instanceof ParticleShape3D
               ? root.targetNode.shape.extents.times(0.02) // default extent is 50
               : autoScale.getScale(Qt.vector3d(0.1, 0.1, 0.1))
        visible: !shapeModel
    }

    AutoScaleHelper {
        id: autoScale
        view3D: overlayView
    }

    DefaultMaterial {
        id: defaultMaterial
        diffuseColor: root.selected ? "#FF0000"
                                    : root.partOfActiveSystem
                                      ? root.isEmitter ? "#FFFF00" : "#0000FF"
                                      : "#AAAAAA"
        lighting: DefaultMaterial.NoLighting
        cullMode: Material.NoCulling
    }
}