// Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only import QtQuick import QtQuick3D import QtQuick.Controls import QtQuick.Layouts Item { id: root Text { color: "#ffffff" style: Text.Outline styleColor: "#606060" font.pixelSize: 28 property int api: GraphicsInfo.api text: { if (GraphicsInfo.api === GraphicsInfo.OpenGL) "OpenGL"; else if (GraphicsInfo.api === GraphicsInfo.Software) "Software"; else if (GraphicsInfo.api === GraphicsInfo.Direct3D12) "D3D12"; else if (GraphicsInfo.api === GraphicsInfo.OpenVG) "OpenVG"; else if (GraphicsInfo.api === GraphicsInfo.OpenGLRhi) "OpenGL via QRhi"; else if (GraphicsInfo.api === GraphicsInfo.Direct3D11Rhi) "D3D11 via QRhi"; else if (GraphicsInfo.api === GraphicsInfo.VulkanRhi) "Vulkan via QRhi"; else if (GraphicsInfo.api === GraphicsInfo.MetalRhi) "Metal via QRhi"; else if (GraphicsInfo.api === GraphicsInfo.Null) "Null via QRhi"; else "Unknown API"; } } ColumnLayout { y: 30 RowLayout { Label { text: "aoStrength" color: "white" font.pointSize: 12 } Label { text: aoStrengthSlider.value color: "red" } Slider { id: aoStrengthSlider from: 0 to: 100 value: 0 stepSize: 1 } Label { text: "aoBias" color: "white" font.pointSize: 12 } Label { text: aoBiasSlider.value.toPrecision(2) color: "red" } Slider { id: aoBiasSlider from: 0 to: 4 value: 0.5 stepSize: 0.01 } Label { text: "aoSoftness" color: "white" font.pointSize: 12 } Label { text: aoSoftnessSlider.value color: "red" } Slider { id: aoSoftnessSlider from: 0 to: 50 value: 50 stepSize: 1 } } RowLayout { Label { text: "aoDistance" color: "white" font.pointSize: 12 } Label { text: aoDistanceSlider.value color: "red" } Slider { id: aoDistanceSlider from: 0 to: 100 value: 5 stepSize: 1 } Label { text: "aoSampleRate" color: "white" font.pointSize: 12 } Label { text: aoSampleRateSlider.value color: "red" } Slider { id: aoSampleRateSlider from: 2 to: 4 value: 2 stepSize: 1 } Label { text: "aoDither" color: "white" font.pointSize: 12 } CheckBox { id: aoDitherCheckBox checked: true } } ColumnLayout { Label { text: "rotation x" color: "white" font.pointSize: 12 } Label { text: rotationXSlider.value color: "red" } Slider { id: rotationXSlider from: 0 to: 360 value: 0 stepSize: 1 } Label { text: "rotation y" color: "white" font.pointSize: 12 } Label { text: rotationYSlider.value color: "red" } Slider { id: rotationYSlider from: 0 to: 360 value: 120 stepSize: 1 } Label { text: "rotation z" color: "white" font.pointSize: 12 } Label { text: rotationZSlider.value color: "red" } Slider { id: rotationZSlider from: 0 to: 360 value: 340 stepSize: 1 } Label { text: "scale" color: "white" font.pointSize: 12 } Label { text: scaleSlider.value color: "red" } Slider { id: scaleSlider from: 1 to: 200 value: 80 stepSize: 1 } Label { text: "Shaded custom material" color: "red" } CheckBox { id: customMaterialShaded checked: false } Label { text: "Unshaded custom material" color: "red" } CheckBox { id: customMaterialUnshaded checked: false } Label { text: "Instancing" color: "white" } CheckBox { id: instancedRendering checked: false } } } View3D { id: v3d anchors.fill: parent camera: camera renderMode: View3D.Overlay environment: SceneEnvironment { aoStrength: aoStrengthSlider.value aoBias: aoBiasSlider.value aoSampleRate: aoSampleRateSlider.value aoDistance: aoDistanceSlider.value aoSoftness: aoSoftnessSlider.value aoDither: aoDitherCheckBox.checked } PerspectiveCamera { id: camera position: Qt.vector3d(0, 200, 300) eulerRotation: Qt.vector3d(-30, 0, 0) } InstanceList { id: manualInstancing instances: [ InstanceListEntry { position: Qt.vector3d(0, 0, 0) color: "green" scale: Qt.vector3d(0.6, 0.6, 0.6) }, InstanceListEntry { position: Qt.vector3d(-100, 0, -100) color: "red" scale: Qt.vector3d(0.5, 0.5, 0.5) }, InstanceListEntry { position: Qt.vector3d(100, 100, 0) scale: Qt.vector3d(0.5, 0.5, 0.5) color: "blue" }, InstanceListEntry { position: Qt.vector3d(100, 0, 50) eulerRotation: Qt.vector3d(-10, 0, 30) color: "orange" scale: Qt.vector3d(0.3, 0.3, 0.3) } ] } Model { visible:instancedRendering.checked || !customMaterialShaded.checked && !customMaterialUnshaded.checked source: "object1.mesh" instancing: instancedRendering.checked ? manualInstancing : null scale: Qt.vector3d(scaleSlider.value, scaleSlider.value, scaleSlider.value) materials: [ DefaultMaterial { cullMode: Material.NoCulling diffuseColor: "white" } ] eulerRotation: Qt.vector3d(rotationXSlider.value, rotationYSlider.value, rotationZSlider.value) } Model { visible: customMaterialShaded.checked source: "object1.mesh" scale: Qt.vector3d(scaleSlider.value, scaleSlider.value, scaleSlider.value) materials: [ CustomMaterial { cullMode: Material.NoCulling vertexShader: "custom.vert" fragmentShader: "custom.frag" property real uTime: 0.0 property real uAmplitude: 0.5 SequentialAnimation on uTime { loops: -1 NumberAnimation { from: 0.0; to: 10.0; duration: 10000 } NumberAnimation { from: 10.0; to: 0.0; duration: 10000 } } } ] eulerRotation: Qt.vector3d(rotationXSlider.value, rotationYSlider.value, rotationZSlider.value) } Model { visible: customMaterialUnshaded.checked source: "object1.mesh" scale: Qt.vector3d(scaleSlider.value, scaleSlider.value, scaleSlider.value) materials: [ CustomMaterial { shadingMode: CustomMaterial.Unshaded cullMode: Material.BackFaceCulling // no double sided support in the simple shader here, so just cull vertexShader: "custom_unshaded.vert" fragmentShader: "custom_unshaded.frag" } ] eulerRotation: Qt.vector3d(rotationXSlider.value, rotationYSlider.value, rotationZSlider.value) } DirectionalLight { id: dirLight ambientColor: Qt.rgba(0.1, 0.1, 0.1, 1.0); } } }