Revision control

++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ import QtQuick 2.15
++ import QtQuick.Layouts 1.15
++ import HelperWidgets 2.0
++ import StudioTheme 1.0 as StudioTheme
++
++ Column {
++ width: parent.width
++
++ Section {
++ width: parent.width
++ caption: qsTr("Extended Scene Environment")
++
++ SectionLayout {
++ id: baseSectionLayout
++ property bool isColorMode: backgroundModeComboBox.currentIndex === 2
++ property bool isSkyBoxMode: backgroundModeComboBox.currentIndex === 3
++ property bool isSkyBoxCubeMapMode: backgroundModeComboBox.currentIndex === 4
++
++ PropertyLabel {
++ text: qsTr("Background Mode")
++ tooltip: qsTr("Sets if and how the background of the scene should be cleared.")
++ }
++
++ SecondColumnLayout {
++ ComboBox {
++ id: backgroundModeComboBox
++ scope: "SceneEnvironment"
++ model: ["Transparent", "Unspecified", "Color", "SkyBox", "SkyBoxCubeMap"]
++ backendValue: backendValues.backgroundMode
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: baseSectionLayout.isColorMode
++ text: qsTr("Clear Color")
++ tooltip: qsTr("Sets which color will be used to clear the viewport when using SceneEnvironment.Color for the backgroundMode property.")
++ }
++
++ ColorEditor {
++ visible: baseSectionLayout.isColorMode
++ backendValue: backendValues.clearColor
++ supportGradient: false
++ }
++
++ PropertyLabel {
++ visible: baseSectionLayout.isSkyBoxCubeMapMode
++ text: qsTr("Skybox Cube Map")
++ tooltip: qsTr("Sets a cubemap to be used as a skybox when the background mode is SkyBoxCubeMap.")
++ }
++
++ SecondColumnLayout {
++ visible: baseSectionLayout.isSkyBoxCubeMapMode
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.CubeMapTexture"
++ backendValue: backendValues.skyBoxCubeMap
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: baseSectionLayout.isSkyBoxMode || baseSectionLayout.isSkyBoxCubeMapMode
++ text: qsTr("Skybox Blur")
++ tooltip: qsTr("Sets how much to blur the skybox when using SceneEnvironment.SkyBox for the backgroundMode property.")
++ }
++
++ SecondColumnLayout {
++ visible: baseSectionLayout.isSkyBoxMode || baseSectionLayout.isSkyBoxCubeMapMode
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.skyboxBlurAmount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ id: antialiasingSection
++ width: parent.width
++ caption: qsTr("Antialiasing")
++
++ property bool isAntialiasingEnabled: antialiasingModeComboBox.currentIndex !== 0
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Antialiasing Mode")
++ tooltip: qsTr("Sets the antialiasing mode applied to the scene.")
++ }
++
++ SecondColumnLayout {
++ ComboBox {
++ id: antialiasingModeComboBox
++ scope: "SceneEnvironment"
++ model: ["NoAA", "SSAA", "MSAA", "ProgressiveAA"]
++ backendValue: backendValues.antialiasingMode
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: antialiasingSection.isAntialiasingEnabled
++ text: qsTr("Antialiasing Quality")
++ tooltip: qsTr("Sets the level of antialiasing applied to the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: antialiasingSection.isAntialiasingEnabled
++ ComboBox {
++ scope: "SceneEnvironment"
++ model: ["Medium", "High", "VeryHigh"]
++ backendValue: backendValues.antialiasingQuality
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("FXAA")
++ tooltip: qsTr("Enables fast approximate antialiasing.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.fxaaEnabled.valueToString
++ backendValue: backendValues.fxaaEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Specular AA")
++ tooltip: qsTr("Enables specular antialiasing.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.specularAAEnabled.valueToString
++ backendValue: backendValues.specularAAEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Temporal AA")
++ tooltip: qsTr("Enables temporal antialiasing using camera jittering and frame blending.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: temporalAAEnabledCheckBox
++ text: backendValues.temporalAAEnabled.valueToString
++ backendValue: backendValues.temporalAAEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: temporalAAEnabledCheckBox.checked
++ text: qsTr("Temporal AA Strength")
++ tooltip: qsTr("Sets the amount of temporal antialiasing applied.")
++ }
++
++ SecondColumnLayout {
++ visible: temporalAAEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.01
++ maximumValue: 2.0
++ decimals: 2
++ stepSize: 0.1
++ backendValue: backendValues.temporalAAStrength
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Tone Mapping")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Mode")
++ tooltip: qsTr("Sets how colors are tonemapped from HDR to LDR before being displayed.")
++ }
++
++ SecondColumnLayout {
++ ComboBox {
++ scope: "SceneEnvironment"
++ model: ["TonemapModeNone", "TonemapModeLinear", "TonemapModeAces", "TonemapModeHejlDawson", "TonemapModeFilmic"]
++ backendValue: backendValues.tonemapMode
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Exposure")
++ tooltip: qsTr("Sets the exposure of the scene.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 10
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.exposure
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("White Point")
++ tooltip: qsTr("Sets the white point of the scene.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.whitePoint
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Sharpening")
++ tooltip: qsTr("Set the sharpening amount applied to the scene.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.sharpnessAmount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Dithering")
++ tooltip: qsTr("Enables dithering to reduce banding artifacts.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.ditheringEnabled.valueToString
++ backendValue: backendValues.ditheringEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Color Adjustments")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables color adjustments")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: adjustmentsEnabledCheckBox
++ text: backendValues.colorAdjustmentsEnabled.valueToString
++ backendValue: backendValues.colorAdjustmentsEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: adjustmentsEnabledCheckBox.checked
++ text: qsTr("Brightness")
++ tooltip: qsTr("Adjusts the brightness of the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: adjustmentsEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.01
++ maximumValue: 8.0
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.adjustmentBrightness
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: adjustmentsEnabledCheckBox.checked
++ text: qsTr("Contrast")
++ tooltip: qsTr("Adjusts the contrast of the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: adjustmentsEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.01
++ maximumValue: 8.0
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.adjustmentContrast
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: adjustmentsEnabledCheckBox.checked
++ text: qsTr("Saturation")
++ tooltip: qsTr("Adjusts the saturation of the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: adjustmentsEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.01
++ maximumValue: 8.0
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.adjustmentSaturation
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Color Grading")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables color grading via look up table (LUT) textures.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: colorGradingEnabledCheckBox
++ text: backendValues.lutEnabled.valueToString
++ backendValue: backendValues.lutEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: colorGradingEnabledCheckBox.checked
++ text: qsTr("Size")
++ tooltip: qsTr("Sets the size of the LUT texture. The texture should have the dimensions: width=(size * size), height=(size).")
++ }
++
++ SecondColumnLayout {
++ visible: colorGradingEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 1
++ maximumValue: 64
++ decimals: 0
++ stepSize: 1
++ sliderIndicatorVisible: true
++ backendValue: backendValues.skyboxBlurAmount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: colorGradingEnabledCheckBox.checked
++ text: qsTr("Texture")
++ tooltip: qsTr("Sets the source of the LUT texture.")
++ }
++
++ SecondColumnLayout {
++ visible: colorGradingEnabledCheckBox.checked
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Texture"
++ backendValue: backendValues.lutTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: colorGradingEnabledCheckBox.checked
++ text: qsTr("Alpha Mix")
++ tooltip: qsTr("Sets the amount of color grading to mix with the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: colorGradingEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ sliderIndicatorVisible: true
++ decimals: 2
++ stepSize: 0.01
++ backendValue: backendValues.lutFilterAlpha
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Ambient Occlusion (SSAO)")
++
++ SectionLayout {
++
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables ambient occlusion.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: ambientOcclusionEnabledCheckBox
++ text: backendValues.aoEnabled.valueToString
++ backendValue: backendValues.aoEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Strength")
++ tooltip: qsTr("Sets the amount of ambient occulusion applied.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 100
++ sliderIndicatorVisible: true
++ decimals: 0
++ backendValue: backendValues.aoStrength
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Distance")
++ tooltip: qsTr("Sets roughly how far ambient occlusion shadows spread away from objects.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.aoDistance
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Softness")
++ tooltip: qsTr("Sets how smooth the edges of the ambient occlusion shading are.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 50
++ sliderIndicatorVisible: true
++ decimals: 2
++ backendValue: backendValues.aoSoftness
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Sample Rate")
++ tooltip: qsTr("Sets ambient occlusion quality (more shades of gray) at the expense of performance.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 2
++ maximumValue: 4
++ decimals: 0
++ stepSize: 1
++ sliderIndicatorVisible: true
++ backendValue: backendValues.aoSampleRate
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Bias")
++ tooltip: qsTr("Sets a cutoff distance preventing objects from exhibiting ambient occlusion at close distances.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: -1.0
++ maximumValue: 1.0
++ decimals: 2
++ backendValue: backendValues.aoBias
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ text: qsTr("Dither")
++ tooltip: qsTr("Enables scattering the edges of the ambient occlusion shadow bands to improve smoothness.")
++ }
++
++ SecondColumnLayout {
++ visible: ambientOcclusionEnabledCheckBox.checked
++ CheckBox {
++ id: aoDitherCheckBox
++ text: backendValues.aoDither.valueToString
++ backendValue: backendValues.aoDither
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Depth of Field")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables Depth of Field effect.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: depthOfFieldEnabledCheckBox
++ text: backendValues.depthOfFieldEnabled.valueToString
++ backendValue: backendValues.depthOfFieldEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: depthOfFieldEnabledCheckBox.checked
++ text: qsTr("Focus Distance")
++ tooltip: qsTr("Sets the distance from the camera at which objects are in focus.")
++ }
++
++ SecondColumnLayout {
++ visible: depthOfFieldEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.depthOfFieldFocusDistance
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: depthOfFieldEnabledCheckBox.checked
++ text: qsTr("Focus Range")
++ tooltip: qsTr("Sets the range of distances from the focus distance that are in focus.")
++ }
++
++ SecondColumnLayout {
++ visible: depthOfFieldEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.depthOfFieldFocusRange
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: depthOfFieldEnabledCheckBox.checked
++ text: qsTr("Blur Amount")
++ tooltip: qsTr("Sets the amount of blur applied to objects outside the focus range.")
++ }
++
++ SecondColumnLayout {
++ visible: depthOfFieldEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 25
++ decimals: 2
++ stepSize: 0.01
++ backendValue: backendValues.depthOfFieldBlurAmount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Glow")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables the Glow/Bloom Effect")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: glowEnabledCheckBox
++ text: backendValues.glowEnabled.valueToString
++ backendValue: backendValues.glowEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("High Quality")
++ tooltip: qsTr("Enables high quality mode for the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ CheckBox {
++ text: backendValues.glowQualityHigh.valueToString
++ backendValue: backendValues.glowQualityHigh
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Bicubic Upsampling")
++ tooltip: qsTr("Reduces the aliasing artifacts and boxing in the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ CheckBox {
++ text: backendValues.glowUseBicubicUpscale.valueToString
++ backendValue: backendValues.glowUseBicubicUpscale
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Strength")
++ tooltip: qsTr("Sets the strength of the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 2
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowStrength
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Intensity")
++ tooltip: qsTr("Sets the Intensity of the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 2
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowIntensity
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Bloom")
++ tooltip: qsTr("Sets the amount of bloom applied to the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowBloom
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Lower Threshold")
++ tooltip: qsTr("Sets the minimum brightness of the HDR glow.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 4
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowHDRMinimumValue
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Upper Threshold")
++ tooltip: qsTr("Sets the maximum brightness of the HDR glow.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 256
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowHDRMaximumValue
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("HDR Scale")
++ tooltip: qsTr("Sets the bleed scale of the HDR glow.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 8
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.glowHDRScale
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Blend Mode")
++ tooltip: qsTr("Sets the blending mode for the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ ComboBox {
++ scope: "ExtendedSceneEnvironment.GlowBlendMode"
++ model: ["Additive", "Screen", "SoftLight", "Replace"]
++ backendValue: backendValues.glowBlendMode
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: glowEnabledCheckBox.checked
++ text: qsTr("Blur Levels")
++ tooltip: qsTr("Sets which of the blur passes get applied to the glow effect.")
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++ // ### This isn't perfect, but it's the best we can do for now
++ ActionIndicator {
++ id: glowLevelController
++ icon.color: extFuncLogic.color
++ icon.text: extFuncLogic.glyph
++ onClicked: extFuncLogic.show()
++ forceVisible: extFuncLogic.menuVisible
++ visible: true
++
++ property var enableLevel1: { "value": false, "isInModel": false}
++ property var enableLevel2: { "value": false, "isInModel": false}
++ property var enableLevel3: { "value": false, "isInModel": false}
++ property var enableLevel4: { "value": false, "isInModel": false}
++ property var enableLevel5: { "value": false, "isInModel": false}
++ property var enableLevel6: { "value": false, "isInModel": false}
++ property var enableLevel7: { "value": false, "isInModel": false}
++
++ property variant backendValue: backendValues.glowLevel
++ property variant valueFromBackend: backendValue === undefined ? 0 : backendValue.value
++ property bool blockLevels: false
++
++ onBackendValueChanged: evaluateLevels()
++ onValueFromBackendChanged: evaluateLevels()
++
++ Connections {
++ target: modelNodeBackend
++ function onSelectionChanged() {
++ evaluateLevels()
++ }
++ }
++
++ Component.onCompleted: evaluateLevels()
++
++ function evaluateLevels() {
++ blockLevels = true
++ enableLevel1 = { "value": valueFromBackend & 1, "isInModel": false}
++ enableLevel2 = { "value": valueFromBackend & 2, "isInModel": false}
++ enableLevel3 = { "value": valueFromBackend & 4, "isInModel": false}
++ enableLevel4 = { "value": valueFromBackend & 8, "isInModel": false}
++ enableLevel5 = { "value": valueFromBackend & 16, "isInModel": false}
++ enableLevel6 = { "value": valueFromBackend & 32, "isInModel": false}
++ enableLevel7 = { "value": valueFromBackend & 64, "isInModel": false}
++ blockLevels = false
++ }
++
++ function composeExpressionString() {
++ if (blockLevels)
++ return
++
++ let expressionStr = "";
++
++ if (enableLevel1.value || enableLevel2.value || enableLevel3.value || enableLevel4.value
++ || enableLevel5.value || enableLevel6.value || enableLevel7.value) {
++ if (enableLevel1.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.One";
++ if (enableLevel2.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Two";
++ if (enableLevel3.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Three";
++ if (enableLevel4.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Four";
++ if (enableLevel5.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Five";
++ if (enableLevel6.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Six";
++ if (enableLevel7.value)
++ expressionStr += " | ExtendedSceneEnvironment.GlowLevel.Seven";
++
++ expressionStr = expressionStr.substring(3);
++
++ backendValue.expression = expressionStr
++ } else {
++ expressionStr = "0";
++ backendValue.expression = expressionStr
++ }
++ }
++ ExtendedFunctionLogic {
++ id: extFuncLogic
++ backendValue: backendValues.glowLevel
++ onReseted: {
++ glowLevelController.enableLevel1 = { "value": true, "isInModel": false}
++ glowLevelController.enableLevel2 = { "value": false, "isInModel": false}
++ glowLevelController.enableLevel3 = { "value": false, "isInModel": false}
++ glowLevelController.enableLevel4 = { "value": false, "isInModel": false}
++ glowLevelController.enableLevel5 = { "value": false, "isInModel": false}
++ glowLevelController.enableLevel6 = { "value": false, "isInModel": false}
++ glowLevelController.enableLevel7 = { "value": false, "isInModel": false}
++ glowLevelController.evaluateLevels()
++ }
++ }
++ }
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 1")
++ backendValue: glowLevelController.enableLevel1
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 2")
++ backendValue: glowLevelController.enableLevel2
++ actionIndicatorVisible: false
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 3")
++ backendValue: glowLevelController.enableLevel3
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 4")
++ backendValue: glowLevelController.enableLevel4
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 5")
++ backendValue: glowLevelController.enableLevel5
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 6")
++ backendValue: glowLevelController.enableLevel6
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ PropertyLabel {
++ // spacer
++ visible: glowEnabledCheckBox.checked
++ }
++ SecondColumnLayout {
++ visible: glowEnabledCheckBox.checked
++
++ Item {
++ // spacer for the always hiden action indicator
++ width: StudioTheme.Values.actionIndicatorWidth
++ }
++
++ CheckBox {
++ text: qsTr("Level 7")
++ backendValue: glowLevelController.enableLevel7
++ actionIndicatorVisible: false
++ onCheckedChanged: glowLevelController.composeExpressionString()
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Vignette")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables the vignette effect.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: vignetteEnabledCheckBox
++ text: backendValues.vignetteEnabled.valueToString
++ backendValue: backendValues.vignetteEnabled
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: vignetteEnabledCheckBox.checked
++ text: qsTr("Color")
++ tooltip: qsTr("Sets the color of the vignette effect.")
++ }
++
++ ColorEditor {
++ visible: vignetteEnabledCheckBox.checked
++ backendValue: backendValues.vignetteColor
++ supportGradient: false
++ }
++
++ PropertyLabel {
++ visible: vignetteEnabledCheckBox.checked
++ text: qsTr("Strength")
++ tooltip: qsTr("Sets the strength of the vignette effect.")
++ }
++
++ SecondColumnLayout {
++ visible: vignetteEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.01
++ maximumValue: 15
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.vignetteStrength
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: vignetteEnabledCheckBox.checked
++ text: qsTr("Radius")
++ tooltip: qsTr("Sets the radius of the vignette effect.")
++ }
++
++ SecondColumnLayout {
++ visible: vignetteEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 5
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.vignetteRadius
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Lens Flare")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enabled")
++ tooltip: qsTr("Enables the Lens Flare effect.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ id: lensFlareEnabledCheckBox
++ text: backendValues.lensFlareEnabled.valueToString
++ backendValue: backendValues.lensFlareEnabled
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Bloom Scale")
++ tooltip: qsTr("Sets the scale of the lens flare bloom effect.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 20
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareBloomScale
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Bloom Bias")
++ tooltip: qsTr("Sets the level at which the lens flare bloom starts.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 10
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareBloomBias
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Ghost Dispersal")
++ tooltip: qsTr("Sets the distance between the lens flare ghosts.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0.001
++ maximumValue: 1
++ decimals: 3
++ stepSize: 0.001
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareGhostDispersal
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Ghost Count")
++ tooltip: qsTr("Sets the amount of lens flare ghosts.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 20
++ decimals: 0
++ stepSize: 1
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareGhostCount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Halo Width")
++ tooltip: qsTr("Sets the size of the lens flare halo.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 3
++ stepSize: 0.001
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareHaloWidth
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Stretch Aspect")
++ tooltip: qsTr("Set correction factor for roundness of the lens flare halo.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 3
++ stepSize: 0.001
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareStretchToAspect
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Distortion")
++ tooltip: qsTr("Set amount of chromatic aberration in the lens flare.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 25
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareDistortion
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Blur")
++ tooltip: qsTr("Set amount of blur to apply to the lens flare.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 50
++ decimals: 2
++ stepSize: 0.01
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lensFlareBlurAmount
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Lens Color Texture")
++ tooltip: qsTr("A gradient image used for the lens flare lens color.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Texture"
++ backendValue: backendValues.lensFlareLensColorTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Apply Dirt")
++ tooltip: qsTr("Set whether to apply a dirt texture to the lens flare.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ CheckBox {
++ id: lensFlareDirtEnabledCheckBox
++ text: backendValues.lensFlareApplyDirtTexture.valueToString
++ backendValue: backendValues.lensFlareApplyDirtTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked && lensFlareDirtEnabledCheckBox.checked
++ text: qsTr("Dirt Texture")
++ tooltip: qsTr("An image that is used to simulate inperfections on the lens.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked && lensFlareDirtEnabledCheckBox.checked
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Texture"
++ backendValue: backendValues.lensFlareLensDirtTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Apply Starburst")
++ tooltip: qsTr("Set whether to apply a starburst texture to the lens flare.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ CheckBox {
++ id: lensFlareStarburstEnabledCheckBox
++ text: backendValues.lensFlareApplyStarburstTexture.valueToString
++ backendValue: backendValues.lensFlareApplyStarburstTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked && lensFlareStarburstEnabledCheckBox.checked
++ text: qsTr("Starburst Texture")
++ tooltip: qsTr("A noise image to augment the starburst effect of the lens flare.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked && lensFlareStarburstEnabledCheckBox.checked
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Texture"
++ backendValue: backendValues.lensFlareLensStarburstTexture
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ text: qsTr("Direction")
++ tooltip: qsTr("Sets the direction of the camera in the scene.")
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.lensFlareCameraDirection_x
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "X"
++ color: StudioTheme.Values.theme3DAxisXColor
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.lensFlareCameraDirection_y
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "Y"
++ color: StudioTheme.Values.theme3DAxisYColor
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ visible: lensFlareEnabledCheckBox.checked
++ }
++
++ SecondColumnLayout {
++ visible: lensFlareEnabledCheckBox.checked
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.lensFlareCameraDirection_z
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "Z"
++ color: StudioTheme.Values.theme3DAxisZColor
++ }
++
++ ExpandingSpacer {}
++ }
++
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Image Based Lighting")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("HDR Image")
++ tooltip: qsTr("Sets an image to use to light the scene, either instead of, or in addition to standard lights.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Texture"
++ backendValue: backendValues.lightProbe
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Exposure")
++ tooltip: qsTr("Sets the amount of light emitted by the light probe.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.probeExposure
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Horizon")
++ tooltip: qsTr("Sets the light probe horizon. When set, adds darkness (black) to the bottom of the environment, forcing the lighting to come predominantly from the top of the image.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0
++ maximumValue: 1
++ decimals: 2
++ stepSize: 0.1
++ backendValue: backendValues.probeHorizon
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Orientation")
++ tooltip: qsTr("Sets the orientation of the light probe.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.probeOrientation_x
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "X"
++ color: StudioTheme.Values.theme3DAxisXColor
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {}
++
++ SecondColumnLayout {
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.probeOrientation_y
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "Y"
++ color: StudioTheme.Values.theme3DAxisYColor
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {}
++
++ SecondColumnLayout {
++ SpinBox {
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.probeOrientation_z
++ }
++
++ Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
++
++ ControlLabel {
++ text: "Z"
++ color: StudioTheme.Values.theme3DAxisZColor
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Other Effects")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Effects")
++ tooltip: qsTr("Post Processing effects applied to this scene.")
++ Layout.alignment: Qt.AlignTop
++ Layout.topMargin: 5
++ }
++
++ SecondColumnLayout {
++ EditableListView {
++ backendValue: backendValues.effects
++ model: backendValues.effects.expressionAsList
++ Layout.fillWidth: true
++ typeFilter: "QtQuick3D.Effect"
++
++ onAdd: function(value) { backendValues.effects.idListAdd(value) }
++ onRemove: function(idx) { backendValues.effects.idListRemove(idx) }
++ onReplace: function (idx, value) { backendValues.effects.idListReplace(idx, value) }
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Fog")
++ tooltip: qsTr("Settings for Fog applied to the scene.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Fog"
++ backendValue: backendValues.fog
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ width: parent.width
++ caption: qsTr("Advanced")
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Enable Depth Test")
++ tooltip: qsTr("Enables depth testing. Disable to optimize render speed for layers with mostly transparent objects.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.depthTestEnabled.valueToString
++ backendValue: backendValues.depthTestEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Enable Depth Prepass")
++ tooltip: qsTr("Enables draw depth buffer as a separate pass. Disable to optimize render speed for layers with low depth complexity.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.depthPrePassEnabled.valueToString
++ backendValue: backendValues.depthPrePassEnabled
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Debug Settings")
++ tooltip: qsTr("Additional render settings for debugging scenes.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.DebugSettings"
++ backendValue: backendValues.debugSettings
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++ }