File: tst_geometry_readd.qml

package info (click to toggle)
qt6-quick3dphysics 6.9.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,116 kB
  • sloc: cpp: 261,267; python: 40; makefile: 21
file content (145 lines) | stat: -rw-r--r-- 4,157 bytes parent folder | download | duplicates (2)
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtTest
import QtQuick3D
import QtQuick3D.Physics
import QtQuick3D.Physics.Helpers
import Geometry

// This test tries repeatedly adding and removing a static triangle mesh.
// It should not leak nor crash.

Item {
    width: 640
    height: 480
    visible: true

    PhysicsWorld {
        scene: viewport.scene
        minimumTimestep: 16
        maximumTimestep: 16
        forceDebugDraw: true
    }

    View3D {
        id: viewport
        anchors.fill: parent

        environment: SceneEnvironment {
            clearColor: "#d6dbdf"
            backgroundMode: SceneEnvironment.Color
        }

        PerspectiveCamera {
            position: Qt.vector3d(-200, 100, 500)
            eulerRotation: Qt.vector3d(-20, -20, 0)
            clipFar: 5000
            clipNear: 1
        }

        DirectionalLight {
            eulerRotation.x: -45
            eulerRotation.y: 45
            castsShadow: true
            brightness: 1
            shadowFactor: 100
        }

        StaticRigidBody {
            position: Qt.vector3d(0, -100, 0)
            eulerRotation: Qt.vector3d(-90, 0, 0)
            collisionShapes: PlaneShape {}
            Model {
                source: "#Rectangle"
                scale: Qt.vector3d(10, 10, 1)
                materials: DefaultMaterial {
                    diffuseColor: "green"
                }
                castsShadows: false
                receivesShadows: true
            }
        }

        DynamicRigidBody {
            id: dynamicBox
            property bool hit : false
            onBodyContact: () => {
                dynamicBox.hit = true
            }
            receiveContactReports: true
            sendContactReports: true

            position: Qt.vector3d(-50, 300, 0)
            collisionShapes: ConvexMeshShape {
                geometry: ExampleTriangleGeometry { }
            }
            Model {
                geometry: ExampleTriangleGeometry { }
                materials: PrincipledMaterial {
                    baseColor: "yellow"
                }
            }

            onPositionChanged: frameAnimation.stepFrame()
        }

        StaticRigidBody {
            id: staticBox
            sendContactReports: true
            position: Qt.vector3d(0, 50, 0)
            collisionShapes: TriangleMeshShape {
                geometry: ExampleTriangleGeometry { }
            }
        }
    }

    QtObject {
        id: frameAnimation
        property int frame: -1
        property var shape: null
        function stepFrame() {
            frame += 1;
            let step = frame % 4;
            if (step == 0) {
                shape = Qt.createQmlObject(`
                    import QtQuick
                    import QtQuick3D
                    import QtQuick3D.Physics
                    import QtQuick3D.Physics.Helpers
                    import Geometry
                    TriangleMeshShape { geometry: ExampleTriangleGeometry {} }
                    `,
                    frameAnimation,
                    "myGeometry"
                );
                staticBox.collisionShapes = shape
            } else if (step == 1) {
                staticBox.collisionShapes = []
                shape.destroy()
                shape = null
            } else if (step == 2) {
                shape = Qt.createQmlObject(`
                    import QtQuick
                    import QtQuick3D
                    import QtQuick3D.Physics
                    import QtQuick3D.Physics.Helpers
                    import Geometry
                    TriangleMeshShape { geometry: ExampleTriangleGeometry {} }
                    `,
                    frameAnimation,
                    "myGeometry"
                );
                staticBox.collisionShapes = shape
            } else if (step == 3) {
                staticBox.collisionShapes[0].destroy();
            }
        }
    }

    TestCase {
        name: "scene"
        when: dynamicBox.hit
        function triggered() {  }
    }
}