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 QtQuick3D.Helpers
++ import QtQuick.Controls
++
++ Window {
++ id: window
++ width: 640
++ height: 640
++ visible: true
++ color: "black"
++
++ WasdController {
++ controlledObject: camera
++ }
++
++ View3D {
++ id: view
++ anchors.fill: parent
++
++ environment: SceneEnvironment {
++ clearColor: window.color
++ backgroundMode: SceneEnvironment.SkyBox
++ lightProbe: Texture {
++ source: "qrc:///OpenfootageNET_garage-1024.hdr"
++ }
++ probeOrientation: Qt.vector3d(0, -90, 0)
++ }
++
++ PerspectiveCamera {
++ id: camera
++ position: Qt.vector3d(0, 200, 400)
++ eulerRotation.x: -30
++ }
++
++ DirectionalLight {
++ eulerRotation.x: -60
++ castsShadow: true
++ }
++
++ Model {
++ property real angle: 0
++ source: "#Sphere"
++ x: Math.cos(angle) * 100
++ z: Math.sin(angle) * 100
++ receivesReflections: true
++
++ NumberAnimation on angle {
++ from: 0
++ to: Math.PI * 2
++ duration: 8000
++ loops: Animation.Infinite
++ }
++
++ materials: PrincipledMaterial {
++ metalness: 1
++ roughness: 0
++
++ SequentialAnimation on roughness {
++ loops: Animation.Infinite
++ NumberAnimation {
++ from: 0
++ to: 1.0
++ duration: 5000
++ }
++ NumberAnimation {
++ from: 1
++ to: 0.0
++ duration: 5000
++ }
++ }
++ }
++
++ ReflectionProbe {
++ id: probe
++ timeSlicing: {
++ if (comboTimeSlicing.currentIndex === 0) ReflectionProbe.None
++ else if (comboTimeSlicing.currentIndex === 1) ReflectionProbe.AllFacesAtOnce
++ else ReflectionProbe.IndividualFaces
++ }
++ refreshMode: {
++ if (comboRefreshMode.currentIndex === 0) ReflectionProbe.EveryFrame
++ else ReflectionProbe.FirstFrame
++ }
++ quality: {
++ if (comboQuality.currentIndex === 0) ReflectionProbe.VeryLow
++ else if (comboQuality.currentIndex === 1) ReflectionProbe.Low
++ else if (comboQuality.currentIndex === 2) ReflectionProbe.Medium
++ else if (comboQuality.currentIndex === 3) ReflectionProbe.High
++ else ReflectionProbe.VeryHigh
++ }
++ parallaxCorrection: checkParallax.checked
++ boxSize: Qt.vector3d(sliderBoxX.value, sliderBoxY.value, sliderBoxZ.value)
++ texture: {
++ if (comboTexture.currentIndex === 0) null
++ else if (comboTexture.currentIndex === 1) ktxCubeTexture
++ else if (comboTexture.currentIndex === 2) pngCubeTexture
++ else pngTexture
++ }
++ }
++ }
++
++ CubeMapTexture {
++ id: ktxCubeTexture
++ source: "cubemap_bc1.ktx"
++ }
++
++ CubeMapTexture {
++ id: pngCubeTexture
++ source: "qt_logo.png;qt_logo.png;qt_logo.png;qt_logo.png;qt_logo.png;qt_logo.png"
++ }
++
++ ParticleSystem3D {
++ position: Qt.vector3d(200, 0, 0)
++ SpriteParticle3D {
++ id: starParticle
++ sprite: Texture {
++ source: "snowflake.png"
++ }
++ maxAmount: 200
++ color: "#ffff00"
++ particleScale: 20.0
++ fadeOutDuration: 500
++ billboard: true
++ }
++ ParticleEmitter3D {
++ particle: starParticle
++ velocity: VectorDirection3D {
++ direction: Qt.vector3d(100, 200, 0)
++ directionVariation: Qt.vector3d(20, 20, 20)
++ }
++ particleScaleVariation: 0.4
++ emitRate: 50
++ lifeSpan: 4000
++ }
++ Gravity3D {
++ magnitude: 100
++ }
++ }
++
++ Model {
++ source: "#Sphere"
++ materials: DefaultMaterial {}
++ }
++
++ Model {
++ position: Qt.vector3d(0, 0, 200)
++ source: "#Sphere"
++ materials: DefaultMaterial {}
++ }
++
++ Model {
++ source: "#Cube"
++
++ materials: [
++ CustomMaterial {
++ shadingMode: CustomMaterial.Shaded
++ fragmentShader: "material_simple.frag"
++ property color uDiffuse: "fuchsia"
++ property real uSpecular: 1.0
++ }
++ ]
++
++ //materials: PrincipledMaterial {}
++
++ y: -200
++ scale: Qt.vector3d(10, 1, 10)
++ }
++ }
++
++ Frame {
++ anchors.top: parent.top
++ anchors.topMargin: 20
++ anchors.left: parent.left
++ anchors.leftMargin: 10
++ background: Rectangle {
++ color: "#e0e0e0"
++ border.color: "#000000"
++ border.width: 1
++ opacity: 0.8
++ }
++ Column {
++ id: settingsArea
++ ComboBox {
++ id: comboTimeSlicing
++ width: 200
++ model: [ "None", "All Faces At Once", "Individual Faces" ]
++ }
++ ComboBox {
++ id: comboRefreshMode
++ width: 200
++ model: [ "Every Frame", "First Frame" ]
++ }
++ ComboBox {
++ id: comboQuality
++ width: 200
++ model: [ "Very Low", "Low", "Medium", "High", "Very High" ]
++ }
++ CheckBox {
++ id: checkParallax
++ checked: false
++ text: qsTr("Parallax")
++ }
++ Slider {
++ id: sliderBoxX
++ from: 0
++ value: 0
++ to: 1000
++ }
++ Slider {
++ id: sliderBoxY
++ from: 0
++ value: 0
++ to: 1000
++ }
++ Slider {
++ id: sliderBoxZ
++ from: 0
++ value: 0
++ to: 1000
++ }
++ Button {
++ text: "Schedule Update"
++ onClicked: probe.scheduleUpdate()
++ }
++ ComboBox {
++ id: comboTexture
++ width: 200
++ model: [ "No texture", "KtxCubeMapTexture", "PngCubeMapTexture" ]
++ }
++ }
++ }
++
++ DebugView {
++ anchors.right: parent.right
++ source: view
++ }
++ }