// 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"; } } }