Revision control

++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ import QtQuick
++ import QtQuick3D
++ import QtQuick3D.Particles3D
++ import QtQuick.Timeline
++
++ Item {
++ id: mainWindow
++ width: 400
++ height: 400
++
++ Timeline {
++ id: timeline
++ enabled: true
++ startFrame: 0
++ endFrame: 120
++ animations: [
++ TimelineAnimation {
++ id: timelineAnimation
++ running: true
++ duration: 2000
++ from: timeline.currentFrame
++ to: 120
++ }
++ ]
++ keyframeGroups: [
++ KeyframeGroup {
++ target: psystem
++ property: "time"
++ Keyframe { frame: 0; value: 0 }
++ Keyframe { frame: 120; value: 2000 }
++ }
++ ]
++ }
++
++ View3D {
++ anchors.fill: parent
++
++ environment: SceneEnvironment {
++ clearColor: "#202020"
++ backgroundMode: SceneEnvironment.Color
++ antialiasingMode: SceneEnvironment.MSAA
++ antialiasingQuality: SceneEnvironment.High
++ }
++
++ camera: PerspectiveCamera {
++ id: camera
++ position: Qt.vector3d(0, 0, 600)
++ }
++
++ PointLight {
++ position: Qt.vector3d(0, 400, 0)
++ brightness: 10
++ ambientColor: Qt.rgba(0.3, 0.3, 0.3, 1.0)
++ }
++
++ // Model shared between particles
++ Component {
++ id: particleComponent
++ Model {
++ source: "#Cube"
++ scale: Qt.vector3d(0.15, 0.02, 0.02)
++ eulerRotation: Qt.vector3d(20,-20,20)
++ materials: DefaultMaterial {
++ lighting: DefaultMaterial.NoLighting
++ }
++ }
++ }
++
++ ParticleSystem3D {
++ id: psystem
++ useRandomSeed: false
++ running: false
++
++ // Particles
++ ModelParticle3D {
++ id: particleRed
++ delegate: particleComponent
++ maxAmount: 1000
++ color: "#ff0000"
++ colorVariation: Qt.vector4d(0, 0, 0, 0.8)
++ }
++ ModelParticle3D {
++ id: particleGreen
++ delegate: particleComponent
++ maxAmount: 1000
++ color: "#00ff00"
++ colorVariation: Qt.vector4d(0, 0, 0, 0.8)
++ }
++ ModelParticle3D {
++ id: particleWhite
++ delegate: particleComponent
++ maxAmount: 1000
++ color: "#ffffff"
++ colorVariation: Qt.vector4d(0, 0, 0, 0.8)
++ }
++
++ Model {
++ id: emittingSphere
++ source: "#Sphere"
++ scale: Qt.vector3d(2.0, 2.0, 2.0)
++ materials: DefaultMaterial {
++ opacity: 0.2
++ }
++
++ position.x: -300
++ position.y: -200
++ }
++
++ // Emitters, one per particle
++ ParticleEmitter3D {
++ system: psystem
++ position: emittingSphere.position
++ particle: particleRed
++ shape: ParticleShape3D {
++ type: ParticleShape3D.Sphere
++ fill: true
++ }
++ emitRate: 500
++ lifeSpan: 2000
++ }
++
++ ParticleEmitter3D {
++ id: emitter2
++ system: psystem
++ position: emittingSphere.position
++ particle: particleGreen
++ shape: ParticleShape3D {
++ type: ParticleShape3D.Sphere
++ fill: true
++ }
++ emitRate: 200
++ lifeSpan: 5000
++ velocity: VectorDirection3D {
++ direction: Qt.vector3d(0, 400, 0)
++ directionVariation: Qt.vector3d(50, 50, 50)
++ }
++ particleRotationVelocityVariation: Qt.vector3d(500.0, 500.0, 500.0)
++ }
++
++ ParticleEmitter3D {
++ system: psystem
++ particle: particleWhite
++ position: Qt.vector3d(100, 50, 0)
++ scale: Qt.vector3d(5.0, 5.0, 5.0)
++ shape: ParticleCustomShape3D {
++ source: "qt_logo_in_4096.cbor"
++ }
++ emitRate: 500
++ lifeSpan: 5000
++ }
++
++ Model {
++ id: targetSphere
++ source: "#Sphere"
++ materials: DefaultMaterial {
++ opacity: 0.2
++ }
++ position.y: -200
++ }
++
++ Wander3D {
++ particles: [particleGreen]
++ uniqueAmount: Qt.vector3d(10, 10, 10)
++ uniquePace: Qt.vector3d(1, 1, 1)
++ uniqueAmountVariation: 8
++ uniquePaceVariation: 0.8
++ }
++
++ Attractor3D {
++ particles: [particleRed]
++ // Attract into a position
++ position: targetSphere.position
++ positionVariation: Qt.vector3d(10, 10, 10)
++ duration: 1500
++ durationVariation: 500
++ hideAtEnd: false
++ }
++
++ Attractor3D {
++ particles: [particleGreen]
++ // Attract into a shape
++ shape: ParticleShape3D {
++ type: ParticleShape3D.Sphere
++ fill: false
++ }
++ duration: 3000
++ durationVariation: 500
++ hideAtEnd: false
++ }
++ }
++ }
++ }