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.Helpers
++ import QtQuick.Controls
++ import QtQuick.Layouts
++
++ Item {
++ id: root
++ property url modelSrc: "meshes/cube.mesh"
++
++ Rectangle {
++ color: "lightGray"
++ width: parent.width / 2
++ height: parent.height
++
++ View3D {
++ id: lightmapSource
++ renderMode: View3D.Offscreen // so a texture provider as well
++ anchors.fill: parent
++ anchors.margins: 4
++
++ environment: SceneEnvironment {
++ clearColor: "transparent"
++ backgroundMode: SceneEnvironment.Color
++ }
++
++ DirectionalLight {
++ }
++
++ PerspectiveCamera {
++ id: camera1
++ z: 200
++ }
++
++ Texture {
++ id: baseTex
++ source: "hskin.png"
++ generateMipmaps: true
++ mipFilter: Texture.Linear
++ }
++
++ PrincipledMaterial {
++ id: principledMat
++ roughness: 0.4
++ baseColorMap: baseTex
++ }
++
++ CustomMaterial {
++ id: customMat
++ shadingMode: CustomMaterial.Shaded
++ fragmentShader: "lightmapgen.frag"
++ property TextureInput tex: TextureInput {
++ texture: baseTex
++ }
++ }
++
++ CustomMaterial {
++ id: lightmapGenMat
++ shadingMode: CustomMaterial.Shaded
++ vertexShader: "lightmapgen.vert"
++ fragmentShader: "lightmapgen.frag"
++ property bool useUV1: radioLightmapGen1.checked
++ property TextureInput tex: TextureInput {
++ texture: baseTex
++ }
++ cullMode: Material.NoCulling
++ // sourceBlend: CustomMaterial.SrcAlpha
++ // destinationBlend: CustomMaterial.OneMinusSrcAlpha
++ }
++
++ Model {
++ source: root.modelSrc
++ scale: Qt.vector3d(10, 10, 10)
++ NumberAnimation on eulerRotation.y {
++ running: cbRotate.checked
++ from: 0; to: 360; duration: 10000; loops: -1
++ }
++ materials: radioPrincipled.checked
++ ? principledMat
++ : (radioCustom.checked ? customMat : lightmapGenMat)
++ }
++
++ WasdController {
++ controlledObject: camera1
++ }
++ }
++ }
++
++ View3D {
++ width: parent.width / 2
++ height: parent.height
++ x: parent.width / 2
++
++ environment: SceneEnvironment {
++ clearColor: "white"
++ backgroundMode: SceneEnvironment.Color
++ }
++
++ camera: camera1
++
++ Model {
++ source: root.modelSrc
++ scale: Qt.vector3d(10, 10, 10)
++ NumberAnimation on eulerRotation.y {
++ running: cbRotate.checked
++ from: 0; to: 360; duration: 10000; loops: -1
++ }
++ materials: CustomMaterial {
++ shadingMode: CustomMaterial.Unshaded
++ vertexShader: "lightmapuse.vert"
++ fragmentShader: "lightmapuse.frag"
++ property TextureInput tex: TextureInput {
++ texture: Texture {
++ sourceItem: lightmapSource
++ minFilter: Texture.Nearest
++ magFilter: Texture.Nearest
++ }
++ }
++ }
++ }
++ }
++
++ Rectangle {
++ id: controlPanelBackground
++ x: 4
++ y: 4
++ color: "white"
++ opacity: 0.5
++ width: controlPanel.implicitWidth
++ height: controlPanel.implicitHeight
++ }
++ Button {
++ anchors.top: controlPanelBackground.top
++ anchors.right: controlPanelBackground.right
++ text: "Toggle"
++ onClicked: {
++ controlPanelBackground.visible = !controlPanelBackground.visible;
++ controlPanel.visible = !controlPanel.visible;
++ }
++ focusPolicy: Qt.NoFocus
++ }
++ ColumnLayout {
++ id: controlPanel
++ x: 4
++ y: 4
++ RowLayout {
++ Label {
++ text: "Model"
++ }
++ ComboBox {
++ model: [ "Cube",
++ "Sphere",
++ "Torus",
++ "Suzanne",
++ "Animal" ]
++ onCurrentIndexChanged: {
++ var meshes = [ "meshes/cube.mesh",
++ "meshes/sphere.mesh",
++ "meshes/torus.mesh",
++ "meshes/suzanne.mesh",
++ "meshes/animal.mesh" ];
++ root.modelSrc = meshes[currentIndex]
++ }
++ focusPolicy: Qt.NoFocus
++ }
++ }
++ RadioButton {
++ id: radioPrincipled
++ text: "PrincipledMaterial"
++ checked: true
++ focusPolicy: Qt.NoFocus
++ }
++ RadioButton {
++ id: radioCustom
++ text: "Custom material\nJust for verification; should look identical to Principled"
++ checked: false
++ focusPolicy: Qt.NoFocus
++ }
++ RadioButton {
++ id: radioLightmapGen0
++ text: "Lightmap generator custom material\nusing UV0"
++ checked: false
++ focusPolicy: Qt.NoFocus
++ }
++ RadioButton {
++ id: radioLightmapGen1
++ text: "Lightmap generator custom material\nusing UV1"
++ checked: false
++ focusPolicy: Qt.NoFocus
++ }
++ CheckBox {
++ id: cbRotate
++ text: "Rotate model\nto demo how the lightmap changes"
++ checked: false
++ focusPolicy: Qt.NoFocus
++ }
++ }
++
++ Text {
++ x: parent.width / 2
++ text: "DefaultMaterial with no lighting,\njust a diffuseMap with UV1 and the texture of the left view.\nCamera is the same (use WASD to move)."
++ }
++
++ Text {
++ anchors.right: parent.right
++ anchors.margins: 10
++ color: "red"
++ style: Text.Outline
++ font.pixelSize: 28
++ text: {
++ if (GraphicsInfo.api === GraphicsInfo.OpenGL)
++ "OpenGL";
++ else if (GraphicsInfo.api === GraphicsInfo.Direct3D11)
++ "D3D11";
++ else if (GraphicsInfo.api === GraphicsInfo.Vulkan)
++ "Vulkan";
++ else if (GraphicsInfo.api === GraphicsInfo.Metal)
++ "Metal";
++ else if (GraphicsInfo.api === GraphicsInfo.Null)
++ "Null";
++ else
++ "Unknown";
++ }
++ }
++ }