RigsofRods
Soft-body Physics Simulation
DashBoardManager.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 
6  For more information, see http://www.rigsofrods.org/
7 
8  Rigs of Rods is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License version 3, as
10  published by the Free Software Foundation.
11 
12  Rigs of Rods is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
24 
25 
26 #include "DashBoardManager.h"
27 
28 #include "Actor.h"
29 #include "Application.h"
30 #include "CacheSystem.h"
31 #include "Console.h"
32 #include "GenericFileFormat.h"
33 #include "Utils.h"
34 
35 using namespace Ogre;
36 using namespace RoR;
37 
38 #define INITDATA(key, type, name) data[key] = dashData_t(type, name)
39 
40 DashBoardManager::DashBoardManager(ActorPtr actor) : visible(true), m_actor(actor)
41 {
42 
43  // init data
45  INITDATA(DD_ENGINE_SPEEDO_KPH , DC_FLOAT, "speedo_kph");
46  INITDATA(DD_ENGINE_SPEEDO_MPH , DC_FLOAT, "speedo_mph");
47  INITDATA(DD_ENGINE_TURBO , DC_FLOAT, "engine_turbo");
48  INITDATA(DD_ENGINE_IGNITION , DC_BOOL , "engine_ignition");
49  INITDATA(DD_ENGINE_BATTERY , DC_BOOL , "engine_battery");
50  INITDATA(DD_ENGINE_CLUTCH_WARNING , DC_BOOL , "engine_clutch_warning");
51  INITDATA(DD_ENGINE_GEAR , DC_INT , "engine_gear");
52  INITDATA(DD_ENGINE_NUM_GEAR , DC_INT , "engine_num_gear");
53  INITDATA(DD_ENGINE_GEAR_STRING , DC_CHAR , "engine_gear_string");
54  INITDATA(DD_ENGINE_AUTOGEAR_STRING , DC_CHAR , "engine_autogear_string");
55  INITDATA(DD_ENGINE_AUTO_GEAR , DC_INT , "engine_auto_gear");
56  INITDATA(DD_ENGINE_CLUTCH , DC_FLOAT, "engine_clutch");
57  INITDATA(DD_BRAKE , DC_FLOAT, "brake");
58  INITDATA(DD_ACCELERATOR , DC_FLOAT, "accelerator");
59  INITDATA(DD_ROLL , DC_FLOAT, "roll");
60  INITDATA(DD_ROLL_CORR , DC_FLOAT, "roll_corr");
61  INITDATA(DD_ROLL_CORR_ACTIVE , DC_BOOL , "roll_corr_active");
62  INITDATA(DD_PITCH , DC_FLOAT, "pitch");
63  INITDATA(DD_PARKINGBRAKE , DC_BOOL , "parkingbrake");
64  INITDATA(DD_LOCKED , DC_BOOL , "locked");
65  INITDATA(DD_LOW_PRESSURE , DC_BOOL , "low_pressure");
66  INITDATA(DD_TRACTIONCONTROL_MODE , DC_INT , "tractioncontrol_mode");
67  INITDATA(DD_ANTILOCKBRAKE_MODE , DC_INT , "antilockbrake_mode");
68  INITDATA(DD_TIES_MODE , DC_INT , "ties_mode");
69  INITDATA(DD_SCREW_THROTTLE_0 , DC_FLOAT, "screw_throttle_0");
70  INITDATA(DD_SCREW_THROTTLE_1 , DC_FLOAT, "screw_throttle_1");
71  INITDATA(DD_SCREW_THROTTLE_2 , DC_FLOAT, "screw_throttle_2");
72  INITDATA(DD_SCREW_THROTTLE_3 , DC_FLOAT, "screw_throttle_3");
73  INITDATA(DD_SCREW_THROTTLE_4 , DC_FLOAT, "screw_throttle_4");
74  INITDATA(DD_SCREW_THROTTLE_5 , DC_FLOAT, "screw_throttle_5");
75  INITDATA(DD_SCREW_STEER_0 , DC_FLOAT, "screw_steer_0");
76  INITDATA(DD_SCREW_STEER_1 , DC_FLOAT, "screw_steer_1");
77  INITDATA(DD_SCREW_STEER_2 , DC_FLOAT, "screw_steer_2");
78  INITDATA(DD_SCREW_STEER_3 , DC_FLOAT, "screw_steer_3");
79  INITDATA(DD_SCREW_STEER_4 , DC_FLOAT, "screw_steer_4");
80  INITDATA(DD_SCREW_STEER_5 , DC_FLOAT, "screw_steer_5");
81  INITDATA(DD_WATER_DEPTH , DC_FLOAT, "water_depth");
82  INITDATA(DD_WATER_SPEED , DC_FLOAT, "water_speed");
83  INITDATA(DD_AEROENGINE_THROTTLE_0 , DC_FLOAT, "aeroengine_throttle_0");
84  INITDATA(DD_AEROENGINE_THROTTLE_1 , DC_FLOAT, "aeroengine_throttle_1");
85  INITDATA(DD_AEROENGINE_THROTTLE_2 , DC_FLOAT, "aeroengine_throttle_2");
86  INITDATA(DD_AEROENGINE_THROTTLE_3 , DC_FLOAT, "aeroengine_throttle_3");
87  INITDATA(DD_AEROENGINE_THROTTLE_4 , DC_FLOAT, "aeroengine_throttle_4");
88  INITDATA(DD_AEROENGINE_THROTTLE_5 , DC_FLOAT, "aeroengine_throttle_5");
89  INITDATA(DD_AEROENGINE_FAILED_0 , DC_BOOL , "aeroengine_failed_0");
90  INITDATA(DD_AEROENGINE_FAILED_1 , DC_BOOL , "aeroengine_failed_1");
91  INITDATA(DD_AEROENGINE_FAILED_2 , DC_BOOL , "aeroengine_failed_2");
92  INITDATA(DD_AEROENGINE_FAILED_3 , DC_BOOL , "aeroengine_failed_3");
93  INITDATA(DD_AEROENGINE_FAILED_4 , DC_BOOL , "aeroengine_failed_4");
94  INITDATA(DD_AEROENGINE_FAILED_5 , DC_BOOL , "aeroengine_failed_5");
95  INITDATA(DD_AEROENGINE_RPM_0 , DC_FLOAT, "aeroengine_rpm_0");
96  INITDATA(DD_AEROENGINE_RPM_1 , DC_FLOAT, "aeroengine_rpm_1");
97  INITDATA(DD_AEROENGINE_RPM_2 , DC_FLOAT, "aeroengine_rpm_2");
98  INITDATA(DD_AEROENGINE_RPM_3 , DC_FLOAT, "aeroengine_rpm_3");
99  INITDATA(DD_AEROENGINE_RPM_4 , DC_FLOAT, "aeroengine_rpm_4");
100  INITDATA(DD_AEROENGINE_RPM_5 , DC_FLOAT, "aeroengine_rpm_5");
101  INITDATA(DD_AIRSPEED , DC_FLOAT, "airspeed");
102  INITDATA(DD_WING_AOA_0 , DC_FLOAT, "wing_aoa_0");
103  INITDATA(DD_WING_AOA_1 , DC_FLOAT, "wing_aoa_1");
104  INITDATA(DD_WING_AOA_2 , DC_FLOAT, "wing_aoa_2");
105  INITDATA(DD_WING_AOA_3 , DC_FLOAT, "wing_aoa_3");
106  INITDATA(DD_WING_AOA_4 , DC_FLOAT, "wing_aoa_4");
107  INITDATA(DD_WING_AOA_5 , DC_FLOAT, "wing_aoa_5");
108  INITDATA(DD_ALTITUDE , DC_FLOAT, "altitude");
109  INITDATA(DD_ALTITUDE_STRING , DC_CHAR , "altitude_string");
110 
111  INITDATA(DD_ODOMETER_TOTAL , DC_FLOAT, "odometer_total");
112  INITDATA(DD_ODOMETER_USER , DC_FLOAT, "odometer_user");
113 
114  // Lights (mirrors RoRnet::Lightmask)
115 
116  INITDATA(DD_CUSTOM_LIGHT1 , DC_BOOL, "custom_light1");
117  INITDATA(DD_CUSTOM_LIGHT2 , DC_BOOL, "custom_light2");
118  INITDATA(DD_CUSTOM_LIGHT3 , DC_BOOL, "custom_light3");
119  INITDATA(DD_CUSTOM_LIGHT4 , DC_BOOL, "custom_light4");
120  INITDATA(DD_CUSTOM_LIGHT5 , DC_BOOL, "custom_light5");
121  INITDATA(DD_CUSTOM_LIGHT6 , DC_BOOL, "custom_light6");
122  INITDATA(DD_CUSTOM_LIGHT7 , DC_BOOL, "custom_light7");
123  INITDATA(DD_CUSTOM_LIGHT8 , DC_BOOL, "custom_light8");
124  INITDATA(DD_CUSTOM_LIGHT9 , DC_BOOL, "custom_light9");
125  INITDATA(DD_CUSTOM_LIGHT10 , DC_BOOL, "custom_light10");
126 
127  INITDATA(DD_HEADLIGHTS , DC_BOOL, "headlights");
128  INITDATA(DD_HIGHBEAMS , DC_BOOL, "highbeams");
129  INITDATA(DD_FOGLIGHTS , DC_BOOL, "foglights");
130  INITDATA(DD_SIDELIGHTS , DC_BOOL, "sidelights");
131  INITDATA(DD_BRAKE_LIGHTS , DC_BOOL, "brake_lights");
132  INITDATA(DD_REVERSE_LIGHT , DC_BOOL, "reverse_light");
133  INITDATA(DD_BEACONS , DC_BOOL, "beacons");
134  INITDATA(DD_LIGHTS_LEGACY , DC_BOOL, "lights"); // Alias of 'sidelights'
135 
136  INITDATA(DD_SIGNAL_TURNLEFT , DC_BOOL, "signal_turnleft");
137  INITDATA(DD_SIGNAL_TURNRIGHT , DC_BOOL, "signal_turnright");
138  INITDATA(DD_SIGNAL_WARNING , DC_BOOL, "signal_warning");
139 
140  // load dash fonts
141  MyGUI::ResourceManager::getInstance().load("MyGUI_FontsDash.xml");
142 }
143 
145 {
146  // free all objects
147  while (m_dashboards.size() > 0)
148  {
149  delete m_dashboards.back();
150  m_dashboards.pop_back();
151  }
152 }
153 
155 {
156  const char* s = str.c_str();
157  for (int i = 0; i < DD_MAX; i++)
158  {
159  if (!strcmp(data[i].name, s))
160  return i;
161  }
162  return -1;
163 }
164 
166 {
167  if (id > 0 && id < DD_MAX)
168  {
169  return data[id].name;
170  }
171  else
172  {
173  return "";
174  }
175 }
176 
177 // Helper funcs and structs for `determineLayoutFromDashboardMod()` below.
178 
179 constexpr int DASHTAG_RPM_NONE = -1;
180 constexpr char DASHTAG_XPH_NONE = '\0';
181 
182 static int DashRPM(const std::string& input)
183 {
184  std::regex rpm_regex(R"((\d+)rpm)");
185  std::smatch match;
186  if (std::regex_search(input, match, rpm_regex)) {
187  std::string rpm = match[1];
188  return std::atoi(rpm.c_str());
189  }
190  return DASHTAG_RPM_NONE;
191 }
192 
193 static char DashXPH(const std::string& input)
194 {
195  std::regex xph_regex(R"(([km])ph)");
196  std::smatch match;
197  if (std::regex_search(input, match, xph_regex)) {
198  return match[1].str()[0];
199  }
200  return DASHTAG_XPH_NONE;
201 }
202 
204 {
205  std::string filename;
206  int rpm = DASHTAG_RPM_NONE;
207  char xph = DASHTAG_XPH_NONE;
208 
209  DashCandidateLayout(const std::string& filename)
210  {
211  this->filename = filename;
212  this->rpm = DashRPM(filename);
213  this->xph = DashXPH(filename);
214  }
215 };
216 
217 std::string DashBoardManager::determineLayoutFromDashboardMod(CacheEntryPtr& entry, std::string const& basename)
218 {
220  Ogre::FileInfoListPtr filelist
221  = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(entry->resource_group, fmt::format("{}*.layout", basename));
222 
223  if (filelist->empty())
224  {
226  fmt::format("{}: No layout files found in dashboard '{}'", m_actor->ar_design_name, basename));
227  return "";
228  }
229 
230  // Boat dashboards are separate from trucks and have no tags to evaluate.
231  if (m_actor->ar_driveable == BOAT)
232  {
233  return filelist->begin()->filename;
234  }
235 
236  if (m_actor->ar_driveable == TRUCK)
237  {
238  return this->determineTruckLayoutFromDashboardMod(filelist);
239  }
240 
241  return "";
242 }
243 
244 std::string DashBoardManager::determineTruckLayoutFromDashboardMod(Ogre::FileInfoListPtr& filelist)
245 {
246  // Algorithm:
247  // A. Consider only layouts with matching Xph tag, find best RPM match (see below).
248  // B. If no match found, consider also layouts without Xph tag, find best RPM match (see below).
249  //
250  // Best RPM matching:
251  // 1. Consider just layouts with Xrpm tag, find one with with smallest RPM overshoot.
252  // 2. If all undershoot, take one with least undershoot and log a warning
253  // 3. If there's no layout with Xrpm tag, Consider layouts without Xrpm tag, pick random .
254  // ---------------------------------------------------------------------------------------
255 
256  const int redlineRPM = (int)m_actor->ar_engine->getShiftUpRPM();
257  const char desiredX = App::gfx_speedo_imperial->getBool() ? 'm' : 'k';
258  std::vector<DashCandidateLayout> candidates;
259 
260  for (Ogre::FileInfo& fileinfo : *filelist)
261  {
262  candidates.emplace_back(fileinfo.filename);
263  }
264 
265  // A. Consider only layouts with matching Xph tag, find best RPM match (see above).
266  float least_overshoot = std::numeric_limits<float>::max(); DashCandidateLayout* overshoot_candidate = nullptr;
267  float least_undershoot = -std::numeric_limits<float>::max(); DashCandidateLayout* undershoot_candidate = nullptr;
268  for (auto& candidate : candidates)
269  {
270  if (candidate.xph == desiredX)
271  {
272  float rpm_diff = (float)candidate.rpm - redlineRPM;
273  if (rpm_diff < 0 && rpm_diff > least_undershoot)
274  {
275  least_undershoot = rpm_diff;
276  undershoot_candidate = &candidate;
277  }
278  else if (rpm_diff >= 0 && rpm_diff < least_overshoot)
279  {
280  least_overshoot = rpm_diff;
281  overshoot_candidate = &candidate;
282  }
283  }
284  }
285 
286  if (overshoot_candidate)
287  {
288  return overshoot_candidate->filename;
289  }
290  else if (undershoot_candidate)
291  {
293  fmt::format("{}: No ideal dashboard found, using one with least RPM undershoot", m_actor->ar_design_name));
294  return undershoot_candidate->filename;
295  }
296 
297  // B. If no match found, consider also layouts without Xph tag, find best RPM match (see above).
299  fmt::format("{}: Selected dashboard has no '{}ph' layouts, ignoring setting", m_actor->ar_design_name, desiredX));
300  least_overshoot = std::numeric_limits<float>::max(); overshoot_candidate = nullptr;
301  least_undershoot = -std::numeric_limits<float>::max(); undershoot_candidate = nullptr;
302  for (auto& candidate : candidates)
303  {
304  float rpm_diff = (float)candidate.rpm - redlineRPM;
305  if (rpm_diff < 0 && rpm_diff > least_undershoot)
306  {
307  least_undershoot = rpm_diff;
308  undershoot_candidate = &candidate;
309  }
310  else if (rpm_diff >= 0 && rpm_diff < least_overshoot)
311  {
312  least_overshoot = rpm_diff;
313  overshoot_candidate = &candidate;
314  }
315  }
316 
317  if (overshoot_candidate)
318  {
319  return overshoot_candidate->filename;
320  }
321  else if (undershoot_candidate)
322  {
324  fmt::format("{}: No ideal dashboard found, using one with least RPM undershoot", m_actor->ar_design_name));
325  return undershoot_candidate->filename;
326  }
327 
328  return filelist->begin()->filename; // If all else failed, just pick random.
329 }
330 
331 void DashBoardManager::loadDashBoard(std::string const& filename, BitMask_t flags)
332 {
333  // filename may be either '.layout' file (classic approach) or a new '.dashboard' mod.
334  // ----------------------------------------------------------------------------------
335 
337  return; // Nothing to do.
338 
339  std::string basename, ext, layoutfname;
340  Ogre::StringUtil::splitBaseFilename(filename, basename, ext);
341  if (ext == "dashboard")
342  {
343  CacheEntryPtr entry = App::GetCacheSystem()->FindEntryByFilename(LT_DashBoard, /*partial=*/false, filename);
344  if (!entry)
345  {
347  fmt::format("DashboardManager: Could not find dashboard file '{}'", filename));
348  return;
349  }
351  layoutfname = this->determineLayoutFromDashboardMod(entry, basename);
352  // load dash fonts
353  Ogre::FileInfoListPtr filelist
354  = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(entry->resource_group, fmt::format("{}*.resource", basename));
355  for (Ogre::FileInfo& fileinfo : *filelist)
356  {
357  MyGUI::ResourceManager::getInstance().load(fileinfo.filename);
358  }
359  }
360  else
361  {
362  layoutfname = filename;
363  }
364 
365  if (layoutfname == "")
366  {
368  fmt::format("{}: Cannot load dashboard '{}' - no applicable layout file found", m_actor->ar_design_name, filename));
369  return;
370  }
371 
373  {
374  DashBoard* d = new DashBoard(this, layoutfname, /* textureLayer: */true);
375  d->setVisible(true);
376  m_dashboards.push_back(d);
378  {
379  m_rtt_loaded = true;
380  }
381  }
382 
384  {
385  DashBoard* d = new DashBoard(this, layoutfname, /* textureLayer: */false);
386  d->setVisible(true);
387  m_dashboards.push_back(d);
389  {
390  m_hud_loaded = true;
391  }
392  }
393 }
394 
396 {
397  for (DashBoard* d: m_dashboards)
398  {
399  d->update(dt);
400  }
401 }
402 
404 {
405  for (DashBoard* d: m_dashboards)
406  {
407  d->updateFeatures();
408  }
409 }
410 
412 {
413  switch (data[key].type)
414  {
415  case DC_BOOL:
416  return data[key].data.value_bool ? 1.0f : 0.0f;
417  case(DC_INT):
418  return (float)data[key].data.value_int;
419  case(DC_FLOAT):
420  return data[key].data.value_float;
421  }
422  return 0;
423 }
424 
425 void DashBoardManager::setVisible(bool visibility)
426 {
427  visible = visibility;
428  for (DashBoard* d: m_dashboards)
429  {
430  if (!d->getIsTextureLayer())
431  {
432  d->setVisible(visibility);
433  }
434  }
435 }
436 
437 void DashBoardManager::setVisible3d(bool visibility)
438 {
439  for (DashBoard* d: m_dashboards)
440  {
441  if (d->getIsTextureLayer())
442  {
443  d->setVisible(visibility, /*smooth:*/false);
444  }
445  }
446 }
447 
449 {
450  for (DashBoard* d: m_dashboards)
451  {
452  d->windowResized();
453  }
454 }
455 
456 // DASHBOARD class below
457 
458 DashBoard::DashBoard(DashBoardManager* manager, Ogre::String filename, bool _textureLayer)
459  : manager(manager)
460  , filename(filename)
461  , free_controls(0)
462  , visible(false)
463  , mainWidget(nullptr)
464  , textureLayer(_textureLayer)
465 {
466  // use 'this' class pointer to make layout unique
467  prefix = MyGUI::utility::toString(this, "_");
468  memset(&controls, 0, sizeof(controls));
470  // hide first
471  if (mainWidget)
472  mainWidget->setVisible(false);
473 }
474 
476 {
477  // Clear the GUI widgets
478  MyGUI::LayoutManager::getInstance().unloadLayout(widgets);
479  // Force unloading the '.layout' file from memory
480  MyGUI::ResourceManager::getInstance().removeByName(filename);
481 }
482 
484 {
485  // this hides / shows parts of the gui depending on the vehicle features
486  for (int i = 0; i < free_controls; i++)
487  {
488  bool enabled = manager->getEnabled(controls[i].linkID);
489 
490  controls[i].widget->setVisible(enabled);
491  }
492 }
493 
494 const float DASH_SMOOTHING = 0.02;
495 
496 float DashBoard::getSmoothNumeric(int controlID)
497 {
498  if (manager->getDataType(controls[controlID].linkID) != DC_FLOAT)
499  {
500  return manager->getNumeric(controls[controlID].linkID); // Only smoothen FLOAT inputs
501  }
502  else
503  {
504  const float curVal = manager->getNumeric(controls[controlID].linkID);
505  const float val = controls[controlID].lastVal * (1 - DASH_SMOOTHING) + curVal * DASH_SMOOTHING;
506  controls[controlID].lastVal = curVal;
507  return val;
508  }
509 }
510 
511 void DashBoard::update(float dt)
512 {
513  // walk all controls and animate them
514  for (int i = 0; i < free_controls; i++)
515  {
516  // get its value from its linkage
517  if (controls[i].animationType == ANIM_ROTATE)
518  {
519  // get the value
520  const float val = this->getSmoothNumeric(i);
521  // calculate the angle
522  float angle = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
523 
524  // enforce limits
525  if (angle < controls[i].wmin)
526  angle = controls[i].wmin;
527  else if (angle > controls[i].wmax)
528  angle = controls[i].wmax;
529  // rotate finally
530  controls[i].rotImg->setAngle(Ogre::Degree(angle).valueRadians());
531  }
532  else if (controls[i].animationType == ANIM_LAMP)
533  {
534  // or a lamp?
535  bool state = false;
536  // conditional
537  if (controls[i].condition == CONDITION_GREATER)
538  {
539  float val = manager->getNumeric(controls[i].linkID);
540  state = (val > controls[i].conditionArgument);
541  }
542  else if (controls[i].condition == CONDITION_LESSER)
543  {
544  float val = manager->getNumeric(controls[i].linkID);
545  state = (val < controls[i].conditionArgument);
546  }
547  else
548  {
549  state = (manager->getNumeric(controls[i].linkID) > 0);
550  }
551 
552  if (state == controls[i].lastState)
553  continue;
554  controls[i].lastState = state;
555 
556  // switch states
557  if (state)
558  {
559  controls[i].img->setImageTexture(String(controls[i].texture) + "-on.png");
560  }
561  else
562  {
563  controls[i].img->setImageTexture(String(controls[i].texture) + "-off.png");
564  }
565  }
566  else if (controls[i].animationType == ANIM_SERIES)
567  {
568  const float val = this->getSmoothNumeric(i);
569 
570  String fn = String(controls[i].texture) + String("-") + TOSTRING((int)val) + String(".png");
571 
572  controls[i].img->setImageTexture(fn);
573  }
574  else if (controls[i].animationType == ANIM_SCALE)
575  {
576  const float val = this->getSmoothNumeric(i);
577 
578  float scale = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
579  if (controls[i].direction == DIRECTION_UP)
580  {
581  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top - scale);
582  controls[i].widget->setSize(controls[i].initialSize.width, controls[i].initialSize.height + scale);
583  }
584  else if (controls[i].direction == DIRECTION_DOWN)
585  {
586  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top);
587  controls[i].widget->setSize(controls[i].initialSize.width, controls[i].initialSize.height + scale);
588  }
589  else if (controls[i].direction == DIRECTION_LEFT)
590  {
591  controls[i].widget->setPosition(controls[i].initialPosition.left - scale, controls[i].initialPosition.top);
592  controls[i].widget->setSize(controls[i].initialSize.width + scale, controls[i].initialSize.height);
593  }
594  else if (controls[i].direction == DIRECTION_RIGHT)
595  {
596  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top);
597  controls[i].widget->setSize(controls[i].initialSize.width + scale, controls[i].initialSize.height);
598  }
599  }
600  else if (controls[i].animationType == ANIM_TRANSLATE)
601  {
602  const float val = this->getSmoothNumeric(i);
603 
604  float translation = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
605  if (controls[i].direction == DIRECTION_UP)
606  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top - translation);
607  else if (controls[i].direction == DIRECTION_DOWN)
608  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top + translation);
609  else if (controls[i].direction == DIRECTION_LEFT)
610  controls[i].widget->setPosition(controls[i].initialPosition.left - translation, controls[i].initialPosition.top);
611  else if (controls[i].direction == DIRECTION_RIGHT)
612  controls[i].widget->setPosition(controls[i].initialPosition.left + translation, controls[i].initialPosition.top);
613  }
614  else if (controls[i].animationType == ANIM_TEXTFORMAT)
615  {
616  const float val = this->getSmoothNumeric(i);
617 
618  MyGUI::UString s;
619  if (strlen(controls[i].format) == 0)
620  {
621  s = Ogre::StringConverter::toString(val);
622  }
623  else
624  {
625  char tmp[1024] = "";
626  sprintf(tmp, controls[i].format, val);
627 
628  // Detect and eliminate negative zero (-0) on output
629  if (strcmp(tmp, controls[i].format_neg_zero) == 0)
630  {
631  sprintf(tmp, controls[i].format, 0.f);
632  }
633 
634  s = MyGUI::UString(tmp);
635  }
636 
637  controls[i].txt->setCaption(s);
638  }
639  else if (controls[i].animationType == ANIM_TEXTSTRING)
640  {
641  char* val = manager->getChar(controls[i].linkID);
642  controls[i].txt->setCaption(MyGUI::UString(val));
643  }
644  }
645 }
646 
648 {
649  if (!mainWidget)
650  return;
651  mainWidget->setPosition(0, 0);
652  if (textureLayer)
653  {
654  // texture layers are independent from the screen size, but rather from the layer texture size
655  TexturePtr tex = TextureManager::getSingleton().getByName("RTTTexture1");
656  if (tex)
657  mainWidget->setSize(tex->getWidth(), tex->getHeight());
658  }
659  else
660  {
661  MyGUI::IntSize screenSize = MyGUI::RenderManager::getInstance().getViewSize();
662  mainWidget->setSize(screenSize);
663  }
664 }
665 
666 void DashBoard::loadLayoutRecursive(MyGUI::WidgetPtr w)
667 {
668  std::string name = w->getName();
669  std::string anim = w->getUserString("anim");
670  std::string debug = w->getUserString("debug");
671  std::string linkArgs = w->getUserString("link");
672 
673  // make it unclickable
674  w->setUserString("interactive", "0");
675 
676  if (!debug.empty())
677  {
678  w->setVisible(false);
679  return;
680  }
681 
682  // find the root widget and ignore debug widgets
683  if (name.size() > prefix.size())
684  {
685  std::string prefixLessName = name.substr(prefix.size());
686  if (prefixLessName == "_Main")
687  {
688  mainWidget = (MyGUI::WindowPtr)w;
689  // resize it
690  windowResized();
691  }
692 
693  // ignore debug widgets
694  if (prefixLessName == "DEBUG")
695  {
696  w->setVisible(false);
697  return;
698  }
699  }
700 
701  // animations for this control?
702  if (!linkArgs.empty())
703  {
704  layoutLink_t ctrl;
705  memset(&ctrl, 0, sizeof(ctrl));
706 
707  if (!name.empty())
708  strncpy(ctrl.name, name.c_str(), 255);
709  ctrl.widget = w;
710  ctrl.initialSize = w->getSize();
711  ctrl.initialPosition = w->getPosition();
712  ctrl.lastState = false;
713 
714  // establish the link
715  {
716  replaceString(linkArgs, "&gt;", ">");
717  replaceString(linkArgs, "&lt;", "<");
718  String linkName = "";
719  if (linkArgs.empty())
720  {
721  LOG("Dashboard ("+filename+"/"+name+"): empty Link");
722  return;
723  }
724  // conditional checks
725  // TODO: improve the logic, this is crap ...
726  if (linkArgs.find(">") != linkArgs.npos)
727  {
728  Ogre::StringVector args = Ogre::StringUtil::split(linkArgs, ">");
729  if (args.size() == 2)
730  {
731  linkName = args[0];
732  ctrl.conditionArgument = StringConverter::parseReal(args[1]);
734  }
735  else
736  {
737  LOG("Dashboard ("+filename+"/"+name+"): error in conditional Link: " + linkArgs);
738  return;
739  }
740  }
741  else if (linkArgs.find("<") != linkArgs.npos)
742  {
743  Ogre::StringVector args = Ogre::StringUtil::split(linkArgs, "<");
744  if (args.size() == 2)
745  {
746  linkName = args[0];
747  ctrl.conditionArgument = StringConverter::parseReal(args[1]);
749  }
750  else
751  {
752  LOG("Dashboard ("+filename+"/"+name+"): error in conditional Link: " + linkArgs);
753  return;
754  }
755  }
756  else
757  {
758  ctrl.condition = CONDITION_NONE;
759  ctrl.conditionArgument = 0;
760  linkName = linkArgs;
761  }
762 
763  // now try to get the enum id for it
764  int linkID = manager->getLinkIDForName(linkName);
765  if (linkID < 0)
766  {
767  LOG("Dashboard ("+filename+"/"+name+"): unknown Link: " + linkName);
768  return;
769  }
770 
771  ctrl.linkID = linkID;
772  }
773 
774  // parse more attributes
775  ctrl.wmin = StringConverter::parseReal(w->getUserString("min"));
776  ctrl.wmax = StringConverter::parseReal(w->getUserString("max"));
777  ctrl.vmin = StringConverter::parseReal(w->getUserString("vmin"));
778  ctrl.vmax = StringConverter::parseReal(w->getUserString("vmax"));
779 
780  String texture = w->getUserString("texture");
781  if (!texture.empty())
782  strncpy(ctrl.texture, texture.c_str(), 255);
783 
784  String format = w->getUserString("format");
785  if (!format.empty())
786  strncpy(ctrl.format, format.c_str(), 255);
787 
788  String direction = w->getUserString("direction");
789  if (direction == "right")
790  ctrl.direction = DIRECTION_RIGHT;
791  else if (direction == "left")
792  ctrl.direction = DIRECTION_LEFT;
793  else if (direction == "down")
794  ctrl.direction = DIRECTION_DOWN;
795  else if (direction == "up")
796  ctrl.direction = DIRECTION_UP;
797  else if (!direction.empty())
798  {
799  LOG("Dashboard ("+filename+"/"+name+"): unknown direction: " + direction);
800  return;
801  }
802  // then specializations
803  if (anim == "rotate")
804  {
805  ctrl.animationType = ANIM_ROTATE;
806  // check if its the correct control
807  // try to cast, will throw
808  // and if the link is a float
809  /*
810  if (manager->getDataType(ctrl.linkID) != DC_FLOAT)
811  {
812  LOG("Dashboard ("+filename+"/"+name+"): Rotating controls can only link to floats");
813  continue;
814  }
815  */
816 
817  try
818  {
819  ctrl.rotImg = w->getSubWidgetMain()->castType<MyGUI::RotatingSkin>();
820  }
821  catch (...)
822  {
823  LOG("Dashboard ("+filename+"/"+name+"): Rotating controls must use the RotatingSkin");
824  return;
825  }
826  if (!ctrl.rotImg)
827  {
828  LOG("Dashboard ("+filename+"/"+name+"): error loading rotation control");
829  return;
830  }
831 
832  // special: set rotation center now into the middle
833  ctrl.rotImg->setCenter(MyGUI::IntPoint(w->getHeight() * 0.5f, w->getWidth() * 0.5f));
834  }
835  else if (anim == "scale")
836  {
837  ctrl.animationType = ANIM_SCALE;
838  if (ctrl.direction == DIRECTION_NONE)
839  {
840  LOG("Dashboard ("+filename+"/"+name+"): direction empty: scale needs a direction");
841  return;
842  }
843  }
844  else if (anim == "translate")
845  {
847  if (ctrl.direction == DIRECTION_NONE)
848  {
849  LOG("Dashboard ("+filename+"/"+name+"): direction empty: translate needs a direction");
850  return;
851  }
852  }
853  else if (anim == "series")
854  {
855  ctrl.animationType = ANIM_SERIES;
856  ctrl.img = (MyGUI::ImageBox *)w; //w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
857  if (!ctrl.img)
858  {
859  LOG("Dashboard ("+filename+"/"+name+"): error loading series control");
860  return;
861  }
862  }
863  else if (anim == "textcolor" || anim == "textcolour")
864  {
866 
867  // try to cast, will throw
868  try
869  {
870  ctrl.txt = (MyGUI::TextBox *)w;
871  }
872  catch (...)
873  {
874  LOG("Dashboard ("+filename+"/"+name+"): textcolor controls must use the TextBox Control");
875  return;
876  }
877  }
878  else if (anim == "textformat")
879  {
880  // try to cast, will throw
881  try
882  {
883  ctrl.txt = (MyGUI::TextBox *)w; // w->getSubWidgetMain()->castType<MyGUI::TextBox>();
884  }
885  catch (...)
886  {
887  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
888  return;
889  }
891 
892  // Prepare for eliminating negative zero (-0.0) display
893  // Must be done on string-level because -0.001 with format "%1.0f" would still produce "-0"
894  if (std::strlen(ctrl.format))
895  {
896  std::snprintf(ctrl.format_neg_zero, 255, ctrl.format, -0.f);
897  }
898  }
899  else if (anim == "textstring")
900  {
901  // try to cast, will throw
902  try
903  {
904  ctrl.txt = (MyGUI::TextBox *)w; // w->getSubWidgetMain()->castType<MyGUI::TextBox>();
905  }
906  catch (...)
907  {
908  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
909  return;
910  }
912  }
913  else if (anim == "lamp")
914  {
915  // try to cast, will throw
916  /*
917  {
918  try
919  {
920  w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
921  }
922  catch (...)
923  {
924  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
925  continue;
926  }
927  }
928  */
929  ctrl.animationType = ANIM_LAMP;
930  ctrl.img = (MyGUI::ImageBox *)w; //w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
931  if (!ctrl.img)
932  {
933  LOG("Dashboard ("+filename+"/"+name+"): error loading Lamp control");
934  return;
935  }
936  }
937 
938  controls[free_controls] = ctrl;
939  free_controls++;
941  {
942  LOG("maximum amount of controls reached, discarding the rest: " + TOSTRING(MAX_CONTROLS));
943  return;
944  }
945  }
946 
947  // walk the children now
948  MyGUI::EnumeratorWidgetPtr e = w->getEnumerator();
949  while (e.next())
950  {
951  loadLayoutRecursive(e.current());
952  }
953 }
954 
956 {
957  widgets = MyGUI::LayoutManager::getInstance().loadLayout(filename, prefix, nullptr); // never has a parent
958 
959  for (MyGUI::VectorWidgetPtr::iterator iter = widgets.begin(); iter != widgets.end(); ++iter)
960  {
961  loadLayoutRecursive(*iter);
962  }
963 
964  // if this thing should be rendered to texture, relocate the main window to the RTT layer
965  if (textureLayer && mainWidget)
966  mainWidget->detachFromWidget("RTTLayer1");
967 }
968 
969 void DashBoard::setVisible(bool v, bool smooth)
970 {
971  visible = v;
972 
973  if (!mainWidget)
974  {
975  for (MyGUI::VectorWidgetPtr::iterator iter = widgets.begin(); iter != widgets.end(); ++iter)
976  {
977  (*iter)->setVisible(v);
978  }
979  return;
980  }
981 
982  /*
983  // buggy for some reason
984  if (smooth)
985  mainWidget->setVisibleSmooth(v);
986  */
987  mainWidget->setVisible(v);
988 }
RoR::DashBoard::windowResized
void windowResized()
Definition: DashBoardManager.cpp:647
RoR::DashBoard::ANIM_TEXTFORMAT
@ ANIM_TEXTFORMAT
Definition: DashBoardManager.h:292
RoR::DashBoard::DIRECTION_UP
@ DIRECTION_UP
Definition: DashBoardManager.h:303
RoR::DashBoardManager::windowResized
void windowResized()
Definition: DashBoardManager.cpp:448
RoR::DashBoardManager::determineTruckLayoutFromDashboardMod
std::string determineTruckLayoutFromDashboardMod(Ogre::FileInfoListPtr &filelist)
Definition: DashBoardManager.cpp:244
RoR::DashBoard::widgets
MyGUI::VectorWidgetPtr widgets
Definition: DashBoardManager.h:282
RoR::App::gfx_speedo_imperial
CVar * gfx_speedo_imperial
Definition: Application.cpp:257
RoR::DashBoardManager::getChar
char * getChar(size_t key)
Definition: DashBoardManager.h:223
RoR::DD_AEROENGINE_THROTTLE_5
@ DD_AEROENGINE_THROTTLE_5
Definition: DashBoardManager.h:144
RoR::DD_ENGINE_SPEEDO_MPH
@ DD_ENGINE_SPEEDO_MPH
speedo in kilometer per hour
Definition: DashBoardManager.h:88
RoR::DC_FLOAT
@ DC_FLOAT
Definition: DashBoardManager.h:57
RoR::DD_HIGHBEAMS
@ DD_HIGHBEAMS
Definition: DashBoardManager.h:189
RoR::DashBoardManager::getNumeric
float getNumeric(size_t key)
Definition: DashBoardManager.cpp:411
RoR::DD_SCREW_THROTTLE_5
@ DD_SCREW_THROTTLE_5
Definition: DashBoardManager.h:126
RoR::DD_CUSTOM_LIGHT8
@ DD_CUSTOM_LIGHT8
custom light 8 on
Definition: DashBoardManager.h:184
RoR::TRUCK
@ TRUCK
its a truck (or other land vehicle)
Definition: SimData.h:85
RoR::DD_ENGINE_SPEEDO_KPH
@ DD_ENGINE_SPEEDO_KPH
Definition: DashBoardManager.h:87
RoR::DashBoard::CONDITION_LESSER
@ CONDITION_LESSER
Definition: DashBoardManager.h:313
RoR::DD_ACCELERATOR
@ DD_ACCELERATOR
Definition: DashBoardManager.h:103
RoR::DashBoard::ANIM_SCALE
@ ANIM_SCALE
Definition: DashBoardManager.h:291
RoR::DD_SCREW_THROTTLE_1
@ DD_SCREW_THROTTLE_1
Definition: DashBoardManager.h:122
RoR::DD_SCREW_THROTTLE_0
@ DD_SCREW_THROTTLE_0
ties locked
Definition: DashBoardManager.h:121
RoR::DD_AEROENGINE_RPM_1
@ DD_AEROENGINE_RPM_1
Definition: DashBoardManager.h:154
RoR::DD_AEROENGINE_THROTTLE_0
@ DD_AEROENGINE_THROTTLE_0
Definition: DashBoardManager.h:139
RoR::DashBoardManager::~DashBoardManager
~DashBoardManager(void)
Definition: DashBoardManager.cpp:144
RoR::DD_ENGINE_TURBO
@ DD_ENGINE_TURBO
speedo in miles per hour
Definition: DashBoardManager.h:89
RoR::DC_BOOL
@ DC_BOOL
Definition: DashBoardManager.h:55
DashBoardManager.h
MAX_CONTROLS
#define MAX_CONTROLS
Definition: DashBoardManager.h:43
RoR::DD_AEROENGINE_FAILED_2
@ DD_AEROENGINE_FAILED_2
Definition: DashBoardManager.h:148
RoR::DashBoard::DIRECTION_NONE
@ DIRECTION_NONE
Definition: DashBoardManager.h:302
RoR::LOADDASHBOARD_RTT_TEXTURE
@ LOADDASHBOARD_RTT_TEXTURE
Will be drawn to texture. Unless STACKABLE, it prevents the default dashboard from loading.
Definition: DashBoardManager.h:207
RoR::DashBoard::ANIM_TEXTSTRING
@ ANIM_TEXTSTRING
Definition: DashBoardManager.h:293
RoR::DashData
DashData
Definition: DashBoardManager.h:84
DASHTAG_RPM_NONE
constexpr int DASHTAG_RPM_NONE
Definition: DashBoardManager.cpp:179
RoR::DD_REVERSE_LIGHT
@ DD_REVERSE_LIGHT
Definition: DashBoardManager.h:193
format
Truck file format(technical spec)
RoR::DD_WATER_SPEED
@ DD_WATER_SPEED
Definition: DashBoardManager.h:136
RoR::DD_CUSTOM_LIGHT2
@ DD_CUSTOM_LIGHT2
custom light 2 on
Definition: DashBoardManager.h:178
RoR::DD_CUSTOM_LIGHT5
@ DD_CUSTOM_LIGHT5
custom light 5 on
Definition: DashBoardManager.h:181
RoR::CVar::getBool
bool getBool() const
Definition: CVar.h:98
RoR::DashBoard::CONDITION_NONE
@ CONDITION_NONE
Definition: DashBoardManager.h:311
RoR::DD_ROLL_CORR
@ DD_ROLL_CORR
Definition: DashBoardManager.h:106
RoR::DD_SCREW_THROTTLE_4
@ DD_SCREW_THROTTLE_4
Definition: DashBoardManager.h:125
RoR::DashBoard::ANIM_TRANSLATE
@ ANIM_TRANSLATE
Definition: DashBoardManager.h:296
RoR::DD_TIES_MODE
@ DD_TIES_MODE
Definition: DashBoardManager.h:118
RoR::DashBoard::controls
layoutLink_t controls[MAX_CONTROLS]
Definition: DashBoardManager.h:347
Console.h
RoR::DD_WING_AOA_3
@ DD_WING_AOA_3
Definition: DashBoardManager.h:165
RoR::Console::putMessage
void putMessage(MessageArea area, MessageType type, std::string const &msg, std::string icon="")
Definition: Console.cpp:103
RoR::DashBoardManager::determineLayoutFromDashboardMod
std::string determineLayoutFromDashboardMod(CacheEntryPtr &entry, std::string const &basename)
Definition: DashBoardManager.cpp:217
RoR::DD_ENGINE_CLUTCH
@ DD_ENGINE_CLUTCH
automatic gear
Definition: DashBoardManager.h:100
RoR::CacheEntry::resource_group
Ogre::String resource_group
Resource group of the loaded bundle. Empty if not loaded yet.
Definition: CacheSystem.h:89
RoR::DD_AEROENGINE_FAILED_0
@ DD_AEROENGINE_FAILED_0
Definition: DashBoardManager.h:146
RoR::DD_AEROENGINE_THROTTLE_4
@ DD_AEROENGINE_THROTTLE_4
Definition: DashBoardManager.h:143
RoR::DashBoard::updateFeatures
void updateFeatures()
Definition: DashBoardManager.cpp:483
RoR::DD_SCREW_THROTTLE_2
@ DD_SCREW_THROTTLE_2
Definition: DashBoardManager.h:123
Utils.h
DASHTAG_XPH_NONE
constexpr char DASHTAG_XPH_NONE
Definition: DashBoardManager.cpp:180
RoR::DC_CHAR
@ DC_CHAR
Definition: DashBoardManager.h:58
RoR::DD_SCREW_STEER_3
@ DD_SCREW_STEER_3
Definition: DashBoardManager.h:131
RefCountingObjectPtr< Actor >
RoR::DashBoardManager::getLinkNameForID
std::string getLinkNameForID(DashData id)
Definition: DashBoardManager.cpp:165
RoR::DD_WING_AOA_1
@ DD_WING_AOA_1
Definition: DashBoardManager.h:163
Actor.h
w
float w
Definition: (ValueTypes) quaternion.h:4
RoR::replaceString
void replaceString(std::string &str, std::string searchString, std::string replaceString)
Definition: Utils.h:51
RoR::DD_SCREW_STEER_1
@ DD_SCREW_STEER_1
Definition: DashBoardManager.h:129
RoR::DashBoard::loadLayoutInternal
void loadLayoutInternal()
Definition: DashBoardManager.cpp:955
DashCandidateLayout::DashCandidateLayout
DashCandidateLayout(const std::string &filename)
Definition: DashBoardManager.cpp:209
RoR::DD_AEROENGINE_RPM_2
@ DD_AEROENGINE_RPM_2
Definition: DashBoardManager.h:155
RoR::DashBoard::setVisible
void setVisible(bool visible, bool smooth=true)
Definition: DashBoardManager.cpp:969
RoR::DashBoardManager::m_rtt_loaded
bool m_rtt_loaded
Definition: DashBoardManager.h:257
RoR::DashBoard::visible
bool visible
Definition: DashBoardManager.h:284
RoR::DD_ODOMETER_USER
@ DD_ODOMETER_USER
Definition: DashBoardManager.h:173
RoR::DD_FOGLIGHTS
@ DD_FOGLIGHTS
Definition: DashBoardManager.h:190
TOSTRING
#define TOSTRING(x)
Definition: Application.h:56
DashCandidateLayout::rpm
int rpm
Definition: DashBoardManager.cpp:206
RoR::DashBoard::filename
Ogre::String filename
Definition: DashBoardManager.h:281
RoR::DD_ENGINE_GEAR
@ DD_ENGINE_GEAR
clutch warning lamp
Definition: DashBoardManager.h:94
BITMASK_IS_0
#define BITMASK_IS_0(VAR, FLAGS)
Definition: BitFlags.h:13
RoR::DD_CUSTOM_LIGHT3
@ DD_CUSTOM_LIGHT3
custom light 3 on
Definition: DashBoardManager.h:179
RoR::DD_PARKINGBRAKE
@ DD_PARKINGBRAKE
chassis pitch
Definition: DashBoardManager.h:111
RoR::DD_AEROENGINE_RPM_4
@ DD_AEROENGINE_RPM_4
Definition: DashBoardManager.h:157
RoR::CacheSystem::FindEntryByFilename
CacheEntryPtr FindEntryByFilename(RoR::LoaderType type, bool partial, const std::string &_filename_maybe_bundlequalified)
Returns NULL if none found; "Bundle-qualified" format also specifies the ZIP/directory in modcache,...
Definition: CacheSystem.cpp:186
RoR::Actor::ar_engine
EnginePtr ar_engine
Definition: Actor.h:403
RoR::DD_ROLL
@ DD_ROLL
Definition: DashBoardManager.h:105
CacheSystem.h
A database of user-installed content alias 'mods' (vehicles, terrains...)
RoR::DashBoard::prefix
std::string prefix
Definition: DashBoardManager.h:285
RoR::DD_SIDELIGHTS
@ DD_SIDELIGHTS
Definition: DashBoardManager.h:191
BITMASK_IS_1
#define BITMASK_IS_1(VAR, FLAGS)
Definition: BitFlags.h:14
RoR::DD_MAX
@ DD_MAX
Definition: DashBoardManager.h:201
RoR::DashBoardManager::setVisible3d
void setVisible3d(bool visibility)
Definition: DashBoardManager.cpp:437
RoR::dashData_t::name
const char * name
Definition: DashBoardManager.h:67
RoR::DashBoardManager::updateFeatures
void updateFeatures()
Definition: DashBoardManager.cpp:403
RoR::DashBoardManager::data
dashData_t data[DD_MAX]
Definition: DashBoardManager.h:254
RoR::DashBoardManager::loadDashBoard
void loadDashBoard(const std::string &filename, BitMask_t flags)
Definition: DashBoardManager.cpp:331
RoR::DashBoardManager::getDataType
int getDataType(size_t key)
Definition: DashBoardManager.h:233
RoR::DashBoard::DIRECTION_LEFT
@ DIRECTION_LEFT
Definition: DashBoardManager.h:306
RoR::DD_CUSTOM_LIGHT4
@ DD_CUSTOM_LIGHT4
custom light 4 on
Definition: DashBoardManager.h:180
RoR::DD_ROLL_CORR_ACTIVE
@ DD_ROLL_CORR_ACTIVE
Definition: DashBoardManager.h:107
RoR::DD_SIGNAL_TURNRIGHT
@ DD_SIGNAL_TURNRIGHT
Right blinker is lit.
Definition: DashBoardManager.h:198
Application.h
Central state/object manager and communications hub.
RoR::DD_AEROENGINE_FAILED_3
@ DD_AEROENGINE_FAILED_3
Definition: DashBoardManager.h:149
RoR::App::GetConsole
Console * GetConsole()
Definition: Application.cpp:286
RoR::LT_DashBoard
@ LT_DashBoard
Definition: Application.h:473
RoR::DashBoardManager::getLinkIDForName
int getLinkIDForName(Ogre::String &str)
Definition: DashBoardManager.cpp:154
RoR::DD_SCREW_STEER_5
@ DD_SCREW_STEER_5
Definition: DashBoardManager.h:133
RoR::dataContainer_t::value_bool
bool value_bool
Definition: DashBoardManager.h:47
RoR::DD_WING_AOA_4
@ DD_WING_AOA_4
Definition: DashBoardManager.h:166
RoR::DD_CUSTOM_LIGHT7
@ DD_CUSTOM_LIGHT7
custom light 7 on
Definition: DashBoardManager.h:183
RoR::DD_CUSTOM_LIGHT10
@ DD_CUSTOM_LIGHT10
custom light 10 on
Definition: DashBoardManager.h:186
RoR::DD_BEACONS
@ DD_BEACONS
Definition: DashBoardManager.h:194
RoR::DD_AEROENGINE_FAILED_4
@ DD_AEROENGINE_FAILED_4
Definition: DashBoardManager.h:150
RoR::DashBoard::~DashBoard
~DashBoard()
Definition: DashBoardManager.cpp:475
RoR::DD_ENGINE_BATTERY
@ DD_ENGINE_BATTERY
Definition: DashBoardManager.h:91
RoR::dashData_t::data
dataContainer_t data
Definition: DashBoardManager.h:65
RoR::DashBoardManager::getEnabled
bool getEnabled(size_t key)
Definition: DashBoardManager.h:224
RoR::DD_SCREW_THROTTLE_3
@ DD_SCREW_THROTTLE_3
Definition: DashBoardManager.h:124
RoR::DD_BRAKE
@ DD_BRAKE
Definition: DashBoardManager.h:102
RoR::DD_AIRSPEED
@ DD_AIRSPEED
Definition: DashBoardManager.h:160
RoR::DD_PITCH
@ DD_PITCH
Definition: DashBoardManager.h:109
RoR::DD_ENGINE_RPM
@ DD_ENGINE_RPM
Definition: DashBoardManager.h:86
RoR::DashBoardManager::m_actor
ActorPtr m_actor
Definition: DashBoardManager.h:258
RoR::DD_SIGNAL_WARNING
@ DD_SIGNAL_WARNING
The warning-blink indicator is lit.
Definition: DashBoardManager.h:199
RoR::DashBoard::DIRECTION_RIGHT
@ DIRECTION_RIGHT
Definition: DashBoardManager.h:304
RoR::DashBoardManager::m_dashboards
std::vector< DashBoard * > m_dashboards
Definition: DashBoardManager.h:255
RoR::DashBoard::free_controls
int free_controls
Definition: DashBoardManager.h:348
DashCandidateLayout
Definition: DashBoardManager.cpp:203
RoR::DD_WING_AOA_0
@ DD_WING_AOA_0
Definition: DashBoardManager.h:162
RoR::App::GetCacheSystem
CacheSystem * GetCacheSystem()
Definition: Application.cpp:288
RoR::DD_SIGNAL_TURNLEFT
@ DD_SIGNAL_TURNLEFT
Left blinker is lit.
Definition: DashBoardManager.h:197
RoR::DashBoardManager
Definition: DashBoardManager.h:212
RoR::dataContainer_t::value_float
float value_float
Definition: DashBoardManager.h:49
RoR::LOADDASHBOARD_SCREEN_HUD
@ LOADDASHBOARD_SCREEN_HUD
Will be drawn to screen. Unless STACKABLE, it prevents the default dashboard from loading.
Definition: DashBoardManager.h:206
RoR::DashBoard::manager
DashBoardManager * manager
Definition: DashBoardManager.h:280
RoR::DD_SCREW_STEER_4
@ DD_SCREW_STEER_4
Definition: DashBoardManager.h:132
RoR::DD_ENGINE_IGNITION
@ DD_ENGINE_IGNITION
turbo gauge
Definition: DashBoardManager.h:90
RoR::DD_SCREW_STEER_2
@ DD_SCREW_STEER_2
Definition: DashBoardManager.h:130
RoR::DD_AEROENGINE_RPM_5
@ DD_AEROENGINE_RPM_5
Definition: DashBoardManager.h:158
RoR::CacheSystem::LoadResource
void LoadResource(CacheEntryPtr &t)
Loads the associated resource bundle if not already done.
Definition: CacheSystem.cpp:1538
RoR::DashBoard::getSmoothNumeric
float getSmoothNumeric(int controlID)
Definition: DashBoardManager.cpp:496
RoR::Actor::ar_driveable
ActorType ar_driveable
Sim attr; marks vehicle type and features.
Definition: Actor.h:402
RoR::DashBoardManager::m_hud_loaded
bool m_hud_loaded
Definition: DashBoardManager.h:256
INITDATA
#define INITDATA(key, type, name)
Definition: DashBoardManager.cpp:38
RoR::DD_AEROENGINE_THROTTLE_2
@ DD_AEROENGINE_THROTTLE_2
Definition: DashBoardManager.h:141
RoR::DashBoard::loadLayoutRecursive
void loadLayoutRecursive(MyGUI::WidgetPtr ptr)
Definition: DashBoardManager.cpp:666
RoR::DD_AEROENGINE_RPM_3
@ DD_AEROENGINE_RPM_3
Definition: DashBoardManager.h:156
RoR::DashBoard::ANIM_TEXTCOLOR
@ ANIM_TEXTCOLOR
Definition: DashBoardManager.h:297
RoR::DD_AEROENGINE_FAILED_5
@ DD_AEROENGINE_FAILED_5
Definition: DashBoardManager.h:151
DashRPM
static int DashRPM(const std::string &input)
Definition: DashBoardManager.cpp:182
RoR::DashBoard::ANIM_LAMP
@ ANIM_LAMP
Definition: DashBoardManager.h:294
RoR::DashBoard
Definition: DashBoardManager.h:261
DashXPH
static char DashXPH(const std::string &input)
Definition: DashBoardManager.cpp:193
RoR::DD_ALTITUDE_STRING
@ DD_ALTITUDE_STRING
Definition: DashBoardManager.h:170
RoR::DD_SCREW_STEER_0
@ DD_SCREW_STEER_0
Definition: DashBoardManager.h:128
RoR::DD_CUSTOM_LIGHT6
@ DD_CUSTOM_LIGHT6
custom light 6 on
Definition: DashBoardManager.h:182
RoR::DD_TRACTIONCONTROL_MODE
@ DD_TRACTIONCONTROL_MODE
low pressure
Definition: DashBoardManager.h:116
RoR::DashBoardManager::update
void update(float dt)
Definition: DashBoardManager.cpp:395
RoR::DD_WING_AOA_5
@ DD_WING_AOA_5
Definition: DashBoardManager.h:167
RoR::DD_WING_AOA_2
@ DD_WING_AOA_2
Definition: DashBoardManager.h:164
BitMask_t
uint32_t BitMask_t
Definition: BitFlags.h:7
RoR::DashBoard::DIRECTION_DOWN
@ DIRECTION_DOWN
Definition: DashBoardManager.h:305
Ogre
Definition: ExtinguishableFireAffector.cpp:35
RoR::Actor::ar_design_name
Ogre::String ar_design_name
Name of the vehicle/machine/object this actor represents.
Definition: Actor.h:377
RoR::DashBoard::textureLayer
bool textureLayer
Definition: DashBoardManager.h:284
RoR::Console::CONSOLE_MSGTYPE_ACTOR
@ CONSOLE_MSGTYPE_ACTOR
Parsing/spawn/simulation messages for actors.
Definition: Console.h:63
RoR::Console::CONSOLE_SYSTEM_WARNING
@ CONSOLE_SYSTEM_WARNING
Definition: Console.h:53
RoR::DashBoard::CONDITION_GREATER
@ CONDITION_GREATER
Definition: DashBoardManager.h:312
RoR::DashBoardManager::setVisible
void setVisible(bool visibility)
Definition: DashBoardManager.cpp:425
RoR::Console::CONSOLE_MSGTYPE_INFO
@ CONSOLE_MSGTYPE_INFO
Generic message.
Definition: Console.h:60
RoR::DashBoard::DashBoard
DashBoard(DashBoardManager *manager, Ogre::String filename, bool textureLayer)
Definition: DashBoardManager.cpp:458
RoR::DD_ANTILOCKBRAKE_MODE
@ DD_ANTILOCKBRAKE_MODE
Definition: DashBoardManager.h:117
RoR::DD_CUSTOM_LIGHT1
@ DD_CUSTOM_LIGHT1
custom light 1 on
Definition: DashBoardManager.h:177
RoR::DD_LOCKED
@ DD_LOCKED
parking brake status
Definition: DashBoardManager.h:112
RoR::DashBoard::ANIM_SERIES
@ ANIM_SERIES
Definition: DashBoardManager.h:295
RoR::BOAT
@ BOAT
its a boat
Definition: SimData.h:87
RoR::DD_AEROENGINE_THROTTLE_1
@ DD_AEROENGINE_THROTTLE_1
Definition: DashBoardManager.h:140
RoR::DD_AEROENGINE_THROTTLE_3
@ DD_AEROENGINE_THROTTLE_3
Definition: DashBoardManager.h:142
RoR::DD_BRAKE_LIGHTS
@ DD_BRAKE_LIGHTS
Definition: DashBoardManager.h:192
RoR::DC_INT
@ DC_INT
Definition: DashBoardManager.h:56
GenericFileFormat.h
Generic text file parser.
RoR::DD_LOW_PRESSURE
@ DD_LOW_PRESSURE
locked lamp
Definition: DashBoardManager.h:114
RoR::DashBoard::update
void update(float dt)
Definition: DashBoardManager.cpp:511
RoR::DD_ENGINE_NUM_GEAR
@ DD_ENGINE_NUM_GEAR
current gear
Definition: DashBoardManager.h:95
RoR::DD_ENGINE_AUTO_GEAR
@ DD_ENGINE_AUTO_GEAR
string like "P R N G"
Definition: DashBoardManager.h:98
RoR::DD_ENGINE_AUTOGEAR_STRING
@ DD_ENGINE_AUTOGEAR_STRING
string like "<current gear>/<max gear>"
Definition: DashBoardManager.h:97
RoR::DD_ENGINE_CLUTCH_WARNING
@ DD_ENGINE_CLUTCH_WARNING
battery lamp
Definition: DashBoardManager.h:92
RoR
Definition: AppContext.h:36
RoR::DD_WATER_DEPTH
@ DD_WATER_DEPTH
Definition: DashBoardManager.h:135
RoR::dataContainer_t::value_int
int value_int
Definition: DashBoardManager.h:48
DashCandidateLayout::filename
std::string filename
Definition: DashBoardManager.cpp:205
RoR::DD_HEADLIGHTS
@ DD_HEADLIGHTS
Definition: DashBoardManager.h:188
RoR::DD_ALTITUDE
@ DD_ALTITUDE
Definition: DashBoardManager.h:169
RoR::DashBoard::mainWidget
MyGUI::WindowPtr mainWidget
Definition: DashBoardManager.h:283
RoR::DD_ENGINE_GEAR_STRING
@ DD_ENGINE_GEAR_STRING
Definition: DashBoardManager.h:96
RoR::LOADDASHBOARD_STACKABLE
@ LOADDASHBOARD_STACKABLE
Allows loading multiple dashboards at once (by default there's only one for screen and one for RTT).
Definition: DashBoardManager.h:208
DASH_SMOOTHING
const float DASH_SMOOTHING
Definition: DashBoardManager.cpp:494
RoR::DD_AEROENGINE_FAILED_1
@ DD_AEROENGINE_FAILED_1
Definition: DashBoardManager.h:147
RoR::DashBoardManager::visible
bool visible
Definition: DashBoardManager.h:253
RoR::DD_LIGHTS_LEGACY
@ DD_LIGHTS_LEGACY
Alias of 'sidelights'.
Definition: DashBoardManager.h:195
RoR::DD_ODOMETER_TOTAL
@ DD_ODOMETER_TOTAL
Definition: DashBoardManager.h:172
RoR::DashBoard::ANIM_ROTATE
@ ANIM_ROTATE
Definition: DashBoardManager.h:290
RoR::DD_AEROENGINE_RPM_0
@ DD_AEROENGINE_RPM_0
Definition: DashBoardManager.h:153
RoR::DD_CUSTOM_LIGHT9
@ DD_CUSTOM_LIGHT9
custom light 9 on
Definition: DashBoardManager.h:185