Revision control
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ import QtQuick
++ import QtQuick.Window
++ import QtQuick.Controls
++ import QtQuick.Layouts
++
++ import QtQuick3D
++ import QtQuick3DTest.Extensions.TextureProvider
++
++ Window {
++ id: window
++ width: 800
++ height: 600
++ visible: true
++ title: qsTr("Texture provider")
++
++ View3D {
++ id: view
++ anchors.left: settings.right
++ anchors.right: parent.right
++ height: parent.height
++
++ property int api: GraphicsInfo.api
++ property bool yIsPointingUpInTextures: view.api === GraphicsInfo.OpenGL
++ property real apiFactor: yIsPointingUpInTextures ? 1.0 : 0.0
++ property real apiFactorFlip: 1.0 - apiFactor
++
++ extensions: [ RenderExtension {
++ id: renderer
++ } ]
++
++ Texture {
++ id: rendererTexture
++ textureProvider: renderer
++ flipV: !view.yIsPointingUpInTextures // ignored by custom mat. and postproc. effects
++ }
++
++ camera: PerspectiveCamera {
++ z: 600
++ }
++
++ DirectionalLight {
++
++ }
++
++ Model {
++ visible: principledMaterialOption.checked
++ source: "#Cube"
++ materials: [ PrincipledMaterial {
++ baseColorMap: rendererTexture
++ } ]
++
++ SequentialAnimation on eulerRotation.y {
++ running: animateCb.checked
++ NumberAnimation { from: 0; to: 360; duration: 4000 }
++ loops: -1
++ }
++ }
++
++ environment: SceneEnvironment {
++ id: env
++ effects: []
++ }
++
++ Effect {
++ id: simpleEffect
++ property TextureInput extensionTexture: TextureInput {
++ enabled: textureInputEnableCb.checked
++ texture: rendererTexture
++ }
++ property real apiFactor: view.apiFactor
++ property real apiFactorFlip: view.apiFactorFlip
++ passes: Pass {
++ shaders: Shader {
++ stage: Shader.Fragment
++ shader: "effects/effect.frag"
++ }
++ }
++ }
++
++ Model {
++ visible: customMaterialShadedOption.checked
++ source: "#Cube"
++ scale: Qt.vector3d(2, 2, 2)
++ materials: CustomMaterial {
++ fragmentShader: "materials/shaded_custommaterial.frag"
++ property TextureInput extensionTexture: TextureInput {
++ enabled: textureInputEnableCb.checked
++ texture: rendererTexture
++ }
++ property real apiFactor: view.apiFactor
++ property real apiFactorFlip: view.apiFactorFlip
++ }
++ SequentialAnimation on eulerRotation.y {
++ running: animateCb.checked
++ NumberAnimation { from: 0; to: 360; duration: 4000 }
++ loops: -1
++ }
++ }
++
++ Model {
++ visible: customMaterialUnshadedOption.checked
++ source: "#Cube"
++ scale: Qt.vector3d(3, 3, 3)
++ materials: CustomMaterial {
++ shadingMode: CustomMaterial.Unshaded
++ vertexShader: "materials/unshaded_custommaterial.vert"
++ fragmentShader: "materials/unshaded_custommaterial.frag"
++ property TextureInput extensionTexture: TextureInput {
++ enabled: textureInputEnableCb.checked
++ texture: rendererTexture
++ }
++ property real apiFactor: view.apiFactor
++ property real apiFactorFlip: view.apiFactorFlip
++ }
++ SequentialAnimation on eulerRotation.y {
++ running: animateCb.checked
++ NumberAnimation { from: 0; to: 360; duration: 4000 }
++ loops: -1
++ }
++ }
++ }
++
++ Rectangle {
++ id: settings
++ anchors.left: parent.left
++ anchors.top: parent.top
++ implicitWidth: 350
++ implicitHeight: 210
++ anchors.margins: 10
++ opacity: 0.6
++ color: "gray"
++ ColumnLayout {
++ RadioButton {
++ id: principledMaterialOption
++ text: "PrincipledMaterial (baseColorMap)"
++ checked: true
++ }
++
++ RadioButton {
++ id: customMaterialShadedOption
++ text: "Shaded custom material"
++ }
++
++ RadioButton {
++ id: customMaterialUnshadedOption
++ text: "Unshaded custom material (linear, no tonemap)"
++ }
++
++ RadioButton {
++ id: effectOption
++ text: "Post-processing effect"
++ onCheckedChanged: {
++ if (checked)
++ env.effects.push(simpleEffect);
++ else
++ env.effects = [];
++ }
++ }
++ CheckBox {
++ id: textureInputEnableCb
++ text: "TextureInput enabled"
++ checked: true
++ }
++ CheckBox {
++ id: animateCb
++ text: "Animate"
++ checked: false
++ }
++
++ Button {
++ text: "Release resources"
++ onClicked: window.releaseResources()
++ }
++ }
++ }
++ }