bool OgreSubsystem::StartOgre(Ogre::String const & name, Ogre::String const & hwnd, Ogre::String const & mainhwnd)
{
	m_name = name;
	m_hwnd = hwnd;
	m_main_hwnd = mainhwnd;

	try
	{
		SETTINGS.loadSettings(SSETTING("Config Root", "")+"RoR.cfg");
	} 
	catch(Ogre::Exception& e)
	{
		Ogre::String url = "https://rigsofrods.github.io/en/docs/errors/index.html#" + TOSTRING(e.getNumber());
		ErrorUtils::ShowOgreWebError(_L("A fatal exception has occured!"), ANSI_TO_UTF(e.getFullDescription()), ANSI_TO_UTF(url));
		ErrorUtils::ShowStoredOgreWebErrors();
		exit(1);
	}

	Ogre::String logFilename   = SSETTING("Log Path", "") + name + Ogre::String(".log");
	Ogre::String pluginsConfig = SSETTING("plugins.cfg", "plugins.cfg");
	Ogre::String ogreConfig    = SSETTING("ogre.cfg", "ogre.cfg");
    m_ogre_root = new Ogre::Root("", ogreConfig, logFilename);

	// load plugins manually
	LoadOgrePlugins(pluginsConfig);

	// configure RoR
	Configure();

    m_viewport = m_render_window->addViewport(nullptr);
	
    m_viewport->setBackgroundColour(Ogre::ColourValue(0.5f, 0.5f, 0.5f, 1.0f));

    m_viewport->setCamera(nullptr);
	m_viewport->setBackgroundColour(Ogre::ColourValue::Black);

    Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);

    m_timer = new Ogre::Timer();
    m_timer->reset();

    m_render_window->setActive(true);

    return true;
}
	void Main::setupRenderSystem()
	{
		Ogre::String renderer = "";
		Ogre::String vsync = "";
		Ogre::String aa = "";
		Ogre::String fullscreen = "";
		Ogre::String width = "";
		Ogre::String height = "";
		Ogre::String perfhud = "";

		for (std::vector<KeyVal>::iterator i = mSettings["Graphics"].begin(); i != mSettings["Graphics"].end(); i++)
		{
			if (i->Key == "Renderer") renderer = i->Val;
			if (i->Key == "AA") aa = i->Val;
			if (i->Key == "VSync") vsync = i->Val;
			if (i->Key == "Fullscreen") fullscreen = i->Val;
			if (i->Key == "ResolutionWidth") width = i->Val;
			if (i->Key == "ResolutionHeight") height = i->Val;
			if (i->Key == "NVPerfHUD") perfhud = i->Val;
		}

#if _DEBUG
		mRoot->loadPlugin("RenderSystem_Direct3D9_d");
		mRoot->loadPlugin("RenderSystem_GL_d");
#else
		mRoot->loadPlugin("RenderSystem_Direct3D9");
		mRoot->loadPlugin("RenderSystem_GL");
#endif

		LoadOgrePlugins();
		/*for (Ogre::Root::PluginInstanceList::const_iterator i = mRoot->getInstalledPlugins().begin(); i != mRoot->getInstalledPlugins().end(); i++)
		{
		if ((*i)->getName() == "AviSaver")
		{
		}
		}*/

		auto pRenderSystem = mRoot->getAvailableRenderers().begin(); 
		Ogre::RenderSystem *pSelectedRenderSystem; 
		pSelectedRenderSystem = *pRenderSystem; 
		while (pRenderSystem != mRoot->getAvailableRenderers().end())
		{
			if ((*pRenderSystem)->getName() == renderer)
			{
				mRenderSystem = *pRenderSystem;
				break;
			}

			pRenderSystem++;
		}

		mRoot->setRenderSystem(mRenderSystem);

		mRenderSystem->setConfigOption("Full Screen", fullscreen);

		//mRenderSystem->setConfigOption("Capture frames to AVI file (capture.avi)", "Yes");

		mRenderSystem->setConfigOption("VSync", vsync);
		mRenderSystem->setConfigOption("FSAA", aa);

		if (renderer == "Direct3D9 Rendering Subsystem")
		{
			mRenderSystem->setConfigOption("Allow NVPerfHUD", perfhud);

			Log::Instance().LogMessage("setup Rendersystem: " + width + " " + height);
			mRenderSystem->setConfigOption("Video Mode", 
				width
				+ " x " +  height
				+ " @ " +  "32" + "-bit colour"  
				);

		}
		else
		{
			mRenderSystem->setConfigOption("Video Mode", width   + " x " + height);

			mRenderSystem->setConfigOption("Colour Depth", "32");

		}

	}