Revision control

++ import QtQuick
++ import QtQuick3D
++
++ Item {
++ id: root
++ width: 640
++ height: 480
++ visible: true
++
++ property bool swapped: false
++
++ property string skyFragmentShaderCode: `
++ void MAIN()
++ {
++ vec3 d = normalize(qt_eyeDir);
++ FRAGCOLOR = vec4(d * 0.5 + 0.5, 1.0);
++ }
++ `
++
++ // The sky materials deliberately live outside the 3D scene, mimicking
++ // materials provided by e.g. a QML singleton. Their only scene manager
++ // reference comes from the SceneEnvironment.skyMaterial assignment, so
++ // every swap destroys the backend node of the outgoing material and
++ // recreates it when it is assigned again.
++ SkyMaterial {
++ id: skyMaterialA
++ skyboxMode: SkyMaterial.Cubemap
++ enableIBL: true
++ radianceMapSize: 256
++ fragmentShaderCode: root.skyFragmentShaderCode
++ }
++
++ SkyMaterial {
++ id: skyMaterialB
++ skyboxMode: SkyMaterial.Cubemap
++ enableIBL: true
++ radianceMapSize: 256
++ fragmentShaderCode: root.skyFragmentShaderCode
++ }
++
++ View3D {
++ anchors.fill: parent
++
++ environment: SceneEnvironment {
++ backgroundMode: SceneEnvironment.SkyMaterial
++ skyMaterial: root.swapped ? skyMaterialB : skyMaterialA
++ }
++
++ PerspectiveCamera {
++ z: 300
++ }
++
++ DirectionalLight {
++ }
++
++ Model {
++ source: "#Cube"
++ materials: PrincipledMaterial { baseColor: "white" }
++ }
++ }
++ }