From 84197e5eb23de8d035b60753948c3f27fb1871ae Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 9 Feb 2016 11:07:10 -0800 Subject: [PATCH] Add persistent render engine configuration file --- interface/src/Application.cpp | 1 + interface/src/ui/PreferencesDialog.cpp | 14 +++++- libraries/render/src/render/Engine.cpp | 68 +++++++++++++++++++++++++- libraries/render/src/render/Engine.h | 21 ++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 30f2802d70..829deda139 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1156,6 +1156,7 @@ void Application::initializeGL() { render::CullFunctor cullFunctor = LODManager::shouldRender; _renderEngine->addJob("RenderShadowTask", cullFunctor); _renderEngine->addJob("RenderDeferredTask", cullFunctor); + _renderEngine->loadConfig(); _renderEngine->registerScene(_main3DScene); // TODO: Load a cached config file diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index fd4647e429..94ea732b2c 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -335,7 +335,19 @@ void setupPreferences() { { static const QString RENDER("Graphics"); - auto renderConfig = qApp->getRenderEngine()->getConfiguration(); + auto renderEngine = qApp->getRenderEngine(); + auto renderConfig = renderEngine->getConfiguration(); + { + auto getter = [renderEngine]()->QString { return renderEngine->getNamedConfig(); }; + auto setter = [renderEngine](QString config) { renderEngine->setNamedConfig(config); }; + auto preference = new ComboBoxBrowsePreference(RENDER, "Engine Profile", getter, setter); + preference->setItems(renderEngine->getNamedConfigList()); + preference->setBrowseLabel("Custom..."); + preference->setBrowseFilter("Engine Profiles (*.json)"); + preferences->addPreference(preference); + } + + // Theses will override the engine profile because they are defined afterwards { auto getter = [renderConfig]()->bool { return renderConfig->isJobEnabled(); }; auto setter = [renderConfig](bool enable) { renderConfig->setJobEnabled(enable); }; diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp index be0481f97c..470eeb8822 100644 --- a/libraries/render/src/render/Engine.cpp +++ b/libraries/render/src/render/Engine.cpp @@ -9,17 +9,83 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "Engine.h" + +#include + #include -#include "Engine.h" using namespace render; +const QString ENGINE_CONFIG_DEFAULT = "Default"; +// TODO: Presets (e.g., "Highest Performance", "Highest Quality") will go here +const QMap Engine::PRESETS = {}; + Engine::Engine() : + _namedConfig(QStringList() << "Render" << "Engine"), _sceneContext(std::make_shared()), _renderContext(std::make_shared()) { } +QStringList Engine::getNamedConfigList() { + QStringList list; + list << ENGINE_CONFIG_DEFAULT << PRESETS.keys(); + auto current = _namedConfig.get(); + if (!list.contains(current)) { + list << current; + } + + return list; +} + +QString Engine::getNamedConfig() { + return _namedConfig.get(); +} + +void Engine::setNamedConfig(const QString& config) { + _namedConfig.set(config); + loadConfig(); +} + +void Engine::loadConfig() { + auto config = getConfiguration(); + QString current = _namedConfig.get(); + + if (_defaultConfig.isNull()) { + // Set the default + _defaultConfig = + QJsonDocument::fromJson(config->toJSON().toUtf8()).object(); + } + + if (current == ENGINE_CONFIG_DEFAULT) { + // Load the default + config->load(_defaultConfig.toObject()); + } else if (PRESETS.contains(current)) { + // Load a preset + config->load(QJsonDocument::fromJson(PRESETS[current].toUtf8()).object()); + } else { + QFile file(current); + if (!file.exists()) { + qWarning() << "Engine configuration file" << current << "does not exist"; + } else if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Engine configuration file" << current << "cannot be opened"; + } else { + QString data = file.readAll(); + file.close(); + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(data.toUtf8(), &error); + if (error.error == error.NoError) { + config->load(doc.object()); + qDebug() << "Engine configuration file" << current << "loaded"; + } else { + qWarning() << "Engine configuration file" << current << "failed to load:" << + error.errorString() << "at offset" << error.offset; + } + } + } +} + void Engine::run() { // Sync GPU state before beginning to render _renderContext->args->_context->syncCache(); diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index e94de6f266..238754c46a 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -12,6 +12,8 @@ #ifndef hifi_render_Engine_h #define hifi_render_Engine_h +#include + #include "Context.h" #include "Task.h" @@ -25,6 +27,19 @@ public: Engine(); ~Engine() = default; + // Get the configurations + QStringList getNamedConfigList(); + + // Get the current named configuration + QString getNamedConfig(); + + // Set a named configuration + void setNamedConfig(const QString& config); + + // Load the current named config + // The first time this is run, it will also set the current configuration as Default + void loadConfig(); + // Register the scene void registerScene(const ScenePointer& scene) { _sceneContext->_scene = scene; } @@ -37,8 +52,14 @@ public: void run(); protected: + Setting::Handle _namedConfig; + QJsonValue _defaultConfig; + SceneContextPointer _sceneContext; RenderContextPointer _renderContext; + +private: + static const QMap PRESETS; }; using EnginePointer = std::shared_ptr;