Revision control
Copy as Markdown
// 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()
}
}
}
}