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() { }
}
}
|