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 "Engine.h"
32 #include "ErrorUtils.h"
33 #include "GameContext.h"
34 #include "GUIManager.h"
35 #include "GUI_LoadingWindow.h"
36 #include "GUI_MainSelector.h"
39 #include "InputEngine.h"
40 #include "Language.h"
41 #include "PlatformUtils.h"
42 #include "RoRVersion.h"
43 #include "OverlayWrapper.h"
44 
45 #ifdef USE_ANGELSCRIPT
46 # include "ScriptEngine.h"
47 #endif
48 
49 #ifdef _WIN32
50 # include <windows.h>
51 #endif
52 
53 #include <iomanip>
54 #include <sstream>
55 #include <string>
56 #include <ctime>
57 
58 using namespace RoR;
59 
60 // --------------------------
61 // Input handling
62 
64 {
69 
70  if (App::io_ffb_enabled->getBool())
71  {
73  }
74  return true;
75 }
76 
77 bool AppContext::mouseMoved(const OIS::MouseEvent& arg) // overrides OIS::MouseListener
78 {
82 
83  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
84  {
85  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMouseMoved()) // update the old airplane / autopilot gui
86  {
87  if (!App::GetCameraManager()->handleMouseMoved())
88  {
90  }
91  }
92  }
93 
94  return true;
95 }
96 
97 bool AppContext::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID _id) // overrides OIS::MouseListener
98 {
100  App::GetGuiManager()->GetImGui().SetMouseButtonState(_id, /*down:*/true);
102 
103  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
104  {
105  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMousePressed()) // update the old airplane / autopilot gui
106  {
107  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION)
108  {
111  }
112  }
113  }
114 
115  return true;
116 }
117 
118 bool AppContext::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID _id) // overrides OIS::MouseListener
119 {
121  App::GetGuiManager()->GetImGui().SetMouseButtonState(_id, /*down:*/false);
123 
124  if (!ImGui::GetIO().WantCaptureMouse) // true if mouse is over any window
125  {
126  if (!App::GetOverlayWrapper() || !App::GetOverlayWrapper()->handleMouseReleased()) // update the old airplane / autopilot gui
127  {
128  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION)
129  {
131  }
132  }
133  }
134 
135  return true;
136 }
137 
138 bool AppContext::keyPressed(const OIS::KeyEvent& arg)
139 {
141 
142  if (!App::GetGuiManager()->IsGuiCaptureKeyboardRequested() &&
143  !ImGui::GetIO().WantCaptureKeyboard)
144  {
146  }
147 
148  return true;
149 }
150 
151 bool AppContext::keyReleased(const OIS::KeyEvent& arg)
152 {
154 
155  if (!App::GetGuiManager()->IsGuiCaptureKeyboardRequested() &&
156  !ImGui::GetIO().WantCaptureKeyboard)
157  {
159  }
160  else if (App::GetInputEngine()->isKeyDownEffective(arg.key))
161  {
162  // If capturing is requested, still pass release events for already-pressed keys.
164  }
165 
166  return true;
167 }
168 
169 bool AppContext::buttonPressed(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
170 bool AppContext::buttonReleased(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
171 bool AppContext::axisMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
172 bool AppContext::sliderMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
173 bool AppContext::povMoved(const OIS::JoyStickEvent& arg, int) { App::GetInputEngine()->ProcessJoystickEvent(arg); return true; }
174 
175 void AppContext::windowResized(Ogre::RenderWindow* rw)
176 {
177  App::GetInputEngine()->windowResized(rw); // Update mouse area
179  {
181  }
182  if (App::sim_state->getEnum<AppState>() == RoR::AppState::SIMULATION)
183  {
184  for (ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors())
185  {
186  actor->ar_dashboard->windowResized();
187  }
188  }
189 }
190 
191 void AppContext::windowFocusChange(Ogre::RenderWindow* rw)
192 {
193  // 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.
194  // See https://github.com/RigsOfRods/rigs-of-rods/issues/2468
195  // To work around, we reset all internal mouse button states here and pay attention not to get them polluted by OIS again.
197  // Same applies to keyboard keys - reset them manually otherwise OIS will hold them 'down' the entire time.
199 }
200 
201 // --------------------------
202 // Rendering
203 
204 void AppContext::SetRenderWindowIcon(Ogre::RenderWindow* rw)
205 {
206 #ifdef _WIN32
207  size_t hWnd = 0;
208  rw->getCustomAttribute("WINDOW", &hWnd);
209 
210  char buf[MAX_PATH];
211  ::GetModuleFileNameA(0, (LPCH)&buf, MAX_PATH);
212 
213  HINSTANCE instance = ::GetModuleHandleA(buf);
214  HICON hIcon = ::LoadIconA(instance, MAKEINTRESOURCEA(101));
215  if (hIcon)
216  {
217  ::SendMessageA((HWND)hWnd, WM_SETICON, 1, (LPARAM)hIcon);
218  ::SendMessageA((HWND)hWnd, WM_SETICON, 0, (LPARAM)hIcon);
219  }
220 #endif // _WIN32
221 }
222 
224 {
225  // Create 'OGRE root' facade
226  // * leave 'plugins' param empty, we load manually below
227  // * note file 'ogre.cfg' isn't read immediatelly but only after calling 'restoreConfig()' below.
228  std::string log_filepath = PathCombine(App::sys_logs_dir->getStr(), "RoR.log");
229  std::string cfg_filepath = PathCombine(App::sys_config_dir->getStr(), "ogre.cfg");
230  LOG(fmt::format("[RoR|Startup|Rendering] Creating OGRE renderer Root object, config='{}'", cfg_filepath));
231  m_ogre_root = new Ogre::Root("", cfg_filepath, log_filepath);
232 
233  // load OGRE plugins manually
234 #ifdef _DEBUG
235  std::string plugins_path = PathCombine(RoR::App::sys_process_dir->getStr(), "plugins_d.cfg");
236 #else
237  std::string plugins_path = PathCombine(RoR::App::sys_process_dir->getStr(), "plugins.cfg");
238 #endif
239  LOG(fmt::format("[RoR|Startup|Rendering] Loading OGRE renderer plugins config '{}'.", plugins_path));
240  try
241  {
242  Ogre::ConfigFile cfg;
243  cfg.load(plugins_path);
244  std::string plugin_dir = cfg.getSetting("PluginFolder", /*section=*/"", /*default=*/App::sys_process_dir->getStr());
245  Ogre::StringVector plugins = cfg.getMultiSetting("Plugin");
246  for (Ogre::String plugin_filename: plugins)
247  {
248  try
249  {
250  m_ogre_root->loadPlugin(PathCombine(plugin_dir, plugin_filename));
251  }
252  catch (Ogre::Exception&) {} // Logged by OGRE
253  }
254  }
255  catch (Ogre::Exception& e)
256  {
258  _L("Startup error"),
259  fmt::format(_L("Could not load file '{}' - make sure the game is installed correctly.\n\nDetailed info: {}"), plugins_path, e.getDescription()));
260  return false;
261  }
262 
263  // Load renderer configuration
264  bool autodetect_resolution = false;
265  if (!m_ogre_root->restoreConfig())
266  {
267  autodetect_resolution = true;
268  LOG(fmt::format("[RoR|Startup|Rendering] WARNING - invalid 'ogre.cfg', selecting render plugin manually..."));
269 
270  const auto render_systems = App::GetAppContext()->GetOgreRoot()->getAvailableRenderers();
271  if (!render_systems.empty())
272  {
273  LOG(fmt::format("[RoR|Startup|Rendering] Auto-selected renderer plugin '{}'", render_systems.front()->getName()));
274  m_ogre_root->setRenderSystem(render_systems.front());
275  }
276  else
277  {
278  ErrorUtils::ShowError (_L("Startup error"), _L("No render system plugin available. Check your plugins.cfg"));
279  return false;
280  }
281  }
282 
283  const auto rs = m_ogre_root->getRenderSystemByName(App::app_rendersys_override->getStr());
284  if (rs != nullptr && rs != m_ogre_root->getRenderSystem())
285  {
286  LOG(fmt::format("[RoR|Startup|Rendering] Setting renderer '{}' on behalf of 'app_rendersys_override' (user selection via Settings UI)", rs->getName()));
287  // The user has selected a different render system during the previous session.
288  m_ogre_root->setRenderSystem(rs);
289  m_ogre_root->saveConfig();
290  }
292 
293  // Start the renderer
294  LOG(fmt::format("[RoR|Startup|Rendering] Starting renderer '{}' (without auto-creating render window)", m_ogre_root->getRenderSystem()->getName()));
295  m_ogre_root->initialise(/*createWindow=*/false);
296 
297  // Review configuration options
298  Ogre::ConfigOptionMap ropts = m_ogre_root->getRenderSystem()->getConfigOptions();
299  std::stringstream ropts_log;
300  for (auto& pair: ropts)
301  {
302  ropts_log << " " << pair.first << " = " << pair.second.currentValue << " (";
303  for (auto& val: pair.second.possibleValues)
304  {
305  ropts_log << val << ", ";
306  }
307  ropts_log << ")\n";
308  }
309  LOG(fmt::format("[RoR|Startup|Rendering] Renderer options as reported by OGRE:\n{}", ropts_log.str()));
310 
311  // Configure the render window
312  Ogre::NameValuePairList miscParams;
313  miscParams["FSAA"] = ropts["FSAA"].currentValue;
314  miscParams["vsync"] = ropts["VSync"].currentValue;
315  miscParams["gamma"] = ropts["sRGB Gamma Conversion"].currentValue;
316  if (!App::diag_allow_window_resize->getBool())
317  {
318  miscParams["border"] = "fixed";
319  }
320 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
321  const auto rd = ropts["Rendering Device"];
322  const auto it = std::find(rd.possibleValues.begin(), rd.possibleValues.end(), rd.currentValue);
323  const int idx = std::distance(rd.possibleValues.begin(), it);
324  miscParams["monitorIndex"] = Ogre::StringConverter::toString(idx);
325  miscParams["windowProc"] = Ogre::StringConverter::toString((size_t)OgreBites::WindowEventUtilities::_WndProc);
326 #endif
327 
328  // Validate rendering resolution
329  Ogre::uint32 width, height;
330  std::istringstream mode (ropts["Video Mode"].currentValue);
331  Ogre::String token;
332  mode >> width;
333  mode >> token; // 'x' as seperator between width and height
334  mode >> height;
335 
336  if(width < 800) width = 800;
337  if(height < 600) height = 600;
338 
339  if (autodetect_resolution)
340  {
341  for (auto& p_mode_str: ropts["Video Mode"].possibleValues)
342  {
343  Ogre::uint32 p_width, p_height;
344  std::istringstream p_mode (p_mode_str);
345  p_mode >> p_width;
346  p_mode >> token; // 'x' as seperator between width and height
347  p_mode >> p_height;
348  if (p_width >= width && p_height >= height)
349  {
350  width = p_width;
351  height = p_height;
352  m_ogre_root->getRenderSystem()->setConfigOption("Video Mode", p_mode_str);
353  }
354  }
355 
356  LOG(fmt::format("[RoR|Startup|Rendering] WARNING - invalid 'ogre.cfg', auto-detected resolution {}x{}", width, height));
357  m_ogre_root->saveConfig();
358  }
359 
360  // Review render window settings
361  std::stringstream miscParams_log;
362  for (auto& pair: miscParams)
363  {
364  miscParams_log << " " << pair.first << " = " << pair.second << "\n";
365  }
366  LOG(fmt::format("[RoR|Startup|Rendering] Creating render window with settings:\n{}", miscParams_log.str()));
367 
368  // Create render window
369  m_render_window = Ogre::Root::getSingleton().createRenderWindow (
370  "Rigs of Rods version " + Ogre::String (ROR_VERSION_STRING),
371  width, height, ropts["Full Screen"].currentValue == "Yes", &miscParams);
372  OgreBites::WindowEventUtilities::_addRenderWindow(m_render_window);
373  OgreBites::WindowEventUtilities::addWindowEventListener(m_render_window, this);
374 
376  m_render_window->setActive(true);
377 
378  // Create viewport (without camera)
379  m_viewport = m_render_window->addViewport(/*camera=*/nullptr);
380  m_viewport->setBackgroundColour(Ogre::ColourValue::Black);
381 
382  return true;
383 }
384 
385 Ogre::RenderWindow* AppContext::CreateCustomRenderWindow(std::string const& window_name, int width, int height)
386 {
387  Ogre::NameValuePairList misc;
388  Ogre::ConfigOptionMap ropts = m_ogre_root->getRenderSystem()->getConfigOptions();
389  misc["FSAA"] = Ogre::StringConverter::parseInt(ropts["FSAA"].currentValue, 0);
390 
391  Ogre::RenderWindow* rw = Ogre::Root::getSingleton().createRenderWindow(window_name, width, height, false, &misc);
392  return rw;
393 }
394 
396 {
397  const std::time_t time = std::time(nullptr);
398  const int index = (time == m_prev_screenshot_time) ? m_prev_screenshot_index+1 : 1;
399 
400  std::stringstream stamp;
401  stamp << std::put_time(std::localtime(&time), "%Y-%m-%d_%H-%M-%S") << "_" << index
402  << "." << App::app_screenshot_format->getStr();
403  std::string path = PathCombine(App::sys_screenshot_dir->getStr(), "screenshot_") + stamp.str();
404 
405  if (App::app_screenshot_format->getStr() == "png")
406  {
407  AdvancedScreen png(m_render_window, path);
408 
409  png.addData("User_NickName", App::mp_player_name->getStr());
410  png.addData("User_Language", App::app_language->getStr());
411 
412  if (App::app_state->getEnum<AppState>() == AppState::SIMULATION &&
413  App::GetGameContext()->GetPlayerActor())
414  {
415  png.addData("Truck_file", App::GetGameContext()->GetPlayerActor()->ar_filename);
416  png.addData("Truck_name", App::GetGameContext()->GetPlayerActor()->getTruckName());
417  }
418  if (App::GetGameContext()->GetTerrain())
419  {
420  png.addData("Terrn_file", App::sim_terrain_name->getStr());
421  png.addData("Terrn_name", App::sim_terrain_gui_name->getStr());
422  }
423  if (App::mp_state->getEnum<MpState>() == MpState::CONNECTED)
424  {
425  png.addData("MP_ServerName", App::mp_server_host->getStr());
426  }
427 
428  png.write();
429  }
430  else
431  {
432  m_render_window->writeContentsToFile(path);
433  }
434 
436  _L("Screenshot: ") + stamp.str());
437 
438  m_prev_screenshot_time = time;
439  m_prev_screenshot_index = index;
440 }
441 
443 {
444  if (!val && !m_windowed_fix)
445  {
446  // Workaround OGRE glitch - badly aligned viewport after first full->window switch
447  // Observed on Win10/OpenGL (GeForce GTX 660)
448  m_render_window->setFullscreen(false, m_render_window->getWidth()-1, m_render_window->getHeight()-1);
449  m_render_window->setFullscreen(false, m_render_window->getWidth()+1, m_render_window->getHeight()+1);
450  }
451  else
452  {
453  m_render_window->setFullscreen(val, m_render_window->getWidth(), m_render_window->getHeight());
454  }
455 }
456 
457 // --------------------------
458 // Program paths and logging
459 
461 {
462  // Process directory
463  std::string exe_path = RoR::GetExecutablePath();
464  if (exe_path.empty())
465  {
466  ErrorUtils::ShowError(_L("Startup error"), _L("Error while retrieving program directory path"));
467  return false;
468  }
469  App::sys_process_dir->setStr(RoR::GetParentDirectory(exe_path.c_str()).c_str());
470 
471  // RoR's home directory
472  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
473  if (FolderExists(local_userdir))
474  {
475  // It's a portable installation
476  App::sys_user_dir->setStr(local_userdir.c_str());
477  }
478  else
479  {
480  // Default location - user's home directory
481  std::string user_home = RoR::GetUserHomeDirectory();
482  if (user_home.empty())
483  {
484  ErrorUtils::ShowError(_L("Startup error"), _L("Error while retrieving user directory path"));
485  return false;
486  }
487  RoR::Str<500> ror_homedir;
488 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
489  ror_homedir << user_home << PATH_SLASH << "My Games";
490  CreateFolder(ror_homedir.ToCStr());
491  ror_homedir << PATH_SLASH << "Rigs of Rods";
492 #elif OGRE_PLATFORM == OGRE_PLATFORM_LINUX
493  char* env_SNAP = getenv("SNAP_USER_COMMON");
494  if(env_SNAP)
495  ror_homedir = env_SNAP;
496  else
497  ror_homedir << user_home << PATH_SLASH << ".rigsofrods";
498 #elif OGRE_PLATFORM == OGRE_PLATFORM_APPLE
499  ror_homedir << user_home << PATH_SLASH << "RigsOfRods";
500 #endif
501  CreateFolder(ror_homedir.ToCStr ());
502  App::sys_user_dir->setStr(ror_homedir.ToCStr ());
503  }
504 
505  return true;
506 }
507 
509 {
510  std::string logs_dir = PathCombine(App::sys_user_dir->getStr(), "logs");
511  CreateFolder(logs_dir);
512  App::sys_logs_dir->setStr(logs_dir.c_str());
513 
514  auto ogre_log_manager = OGRE_NEW Ogre::LogManager();
515  std::string rorlog_path = PathCombine(logs_dir, "RoR.log");
516  Ogre::Log* rorlog = ogre_log_manager->createLog(rorlog_path, true, true);
517  rorlog->stream() << "[RoR] Rigs of Rods (www.rigsofrods.org) version " << ROR_VERSION_STRING;
518  std::time_t t = std::time(nullptr);
519  rorlog->stream() << "[RoR] Current date: " << std::put_time(std::localtime(&t), "%Y-%m-%d");
520 
521  rorlog->addListener(App::GetConsole()); // Allow console to intercept log messages
522 }
523 
525 {
526  std::string process_dir = PathCombine(App::sys_process_dir->getStr(), "resources");
527 #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX
528  if (!FolderExists(process_dir))
529  {
530  process_dir = "/usr/share/rigsofrods/resources/";
531  }
532 #endif
533  if (!FolderExists(process_dir))
534  {
535  ErrorUtils::ShowError(_L("Startup error"), _L("Resources folder not found. Check if correctly installed."));
536  return false;
537  }
538  App::sys_resources_dir->setStr(process_dir);
539  return true;
540 }
541 
543 {
544  Ogre::String src_path = PathCombine(App::sys_resources_dir->getStr(), "skeleton.zip");
545  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(src_path, "Zip", "SrcRG");
546  Ogre::FileInfoListPtr fl = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("SrcRG", "*", true);
547  if (fl->empty())
548  {
549  ErrorUtils::ShowError(_L("Startup error"), _L("Faulty resource folder. Check if correctly installed."));
550  return false;
551  }
552  Ogre::String dst_path = PathCombine(App::sys_user_dir->getStr(), "");
553  for (auto file : *fl)
554  {
555  CreateFolder(dst_path + file.basename);
556  }
557  fl = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("SrcRG", "*");
558  if (fl->empty())
559  {
560  ErrorUtils::ShowError(_L("Startup error"), _L("Faulty resource folder. Check if correctly installed."));
561  return false;
562  }
563  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dst_path, "FileSystem", "DstRG", false, false);
564  for (auto file : *fl)
565  {
566  if (file.uncompressedSize == 0)
567  continue;
568  Ogre::String path = file.path + file.basename;
569  if (!Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("DstRG", path)->empty())
570  continue;
571  Ogre::DataStreamPtr src_ds = Ogre::ResourceGroupManager::getSingleton().openResource(path, "SrcRG");
572  Ogre::DataStreamPtr dst_ds = Ogre::ResourceGroupManager::getSingleton().createResource(path, "DstRG");
573  std::vector<char> buf(src_ds->size());
574  size_t read = src_ds->read(buf.data(), src_ds->size());
575  if (read > 0)
576  {
577  dst_ds->write(buf.data(), read);
578  }
579  }
580  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("SrcRG");
581  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("DstRG");
582 
583  return true;
584 }
585 
587 {
588 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
589  Ogre::String old_ror_homedir = Ogre::StringUtil::format("%s\\Rigs of Rods 0.4", RoR::GetUserHomeDirectory().c_str());
590  if(FolderExists(old_ror_homedir))
591  {
592  if (!FileExists(Ogre::StringUtil::format("%s\\OBSOLETE_FOLDER.txt", old_ror_homedir.c_str())))
593  {
594  Ogre::String obsoleteMessage = Ogre::StringUtil::format("This folder is obsolete, please move your mods to %s", App::sys_user_dir->getStr());
595  try
596  {
597  Ogre::ResourceGroupManager::getSingleton().addResourceLocation(old_ror_homedir, "FileSystem", "homedir", false, false);
598  Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().createResource("OBSOLETE_FOLDER.txt", "homedir");
599  stream->write(obsoleteMessage.c_str(), obsoleteMessage.length());
600  Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup("homedir");
601  }
602  catch (std::exception & e)
603  {
604  RoR::LogFormat("Error writing to %s, message: '%s'", old_ror_homedir.c_str(), e.what());
605  }
606  Ogre::String message = Ogre::StringUtil::format(
607  "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",
609  App::sys_user_dir->getStr()
610  );
611 
612  RoR::App::GetGuiManager()->ShowMessageBox("Obsolete folder detected", message.c_str());
613  }
614  }
615 #endif // OGRE_PLATFORM_WIN32
616 }
617 
619 {
620  m_mainthread_id = std::this_thread::get_id();
621 
622  // This cannot be done earlier as it uses the above thread ID to assert() against invalid access.
624 }
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:460
RoR::AppContext::mousePressed
virtual bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id) override
Definition: AppContext.cpp:97
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:724
RoR::AppContext::m_windowed_fix
bool m_windowed_fix
Workaround OGRE glitch when switching from fullscreen.
Definition: AppContext.h:100
OverlayWrapper.h
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:385
RoR::AppContext::mouseReleased
virtual bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id) override
Definition: AppContext.cpp:118
RoR::App::GetCameraManager
CameraManager * GetCameraManager()
Definition: Application.cpp:278
RoR::App::GetGuiManager
GUIManager * GetGuiManager()
Definition: Application.cpp:272
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:138
ContentManager.h
RoR::App::GetAppContext
AppContext * GetAppContext()
Definition: Application.cpp:269
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:305
RoR::AppContext::SetUpRendering
bool SetUpRendering()
Definition: AppContext.cpp:223
RoR::App::GetOverlayWrapper
OverlayWrapper * GetOverlayWrapper()
Definition: Application.cpp:271
RoR::InputEngine::SetJoystickListener
void SetJoystickListener(OIS::JoyStickListener *obj)
Definition: InputEngine.cpp:670
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:427
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:103
RoR::AppContext::buttonReleased
virtual bool buttonReleased(const OIS::JoyStickEvent &arg, int button) override
Definition: AppContext.cpp:170
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:524
RoR::App::sim_state
CVar * sim_state
Definition: Application.cpp:96
Engine.h
RoR::App::sys_logs_dir
CVar * sys_logs_dir
Definition: Application.cpp:167
RoR::AppContext::SetUpConfigSkeleton
bool SetUpConfigSkeleton()
Definition: AppContext.cpp:542
Language.h
RefCountingObjectPtr< Actor >
RoR::InputEngine::resetKeysAndMouseButtons
void resetKeysAndMouseButtons()
Definition: InputEngine.cpp:732
GUI_MultiplayerSelector.h
GUIManager.h
RoR::InputEngine::processMouseMotionEvent
void processMouseMotionEvent(const OIS::MouseEvent &arg)
Definition: InputEngine.cpp:699
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:169
RoR::AppContext::m_render_window
Ogre::RenderWindow * m_render_window
Definition: AppContext.h:98
RoR::GUIManager::GetImGui
OgreImGui & GetImGui()
Definition: GUIManager.h:165
RoR::InputEngine::windowResized
void windowResized(Ogre::RenderWindow *rw)
Definition: InputEngine.cpp:647
RoR::AppContext::keyReleased
virtual bool keyReleased(const OIS::KeyEvent &arg) override
Definition: AppContext.cpp:151
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:77
ErrorUtils.h
GUI_MainSelector.h
RoR::AppContext::SetRenderWindowIcon
void SetRenderWindowIcon(Ogre::RenderWindow *rw)
Definition: AppContext.cpp:204
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:693
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:273
RoR::AppContext::axisMoved
virtual bool axisMoved(const OIS::JoyStickEvent &arg, int axis) override
Definition: AppContext.cpp:171
RoR::App::GetGameContext
GameContext * GetGameContext()
Definition: Application.cpp:283
RoR::CacheEntry
Definition: CacheSystem.h:55
RoR::InputEngine::ProcessJoystickEvent
void ProcessJoystickEvent(const OIS::JoyStickEvent &arg)
Definition: InputEngine.cpp:679
RoR::AppState::SIMULATION
@ SIMULATION
RoRVersion.h
RoR::AppContext::CaptureScreenshot
void CaptureScreenshot()
Definition: AppContext.cpp:395
ROR_VERSION_STRING
const char *const ROR_VERSION_STRING
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:454
RoR::App::sys_config_dir
CVar * sys_config_dir
Definition: Application.cpp:164
RoR::AppContext::SetUpLogging
void SetUpLogging()
Definition: AppContext.cpp:508
RoR::AppContext::SetUpThreads
void SetUpThreads()
Definition: AppContext.cpp:618
RoR::OverlayWrapper::windowResized
void windowResized()
Definition: OverlayWrapper.cpp:129
RoR::AppContext::ActivateFullscreen
void ActivateFullscreen(bool val)
Definition: AppContext.cpp:442
RoR::AppContext::SetUpObsoleteConfMarker
void SetUpObsoleteConfMarker()
Definition: AppContext.cpp:586
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:173
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::WakeUpGUI
void WakeUpGUI()
Definition: GUIManager.cpp:469
RoR::App::GetInputEngine
InputEngine * GetInputEngine()
Definition: Application.cpp:274
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:191
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:664
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:175
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:63
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:172
RoR
Definition: AppContext.h:36
RoR::InputEngine::ProcessKeyPress
void ProcessKeyPress(const OIS::KeyEvent &arg)
Definition: InputEngine.cpp:688
RoR::InputEngine::processMousePressEvent
void processMousePressEvent(const OIS::MouseEvent &arg, OIS::MouseButtonID _id)
Definition: InputEngine.cpp:707
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:658