// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

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 {
        id: view3D
        anchors.fill: parent

        environment: SceneEnvironment {
            clearColor: "#202020"
            backgroundMode: SceneEnvironment.Color
            antialiasingMode: SceneEnvironment.MSAA
            antialiasingQuality: SceneEnvironment.High
        }

        PerspectiveCamera {
            id: camera
            property real cameraAnim: 0
            SequentialAnimation on cameraAnim {
                running: true
                NumberAnimation {
                    to: 0.5
                    duration: 2000
                    easing.type: Easing.InOutQuad
                }
            }
            position: Qt.vector3d(0, 400 + cameraAnim * 400, 800 - cameraAnim * 800)
            eulerRotation: Qt.vector3d(-30 - cameraAnim * 60, 0, 0)
        }

        PointLight {
            position: Qt.vector3d(0, 400, 300)
            brightness: 40
            ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0)
        }

        // Model shared between particles
        Component {
            id: particleComponent
            Model {
                source: "#Cube"
                scale: Qt.vector3d(0.2, 0.2, 0.2)
                materials: DefaultMaterial {
                }
            }
        }

        ParticleSystem3D {
            id: psystem
            useRandomSeed: false
            running: false

            NumberAnimation {
                running: true
                target: psystem
                property: "eulerRotation.y"
                from: 0
                to: 140
                duration: 2000
            }

            // Particles
            ModelParticle3D {
                id: particleWhite
                delegate: particleComponent
                maxAmount: 1200
                color: "#ffffff"
            }

            SpriteParticle3D {
                id: particleBillboard
                sprite: Texture {
                    source: "images/sphere.png"
                }
                maxAmount: 250
                color: "#ff0000"
                billboard: true
            }

            ParticleEmitter3D {
                id: emitter1
                particle: particleWhite
                position: Qt.vector3d(-100, -200, 0)
                particleScale: 0.2
                particleEndScale: 1.0
                particleRotationVariation: Qt.vector3d(180, 180, 180)
                velocity: VectorDirection3D {
                    direction: Qt.vector3d(0, 200, 0)
                    directionVariation: Qt.vector3d(20, 0, 20)
                }
                lifeSpan: 3000
                emitRate: 100
            }

            ParticleEmitter3D {
                id: emitter2
                particle: particleBillboard
                position: Qt.vector3d(100, -200, 0)
                particleScale: 4
                particleRotationVariation: Qt.vector3d(180, 180, 180)
                velocity: VectorDirection3D {
                    direction: Qt.vector3d(0, 200, 0)
                    directionVariation: Qt.vector3d(20, 0, 20)
                }
                lifeSpan: 3000
                emitRate: 100
            }
        }
    }
}
