Revision control
++ // 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 QtQuick3D.Helpers
++ import QtQuick.Controls
++
++ Window {
++ id: window
++ width: 1024
++ height: 768
++ visible: true
++ title: qsTr("Reflection Probes")
++
++ View3D {
++ id: view
++ anchors.fill: parent
++ environment: SceneEnvironment {
++ clearColor: window.color
++ backgroundMode: SceneEnvironment.SkyBox
++ lightProbe: Texture {
++ source: "res/OpenfootageNET_lowerAustria01-1024.hdr"
++ }
++ probeOrientation: Qt.vector3d(0, -90, 0)
++ }
++
++ PerspectiveCamera {
++ id: camera
++ position: Qt.vector3d(-50, 700, 475)
++ eulerRotation.x: -50
++ }
++
++ DirectionalLight { }
++
++ Model {
++ property real angle
++ source: "#Sphere"
++ x: Math.cos(angle) * 100
++ z: Math.sin(angle) * 100
++ y: 300
++ receivesReflections: settingsPanel.sphereReceivesReflection
++ materials: PrincipledMaterial {
++ metalness: 1.0
++ roughness: settingsPanel.sphereRoughness
++ }
++
++ NumberAnimation on angle {
++ from: 0
++ to: Math.PI * 2
++ duration: 8000
++ loops: Animation.Infinite
++ }
++
++ ReflectionProbe {
++ objectName: "sphereReflProbe"
++ timeSlicing: {
++ if (settingsPanel.timeSlicingIndex == 0) ReflectionProbe.None
++ else if (settingsPanel.timeSlicingIndex == 1) ReflectionProbe.AllFacesAtOnce
++ else ReflectionProbe.IndividualFaces
++ }
++ refreshMode: {
++ if (settingsPanel.refreshModeIndex == 0) ReflectionProbe.EveryFrame
++ else ReflectionProbe.FirstFrame
++ }
++ quality: {
++ if (settingsPanel.qualityIndex == 0) ReflectionProbe.VeryLow
++ else if (settingsPanel.qualityIndex == 1) ReflectionProbe.Low
++ else if (settingsPanel.qualityIndex == 2) ReflectionProbe.Medium
++ else if (settingsPanel.qualityIndex == 3) ReflectionProbe.High
++ else ReflectionProbe.VeryHigh
++ }
++ boxSize: Qt.vector3d(300, 300, 300)
++ }
++ }
++
++ Model {
++ position: Qt.vector3d(200, 300, 0)
++ source: "#Sphere"
++ materials: PrincipledMaterial {
++ baseColor: "green"
++ }
++ }
++
++ Model {
++ position: Qt.vector3d(-200, 300, 0)
++ source: "#Sphere"
++ materials: PrincipledMaterial {
++ baseColor: "green"
++ }
++ }
++
++ Model {
++ position: Qt.vector3d(0, 200, -285)
++ scale: Qt.vector3d(6, 4, 0.3)
++ source: "#Cube"
++ materials: PrincipledMaterial {
++ baseColor: "yellow"
++ roughness: 0.1
++ metalness: 1.0
++ }
++ }
++
++ Model {
++ scale: Qt.vector3d(6, 0.1, 6)
++ source: "#Cube"
++ receivesReflections: settingsPanel.floorReceivesReflection
++ materials: PrincipledMaterial {
++ baseColor: "lightBlue"
++ roughness: 0.1
++ metalness: 1.0
++ }
++ }
++
++ ReflectionProbe {
++ objectName: "reflProbe"
++ position: settingsPanel.probePosition
++ timeSlicing: {
++ if (settingsPanel.timeSlicingIndex == 0) ReflectionProbe.None
++ else if (settingsPanel.timeSlicingIndex == 1) ReflectionProbe.AllFacesAtOnce
++ else ReflectionProbe.IndividualFaces
++ }
++ refreshMode: {
++ if (settingsPanel.refreshModeIndex == 0) ReflectionProbe.EveryFrame
++ else ReflectionProbe.FirstFrame
++ }
++ quality: {
++ if (settingsPanel.qualityIndex == 0) ReflectionProbe.VeryLow
++ else if (settingsPanel.qualityIndex == 1) ReflectionProbe.Low
++ else if (settingsPanel.qualityIndex == 2) ReflectionProbe.Medium
++ else if (settingsPanel.qualityIndex == 3) ReflectionProbe.High
++ else ReflectionProbe.VeryHigh
++ }
++ parallaxCorrection: settingsPanel.probeParallaxCorrection
++ boxSize: settingsPanel.probeSize
++ }
++
++ ParticleSystem3D {
++ position: Qt.vector3d(0, 300, 0)
++
++ SpriteParticle3D {
++ id: snowFlakeParticle
++ sprite: Texture {
++ source: "res/snowflake.png"
++ }
++ maxAmount: 100
++ particleScale: 20.0
++ fadeOutDuration: 500
++ billboard: true
++ }
++
++ ParticleEmitter3D {
++ enabled: settingsPanel.spriteParticlesEnabled
++ particle: snowFlakeParticle
++ velocity: VectorDirection3D {
++ direction: Qt.vector3d(100, 200, 0)
++ directionVariation: Qt.vector3d(20, 20, 20)
++ }
++ particleScaleVariation: 0.4
++ emitRate: 50
++ lifeSpan: 4000
++ }
++
++ Gravity3D {
++ magnitude: 100
++ }
++ }
++
++ ParticleSystem3D {
++ position: Qt.vector3d(0, 300, 0)
++
++ Component {
++ id: particleComponent
++ Model {
++ source: "#Sphere"
++ scale: Qt.vector3d(0.8, 0.8, 0.8)
++ receivesReflections: true
++ materials: PrincipledMaterial {
++ baseColor: "red"
++ roughness: 0.1
++ metalness: 1.0
++ }
++ }
++ }
++
++ ModelParticle3D {
++ id: particleRed
++ delegate: particleComponent
++ maxAmount: 10
++ }
++
++ ParticleEmitter3D {
++ enabled: settingsPanel.modelParticlesEnabled
++ particle: particleRed
++ velocity: VectorDirection3D {
++ direction: Qt.vector3d(-100, 200, 0)
++ }
++ emitRate: 1
++ lifeSpan: 4000
++ }
++
++ Gravity3D {
++ magnitude: 100
++ }
++ }
++ }
++
++ SettingsPanel {
++ id: settingsPanel
++ iconSize: 16 + Math.max(window.width, window.height) * 0.05
++ }
++
++ Item {
++ width: debugViewToggleText.implicitWidth
++ height: debugViewToggleText.implicitHeight
++ anchors.right: parent.right
++ Label {
++ id: debugViewToggleText
++ text: "Click here " + (dbg.visible ? "to hide DebugView" : "for DebugView")
++ color: "white"
++ anchors.right: parent.right
++ anchors.top: parent.top
++ }
++ MouseArea {
++ anchors.fill: parent
++ onClicked: dbg.visible = !dbg.visible
++ DebugView {
++ y: debugViewToggleText.height * 2
++ anchors.right: parent.right
++ source: view
++ id: dbg
++ visible: false
++ }
++ }
++ }
++ }