| 1603 | } |
| 1604 | |
| 1605 | bool ConfigManager::initVideoConfig(Ogre::Root& ogreRoot) |
| 1606 | { |
| 1607 | // Also creates the config entry if it doesn't exist in config yet. |
| 1608 | std::string rendererName = getVideoValue(Config::RENDERER, std::string(), false); |
| 1609 | // Try the default OpenGL renderer first, if empty. |
| 1610 | if (rendererName.empty()) |
| 1611 | rendererName = "OpenGL Rendering Subsystem"; |
| 1612 | |
| 1613 | Ogre::RenderSystem* renderSystem = ogreRoot.getRenderSystemByName(rendererName); |
| 1614 | bool sameRenderer = true; |
| 1615 | if (renderSystem == nullptr) |
| 1616 | { |
| 1617 | const Ogre::RenderSystemList& renderers = ogreRoot.getAvailableRenderers(); |
| 1618 | if(renderers.empty()) |
| 1619 | { |
| 1620 | OD_LOG_ERR("No valid renderer found. Exiting..."); |
| 1621 | return false; |
| 1622 | } |
| 1623 | renderSystem = *renderers.begin(); |
| 1624 | OD_LOG_INF("No OpenGL renderer found. Using the first available: " + renderSystem->getName()); |
| 1625 | sameRenderer = false; |
| 1626 | } |
| 1627 | |
| 1628 | ogreRoot.setRenderSystem(renderSystem); |
| 1629 | Ogre::ConfigOptionMap& options = renderSystem->getConfigOptions(); |
| 1630 | |
| 1631 | // If the renderer was changed, we need to reset the video options. |
| 1632 | if (sameRenderer == false) |
| 1633 | { |
| 1634 | |
| 1635 | mUserConfig[Config::Ctg::VIDEO].clear(); |
| 1636 | |
| 1637 | for (std::pair<Ogre::String, Ogre::ConfigOption> option : options) |
| 1638 | { |
| 1639 | std::string optionName = option.first; |
| 1640 | Ogre::ConfigOption& values = option.second; |
| 1641 | // We don't store options that are immutable or empty |
| 1642 | if (values.immutable || values.possibleValues.empty()) |
| 1643 | continue; |
| 1644 | |
| 1645 | setVideoValue(optionName, values.currentValue); |
| 1646 | } |
| 1647 | } |
| 1648 | else { |
| 1649 | std::vector<std::string> optionsToRemove; |
| 1650 | |
| 1651 | // The renderer system was initialized. Let's load its new option values. |
| 1652 | std::map<std::string, std::string>& mVideoUserConfig = mUserConfig[Config::Ctg::VIDEO]; |
| 1653 | for (std::pair<std::string, std::string> setting : mVideoUserConfig) |
| 1654 | { |
| 1655 | // Check the option exists. |
| 1656 | if (options.find(setting.first) == options.end()) |
| 1657 | { |
| 1658 | optionsToRemove.push_back(setting.first); |
| 1659 | continue; |
| 1660 | } |
| 1661 | |
| 1662 | // Check the desired option value exists. |