summaryrefslogtreecommitdiffstats
path: root/tests/manual/compute-particles/ParticlesScene.qml
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/compute-particles/ParticlesScene.qml')
-rw-r--r--tests/manual/compute-particles/ParticlesScene.qml200
1 files changed, 200 insertions, 0 deletions
diff --git a/tests/manual/compute-particles/ParticlesScene.qml b/tests/manual/compute-particles/ParticlesScene.qml
new file mode 100644
index 000000000..c3b6fa4ae
--- /dev/null
+++ b/tests/manual/compute-particles/ParticlesScene.qml
@@ -0,0 +1,200 @@
+// Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB).
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import Qt3D.Extras 2.0
+
+Entity {
+ property alias particleStep: computeMaterial.particleStep
+ property alias finalCollisionFactor: computeMaterial.finalCollisionFactor
+
+ readonly property int _SPHERE: 0
+ readonly property int _CUBE: 1
+ readonly property int _CYLINDER: 2
+ readonly property int _TORUS: 3
+
+ property int particlesShape: _SPHERE
+
+ signal reset()
+
+ components: [
+ RenderSettings {
+ ComputeFrameGraph {
+ camera: sceneCamera
+ }
+ // explicitly set RenderingPolicy to AlwaysRender, as changes in the
+ // scene won't be reflected in actual Qt scene-graph changes (due to
+ // GPU compute calls)
+ renderPolicy: RenderSettings.Always
+ }
+ ]
+
+ FirstPersonCameraController { camera: sceneCamera }
+
+ Camera {
+ id: sceneCamera
+ projectionType: CameraLens.PerspectiveProjection
+ viewCenter: Qt.vector3d(0, 0, 0)
+ position: Qt.vector3d(0, 0, -800)
+ nearPlane: 0.1
+ farPlane: 1000
+ fieldOfView: 25
+ aspectRatio: 1.33
+ }
+
+ property int particlesCount: 50 * 1024
+ readonly property int floatSize: 4
+
+ function buildParticlesBuffer() {
+ var byteSizeOfParticleData = 12;
+ var bufferData = new Float32Array(particlesCount * byteSizeOfParticleData);
+ var factor = 500.0;
+ for (var i = 0; i < particlesCount; ++i) {
+ var positionIdx = i * byteSizeOfParticleData;
+ var velocityIdx = i * byteSizeOfParticleData + 4;
+ var colorIdx = i * byteSizeOfParticleData + 8;
+
+ for (var j = 0; j < 3; ++j) {
+ bufferData[positionIdx + j] = (Math.random() - 0.5) * factor;
+ bufferData[velocityIdx + j] = Math.random() * 2.0;
+ bufferData[colorIdx + j] = 0.75 + Math.sin(((i / 1024.0) + j * 0.333) * 6.0) * 0.25;
+ }
+
+ bufferData[positionIdx + 3] = 1.0;
+ bufferData[velocityIdx + 3] = 0.0;
+ bufferData[colorIdx + 3] = 1.0;
+ }
+ return bufferData
+ }
+
+ Buffer {
+ id: particleBuffer
+ // struct ParticleData
+ // {
+ // vec3 position; // Aligned to 4 floats
+ // vec3 velocity; // Aligned to 4 floats
+ // vec3 color; // Aligned to 4 floats
+ // };
+ data: buildParticlesBuffer()
+ }
+
+ onReset : {
+ particleBuffer.data = buildParticlesBuffer()
+ }
+
+ Attribute {
+ id: particlePositionDataAttribute
+ name: "particlePosition"
+ attributeType: Attribute.VertexAttribute
+ vertexBaseType: Attribute.Float
+ vertexSize: 3
+ divisor: 1
+ byteStride: 12 * floatSize
+ buffer: particleBuffer
+ }
+
+ Attribute {
+ id: particleColorDataAttribute
+ name: "particleColor"
+ attributeType: Attribute.VertexAttribute
+ vertexBaseType: Attribute.Float
+ vertexSize: 3
+ divisor: 1
+ byteOffset: 8 * floatSize
+ byteStride: 12 * floatSize
+ buffer: particleBuffer
+ }
+
+ ComputeMaterial {
+ id: computeMaterial
+ dataBuffer: particleBuffer
+ }
+
+ Entity {
+ id: particleComputeEntity
+ readonly property ComputeCommand particlesComputeJob: ComputeCommand {}
+ components: [
+ particlesComputeJob,
+ computeMaterial
+ ]
+ }
+
+ SphereGeometry {
+ id: sphereGeometry
+ rings: 10
+ slices: 10
+ radius: 1
+ // Additional Attributes
+ attributes: [
+ particlePositionDataAttribute,
+ particleColorDataAttribute
+ ]
+ }
+
+ CuboidGeometry {
+ id: cubeGeometry
+ yzMeshResolution: Qt.size(2, 2)
+ xzMeshResolution: Qt.size(2, 2)
+ xyMeshResolution: Qt.size(2, 2)
+ // Additional Attributes
+ attributes: [
+ particlePositionDataAttribute,
+ particleColorDataAttribute
+ ]
+ }
+
+ CylinderGeometry {
+ id: cylinderGeometry
+ rings: 10
+ slices: 10
+ radius: 1
+ length: 1.5
+ // Additional Attributes
+ attributes: [
+ particlePositionDataAttribute,
+ particleColorDataAttribute
+ ]
+ }
+
+ TorusGeometry {
+ id: torusGeometry
+ rings: 10
+ slices: 10
+ radius: 1
+ minorRadius: 0.5
+ // Additional Attributes
+ attributes: [
+ particlePositionDataAttribute,
+ particleColorDataAttribute
+ ]
+ }
+
+ Entity {
+ id: particleRenderEntity
+ readonly property GeometryRenderer particlesRenderer: GeometryRenderer {
+ instanceCount: particlesCount
+ indexOffset: 0
+ firstInstance: 0
+ primitiveType: GeometryRenderer.Triangles
+ geometry: {
+ switch (particlesShape) {
+ case _SPHERE:
+ return sphereGeometry;
+ case _CUBE:
+ return cubeGeometry;
+ case _CYLINDER:
+ return cylinderGeometry;
+ case _TORUS:
+ return torusGeometry;
+ }
+ }
+ }
+
+ components: [
+ particlesRenderer,
+ computeMaterial
+ ]
+ }
+}
+