RigsofRods
Soft-body Physics Simulation
AppContext.cpp
Go to the documentation of this file.
1 /*
2  This source file is part of Rigs of Rods
3  Copyright 2005-2012 Pierre-Michel Ricordel
4  Copyright 2007-2012 Thomas Fischer
5  Copyright 2013-2020 Petr Ohlidal
6 
7  For more information, see http://www.rigsofrods.org/
8 
9  Rigs of Rods is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License version 3, as
11  published by the Free Software Foundation.
12 
13  Rigs of Rods is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "AppContext.h"
23 
24 #include "AdvancedScreen.h"
25 #include "Actor.h"
26 #include "CameraManager.h"
27 #include "ChatSystem.h"
28 #include "Console.h"
29 #include "ContentManager.h"
30 #include "DashBoardManager.h"
31 #include "ErrorUtils.h"
32 #include "GameContext.h"
33 #include "GUIManager.h"
34 #include "GUI_LoadingWindow.h"
35 #include "GUI_MainSelector.h"
38 #include "InputEngine.h"
39 #include "Language.h"
40 #include "PlatformUtils.h"
41 #include "RoRVersion.h"
42 #include "OverlayWrapper.h"
43 
44 #ifdef USE_ANGELSCRIPT
45 # include "ScriptEngine.h"
46 #endif
47 
48 #ifdef _WIN32
49 # include <windows.h>
50 #endif
51 
52 #include <iomanip>
53 #include <sstream>
54 #include <string>
55 #include <ctime>
56 
57 using namespace RoR;
58 
59 // --------------------------
60 // Input handling
61 
63 {
68 
69  if (App::io_ffb_enabled->getBool())
70  {
72  }
73  return true;
74 }
75 
76 bool AppContext::mouseMoved(const OIS::MouseEvent& arg) // overrides OIS::MouseListener
77 {
81 
82  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
83  {
84  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMouseMoved()) // update the old airplane / autopilot gui
85  {
86  if (!App::GetCameraManager()->handleMouseMoved())
87  {
89  }
90  }
91  }
92 
93  return true;
94 }
95 
96 bool AppContext::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID _id) // overrides OIS::MouseListener
97 {
99  App::GetGuiManager()->GetImGui().SetMouseButtonState(_id, /*down:*/true);
101 
102  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
103  {
104  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMousePressed()) // update the old airplane / autopilot gui
105  {
106  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION)
107  {
110  }
111  }
112  }
113 
114  return true;
115 }
116 
117 bool AppContext::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID _id) // overrides OIS::MouseListener
118 {
120  App::GetGuiManager()->GetImGui().SetMouseButtonState(_id, /*down:*/false);
122 
123  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
124  {
125  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMouseReleased()) // update the old airplane / autopilot gui
126  {
127  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION)
128  {
130  }
131  }
132  }
133 
134  return true;
135 }
136 
137 bool AppContext::keyPressed(const OIS::KeyEvent& arg)
138 {
140 
141  if (!App::GetGuiManager()->IsGuiCaptureKeyboardRequested() &&
142  !ImGui::GetIO().WantCaptureKeyboard)
143  {
145  }
146 
147  return true;
148 }
149 
150 bool AppContext::keyReleased(const OIS::KeyEvent& arg)
151 {
153 
154  if (!App::GetGuiManager()->IsGuiCaptureKeyboardRequested() &&
155  !ImGui::GetIO().WantCaptureKeyboard)
156  {
158  }
159  else if (App::GetInputEngine()->isKeyDownEffective(arg.key))
160  {
161  // If capturing is requested, still pass release events for already-pressed keys.
163  }
164 
165  return true;
166 }
167 
168 bool AppContext::buttonPressed(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
169 bool AppContext::buttonReleased(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
170 bool AppContext::axisMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
171 bool AppContext::sliderMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
172 bool AppContext::povMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
173 
174 void AppContext::windowResized(Ogre::RenderWindow* rw)
175 {
176  App::GetInputEngine()->windowResized(rw); // Update mouse area
178  if (App::sim_state->getEnum<AppState>() == RoR::AppState::SIMULATION)
179  {
180  for (ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors())
181  {
182  actor->ar_dashboard->windowResized();
183  }
184  }
185 }
186 
187 void AppContext::windowFocusChange(Ogre::RenderWindow* rw)
188 {
189  // If you alt+TAB out of the window while any mouse button is down, OIS will not release it until you click in the window again.
190  // See https://github.com/RigsOfRods/rigs-of-rods/issues/2468
191  // To work around, we reset all internal mouse button states here and pay attention not to get them polluted by OIS again.
193  // Same applies to keyboard keys - reset them manually otherwise OIS will hold them 'down' the entire time.
195 }
196 
197 // --------------------------
198 // Rendering
199 
200 void AppContext::SetRenderWindowIcon(Ogre::RenderWindow* rw)
201 {
202 #ifdef _WIN32
203  size_t hWnd = 0;
204  rw->getCustomAttribute("WINDOW", &hWnd);
205 
206  char buf[MAX_PATH];
207  ::GetModuleFileNameA(0, (LPCH)&buf, MAX_PATH);
208 
209  HINSTANCE instance = ::GetModuleHandleA(buf);
210  HICON hIcon = ::LoadIconA(instance, MAKEINTRESOURCEA(101));
211  if (hIcon)
212  {
213  ::SendMessageA((HWND)hWnd, WM_SETICON, 1, (LPARAM)hIcon);
214  ::SendMessageA((HWND)hWnd, WM_SETICON, 0, (LPARAM)hIcon);
215  }
216 #endif // _WIN32
217 }
218 
220 {
221  // Create 'OGRE root' facade
222  // * leave 'plugins' param empty, we load manually below
223  // * note file 'ogre.cfg' isn't read immediatelly but only after calling 'restoreConfig()' below.
224  std::string log_filepath = PathCombine(App::sys_logs_dir->getStr(), "RoR.log");
225  std::string cfg_filepath = PathCombine(App::sys_config_dir->getStr(), "ogre.cfg");
226  LOG(fmt::format("[RoR|Startup|Rendering] Creating OGRE renderer Root object, config='{}'", cfg_filepath));
227  m_ogre_root = new Ogre::Root("", cfg_filepath, log_filepath);
228 
229  // load OGRE plugins manually
230 #ifdef _DEBUG
231  std::string plugins_path = PathCombine(RoR::App::sys_process_dir->getStr(), "plugins_d.cfg");
232 #else
233  std::string plugins_path = PathCombine(RoR::App::sys_process_dir->getStr(), "plugins.cfg");
234 #endif
235  LOG(fmt::format("[RoR|Startup|Rendering] Loading OGRE renderer plugins config '{}'.", plugins_path));
236  try
237  {
238  Ogre::ConfigFile cfg;
239  cfg.load(plugins_path);
240  std::string plugin_dir = cfg.getSetting("PluginFolder", /*section=*/"", /*default=*/App::sys_process_dir->getStr());
241  Ogre::StringVector plugins = cfg.getMultiSetting("Plugin");
242  for (Ogre::String plugin_filename: plugins)
243  {
244  try
245  {
246  m_ogre_root->loadPlugin(PathCombine(plugin_dir, plugin_filename));
247  }
248  catch (Ogre::Exception&) {} // Logged by OGRE
249  }
250  }
251  catch (Ogre::Exception& e)
252  {
254  _L("Startup error"),
255  fmt::format(_L("Could not load file '{}' - make sure the game is installed correctly.\n\nDetailed info: {}"), plugins_path, e.getDescription()));
256  return false;
257  }
258 
259  // Load renderer configuration
260  bool autodetect_resolution = false;
261  if (!m_ogre_root->restoreConfig())
262  {
263  autodetect_resolution = true;
264  LOG(fmt::format("[RoR|Startup|Rendering] WARNING - invalid 'ogre.cfg', selecting render plugin manually..."));
265 
266  const auto render_systems = App::GetAppContext()->GetOgreRoot()->getAvailableRenderers();
267  if (!render_systems.empty())
268  {
269  LOG(fmt::format("[RoR|Startup|Rendering] Auto-selected renderer plugin '{}'", render_systems.front()->getName()));
270  m_ogre_root->setRenderSystem(render_systems.front());
271  }
272  else
273  {
274  ErrorUtils::ShowError (_L("Startup error"), _L("No render system plugin available. Check your plugins.cfg"));
275  return false;
276  }
277  }
278 
279  const auto rs = m_ogre_root->getRenderSystemByName(App::app_rendersys_override->getStr());
280  if (rs != nullptr && rs != m_ogre_root->getRenderSystem())
281  {
282  LOG(fmt::format("[RoR|Startup|Rendering] Setting renderer '{}' on behalf of 'app_rendersys_override' (user selection via Settings UI)", rs->getName()));
283  // The user has selected a different render system during the previous session.
284  m_ogre_root->setRenderSystem(rs);
285  m_ogre_root->saveConfig();
286  }
288 
289  // Start the renderer
290  LOG(fmt::format("[RoR|Startup|Rendering] Starting renderer '{}' (without auto-creating render window)", m_ogre_root->getRenderSystem()->getName()));
291  m_ogre_root->initialise(/*createWindow=*/false);
292 
293  // Review configuration options
294  Ogre::ConfigOptionMap ropts = m_ogre_root->getRenderSystem()->getConfigOptions();
295  std::stringstream ropts_log;
296  for (auto& pair: ropts)
297  {
298  ropts_log << " " << pair.first << " = " << pair.second.currentValue << " (";
299  for (auto& val: pair.second.possibleValues)
300  {
301  ropts_log << val << ", ";
302  }
303  ropts_log << ")\n";
304  }
305  LOG(fmt::format("[RoR|Startup|Rendering] Renderer options as reported by OGRE:\n{}", ropts_log.str()));
306 
307  // Configure the render window
308  Ogre::NameValuePairList miscParams;
309  miscParams["FSAA"] = ropts["FSAA"].currentValue;
310  miscParams["vsync"] = ropts["VSync"].currentValue;
311  miscParams["gamma"] = ropts["sRGB Gamma Conversion"].currentValue;
312  if (!App::diag_allow_window_resize->getBool())
313  {
314  miscParams["border"] = "fixed";
315  }
316 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
317  const auto rd = ropts["Rendering Device"];
318  const auto it = std::find(rd.possibleValues.begin(), rd.possibleValues.end(), rd.currentValue);
319  const int idx = std::distance(rd.possibleValues.begin(), it);
320  miscParams["monitorIndex"] = Ogre::StringConverter::toString(idx);
321  miscParams["windowProc"] = Ogre::StringConverter::toString((size_t)OgreBites::WindowEventUtilities::_WndProc);
322 #endif
323 
324  // Validate rendering resolution
325  Ogre::uint32 width, height;
326  std::istringstream mode (ropts["Video Mode"].currentValue);
327  Ogre::String token;
328  mode >> width;
329  mode >> token; // 'x' as seperator between width and height
330  mode >> height;
331 
332  if(width < 800) width = 800;
333  if(height < 600) height = 600;
334 
335  if (autodetect_resolution)
336  {
337  for (auto& p_mode_str: ropts["Video Mode"].possibleValues)
338  {
339  Ogre::uint32 p_width, p_height;
340  std::istringstream p_mode (p_mode_str);
341  p_mode >> p_width;
342  p_mode >> token; // 'x' as seperator between width and height
343  p_mode >> p_height;
344  if (p_width >= width && p_height >= height)
345  {
346  width = p_width;
347  height = p_height;
348  m_ogre_root->getRenderSystem()->setConfigOption("Video Mode", p_mode_str);
349  }
350  }
351 
352  LOG(fmt::format("[RoR|Startup|Rendering] WARNING - invalid 'ogre.cfg', auto-detected resolution {}x{}", width, height));
353  m_ogre_root->saveConfig();
354  }
355 
356  // Review render window settings
357  std::stringstream miscParams_log;
358  for (auto& pair: miscParams)
359  {
360  miscParams_log << " " << pair.first << " = " << pair.second << "\n";
361  }
362  LOG(fmt::format("[RoR|Startup|Rendering] Creating render window with settings:\n{}", miscParams_log.str()));
363 
364  // Create render window
365  m_render_window = Ogre::Root::getSingleton().createRenderWindow (
366  "Rigs of Rods version " + Ogre::String (ROR_VERSION_STRING),
367  width, height, ropts["Full Screen"].currentValue == "Yes", &miscParams);
368  OgreBites::WindowEventUtilities::_addRenderWindow(m_render_window);
369  OgreBites::WindowEventUtilities::addWindowEventListener(m_render_window, this);
370 
372  m_render_window->setActive(true);
373 
374  // Create viewport (without camera)
375  m_viewport = m_render_window->addViewport(/*camera=*/nullptr);
376  m_viewport->setBackgroundColour(Ogre::ColourValue::Black);
377 
378  return true;
379 }
380 
381 Ogre::RenderWindow* AppContext::CreateCustomRenderWindow(std::string const& window_name, int width, int height)
382 {
383  Ogre::NameValuePairList misc;
384  Ogre::ConfigOptionMap ropts = m_ogre_root->getRenderSystem()->getConfigOptions();
385  misc["FSAA"] = Ogre::StringConverter::parseInt(ropts["FSAA"].currentValue, 0);
386 
387  Ogre::RenderWindow* rw = Ogre::Root::getSingleton().createRenderWindow(window_name, width, height, false, &misc);
388  return rw;
389 }
390 
392 {
393  const std::time_t time = std::time(nullptr);
394  const int index = (time == m_prev_screenshot_time) ? m_prev_screenshot_index+1 : 1;
395 
396  std::stringstream stamp;
397  stamp << std::put_time(std::localtime(&time), "%Y-%m-%d_%H-%M-%S") << "_" << index
398  << "." << App::app_screenshot_format->getStr();
399  std::string path = PathCombine(App::sys_screenshot_dir->getStr(), "screenshot_") + stamp.str();
400 
401  if (App::app_screenshot_format->getStr() == "png")
402  {
403  AdvancedScreen png(m_render_window, path);
404 
405  png.addData("User_NickName", App::mp_player_name->getStr());
406  png.addData("User_Language", App::app_language->getStr());
407 
408  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION &&
409  App::GetGameContext()->GetPlayerActor())
410  {
411  png.addData("Truck_file", App::GetGameContext()->GetPlayerActor()->ar_filename);
412  png.addData("Truck_name", App::GetGameContext()->GetPlayerActor()->getTruckName());
413  }
414  if (App::GetGameContext()->GetTerrain())
415  {
416  png.addData("Terrn_file", App::sim_terrain_name->getStr());
417  png.addData("Terrn_name", App::sim_terrain_gui_name->getStr());
418  }
419  if (App::mp_state->getEnum<MpState>() == MpState::CONNECTED)
420  {
421  png.addData("MP_ServerName", App::mp_server_host->getStr());
422  }
423 
424  png.write();
425  }
426  else
427  {
428  m_render_window->writeContentsToFile(path);
429  }
430 
432  _L("Screenshot: ") + stamp.str());
433 
434  m_prev_screenshot_time = time;
435  m_prev_screenshot_index = index;
436 }
437 
439 {
440  if (!val && !m_windowed_fix)
441  {
442  // Workaround OGRE glitch - badly aligned viewport after first full->window switch
443  // Observed on Win10/OpenGL (GeForce GTX 660)
444  m_render_window->setFullscreen(false, m_render_window->getWidth()-1, m_render_window->getHeight()-1);
445  m_render_window->setFullscreen(false, m_render_window->getWidth()+1, m_render_window->getHeight()+1);
446  }
447  else
448  {
449  m_render_window->setFullscreen(val, m_render_window->getWidth(), m_render_window->getHeight());
450  }
451 }
452 
453 // --------------------------
454 // Program paths and logging
455 
457 {
458  // Process directory
459  std::string exe_path = RoR::GetExecutablePath();
460  if (exe_path.empty())
461  {
462  ErrorUtils::ShowError(_L("Startup error"), _L("Error while retrieving program directory path"));
463  return false;
464  }
465  App::sys_process_dir->setStr(RoR::GetParentDirectory(exe_path.c_str()).c_str());
466 
467  // RoR's home directory
468  std::string local_userdir = PathCombine(App::sys_process_dir->getStr(), "config"); // TODO: Think of a better name, this is ambiguious with ~/.rigsofrods/config which stores configfiles! ~ only_a_ptr, 02/2018
469  if (FolderExists(local_userdir))
470  {
471  // It's a portable installation
472  App::sys_user_dir->setStr(local_userdir.c_str());
473  }
474  else
475  {
476  // Default location - user's home directory
477  std::string user_home = RoR::GetUserHomeDirectory();
478  if (user_home.empty())
479  {
480  ErrorUtils::ShowError(_L("Startup error"), _L("Error while retrieving user directory path"));
481  return false;
482  }
483  RoR::Str<500> ror_homedir;
484 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
485  ror_homedir << user_home << PATH_SLASH << "My Games";
486  CreateFolder(ror_homedir.ToCStr());
487  ror_homedir << PATH_SLASH << "Rigs of Rods";
488 #elif OGRE_PLATFORM == OGRE_PLATFORM_LINUX
489  char* env_SNAP = getenv("SNAP_USER_COMMON");
490  if(env_SNAP)
491  ror_homedir = env_SNAP;
492  else
493  ror_homedir << user_home << PATH_SLASH << ".rigsofrods";
494 #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE
495  ror_homedir << user_home << PATH_SLASH << "RigsOfRods";
496 #endif
497  CreateFolder(ror_homedir.ToCStr ());
498  App::sys_user_dir->setStr(ror_homedir.ToCStr ());
499  }
500 
501  return true;
502 }
503 
505 {
506  std::string logs_dir = PathCombine(App::sys_user_dir->getStr(), "logs");
507  CreateFolder(logs_dir);
508  App::sys_logs_dir->setStr(logs_dir.c_str());
509 
510  auto ogre_log_manager = OGRE_NEW Ogre::LogManager();
511  std::string rorlog_path = PathCombine(logs_dir, "RoR.log");
512  Ogre::Log* rorlog = ogre_log_manager->createLog(rorlog_path, true, true);
513  rorlog->stream() << "[RoR] Rigs of Rods (www.rigsofrods.org) version " << ROR_VERSION_STRING;
514  std::time_t t = std::time(nullptr);
515  rorlog->stream() << "[RoR] Current date: " << std::put_time(std::localtime(&t), "%Y-%m-%d");
516 
517  rorlog->addListener(App::GetConsole()); // Allow console to intercept log messages
518 }
519 
521 {
522  std::string process_dir = PathCombine(App::sys_process_dir->getStr(), "resources");
523 #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX
524  if (!FolderExists(process_dir))
525  {
526  process_dir = "/usr/share/rigsofrods/resources/";
527  }
528 #endif
529  if (!FolderExists(process_dir))
530  {
531  ErrorUtils::ShowError(_L("Startup error"), _L("Resources folder not found. Check if correctly installed."));
532  return false;
533  }
534  App::sys_resources_dir->setStr(process_dir);
535  return true;
536 }
537 
539 {
540  Ogre::String src_path = PathCombine(App::sys_resources_dir->getStr(), "skeleton.zip");
541  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(src_path, "Zip", "SrcRG");
542  Ogre::FileInfoListPtr fl = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("SrcRG", "*", true);
543  if (fl->empty())
544  {
545  ErrorUtils::ShowError(_L("Startup error"), _L("Faulty resource folder. Check if correctly installed."));
546  return false;
547  }
548  Ogre::String dst_path = PathCombine(App::sys_user_dir->getStr(), "");
549  for (auto file : *fl)
550  {
551  CreateFolder(dst_path + file.basename);
552  }
553  fl = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("SrcRG", "*");
554  if (fl->empty())
555  {
556  ErrorUtils::ShowError(_L("Startup error"), _L("Faulty resource folder. Check if correctly installed."));
557  return false;
558  }
559  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dst_path, "FileSystem", "DstRG", false, false);
560  for (auto file : *fl)
561  {
562  if (file.uncompressedSize == 0)
563  continue;
564  Ogre::String path = file.path + file.basename;
565  if (!Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("DstRG", path)->empty())
566  continue;
567  Ogre::DataStreamPtr src_ds = Ogre::ResourceGroupManager::getSingleton().openResource(path, "SrcRG");
568  Ogre::DataStreamPtr dst_ds = Ogre::ResourceGroupManager::getSingleton().createResource(path, "DstRG");
569  std::vector<char> buf(src_ds->size());
570  size_t read = src_ds->read(buf.data(), src_ds->size());
571  if (read > 0)
572  {
573  dst_ds->write(buf.data(), read);
574  }
575  }
576  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("SrcRG");
577  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("DstRG");
578 
579  return true;
580 }
581 
583 {
584 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
585  Ogre::String old_ror_homedir = Ogre::StringUtil::format("%s\\Rigs of Rods 0.4", RoR::GetUserHomeDirectory().c_str());
586  if(FolderExists(old_ror_homedir))
587  {
588  if (!FileExists(Ogre::StringUtil::format("%s\\OBSOLETE_FOLDER.txt", old_ror_homedir.c_str())))
589  {
590  Ogre::String obsoleteMessage = Ogre::StringUtil::format("This folder is obsolete, please move your mods to %s", App::sys_user_dir->getStr());
591  try
592  {
593  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(old_ror_homedir, "FileSystem", "homedir", false, false);
594  Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().createResource("OBSOLETE_FOLDER.txt", "homedir");
595  stream->write(obsoleteMessage.c_str(), obsoleteMessage.length());
596  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("homedir");
597  }
598  catch (std::exception & e)
599  {
600  RoR::LogFormat("Error writing to %s, message: '%s'", old_ror_homedir.c_str(), e.what());
601  }
602  Ogre::String message = Ogre::StringUtil::format(
603  "Welcome to Rigs of Rods %s\nPlease note that the mods folder has moved to:\n\"%s\"\nPlease move your mods to the new folder to continue using them",
605  App::sys_user_dir->getStr()
606  );
607 
608  RoR::App::GetGuiManager()->ShowMessageBox("Obsolete folder detected", message.c_str());
609  }
610  }
611 #endif // OGRE_PLATFORM_WIN32
612 }
613 
615 {
616  m_mainthread_id = std::this_thread::get_id();
617 
618  // This cannot be done earlier as it uses the above thread ID to assert() against invalid access.
620 }
RoR::App::sys_user_dir
CVar * sys_user_dir
Definition: Application.cpp:163
GameContext.h
Game state manager and message-queue provider.
RoR::AppContext::SetUpProgramPaths
bool SetUpProgramPaths()
Definition: AppContext.cpp:456
RoR::AppContext::mousePressed
virtual bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id) override
Definition: AppContext.cpp:96
GUI_MultiplayerClientList.h
OgreImGui::SetMouseButtonState
void SetMouseButtonState(OIS::MouseButtonID id, bool down)
Definition: OgreImGui.cpp:99
RoR::SceneMouse::handleMouseReleased
bool handleMouseReleased()
Definition: SceneMouse.cpp:307
RoR::AppContext::m_viewport
Ogre::Viewport * m_viewport
Definition: AppContext.h:99
RoR::InputEngine::processMouseReleaseEvent
void processMouseReleaseEvent(const OIS::MouseEvent &arg, OIS::MouseButtonID _id)
Definition: InputEngine.cpp:721
RoR::AppContext::m_windowed_fix
bool m_windowed_fix
Workaround OGRE glitch when switching from fullscreen.
Definition: AppContext.h:100
OverlayWrapper.h
RoR::GUIManager::WakeUpGUI
void WakeUpGUI()
Definition: GUIManager.cpp:444
RoR::MpState::CONNECTED
@ CONNECTED
RoR::App::sys_resources_dir
CVar * sys_resources_dir
Definition: Application.cpp:168
RoR::AppContext::CreateCustomRenderWindow
Ogre::RenderWindow * CreateCustomRenderWindow(std::string const &name, int width, int height)
Definition: AppContext.cpp:381
RoR::AppContext::mouseReleased
virtual bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id) override
Definition: AppContext.cpp:117
RoR::App::GetCameraManager
CameraManager * GetCameraManager()
Definition: Application.cpp:275
RoR::App::GetGuiManager
GUIManager * GetGuiManager()
Definition: Application.cpp:269
RoR::AppContext::m_prev_screenshot_index
int m_prev_screenshot_index
Definition: AppContext.h:103
DashBoardManager.h
file
This is a raw Ogre binding for Imgui No project cmake file
Definition: README-OgreImGui.txt:3
RoR::App::mp_player_name
CVar * mp_player_name
Definition: Application.cpp:124
RoR::AppContext::keyPressed
virtual bool keyPressed(const OIS::KeyEvent &arg) override
Definition: AppContext.cpp:137
ContentManager.h
RoR::App::GetAppContext
AppContext * GetAppContext()
Definition: Application.cpp:266
format
Truck file format(technical spec)
RoR::App::app_language
CVar * app_language
Definition: Application.cpp:80
AdvancedScreen::write
void write()
Definition: AdvancedScreen.h:68
RoR::App::CreateInputEngine
void CreateInputEngine()
Definition: Application.cpp:302
RoR::AppContext::SetUpRendering
bool SetUpRendering()
Definition: AppContext.cpp:219
RoR::App::GetOverlayWrapper
OverlayWrapper * GetOverlayWrapper()
Definition: Application.cpp:268
RoR::InputEngine::SetJoystickListener
void SetJoystickListener(OIS::JoyStickListener *obj)
Definition: InputEngine.cpp:667
OgreImGui::InjectKeyReleased
void InjectKeyReleased(const OIS::KeyEvent &arg)
Definition: OgreImGui.cpp:129
CameraManager.h
RoR::LogFormat
void LogFormat(const char *format,...)
Improved logging utility. Uses fixed 2Kb buffer.
Definition: Application.cpp:424
RoR::SceneMouse::handleMousePressed
bool handleMousePressed()
Definition: SceneMouse.cpp:229
RoR::App::app_rendersys_override
CVar * app_rendersys_override
Definition: Application.cpp:86
AppContext.h
System integration layer; inspired by OgreBites::ApplicationContext.
Console.h
RoR::Console::putMessage
void putMessage(MessageArea area, MessageType type, std::string const &msg, std::string icon="")
Definition: Console.cpp:97
RoR::AppContext::buttonReleased
virtual bool buttonReleased(const OIS::JoyStickEvent &arg, int button) override
Definition: AppContext.cpp:169
AdvancedScreen.h
RoR::App::io_ffb_enabled
CVar * io_ffb_enabled
Definition: Application.cpp:192
RoR::FolderExists
bool FolderExists(const char *path)
Path must be UTF-8 encoded.
Definition: PlatformUtils.cpp:169
RoR::AppContext::SetUpResourcesDir
bool SetUpResourcesDir()
Definition: AppContext.cpp:520
RoR::App::sim_state
CVar * sim_state
Definition: Application.cpp:96
RoR::App::sys_logs_dir
CVar * sys_logs_dir
Definition: Application.cpp:167
RoR::AppContext::SetUpConfigSkeleton
bool SetUpConfigSkeleton()
Definition: AppContext.cpp:538
Language.h
RefCountingObjectPtr< Actor >
RoR::InputEngine::resetKeysAndMouseButtons
void resetKeysAndMouseButtons()
Definition: InputEngine.cpp:729
GUI_MultiplayerSelector.h
GUIManager.h
RoR::InputEngine::processMouseMotionEvent
void processMouseMotionEvent(const OIS::MouseEvent &arg)
Definition: InputEngine.cpp:696
Actor.h
RoR::Console::CONSOLE_SYSTEM_NOTICE
@ CONSOLE_SYSTEM_NOTICE
Definition: Console.h:51
OgreImGui::ResetAllMouseButtons
void ResetAllMouseButtons()
Definition: OgreImGui.cpp:108
RoR::App::mp_state
CVar * mp_state
Definition: Application.cpp:115
RoR::PATH_SLASH
char PATH_SLASH
Definition: PlatformUtils.cpp:161
RoR::AppContext::buttonPressed
virtual bool buttonPressed(const OIS::JoyStickEvent &arg, int button) override
Definition: AppContext.cpp:168
RoR::AppContext::m_render_window
Ogre::RenderWindow * m_render_window
Definition: AppContext.h:98
RoR::GUIManager::GetImGui
OgreImGui & GetImGui()
Definition: GUIManager.h:153
RoR::InputEngine::windowResized
void windowResized(Ogre::RenderWindow *rw)
Definition: InputEngine.cpp:644
RoR::AppContext::keyReleased
virtual bool keyReleased(const OIS::KeyEvent &arg) override
Definition: AppContext.cpp:150
RoR::GameContext::GetSceneMouse
SceneMouse & GetSceneMouse()
Definition: GameContext.h:170
RoR::CVar::getStr
std::string const & getStr() const
Definition: CVar.h:95
RoR::ForceFeedback::Setup
void Setup()
Definition: ForceFeedback.cpp:35
RoR::Str< 500 >
OgreImGui::InjectMouseMoved
void InjectMouseMoved(const OIS::MouseEvent &arg)
Definition: OgreImGui.cpp:89
RoR::PathCombine
std::string PathCombine(std::string a, std::string b)
Definition: PlatformUtils.h:48
GUI_LoadingWindow.h
RoR::AppContext::mouseMoved
virtual bool mouseMoved(const OIS::MouseEvent &arg) override
Definition: AppContext.cpp:76
ErrorUtils.h
GUI_MainSelector.h
RoR::AppContext::SetRenderWindowIcon
void SetRenderWindowIcon(Ogre::RenderWindow *rw)
Definition: AppContext.cpp:200
ScriptEngine.h
RoR::AppContext::m_mainthread_id
std::thread::id m_mainthread_id
Definition: AppContext.h:107
RoR::App::app_state
CVar * app_state
Definition: Application.cpp:79
RoR::InputEngine::ProcessKeyRelease
void ProcessKeyRelease(const OIS::KeyEvent &arg)
Definition: InputEngine.cpp:690
ChatSystem.h
RoR::Str::ToCStr
const char * ToCStr() const
Definition: Str.h:46
RoR::App::sim_terrain_name
CVar * sim_terrain_name
Definition: Application.cpp:97
RoR::AppContext::m_prev_screenshot_time
std::time_t m_prev_screenshot_time
Definition: AppContext.h:102
RoR::CreateFolder
void CreateFolder(const char *path)
Path must be UTF-8 encoded.
Definition: PlatformUtils.cpp:175
OgreImGui::InjectKeyPressed
void InjectKeyPressed(const OIS::KeyEvent &arg)
Definition: OgreImGui.cpp:118
PlatformUtils.h
Platform-specific utilities. We use narrow UTF-8 encoded strings as paths. Inspired by http://utf8eve...
RoR::GetUserHomeDirectory
std::string GetUserHomeDirectory()
Returns UTF-8 path or empty string on error.
Definition: PlatformUtils.cpp:180
RoR::App::GetConsole
Console * GetConsole()
Definition: Application.cpp:270
RoR::AppContext::axisMoved
virtual bool axisMoved(const OIS::JoyStickEvent &arg, int axis) override
Definition: AppContext.cpp:170
RoR::App::GetGameContext
GameContext * GetGameContext()
Definition: Application.cpp:280
RoR::CacheEntry
Definition: CacheSystem.h:55
RoR::InputEngine::ProcessJoystickEvent
void ProcessJoystickEvent(const OIS::JoyStickEvent &arg)
Definition: InputEngine.cpp:676
RoR::AppState::SIMULATION
@ SIMULATION
RoRVersion.h
RoR::AppContext::CaptureScreenshot
void CaptureScreenshot()
Definition: AppContext.cpp:391
ROR_VERSION_STRING
const char *const ROR_VERSION_STRING
RoR::App::sys_config_dir
CVar * sys_config_dir
Definition: Application.cpp:164
RoR::AppContext::SetUpLogging
void SetUpLogging()
Definition: AppContext.cpp:504
RoR::AppContext::SetUpThreads
void SetUpThreads()
Definition: AppContext.cpp:614
RoR::OverlayWrapper::windowResized
void windowResized()
Definition: OverlayWrapper.cpp:129
RoR::AppContext::ActivateFullscreen
void ActivateFullscreen(bool val)
Definition: AppContext.cpp:438
RoR::AppContext::SetUpObsoleteConfMarker
void SetUpObsoleteConfMarker()
Definition: AppContext.cpp:582
AdvancedScreen
Definition: AdvancedScreen.h:47
instance
or anywhere else will not be considered a but parsed as regular data ! Each line is treated as values separated by separators Possible i e animators Multiline description Single instance
Definition: ReadMe.txt:53
RoR::App::app_screenshot_format
CVar * app_screenshot_format
Definition: Application.cpp:85
RoR::AppContext::povMoved
virtual bool povMoved(const OIS::JoyStickEvent &arg, int) override
Definition: AppContext.cpp:172
RoR::AppContext::m_ogre_root
Ogre::Root * m_ogre_root
Definition: AppContext.h:97
RoR::App::mp_server_host
CVar * mp_server_host
Definition: Application.cpp:121
RoR::GetExecutablePath
std::string GetExecutablePath()
Returns UTF-8 path or empty string on error.
Definition: PlatformUtils.cpp:185
RoR::GetParentDirectory
std::string GetParentDirectory(const char *src_buff)
Returns UTF-8 path without trailing slash.
Definition: PlatformUtils.cpp:209
_L
#define _L
Definition: ErrorUtils.cpp:34
RoR::GUIManager::ShowMessageBox
void ShowMessageBox(const char *title, const char *text, bool allow_close=true, const char *btn1_text="OK", const char *btn2_text=nullptr)
Definition: GUIManager.cpp:429
RoR::App::GetInputEngine
InputEngine * GetInputEngine()
Definition: Application.cpp:271
RoR::App::diag_allow_window_resize
CVar * diag_allow_window_resize
Definition: Application.cpp:159
RoR::AppContext::windowFocusChange
virtual void windowFocusChange(Ogre::RenderWindow *rw) override
Definition: AppContext.cpp:187
RoR::AppContext::GetOgreRoot
Ogre::Root * GetOgreRoot()
Definition: AppContext.h:65
InputEngine.h
Handles controller inputs from player. Defines input events and binding mechanism,...
RoR::InputEngine::SetMouseListener
void SetMouseListener(OIS::MouseListener *obj)
Definition: InputEngine.cpp:661
AdvancedScreen::addData
void addData(Ogre::String name, Ogre::String value)
Definition: AdvancedScreen.h:61
RoR::App::sys_process_dir
CVar * sys_process_dir
Definition: Application.cpp:162
RoR::AppContext::windowResized
virtual void windowResized(Ogre::RenderWindow *rw) override
Definition: AppContext.cpp:174
RoR::Console::CONSOLE_MSGTYPE_INFO
@ CONSOLE_MSGTYPE_INFO
Generic message.
Definition: Console.h:60
RoR::App::sim_terrain_gui_name
CVar * sim_terrain_gui_name
Definition: Application.cpp:98
RoR::GameContext::m_dummy_cache_selection
CacheEntryPtr m_dummy_cache_selection
Definition: GameContext.h:202
RoR::SceneMouse::handleMouseMoved
bool handleMouseMoved()
Definition: SceneMouse.cpp:114
RoR::App::sys_screenshot_dir
CVar * sys_screenshot_dir
Definition: Application.cpp:171
RoR::AppContext::m_force_feedback
RoR::ForceFeedback m_force_feedback
Definition: AppContext.h:105
RoR::AppContext::SetUpInput
bool SetUpInput()
Definition: AppContext.cpp:62
ErrorUtils::ShowError
static int ShowError(Ogre::UTFString title, Ogre::UTFString message)
shows a simple error message box
Definition: ErrorUtils.cpp:43
RoR::AppContext::sliderMoved
virtual bool sliderMoved(const OIS::JoyStickEvent &arg, int) override
Definition: AppContext.cpp:171
RoR
Definition: AppContext.h:36
RoR::InputEngine::ProcessKeyPress
void ProcessKeyPress(const OIS::KeyEvent &arg)
Definition: InputEngine.cpp:685
RoR::InputEngine::processMousePressEvent
void processMousePressEvent(const OIS::MouseEvent &arg, OIS::MouseButtonID _id)
Definition: InputEngine.cpp:704
Log
quaternion Log() const
RoR::CVar::setStr
void setStr(std::string const &str)
Definition: CVar.h:83
RoR::CameraManager::handleMousePressed
bool handleMousePressed()
Definition: CameraManager.cpp:591
ROR_VERSION_STRING_SHORT
const char *const ROR_VERSION_STRING_SHORT
RoR::FileExists
bool FileExists(const char *path)
Path must be UTF-8 encoded.
Definition: PlatformUtils.cpp:163
RoR::InputEngine::SetKeyboardListener
void SetKeyboardListener(OIS::KeyListener *obj)
Definition: InputEngine.cpp:655