Qt Quick 3D - Scene Effects Example
// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick.Controls import QtQuick.Layouts import QtQuick3D import QtQuick3D.Helpers Page { id: toolPage required property PerspectiveCamera camera required property var sceneEnvironment required property Texture lutTexture component HorizontalSpacer : Item { Layout.fillWidth: true } component ResetButton : Button { signal reset() text: "Reset to Defaults" Layout.alignment: Qt.AlignRight onClicked: { reset() } } ScrollView { anchors.fill: parent anchors.margins: 10 contentHeight: editableSections.implicitHeight ColumnLayout { id: editableSections width: parent.width // AA SectionLayout { id: antialiasingSection title: "Antialiasing" Label { text: "AA Mode" Layout.fillWidth: true } RowLayout { HorizontalSpacer { } ComboBox { id: antialiasingModeComboBox textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.sceneEnvironment.antialiasingMode = currentValue Layout.fillWidth: true model: [ { value: SceneEnvironment.NoAA, text: "No Antialiasing"}, { value: SceneEnvironment.SSAA, text: "Supersample AA"}, { value: SceneEnvironment.MSAA, text: "Multisample AA"}, { value: SceneEnvironment.ProgressiveAA, text: "Progressive AA"} ] Connections { target: toolPage.sceneEnvironment function onAntialiasingModeChanged() { antialiasingModeComboBox.currentIndex = antialiasingModeComboBox.indexOfValue(toolPage.sceneEnvironment.antialiasingMode) } } } } Label { text: "AA Quality" Layout.fillWidth: true visible: toolPage.sceneEnvironment.antialiasingMode !== SceneEnvironment.NoAA } RowLayout { visible: toolPage.sceneEnvironment.antialiasingMode !== SceneEnvironment.NoAA HorizontalSpacer { } ComboBox { id: antialiasingQualityComboBox Layout.fillWidth: true textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.sceneEnvironment.antialiasingQuality = currentValue model: [ { value: SceneEnvironment.Medium, text: "Medium"}, { value: SceneEnvironment.High, text: "High"}, { value: SceneEnvironment.VeryHigh, text: "VeryHigh"} ] Connections { target: toolPage.sceneEnvironment function onAntialiasingModeChanged() { antialiasingQualityComboBox.currentIndex = antialiasingQualityComboBox.indexOfValue(toolPage.sceneEnvironment.antialiasingQuality) } } } } CheckBox { Layout.columnSpan: 2 text: "Enable FXAA" checked: toolPage.sceneEnvironment.fxaaEnabled onCheckedChanged: { toolPage.sceneEnvironment.fxaaEnabled = checked } } CheckBox { Layout.columnSpan: 2 text: "Enable Temporal AA" checked: toolPage.sceneEnvironment.temporalAAEnabled onCheckedChanged: { toolPage.sceneEnvironment.temporalAAEnabled = checked } } Label { visible: toolPage.sceneEnvironment.temporalAAEnabled text: "Temporal AA Strength (" + toolPage.sceneEnvironment.temporalAAStrength.toFixed(2) + ")" Layout.fillWidth: true } Slider { visible: toolPage.sceneEnvironment.temporalAAEnabled Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.temporalAAStrength onValueChanged: toolPage.sceneEnvironment.temporalAAStrength = value } CheckBox { Layout.columnSpan: 2 text: "Enable Specular AA" checked: toolPage.sceneEnvironment.specularAAEnabled onCheckedChanged: { toolPage.sceneEnvironment.specularAAEnabled = checked } } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.antialiasingMode = SceneEnvironment.NoAA toolPage.sceneEnvironment.antialiasingQuality = SceneEnvironment.High toolPage.sceneEnvironment.fxaaEnabled = false toolPage.sceneEnvironment.temporalAAEnabled = false toolPage.sceneEnvironment.temporalAAStrength = 0.3 toolPage.sceneEnvironment.specularAAEnabled = false } } } // TONEMAPPING SectionLayout { id: tonemappingSection title: "Tonemapping" Label { text: "Tonemapping Mode" Layout.fillWidth: true } ComboBox { id: tonemappingModeComboBox Layout.fillWidth: true textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.sceneEnvironment.tonemapMode = currentValue Component.onCompleted: tonemappingModeComboBox.currentIndex = tonemappingModeComboBox.indexOfValue(toolPage.sceneEnvironment.tonemapMode) model: [ { value: SceneEnvironment.TonemapModeNone, text: "None"}, { value: SceneEnvironment.TonemapModeAces, text: "ACES"}, { value: SceneEnvironment.TonemapModeFilmic, text: "Filmic"}, { value: SceneEnvironment.TonemapModeHejlDawson, text: "HejlDawson"}, { value: SceneEnvironment.TonemapModeLinear, text: "Linear"} ] Connections { target: toolPage.sceneEnvironment function onTonemapModeChanged() { tonemappingModeComboBox.currentIndex = tonemappingModeComboBox.indexOfValue(toolPage.sceneEnvironment.tonemapMode) } } } Label { text: "Exposure (" + (toolPage.sceneEnvironment.exposure).toFixed(2) + ")" Layout.fillWidth: true } Slider { Layout.fillWidth: true from: 0.0 to: 10.0 value: toolPage.sceneEnvironment.exposure onValueChanged: toolPage.sceneEnvironment.exposure = value } Label { enabled: !(toolPage.sceneEnvironment.tonemapMode === SceneEnvironment.TonemapModeLinear || toolPage.sceneEnvironment.tonemapMode === SceneEnvironment.TonemapModeNone) text: "White Point (" + (toolPage.sceneEnvironment.whitePoint).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: !(toolPage.sceneEnvironment.tonemapMode === SceneEnvironment.TonemapModeLinear || toolPage.sceneEnvironment.tonemapMode === SceneEnvironment.TonemapModeNone) Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.whitePoint onValueChanged: toolPage.sceneEnvironment.whitePoint = value } Label { text: "Sharpness Amount (" + (toolPage.sceneEnvironment.sharpnessAmount).toFixed(2) + ")" Layout.fillWidth: true } Slider { Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.sharpnessAmount onValueChanged: toolPage.sceneEnvironment.sharpnessAmount = value } CheckBox { Layout.columnSpan: 2 text: "Enable Dithering" checked: toolPage.sceneEnvironment.ditheringEnabled onCheckedChanged: { toolPage.sceneEnvironment.ditheringEnabled = checked } } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.tonemapMode = SceneEnvironment.TonemapModeLinear toolPage.sceneEnvironment.exposure = 1.0 toolPage.sceneEnvironment.whitePoint = 1.0 toolPage.sceneEnvironment.sharpnessAmount = 0.0 toolPage.sceneEnvironment.ditheringEnabled = false } } } // AO SectionLayout { id: aoSection title: "Ambient Occlusion" isExpanded: false readonly property bool aoEnabled: toolPage.sceneEnvironment.aoEnabled CheckBox { Layout.columnSpan: 2 text: "Enable Screen Space Ambient Occlusion" checked: toolPage.sceneEnvironment.aoEnabled onCheckedChanged: { toolPage.sceneEnvironment.aoEnabled = checked } } Label { enabled: aoSection.aoEnabled text: "Strength (" + (toolPage.sceneEnvironment.aoStrength).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: aoSection.aoEnabled Layout.fillWidth: true from: aoSection.aoEnabled ? 0.01 : 0.0 to: 100.0 value: toolPage.sceneEnvironment.aoStrength onValueChanged: { toolPage.sceneEnvironment.aoStrength = value } } Label { enabled: aoSection.aoEnabled text: "Softness (" + (toolPage.sceneEnvironment.aoSoftness).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: aoSection.aoEnabled Layout.fillWidth: true from: 0.0 to: 50.0 value: toolPage.sceneEnvironment.aoSoftness onValueChanged: toolPage.sceneEnvironment.aoSoftness = value } Label { enabled: aoSection.aoEnabled text: "Distance (" + (toolPage.sceneEnvironment.aoDistance).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: aoSection.aoEnabled Layout.fillWidth: true from: 0.01 to: 5.0 value: toolPage.sceneEnvironment.aoDistance onValueChanged: toolPage.sceneEnvironment.aoDistance = value } Label { enabled: aoSection.aoEnabled text: "Sample Rate" Layout.fillWidth: true } ComboBox { id: aoSampleRateComboBox enabled: aoSection.aoEnabled textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.sceneEnvironment.aoSampleRate = currentValue Layout.fillWidth: true model: [ { value: 2, text: "2"}, { value: 3, text: "3"}, { value: 4, text: "4"} ] Connections { target: toolPage.sceneEnvironment function onAoSampleRateChanged() { aoSampleRateComboBox.currentIndex = aoSampleRateComboBox.indexOfValue(toolPage.sceneEnvironment.aoSampleRate) } } } Label { enabled: aoSection.aoEnabled text: "Bias (" + (toolPage.sceneEnvironment.aoBias).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: aoSection.aoEnabled Layout.fillWidth: true from: -1.0 to: 1.0 stepSize: 0.01 value: toolPage.sceneEnvironment.aoBias onValueChanged: toolPage.sceneEnvironment.aoBias = value } CheckBox { enabled: aoSection.aoEnabled Layout.columnSpan: 2 text: "Enable AO Dither" checked: toolPage.sceneEnvironment.aoDither onCheckedChanged: { toolPage.sceneEnvironment.aoDither = checked } } HorizontalSpacer { } ResetButton { onReset: { if (toolPage.sceneEnvironment.aoEnabled) toolPage.sceneEnvironment.aoStrength = 100.0 else toolPage.sceneEnvironment.aoStrength = 0.0 toolPage.sceneEnvironment.aoSoftness = 50.0 toolPage.sceneEnvironment.aoDistance = 5.0 toolPage.sceneEnvironment.aoSampleRate = 2 toolPage.sceneEnvironment.aoBias = 0.0 toolPage.sceneEnvironment.aoDither = false } } } // DOF SectionLayout { id: dofSection title: "Depth of Field" isExpanded: false readonly property bool dofEnabled: toolPage.sceneEnvironment.depthOfFieldEnabled CheckBox { Layout.columnSpan: 2 text: "Enabled" checked: toolPage.sceneEnvironment.depthOfFieldEnabled onCheckedChanged: { toolPage.sceneEnvironment.depthOfFieldEnabled = checked } } Label { enabled: dofSection.dofEnabled Layout.columnSpan: 2 text: "Focus Distance (" + (toolPage.sceneEnvironment.depthOfFieldFocusDistance).toFixed(2) + ")" Layout.fillWidth: true } Label { enabled: dofSection.dofEnabled Layout.columnSpan: 2 text: "Focus Range (" + (toolPage.sceneEnvironment.depthOfFieldFocusRange).toFixed(2) +")" Layout.fillWidth: true } Label { enabled: dofSection.dofEnabled Layout.columnSpan: 2 text: "Focus Near (" + dofFocusSlider.first.value.toFixed(2) + ")" Layout.fillWidth: true } Label { enabled: dofSection.dofEnabled Layout.columnSpan: 2 text: "Focus Far (" + dofFocusSlider.second.value.toFixed(2) + ")" Layout.fillWidth: true } RangeSlider { id: dofFocusSlider enabled: dofSection.dofEnabled Layout.columnSpan: 2 from: toolPage.camera.clipNear to: toolPage.camera.clipFar Layout.fillWidth: true function updateSlider() { const dofNear = toolPage.sceneEnvironment.depthOfFieldFocusDistance - toolPage.sceneEnvironment.depthOfFieldFocusRange * 0.5 const dofFar = toolPage.sceneEnvironment.depthOfFieldFocusDistance + toolPage.sceneEnvironment.depthOfFieldFocusRange * 0.5 second.value = dofFar first.value = dofNear } Component.onCompleted: updateSlider() first.onMoved: { toolPage.sceneEnvironment.depthOfFieldFocusRange = second.value - first.value toolPage.sceneEnvironment.depthOfFieldFocusDistance = first.value + toolPage.sceneEnvironment.depthOfFieldFocusRange * 0.5 } second.onMoved: { toolPage.sceneEnvironment.depthOfFieldFocusRange = second.value - first.value toolPage.sceneEnvironment.depthOfFieldFocusDistance = first.value + toolPage.sceneEnvironment.depthOfFieldFocusRange * 0.5 } } Label { enabled: dofSection.dofEnabled Layout.fillWidth: true text: "Blur Amount (" + (toolPage.sceneEnvironment.depthOfFieldBlurAmount).toFixed(2) + ")" } Slider { enabled: dofSection.dofEnabled Layout.fillWidth: true from: 0.0 to: 25.0 value: toolPage.sceneEnvironment.depthOfFieldBlurAmount onValueChanged: toolPage.sceneEnvironment.depthOfFieldBlurAmount = value } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.depthOfFieldFocusRange = 100.0 toolPage.sceneEnvironment.depthOfFieldFocusDistance = 600.0 toolPage.sceneEnvironment.depthOfFieldBlurAmount = 4.0 dofFocusSlider.updateSlider() } } } // FOG SectionLayout { id: fogSection title: "Fog" isExpanded: false property bool fogEnabled: toolPage.sceneEnvironment.fog.enabled CheckBox { Layout.columnSpan: 2 text: "Enabled" checked: toolPage.sceneEnvironment.fog.enabled onCheckedChanged: { toolPage.sceneEnvironment.fog.enabled = checked } } Label { enabled: fogSection.fogEnabled Layout.fillWidth: true text: "Density (" + toolPage.sceneEnvironment.fog.density.toFixed(2) + ")" } Slider { id: valDensity enabled: fogSection.fogEnabled Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.fog.density onValueChanged: toolPage.sceneEnvironment.fog.density = value } Label { enabled: fogSection.fogEnabled Layout.fillWidth: true text: "Color" } ColorPicker { enabled: fogSection.fogEnabled Layout.fillWidth: true color: toolPage.sceneEnvironment.fog.color onColorChanged: toolPage.sceneEnvironment.fog.color = color } // DEPTH FOG CheckBox { id: depthFogCheckbox Layout.columnSpan: 2 enabled: fogSection.fogEnabled Layout.fillWidth: true text: "Depth fog enabled" checked: toolPage.sceneEnvironment.fog.depthEnabled onCheckedChanged: { toolPage.sceneEnvironment.fog.depthEnabled = checked } } Label { visible: depthFogCheckbox.checked Layout.fillWidth: true Layout.columnSpan: 2 text: "Near (" + toolPage.sceneEnvironment.fog.depthNear.toFixed(2) + ")" } Label { visible: depthFogCheckbox.checked Layout.fillWidth: true Layout.columnSpan: 2 text: "Far (" + toolPage.sceneEnvironment.fog.depthFar.toFixed(2) + ")" } RangeSlider { id: valDepth visible: depthFogCheckbox.checked Layout.columnSpan: 2 Layout.fillWidth: true from: -1000.0 to: 1000.0 first.value: toolPage.sceneEnvironment.fog.depthNear second.value: toolPage.sceneEnvironment.fog.depthFar first.onValueChanged: toolPage.sceneEnvironment.fog.depthNear = first.value second.onValueChanged: toolPage.sceneEnvironment.fog.depthFar = second.value } Label { visible: depthFogCheckbox.checked Layout.fillWidth: true text: "Curve (" + toolPage.sceneEnvironment.fog.depthCurve.toFixed(2) + ")" } Slider { id: valDepthCurve visible: depthFogCheckbox.checked Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.fog.depthCurve onValueChanged: toolPage.sceneEnvironment.fog.depthCurve = value } // HEIGHT FOG CheckBox { id: heightFogCheckbox Layout.columnSpan: 2 enabled: fogSection.fogEnabled text: "Height fog enabled" checked: toolPage.sceneEnvironment.fog.heightEnabled onCheckedChanged: { toolPage.sceneEnvironment.fog.heightEnabled = checked } } Label { visible: heightFogCheckbox.checked Layout.fillWidth: true text: "Least Intense Y (" + toolPage.sceneEnvironment.fog.leastIntenseY.toFixed(2) + ")" } Slider { id: valHeightMin visible: heightFogCheckbox.checked Layout.fillWidth: true from: -1000.0 to: 1000.0 value: toolPage.sceneEnvironment.fog.leastIntenseY onValueChanged: toolPage.sceneEnvironment.fog.leastIntenseY = value } Label { visible: heightFogCheckbox.checked Layout.fillWidth: true text: "Most Intense Y (" + toolPage.sceneEnvironment.fog.mostIntenseY.toFixed(2) + ")" } Slider { id: valHeightMax visible: heightFogCheckbox.checked Layout.fillWidth: true from: -1000.0 to: 1000.0 value: toolPage.sceneEnvironment.fog.mostIntenseY onValueChanged: toolPage.sceneEnvironment.fog.mostIntenseY = value } Label { visible: heightFogCheckbox.checked Layout.fillWidth: true text: "Curve (" + toolPage.sceneEnvironment.fog.heightCurve.toFixed(2) + ")" } Slider { id: valHeightCurve visible: heightFogCheckbox.checked Layout.fillWidth: true from: 0.0 to: 100.0 value: toolPage.sceneEnvironment.fog.heightCurve onValueChanged: toolPage.sceneEnvironment.fog.heightCurve = value } // TRANSMISSION CheckBox { id: fogTransmitCheckbox Layout.columnSpan: 2 visible: heightFogCheckbox.checked || depthFogCheckbox.checked text: "Light transmission enabled" checked: toolPage.sceneEnvironment.fog.transmitEnabled onCheckedChanged: { toolPage.sceneEnvironment.fog.transmitEnabled = checked } } Label { visible: fogTransmitCheckbox.checked Layout.fillWidth: true text: "Curve (" + toolPage.sceneEnvironment.fog.transmitCurve.toFixed(2) + ")" } Slider { id: valTransmitCurve visible: fogTransmitCheckbox.checked Layout.fillWidth: true from: 0.0 to: 100.0 value: toolPage.sceneEnvironment.fog.transmitCurve onValueChanged: toolPage.sceneEnvironment.fog.transmitCurve = value } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.fog.depthEnabled = false toolPage.sceneEnvironment.fog.heightEnabled = false toolPage.sceneEnvironment.fog.transmitEnabled = false toolPage.sceneEnvironment.fog.density = 1.0; toolPage.sceneEnvironment.fog.color = Qt.rgba(0.5, 0.6, 0.7, 1.0); toolPage.sceneEnvironment.fog.depthNear = 10.0; toolPage.sceneEnvironment.fog.depthFar = 1000.0; toolPage.sceneEnvironment.fog.depthCurve = 1.0; toolPage.sceneEnvironment.fog.leastIntenseY = 10.0; toolPage.sceneEnvironment.fog.mostIntenseY = 0.0; toolPage.sceneEnvironment.fog.heightCurve = 1.0; toolPage.sceneEnvironment.fog.transmitCurve = 1.0; } } } // GLOW SectionLayout { id: glowSection title: "Glow" isExpanded: false property bool glowEnabled: toolPage.sceneEnvironment.glowEnabled CheckBox { Layout.columnSpan: 2 text: "Enable Glow" checked: toolPage.sceneEnvironment.glowEnabled onCheckedChanged: { toolPage.sceneEnvironment.glowEnabled = checked } } CheckBox { Layout.columnSpan: 2 text: "High Quality Mode" enabled: glowSection.glowEnabled checked: toolPage.sceneEnvironment.glowQualityHigh onCheckedChanged: { toolPage.sceneEnvironment.glowQualityHigh = checked } } CheckBox { Layout.columnSpan: 2 enabled: glowSection.glowEnabled text: "Use Bicubic Upscale" checked: toolPage.sceneEnvironment.glowUseBicubicUpscale onCheckedChanged: { toolPage.sceneEnvironment.glowUseBicubicUpscale = checked } } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Strength (" + (toolPage.sceneEnvironment.glowStrength).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 2.0 value: toolPage.sceneEnvironment.glowStrength onValueChanged: toolPage.sceneEnvironment.glowStrength = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Intensity (" + (toolPage.sceneEnvironment.glowIntensity).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 2.0 value: toolPage.sceneEnvironment.glowIntensity onValueChanged: toolPage.sceneEnvironment.glowIntensity = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Bloom (" + (toolPage.sceneEnvironment.glowBloom).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.glowBloom onValueChanged: toolPage.sceneEnvironment.glowBloom = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Upper Threshold (" + (toolPage.sceneEnvironment.glowHDRMaximumValue).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 256.0 value: toolPage.sceneEnvironment.glowHDRMaximumValue onValueChanged: toolPage.sceneEnvironment.glowHDRMaximumValue = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Lower Threshold (" + (toolPage.sceneEnvironment.glowHDRMinimumValue).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 4.0 value: toolPage.sceneEnvironment.glowHDRMinimumValue onValueChanged: toolPage.sceneEnvironment.glowHDRMinimumValue = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "HDR Scale (" + (toolPage.sceneEnvironment.glowHDRScale).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: glowSection.glowEnabled from: 0.0 to: 4.0 value: toolPage.sceneEnvironment.glowHDRScale onValueChanged: toolPage.sceneEnvironment.glowHDRScale = value } Label { Layout.fillWidth: true enabled: glowSection.glowEnabled text: "Blend Mode" } ComboBox { id: glowBlendModeComboBox Layout.fillWidth: true enabled: glowSection.glowEnabled textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.sceneEnvironment.glowBlendMode = currentValue Component.onCompleted: currentIndex = glowBlendModeComboBox.indexOfValue(toolPage.sceneEnvironment.glowBlendMode) model: [ { value: ExtendedSceneEnvironment.GlowBlendMode.Additive, text: "Additive"}, { value: ExtendedSceneEnvironment.GlowBlendMode.Screen, text: "Screen"}, { value: ExtendedSceneEnvironment.GlowBlendMode.SoftLight, text: "Softlight"}, { value: ExtendedSceneEnvironment.GlowBlendMode.Replace, text: "Replace"} ] Connections { target: toolPage.sceneEnvironment function onGlowBlendModeChanged() { glowBlendModeComboBox.currentIndex = glowBlendModeComboBox.indexOfValue(toolPage.sceneEnvironment.glowBlendMode) } } } Label { text: "Glow Level" Layout.fillWidth: true enabled: glowSection.glowEnabled } ColumnLayout { id: glowLevelCheckBoxes enabled: glowSection.glowEnabled Layout.fillWidth: true function updateGlowLevels(value, enable) { if (enable) toolPage.sceneEnvironment.glowLevel |= value else toolPage.sceneEnvironment.glowLevel &= ~value } function isChecked(flag) { return ((toolPage.sceneEnvironment.glowLevel & flag) === flag) } CheckBox { text: qsTr("One") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.One) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.One, checkState === Qt.Checked) } } CheckBox { text: qsTr("Two") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Two) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Two, checkState === Qt.Checked) } } CheckBox { text: qsTr("Three") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Three) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Three, checkState === Qt.Checked) } } CheckBox { text: qsTr("Four") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Four) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Four, checkState === Qt.Checked) } } CheckBox { text: qsTr("Five") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Five) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Five, checkState === Qt.Checked) } } CheckBox { text: qsTr("Six") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Six) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Six, checkState === Qt.Checked) } } CheckBox { text: qsTr("Seven") checked: glowLevelCheckBoxes.isChecked(ExtendedSceneEnvironment.GlowLevel.Seven) onCheckStateChanged: { glowLevelCheckBoxes.updateGlowLevels(ExtendedSceneEnvironment.GlowLevel.Seven, checkState === Qt.Checked) } } } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.glowQualityHigh = false toolPage.sceneEnvironment.glowUseBicubicUpscale = false toolPage.sceneEnvironment.glowStrength = 1.0 toolPage.sceneEnvironment.glowIntensity = 0.8 toolPage.sceneEnvironment.glowBloom = 0.0 toolPage.sceneEnvironment.glowBlendMode = 2 toolPage.sceneEnvironment.glowHDRMaximumValue = 12.0 toolPage.sceneEnvironment.glowHDRScale = 2.0 toolPage.sceneEnvironment.glowHDRMinimumValue = 1.0 toolPage.sceneEnvironment.glowLevel = 1 } } } // ADJUSTMENT SectionLayout { id: adjustmentsSection title: "Adjustments" isExpanded: false property bool colorAdjustmentsEnabled: toolPage.sceneEnvironment.colorAdjustmentsEnabled CheckBox { Layout.columnSpan: 2 text: "Enable Color Adjustments" checked: toolPage.sceneEnvironment.colorAdjustmentsEnabled onCheckedChanged: { toolPage.sceneEnvironment.colorAdjustmentsEnabled = checked } } Label { enabled: adjustmentsSection.colorAdjustmentsEnabled text: "Brightness (" + (toolPage.sceneEnvironment.adjustmentBrightness).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: adjustmentsSection.colorAdjustmentsEnabled Layout.fillWidth: true from: 0.01 to: 8.0 stepSize: 0.01 value: toolPage.sceneEnvironment.adjustmentBrightness onValueChanged: toolPage.sceneEnvironment.adjustmentBrightness = value } Label { enabled: adjustmentsSection.colorAdjustmentsEnabled text: "Contrast (" + (toolPage.sceneEnvironment.adjustmentContrast).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: adjustmentsSection.colorAdjustmentsEnabled Layout.fillWidth: true from: 0.01 to: 8.0 stepSize: 0.01 value: toolPage.sceneEnvironment.adjustmentContrast onValueChanged: toolPage.sceneEnvironment.adjustmentContrast = value } Label { enabled: adjustmentsSection.colorAdjustmentsEnabled text: "Saturation (" + (toolPage.sceneEnvironment.adjustmentSaturation).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: adjustmentsSection.colorAdjustmentsEnabled Layout.fillWidth: true from: 0.01 to: 8.0 stepSize: 0.01 value: toolPage.sceneEnvironment.adjustmentSaturation onValueChanged: toolPage.sceneEnvironment.adjustmentSaturation = value } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.adjustmentBrightness = 1.0 toolPage.sceneEnvironment.adjustmentContrast = 1.0 toolPage.sceneEnvironment.adjustmentSaturation = 1.0 } } } // COLORGRADING SectionLayout { id: colorGradingSection title: "Color Grading" isExpanded: false property bool colorGradingEnabled: toolPage.sceneEnvironment.lutEnabled CheckBox { Layout.columnSpan: 2 text: "Enable" checked: toolPage.sceneEnvironment.lutEnabled onCheckedChanged: { toolPage.sceneEnvironment.lutEnabled = checked } } Label { enabled: colorGradingSection.colorGradingEnabled text: "Alpha Filtering (" + (toolPage.sceneEnvironment.lutFilterAlpha).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: colorGradingSection.colorGradingEnabled Layout.fillWidth: true from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.lutFilterAlpha onValueChanged: toolPage.sceneEnvironment.lutFilterAlpha = value } Label { enabled: colorGradingSection.colorGradingEnabled text: "Look Up Texture (LUT)" Layout.fillWidth: true } ComboBox { id: lutSourceTextureComboBox enabled: colorGradingSection.colorGradingEnabled Layout.fillWidth: true textRole: "text" valueRole: "value" implicitContentWidthPolicy: ComboBox.WidestText onActivated: toolPage.lutTexture.source = currentValue Component.onCompleted: lutSourceTextureComboBox.currentIndex = lutSourceTextureComboBox.indexOfValue(toolPage.lutTexture.source) model: [ { value: Qt.url("qrc:/luts/grayscale.png"), text: "Greyscale"}, { value: Qt.url("qrc:/luts/identity.png"), text: "Identity"}, { value: Qt.url("qrc:/luts/inverted.png"), text: "Inverted"} ] Connections { target: toolPage.lutTexture function onSourceChanged() { lutSourceTextureComboBox.currentIndex = lutSourceTextureComboBox.indexOfValue(toolPage.lutTexture.source) } } } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.lutFilterAlpha = 1.0; toolPage.lutTexture.source = Qt.url("qrc:/luts/identity.png"); } } } // VIGNETTE SectionLayout { id: vignetteSection title: "Vignette" isExpanded: false property bool vignetteEnabled: toolPage.sceneEnvironment.vignetteEnabled CheckBox { Layout.columnSpan: 2 text: "Enable" checked: toolPage.sceneEnvironment.vignetteEnabled onCheckedChanged: { toolPage.sceneEnvironment.vignetteEnabled = checked } } Label { enabled: vignetteSection.vignetteEnabled text: "Vignette Strength(" + (toolPage.sceneEnvironment.vignetteStrength).toFixed(2) + ")" Layout.fillWidth: true } Slider { enabled: vignetteSection.vignetteEnabled Layout.fillWidth: true from: 0.0 to: 15.0 value: toolPage.sceneEnvironment.vignetteStrength onValueChanged: toolPage.sceneEnvironment.vignetteStrength = value } Label { text: "Vignette Color" enabled: vignetteSection.vignetteEnabled Layout.fillWidth: true } ColorPicker { enabled: vignetteSection.vignetteEnabled Layout.fillWidth: true color: toolPage.sceneEnvironment.vignetteColor onColorChanged: toolPage.sceneEnvironment.vignetteColor = color } Label { text: "Vignette Radius(" + (toolPage.sceneEnvironment.vignetteRadius).toFixed(2) + ")" enabled: vignetteSection.vignetteEnabled Layout.fillWidth: true } Slider { enabled: vignetteSection.vignetteEnabled Layout.fillWidth: true from: 0.0 to: 5.0 value: toolPage.sceneEnvironment.vignetteRadius onValueChanged: toolPage.sceneEnvironment.vignetteRadius = value } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.vignetteStrength = 15.0 toolPage.sceneEnvironment.vignetteColor = Qt.rgba(0.5, 0.5, 0.5, 1.0) toolPage.sceneEnvironment.vignetteRadius = 0.35 } } } // LENSFLARE SectionLayout { id: lensFlareSection title: "Lens Flare" isExpanded: false property bool lensFlareEnabled: toolPage.sceneEnvironment.lensFlareEnabled CheckBox { Layout.columnSpan: 2 text: "Enable" checked: toolPage.sceneEnvironment.lensFlareEnabled onCheckedChanged: { toolPage.sceneEnvironment.lensFlareEnabled = checked } } Label { text: "Bloom Scale(" + (toolPage.sceneEnvironment.lensFlareBloomScale).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 20.0 value: toolPage.sceneEnvironment.lensFlareBloomScale onValueChanged: toolPage.sceneEnvironment.lensFlareBloomScale = value } Label { text: "Bloom Bias(" + (toolPage.sceneEnvironment.lensFlareBloomBias).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 10.0 value: toolPage.sceneEnvironment.lensFlareBloomBias onValueChanged: toolPage.sceneEnvironment.lensFlareBloomBias = value } Label { text: "Ghost Dispersal(" + (toolPage.sceneEnvironment.lensFlareGhostDispersal).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.lensFlareGhostDispersal onValueChanged: toolPage.sceneEnvironment.lensFlareGhostDispersal = value } Label { text: "Ghost Count(" + (toolPage.sceneEnvironment.lensFlareGhostCount) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0 to: 20 stepSize: 1 value: toolPage.sceneEnvironment.lensFlareGhostCount onValueChanged: toolPage.sceneEnvironment.lensFlareGhostCount = value } Label { text: "Halo Width(" + (toolPage.sceneEnvironment.lensFlareHaloWidth).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.lensFlareHaloWidth onValueChanged: toolPage.sceneEnvironment.lensFlareHaloWidth = value } Label { text: "Stretch Aspect(" + (toolPage.sceneEnvironment.lensFlareStretchToAspect).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 1.0 value: toolPage.sceneEnvironment.lensFlareStretchToAspect onValueChanged: toolPage.sceneEnvironment.lensFlareStretchToAspect = value } Label { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled text: "Distortion(" + (toolPage.sceneEnvironment.lensFlareDistortion).toFixed(2) + ")" } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 20.0 value: toolPage.sceneEnvironment.lensFlareDistortion onValueChanged: toolPage.sceneEnvironment.lensFlareDistortion = value } Label { text: "Blur Amount(" + (toolPage.sceneEnvironment.lensFlareBlurAmount).toFixed(2) + ")" Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled } Slider { Layout.fillWidth: true enabled: lensFlareSection.lensFlareEnabled from: 0.0 to: 50.0 value: toolPage.sceneEnvironment.lensFlareBlurAmount onValueChanged: toolPage.sceneEnvironment.lensFlareBlurAmount = value } CheckBox { enabled: lensFlareSection.lensFlareEnabled Layout.columnSpan: 2 text: "Apply Lens Dirt" checked: toolPage.sceneEnvironment.lensFlareApplyDirtTexture onCheckedChanged: { toolPage.sceneEnvironment.lensFlareApplyDirtTexture = checked } } CheckBox { enabled: lensFlareSection.lensFlareEnabled Layout.columnSpan: 2 text: "Apply Starburst" checked: toolPage.sceneEnvironment.lensFlareApplyStarburstTexture onCheckedChanged: { toolPage.sceneEnvironment.lensFlareApplyStarburstTexture = checked } } HorizontalSpacer { } ResetButton { onReset: { toolPage.sceneEnvironment.lensFlareBloomScale = 10 toolPage.sceneEnvironment.lensFlareBloomBias = 2.75 toolPage.sceneEnvironment.lensFlareGhostDispersal = 0.5 toolPage.sceneEnvironment.lensFlareGhostCount = 4 toolPage.sceneEnvironment.lensFlareHaloWidth = 0.25 toolPage.sceneEnvironment.lensFlareStretchToAspect = 0.5 toolPage.sceneEnvironment.lensFlareDistortion = 5 toolPage.sceneEnvironment.lensFlareBlurAmount = 3 toolPage.sceneEnvironment.lensFlareApplyDirtTexture = true toolPage.sceneEnvironment.lensFlareApplyStarburstTexture = true } } } } } }