diff --git a/interface/resources/qml/controlsUit/ComboBox.qml b/interface/resources/qml/controlsUit/ComboBox.qml index 8d1d7a5262..1a904df89d 100644 --- a/interface/resources/qml/controlsUit/ComboBox.qml +++ b/interface/resources/qml/controlsUit/ComboBox.qml @@ -22,6 +22,7 @@ FocusScope { property alias editable: comboBox.editable property alias comboBox: comboBox readonly property alias currentText: comboBox.currentText; + property alias displayText: comboBox.displayText; property alias currentIndex: comboBox.currentIndex; property int currentHighLightedIndex: comboBox.currentIndex; diff --git a/interface/resources/qml/hifi/dialogs/graphics/GraphicsSettings.qml b/interface/resources/qml/hifi/dialogs/graphics/GraphicsSettings.qml new file mode 100644 index 0000000000..f7c82c90a1 --- /dev/null +++ b/interface/resources/qml/hifi/dialogs/graphics/GraphicsSettings.qml @@ -0,0 +1,378 @@ +// +// GraphicsSettings.qml +// qml\hifi\dialogs\graphics +// +// Created by Zach Fox on 2019-07-10 +// Copyright 2019 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import Hifi 1.0 as Hifi +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.12 +import stylesUit 1.0 as HifiStylesUit +import controlsUit 1.0 as HifiControlsUit +import "qrc:////qml//controls" as HifiControls +import PerformanceEnums 1.0 + +Item { + HifiStylesUit.HifiConstants { id: hifi; } + + id: root; + anchors.fill: parent + + ColumnLayout { + id: graphicsSettingsColumnLayout + anchors.left: parent.left + anchors.leftMargin: 26 + anchors.right: parent.right + anchors.rightMargin: 26 + anchors.top: parent.top + spacing: 8 + + ColumnLayout { + Layout.preferredWidth: parent.width + Layout.topMargin: 18 + spacing: 0 + + HifiStylesUit.RalewayRegular { + text: "GRAPHICS SETTINGS" + Layout.maximumWidth: parent.width + height: 30 + size: 16 + color: "#FFFFFF" + } + + ColumnLayout { + Layout.topMargin: 10 + Layout.preferredWidth: parent.width + spacing: 0 + + HifiControlsUit.RadioButton { + id: performanceLow + colorScheme: hifi.colorSchemes.dark + height: 18 + fontSize: 16 + leftPadding: 0 + text: "Low" + checked: Performance.getPerformancePreset() === PerformanceEnums.LOW + onClicked: { + Performance.setPerformancePreset(PerformanceEnums.LOW); + root.refreshAllDropdowns(); + } + } + + HifiControlsUit.RadioButton { + id: performanceMedium + colorScheme: hifi.colorSchemes.dark + height: 18 + fontSize: 16 + leftPadding: 0 + text: "Medium" + checked: Performance.getPerformancePreset() === PerformanceEnums.MID + onClicked: { + Performance.setPerformancePreset(PerformanceEnums.MID); + root.refreshAllDropdowns(); + } + } + + HifiControlsUit.RadioButton { + id: performanceHigh + colorScheme: hifi.colorSchemes.dark + height: 18 + fontSize: 16 + leftPadding: 0 + text: "High" + checked: Performance.getPerformancePreset() === PerformanceEnums.HIGH + onClicked: { + Performance.setPerformancePreset(PerformanceEnums.HIGH); + root.refreshAllDropdowns(); + } + } + + HifiControlsUit.RadioButton { + id: performanceCustom + colorScheme: hifi.colorSchemes.dark + height: 18 + fontSize: 16 + leftPadding: 0 + text: "Custom" + checked: Performance.getPerformancePreset() === PerformanceEnums.UNKNOWN + onClicked: { + Performance.setPerformancePreset(PerformanceEnums.UNKNOWN); + } + } + } + + ColumnLayout { + Layout.topMargin: 10 + Layout.preferredWidth: parent.width + spacing: 0 + + Item { + Layout.preferredWidth: parent.width + Layout.preferredHeight: 35 + + HifiStylesUit.RalewayRegular { + id: worldDetailHeader + text: "World Detail" + anchors.left: parent.left + anchors.top: parent.top + width: 130 + height: parent.height + size: 16 + color: "#FFFFFF" + } + + ListModel { + id: worldDetailModel + + ListElement { + text: "Low World Detail" + worldDetailQualityValue: 0.25 + } + ListElement { + text: "Medium World Detail" + worldDetailQualityValue: 0.5 + } + ListElement { + text: "Full World Detail" + worldDetailQualityValue: 0.75 + } + } + + HifiControlsUit.ComboBox { + id: worldDetailDropdown + enabled: performanceCustom.checked + anchors.left: worldDetailHeader.right + anchors.leftMargin: 20 + anchors.top: parent.top + width: 280 + height: parent.height + colorScheme: hifi.colorSchemes.dark + model: worldDetailModel + currentIndex: -1 + + function refreshWorldDetailDropdown() { + var currentWorldDetailQuality = LODManager.worldDetailQuality; + if (currentWorldDetailQuality <= 0.25) { + worldDetailDropdown.currentIndex = 0; + } else if (currentWorldDetailQuality <= 0.5) { + worldDetailDropdown.currentIndex = 1; + } else { + worldDetailDropdown.currentIndex = 2; + } + } + + Component.onCompleted: { + worldDetailDropdown.refreshWorldDetailDropdown(); + } + + onCurrentIndexChanged: { + LODManager.worldDetailQuality = model.get(currentIndex).worldDetailQualityValue; + worldDetailDropdown.displayText = model.get(currentIndex).text; + } + } + } + + Item { + Layout.preferredWidth: parent.width + Layout.preferredHeight: 35 + Layout.topMargin: 20 + + HifiStylesUit.RalewayRegular { + id: renderingEffectsHeader + text: "Rendering Effects" + anchors.left: parent.left + anchors.top: parent.top + width: 130 + height: parent.height + size: 16 + color: "#FFFFFF" + } + + ListModel { + id: renderingEffectsModel + + ListElement { + text: "No Rendering Effects" + preferredRenderMethod: 1 // "FORWARD" + shadowsEnabled: false + } + ListElement { + text: "Local Lights, Fog, Bloom" + preferredRenderMethod: 0 // "DEFERRED" + shadowsEnabled: false + } + ListElement { + text: "Local Lights, Fog, Bloom, Shadows" + preferredRenderMethod: 0 // "DEFERRED" + shadowsEnabled: true + } + } + + HifiControlsUit.ComboBox { + id: renderingEffectsDropdown + enabled: performanceCustom.checked + anchors.left: renderingEffectsHeader.right + anchors.leftMargin: 20 + anchors.top: parent.top + width: 280 + height: parent.height + colorScheme: hifi.colorSchemes.dark + model: renderingEffectsModel + currentIndex: -1 + + function refreshRenderingEffectsDropdownDisplay() { + if (Render.shadowsEnabled) { + renderingEffectsDropdown.currentIndex = 2; + } else if (Render.renderMethod === 0) { + renderingEffectsDropdown.currentIndex = 1; + } else { + renderingEffectsDropdown.currentIndex = 0; + } + } + + Component.onCompleted: { + renderingEffectsDropdown.refreshRenderingEffectsDropdownDisplay(); + } + + onCurrentIndexChanged: { + var renderMethodToSet = 1; + if (model.get(currentIndex).preferredRenderMethod === 0 && + PlatformInfo.isRenderMethodDeferredCapable()) { + renderMethodToSet = 0; + } + Render.renderMethod = renderMethodToSet; + Render.shadowsEnabled = model.get(currentIndex).shadowsEnabled; + renderingEffectsDropdown.displayText = model.get(currentIndex).text; + } + } + } + + Item { + Layout.preferredWidth: parent.width + Layout.preferredHeight: 35 + Layout.topMargin: 20 + + HifiStylesUit.RalewayRegular { + id: refreshRateHeader + text: "Refresh Rate" + anchors.left: parent.left + anchors.top: parent.top + width: 130 + height: parent.height + size: 16 + color: "#FFFFFF" + } + + ListModel { + id: refreshRateModel + + ListElement { + text: "Economical" + refreshRatePreset: 0 // RefreshRateProfile::ECO + } + ListElement { + text: "Interactive" + refreshRatePreset: 1 // RefreshRateProfile::INTERACTIVE + } + ListElement { + text: "Real-Time" + refreshRatePreset: 2 // RefreshRateProfile::REALTIME + } + } + + HifiControlsUit.ComboBox { + id: refreshRateDropdown + enabled: performanceCustom.checked + anchors.left: refreshRateHeader.right + anchors.leftMargin: 20 + anchors.top: parent.top + width: 280 + height: parent.height + colorScheme: hifi.colorSchemes.dark + model: refreshRateModel + currentIndex: -1 + + function refreshRefreshRateDropdownDisplay() { + if (Performance.getRefreshRateProfile() === 0) { + refreshRateDropdown.currentIndex = 0; + } else if (Performance.getRefreshRateProfile() === 1) { + refreshRateDropdown.currentIndex = 1; + } else { + refreshRateDropdown.currentIndex = 2; + } + } + + Component.onCompleted: { + refreshRateDropdown.refreshRefreshRateDropdownDisplay(); + } + + onCurrentIndexChanged: { + Performance.setRefreshRateProfile(model.get(currentIndex).refreshRatePreset); + refreshRateDropdown.displayText = model.get(currentIndex).text; + } + } + } + + Item { + Layout.preferredWidth: parent.width + Layout.preferredHeight: 35 + Layout.topMargin: 16 + + HifiStylesUit.RalewayRegular { + id: resolutionHeader + text: "Resolution Scale (" + Number.parseFloat(Render.viewportResolutionScale).toPrecision(3) + ")" + anchors.left: parent.left + anchors.top: parent.top + width: 130 + height: parent.height + size: 16 + color: "#FFFFFF" + } + + HifiControlsUit.Slider { + id: resolutionScaleSlider + enabled: performanceCustom.checked + anchors.left: resolutionHeader.right + anchors.leftMargin: 57 + anchors.top: parent.top + width: 150 + height: parent.height + colorScheme: hifi.colorSchemes.dark + minimumValue: 0.25 + maximumValue: 1.0 + stepSize: 0.02 + value: Render.viewportResolutionScale + live: true + + function updateResolutionScale(sliderValue) { + if (Render.viewportResolutionScale !== sliderValue) { + Render.viewportResolutionScale = sliderValue; + } + } + + onValueChanged: { + updateResolutionScale(value); + } + onPressedChanged: { + if (!pressed) { + updateResolutionScale(value); + } + } + } + } + } + } + } + + function refreshAllDropdowns() { + worldDetailDropdown.refreshWorldDetailDropdown(); + renderingEffectsDropdown.refreshRenderingEffectsDropdownDisplay(); + refreshRateDropdown.refreshRefreshRateDropdownDisplay(); + } +} diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 8bee8de8c3..4cf78c23ee 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -266,8 +266,13 @@ Menu::Menu() { // Settings > Graphics... action = addActionToQMenuAndActionHash(settingsMenu, "Graphics..."); connect(action, &QAction::triggered, [] { - qApp->showDialog(QString("hifi/dialogs/GraphicsPreferencesDialog.qml"), - QString("hifi/tablet/TabletGraphicsPreferences.qml"), "GraphicsPreferencesDialog"); + auto tablet = DependencyManager::get()->getTablet("com.highfidelity.interface.tablet.system"); + auto hmd = DependencyManager::get(); + tablet->pushOntoStack("hifi/dialogs/graphics/GraphicsSettings.qml"); + + if (!hmd->getShouldShowTablet()) { + hmd->toggleShouldShowTablet(); + } }); // Settings > Security... diff --git a/interface/src/PerformanceManager.cpp b/interface/src/PerformanceManager.cpp index ec12ab0404..80c09e3fec 100644 --- a/interface/src/PerformanceManager.cpp +++ b/interface/src/PerformanceManager.cpp @@ -92,7 +92,7 @@ void PerformanceManager::applyPerformancePreset(PerformanceManager::PerformanceP RenderScriptingInterface::getInstance()->setShadowsEnabled(true); qApp->getRefreshRateManager().setRefreshRateProfile(RefreshRateManager::RefreshRateProfile::REALTIME); - DependencyManager::get()->setWorldDetailQuality(0.5f); + DependencyManager::get()->setWorldDetailQuality(0.75f); break; case PerformancePreset::MID: @@ -114,7 +114,7 @@ void PerformanceManager::applyPerformancePreset(PerformanceManager::PerformanceP RenderScriptingInterface::getInstance()->setViewportResolutionScale(recommandedPpiScale); - DependencyManager::get()->setWorldDetailQuality(0.75f); + DependencyManager::get()->setWorldDetailQuality(0.25f); break; case PerformancePreset::UNKNOWN: diff --git a/interface/src/scripting/PlatformInfoScriptingInterface.cpp b/interface/src/scripting/PlatformInfoScriptingInterface.cpp index cbd94b3dd5..9adf514718 100644 --- a/interface/src/scripting/PlatformInfoScriptingInterface.cpp +++ b/interface/src/scripting/PlatformInfoScriptingInterface.cpp @@ -221,4 +221,6 @@ QStringList PlatformInfoScriptingInterface::getPlatformTierNames() { return platformTierNames; } - +bool PlatformInfoScriptingInterface::isRenderMethodDeferredCapable() { + return platform::Profiler::isRenderMethodDeferredCapable(); +} diff --git a/interface/src/scripting/PlatformInfoScriptingInterface.h b/interface/src/scripting/PlatformInfoScriptingInterface.h index 9ac67ec0bd..f59d476f0c 100644 --- a/interface/src/scripting/PlatformInfoScriptingInterface.h +++ b/interface/src/scripting/PlatformInfoScriptingInterface.h @@ -245,7 +245,12 @@ public slots: */ QStringList getPlatformTierNames(); - + /**jsdoc + * Gets whether the current hardware can render using the Deferred method. + * @function PlatformInfo.isRenderMethodDeferredCapable + * @returns {bool} true if the current hardware can render using the Deferred method; false otherwise. + */ + bool isRenderMethodDeferredCapable(); }; #endif // hifi_PlatformInfoScriptingInterface_h