int mainSetupAndRunOgre() { Ogre::LogManager* log_manager = 0; Ogre::Root* root = 0; #ifdef FREEORION_MACOSX OISInput* ois_input_plugin = 0; #elif defined(OGRE_STATIC_LIB) OISInput* ois_input_plugin = 0; Ogre::OctreePlugin* octree_plugin = 0; Ogre::ParticleFXPlugin* particle_fx_plugin = 0; Ogre::GLPlugin* gl_plugin = 0; #endif try { using namespace Ogre; log_manager = new LogManager(); log_manager->createLog((GetUserDir() / "ogre.log").string(), true, false); root = new Root((GetRootDataDir() / "ogre_plugins.cfg").string()); // this line is needed on some Linux systems which otherwise will crash with // errors about GLX_icon.png being missing. Ogre::ResourceGroupManager::getSingleton().addResourceLocation((ClientUI::ArtDir() / ".").string(), "FileSystem", "General"); #if defined(OGRE_STATIC_LIB) octree_plugin = new Ogre::OctreePlugin; particle_fx_plugin = new Ogre::ParticleFXPlugin; gl_plugin = new Ogre::GLPlugin; root->installPlugin(octree_plugin); root->installPlugin(particle_fx_plugin); root->installPlugin(gl_plugin); #endif RenderSystem* selected_render_system = root->getRenderSystemByName("OpenGL Rendering Subsystem"); if (selected_render_system == 0) throw std::runtime_error("Failed to find an Ogre GL render system."); root->setRenderSystem(selected_render_system); int colour_depth = GetOptionsDB().Get<int>("color-depth"); bool fullscreen = GetOptionsDB().Get<bool>("fullscreen"); std::pair<int, int> width_height = HumanClientApp::GetWindowWidthHeight(selected_render_system); int width(width_height.first), height(width_height.second); selected_render_system->setConfigOption("Full Screen", fullscreen ? "Yes" : "No"); std::string video_mode_str = boost::io::str(boost::format("%1% x %2% @ %3%-bit colour") % width % height % colour_depth); selected_render_system->setConfigOption("Video Mode", video_mode_str); RenderWindow* window = root->initialise(true, "FreeOrion " + FreeOrionVersionString()); #ifdef FREEORION_WIN32 # ifdef IDI_ICON1 // set window icon to embedded application icon HWND hwnd; window->getCustomAttribute("WINDOW", &hwnd); HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL); SetClassLong (hwnd, GCL_HICON, (LONG)LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICON1))); # endif #endif SceneManager* scene_manager = root->createSceneManager("OctreeSceneManager", "SceneMgr"); Camera* camera = scene_manager->createCamera("Camera"); camera->setPosition(Vector3(0, 0, 500)); // Position it at 500 in Z direction camera->lookAt(Vector3(0, 0, -300)); // Look back along -Z camera->setNearClipDistance(5); Viewport* viewport = window->addViewport(camera); viewport->setBackgroundColour(ColourValue(0, 0, 0)); //EntityRenderer entity_renderer(scene_manager); parse::init(); HumanClientApp app(root, window, scene_manager, camera, viewport, (GetRootDataDir() / "OISInput.cfg").string()); #ifdef FREEORION_MACOSX ois_input_plugin = new OISInput; root->installPlugin(ois_input_plugin); #elif defined(OGRE_STATIC_LIB) ois_input_plugin = new OISInput; root->installPlugin(ois_input_plugin); #else root->loadPlugin(OGRE_INPUT_PLUGIN_NAME); #endif if (GetOptionsDB().Get<bool>("quickstart")) { // immediately start the server, establish network connections, and // go into a single player game, using default universe options (a // standard quickstart, without requiring the user to click the // quickstart button). app.NewSinglePlayerGame(true); // acceptable to call before app() } std::string load_filename = GetOptionsDB().Get<std::string>("load"); if (load_filename != "") { // immediately start the server, establish network connections, and // go into a single player game, loading the indicated file // (without requiring the user to click the load button). app.LoadSinglePlayerGame(load_filename); // acceptable to call before app() } // run rendering loop app(); // calls GUI::operator() which calls OgreGUI::Run() which starts rendering loop } catch (const HumanClientApp::CleanQuit&) { // do nothing std::cout << "mainSetupAndRunOgre caught CleanQuit" << std::endl; } catch (const std::invalid_argument& e) { Logger().errorStream() << "main() caught exception(std::invalid_argument): " << e.what(); std::cerr << "main() caught exception(std::invalid_arg): " << e.what() << std::endl; } catch (const std::runtime_error& e) { Logger().errorStream() << "main() caught exception(std::runtime_error): " << e.what(); std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; } catch (const boost::io::format_error& e) { Logger().errorStream() << "main() caught exception(boost::io::format_error): " << e.what(); std::cerr << "main() caught exception(boost::io::format_error): " << e.what() << std::endl; } catch (const GG::ExceptionBase& e) { Logger().errorStream() << "main() caught exception(" << e.type() << "): " << e.what(); std::cerr << "main() caught exception(" << e.type() << "): " << e.what() << std::endl; } catch (const std::exception& e) { Logger().errorStream() << "main() caught exception(std::exception): " << e.what(); std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; } catch (...) { Logger().errorStream() << "main() caught unknown exception."; std::cerr << "main() caught unknown exception." << std::endl; } if (root) { #ifdef FREEORION_MACOSX root->uninstallPlugin(ois_input_plugin); delete ois_input_plugin; #elif defined(OGRE_STATIC_LIB) root->uninstallPlugin(ois_input_plugin); root->uninstallPlugin(octree_plugin); root->uninstallPlugin(particle_fx_plugin); root->uninstallPlugin(gl_plugin); delete ois_input_plugin; delete octree_plugin; delete particle_fx_plugin; delete gl_plugin; #else root->unloadPlugin(OGRE_INPUT_PLUGIN_NAME); #endif delete root; } if (log_manager) delete log_manager; return 0; }
int mainSetupAndRunOgre() { Ogre::LogManager* log_manager = 0; Ogre::Root* root = 0; OISInput* ois_input_plugin = 0; #ifdef OGRE_STATIC_LIB Ogre::OctreePlugin* octree_plugin = 0; Ogre::ParticleFXPlugin* particle_fx_plugin = 0; Ogre::GLPlugin* gl_plugin = 0; #endif try { using namespace Ogre; log_manager = new LogManager(); #ifndef FREEORION_WIN32 log_manager->createLog((GetUserDir() / "ogre.log").string(), true, false); root = new Root((GetRootDataDir() / "ogre_plugins.cfg").string()); // this line is needed on some Linux systems which otherwise will crash with // errors about GLX_icon.png being missing. Ogre::ResourceGroupManager::getSingleton().addResourceLocation((ClientUI::ArtDir() / ".").string(), "FileSystem", "General"); #else boost::filesystem::path::string_type file_native = (GetUserDir() / "ogre.log").native(); std::string ogre_log_file; utf8::utf16to8(file_native.begin(), file_native.end(), std::back_inserter(ogre_log_file)); log_manager->createLog(ogre_log_file, true, false); // for some reason, for this file, the built-in path conversion seems to work properly std::string plugins_cfg_file = (GetRootDataDir() / "ogre_plugins.cfg").string(); root = new Root(plugins_cfg_file); #endif #if defined(OGRE_STATIC_LIB) octree_plugin = new Ogre::OctreePlugin; particle_fx_plugin = new Ogre::ParticleFXPlugin; gl_plugin = new Ogre::GLPlugin; root->installPlugin(octree_plugin); root->installPlugin(particle_fx_plugin); root->installPlugin(gl_plugin); #endif RenderSystem* selected_render_system = root->getRenderSystemByName("OpenGL Rendering Subsystem"); if (!selected_render_system) throw std::runtime_error("Failed to find an Ogre GL render system."); root->setRenderSystem(selected_render_system); int colour_depth = GetOptionsDB().Get<int>("color-depth"); bool fullscreen = GetOptionsDB().Get<bool>("fullscreen"); std::pair<int, int> width_height = HumanClientApp::GetWindowWidthHeight(selected_render_system); int width(width_height.first), height(width_height.second); std::pair<int, int> left_top = HumanClientApp::GetWindowLeftTop(); int left(left_top.first), top(left_top.second); root->initialise(false); Ogre::NameValuePairList misc_window_params; misc_window_params["title"] = "FreeOrion " + FreeOrionVersionString(); misc_window_params["colourDepth"] = boost::lexical_cast<std::string>(colour_depth); misc_window_params["left"] = boost::lexical_cast<std::string>(left); misc_window_params["top"] = boost::lexical_cast<std::string>(top); misc_window_params["macAPI"] = "carbon"; misc_window_params["border"] = "resize"; if (fullscreen) misc_window_params["monitorIndex"] = boost::lexical_cast<std::string>( GetOptionsDB().Get<int>("fullscreen-monitor-id")); RenderWindow* window = root->createRenderWindow("FreeOrion " + FreeOrionVersionString(), width, height, fullscreen, &misc_window_params); #ifdef FREEORION_WIN32 # ifdef IDI_ICON1 // set window icon to embedded application icon HWND hwnd; window->getCustomAttribute("WINDOW", &hwnd); HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL); SetClassLong (hwnd, GCL_HICON, (LONG)LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICON1))); # endif #endif SceneManager* scene_manager = root->createSceneManager("OctreeSceneManager", "SceneMgr"); Camera* camera = scene_manager->createCamera("Camera"); camera->setPosition(Vector3(0, 0, 500)); // Position it at 500 in Z direction camera->lookAt(Vector3(0, 0, -300)); // Look back along -Z camera->setNearClipDistance(5); Viewport* viewport = window->addViewport(camera); viewport->setBackgroundColour(ColourValue(0, 0, 0)); //EntityRenderer entity_renderer(scene_manager); parse::init(); HumanClientApp app(root, window, scene_manager, camera, viewport, GetRootDataDir() / "OISInput.cfg"); ois_input_plugin = new OISInput; ois_input_plugin->SetRenderWindow(window); root->installPlugin(ois_input_plugin); if (GetOptionsDB().Get<bool>("quickstart")) { // immediately start the server, establish network connections, and // go into a single player game, using default universe options (a // standard quickstart, without requiring the user to click the // quickstart button). app.NewSinglePlayerGame(true); // acceptable to call before app() } std::string load_filename = GetOptionsDB().Get<std::string>("load"); if (!load_filename.empty()) { // immediately start the server, establish network connections, and // go into a single player game, loading the indicated file // (without requiring the user to click the load button). app.LoadSinglePlayerGame(load_filename); // acceptable to call before app() } // run rendering loop app(); // calls GUI::operator() which calls OgreGUI::Run() which starts rendering loop } catch (const HumanClientApp::CleanQuit&) { // do nothing std::cout << "mainSetupAndRunOgre caught CleanQuit" << std::endl; } catch (const std::invalid_argument& e) { Logger().errorStream() << "main() caught exception(std::invalid_argument): " << e.what(); std::cerr << "main() caught exception(std::invalid_arg): " << e.what() << std::endl; } catch (const std::runtime_error& e) { Logger().errorStream() << "main() caught exception(std::runtime_error): " << e.what(); std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; } catch (const boost::io::format_error& e) { Logger().errorStream() << "main() caught exception(boost::io::format_error): " << e.what(); std::cerr << "main() caught exception(boost::io::format_error): " << e.what() << std::endl; } catch (const GG::ExceptionBase& e) { Logger().errorStream() << "main() caught exception(" << e.type() << "): " << e.what(); std::cerr << "main() caught exception(" << e.type() << "): " << e.what() << std::endl; } catch (const std::exception& e) { Logger().errorStream() << "main() caught exception(std::exception): " << e.what(); std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; } catch (...) { Logger().errorStream() << "main() caught unknown exception."; std::cerr << "main() caught unknown exception." << std::endl; } if (root) { root->uninstallPlugin(ois_input_plugin); delete ois_input_plugin; #ifdef OGRE_STATIC_LIB root->uninstallPlugin(octree_plugin); root->uninstallPlugin(particle_fx_plugin); root->uninstallPlugin(gl_plugin); delete octree_plugin; delete particle_fx_plugin; delete gl_plugin; #endif delete root; } if (log_manager) delete log_manager; return 0; }