Revision control
++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ import QtQuick
++ import QtQuick3D
++ import QtQuick3D.Particles3D
++ import QtQuick3D.Helpers
++ import QtQuick.Timeline
++
++ Item {
++ id: mainWindow
++ width: 1200
++ height: 600
++
++ property real systemtime: 0
++ property real fontSize: 14
++
++ 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: mainWindow
++ property: "systemtime"
++ Keyframe { frame: 0; value: 0 }
++ Keyframe { frame: 120; value: 2000 }
++ }
++ ]
++ }
++
++ component LineEmitter : Node {
++ id: root
++ property alias emitterPosition : emitter.position
++ property alias emitterScale : emitter.scale
++ property alias emitRate : emitter.emitRate
++ property alias particleCount : particle.maxAmount
++ property real particleOpacity : 1.0
++ property bool textureEnabled : false
++ property bool variableLengthEnabled : false
++ property alias lineSegmentCount : particle.segmentCount
++ property alias particleScale : particle.particleScale
++ property alias particleTexcoordMode : particle.texcoordMode
++ property alias particleTexcoordScale : particle.texcoordMultiplier
++ property alias particleEolFadeDuration : particle.eolFadeOutDuration
++ property real lineLength : 50.0
++ property alias lifespan : emitter.lifeSpan
++ property real velocityX : 120.0
++ property real velocityY : 0.0
++ property real velocityZ : 0.0
++ property real velocityVariation : 5.0
++ property var system
++ property string description : "desc"
++ property real fontSize : 14.0
++ property alias fadeOutDuration : particle.fadeOutDuration
++ property alias fadeInDuration : particle.fadeInDuration
++
++ ParticleEmitter3D {
++ id: emitter
++ system: root.system
++ Texture {
++ id: tex
++ source: "images/qt_logo.png"
++ }
++ particle: LineParticle3D {
++ id: particle
++ sprite: textureEnabled ? tex : null
++ maxAmount: 20
++ color: Qt.rgba(1.0, 1.0, 1.0, particleOpacity)
++ fadeInDuration: 0
++ fadeOutDuration: 500
++ texcoordMode: LineParticle3D.Relative
++ billboard: false
++ length: variableLengthEnabled ? -1.0 : root.lineLength
++ lengthDeltaMin: variableLengthEnabled ? root.lineLength / root.lineSegmentCount : 10.0
++ eolFadeOutDuration: 0
++ particleScale: 20.0
++ segmentCount: 5
++ }
++ velocity: VectorDirection3D {
++ direction: Qt.vector3d(root.velocityX, root.velocityY, root.velocityZ)
++ directionVariation: Qt.vector3d(root.velocityVariation, root.velocityVariation, root.velocityVariation)
++ }
++ emitRate: 2
++ lifeSpan: 3000
++ Text {
++ x: -100
++ text: description
++ font.pixelSize: root.fontSize
++ color: "white"
++ }
++ }
++ }
++
++ component LineEmitterSystem : ParticleSystem3D {
++
++ property real gravityStrength: 0.0
++ property bool variableLengthEnabled: false
++ property int lifespan: 3000
++
++ useRandomSeed: false
++ running: false
++
++ id: psystem
++
++ Gravity3D {
++ position: Qt.vector3d(600, 100, 0)
++ magnitude: psystem.gravityStrength
++ direction: Qt.vector3d(1, 0, 0)
++ }
++
++ LineEmitter {
++ description: "length 50"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 0, 0)
++ variableLengthEnabled: psystem.variableLengthEnabled
++ lifespan: psystem.lifespan
++ }
++
++ LineEmitter {
++ description: "length 100"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 50, 0)
++ lineLength: 100
++ velocityX: 240
++ lifespan: psystem.lifespan - 1000
++ variableLengthEnabled: psystem.variableLengthEnabled
++ }
++
++ LineEmitter {
++ description: "End-of-Life fade"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 100, 0)
++ particleEolFadeDuration: 1000
++ fadeOutDuration: 0
++ variableLengthEnabled: psystem.variableLengthEnabled
++ lifespan: psystem.lifespan
++ }
++
++ LineEmitter {
++ description: "textured"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 150, 0)
++ textureEnabled: true
++ variableLengthEnabled: psystem.variableLengthEnabled
++ lifespan: psystem.lifespan
++ }
++
++ LineEmitter {
++ description: "textured, absolute coordinates"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 200, 0)
++ textureEnabled: true
++ particleTexcoordMode: LineParticle3D.Absolute
++ variableLengthEnabled: psystem.variableLengthEnabled
++ lifespan: psystem.lifespan
++ }
++
++ LineEmitter {
++ description: "textured, filled"
++ fontSize: mainWindow.fontSize
++ system: psystem
++ emitterPosition: Qt.vector3d(0, 250, 0)
++ textureEnabled: true
++ particleTexcoordMode: LineParticle3D.Fill
++ variableLengthEnabled: psystem.variableLengthEnabled
++ lifespan: psystem.lifespan
++ }
++ }
++
++ Text {
++ x : mainWindow.width / 4
++ text: "Fixed length"
++ font.pixelSize: mainWindow.fontSize
++ color: "black"
++ }
++ Text {
++ id: textbox
++ x : 3 * mainWindow.width / 4
++ text: "Variable length"
++ font.pixelSize: mainWindow.fontSize
++ color: "black"
++ }
++
++ View3D {
++ anchors.topMargin: textbox.height
++ anchors.fill: parent
++
++ environment: SceneEnvironment {
++ clearColor: "#101010"
++ backgroundMode: SceneEnvironment.Color
++ antialiasingMode: SceneEnvironment.MSAA
++ antialiasingQuality: SceneEnvironment.VeryHigh
++ }
++ camera: PerspectiveCamera {
++ id: camera
++ position: Qt.vector3d(-50, 100, 500)
++ clipFar: 2000
++ }
++
++ Model {
++ source: "#Cube"
++ position: Qt.vector3d(-400, -50, 0)
++ eulerRotation.y: mainWindow.systemtime * 0.1
++ scale: Qt.vector3d(0.5, 0.5, 0.001)
++ materials: [
++ DefaultMaterial {
++ diffuseColor: "white"
++ lighting: DefaultMaterial.NoLighting
++ }
++ ]
++ }
++
++ LineEmitterSystem {
++ id: fixedSize
++ position: Qt.vector3d(-500, 0, 0)
++ time: mainWindow.systemtime
++ }
++
++ LineEmitterSystem {
++ id: variableSize
++ position: Qt.vector3d(100, 0, 0)
++ gravityStrength: 150.0
++ variableLengthEnabled: true
++ lifespan: 2000
++ time: mainWindow.systemtime
++ }
++ }
++ }