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 "Application.h"
29 #include "Utils.h"
30 
31 using namespace Ogre;
32 using namespace RoR;
33 
34 #define INITDATA(key, type, name) data[key] = dashData_t(type, name)
35 
36 DashBoardManager::DashBoardManager(void) : visible(true)
37 {
38 
39  // init data
41  INITDATA(DD_ENGINE_SPEEDO_KPH , DC_FLOAT, "speedo_kph");
42  INITDATA(DD_ENGINE_SPEEDO_MPH , DC_FLOAT, "speedo_mph");
43  INITDATA(DD_ENGINE_TURBO , DC_FLOAT, "engine_turbo");
44  INITDATA(DD_ENGINE_IGNITION , DC_BOOL , "engine_ignition");
45  INITDATA(DD_ENGINE_BATTERY , DC_BOOL , "engine_battery");
46  INITDATA(DD_ENGINE_CLUTCH_WARNING , DC_BOOL , "engine_clutch_warning");
47  INITDATA(DD_ENGINE_GEAR , DC_INT , "engine_gear");
48  INITDATA(DD_ENGINE_NUM_GEAR , DC_INT , "engine_num_gear");
49  INITDATA(DD_ENGINE_GEAR_STRING , DC_CHAR , "engine_gear_string");
50  INITDATA(DD_ENGINE_AUTOGEAR_STRING , DC_CHAR , "engine_autogear_string");
51  INITDATA(DD_ENGINE_AUTO_GEAR , DC_INT , "engine_auto_gear");
52  INITDATA(DD_ENGINE_CLUTCH , DC_FLOAT, "engine_clutch");
53  INITDATA(DD_BRAKE , DC_FLOAT, "brake");
54  INITDATA(DD_ACCELERATOR , DC_FLOAT, "accelerator");
55  INITDATA(DD_ROLL , DC_FLOAT, "roll");
56  INITDATA(DD_ROLL_CORR , DC_FLOAT, "roll_corr");
57  INITDATA(DD_ROLL_CORR_ACTIVE , DC_BOOL , "roll_corr_active");
58  INITDATA(DD_PITCH , DC_FLOAT, "pitch");
59  INITDATA(DD_PARKINGBRAKE , DC_BOOL , "parkingbrake");
60  INITDATA(DD_LOCKED , DC_BOOL , "locked");
61  INITDATA(DD_LOW_PRESSURE , DC_BOOL , "low_pressure");
62  INITDATA(DD_TRACTIONCONTROL_MODE , DC_INT , "tractioncontrol_mode");
63  INITDATA(DD_ANTILOCKBRAKE_MODE , DC_INT , "antilockbrake_mode");
64  INITDATA(DD_TIES_MODE , DC_INT , "ties_mode");
65  INITDATA(DD_SCREW_THROTTLE_0 , DC_FLOAT, "screw_throttle_0");
66  INITDATA(DD_SCREW_THROTTLE_1 , DC_FLOAT, "screw_throttle_1");
67  INITDATA(DD_SCREW_THROTTLE_2 , DC_FLOAT, "screw_throttle_2");
68  INITDATA(DD_SCREW_THROTTLE_3 , DC_FLOAT, "screw_throttle_3");
69  INITDATA(DD_SCREW_THROTTLE_4 , DC_FLOAT, "screw_throttle_4");
70  INITDATA(DD_SCREW_THROTTLE_5 , DC_FLOAT, "screw_throttle_5");
71  INITDATA(DD_SCREW_STEER_0 , DC_FLOAT, "screw_steer_0");
72  INITDATA(DD_SCREW_STEER_1 , DC_FLOAT, "screw_steer_1");
73  INITDATA(DD_SCREW_STEER_2 , DC_FLOAT, "screw_steer_2");
74  INITDATA(DD_SCREW_STEER_3 , DC_FLOAT, "screw_steer_3");
75  INITDATA(DD_SCREW_STEER_4 , DC_FLOAT, "screw_steer_4");
76  INITDATA(DD_SCREW_STEER_5 , DC_FLOAT, "screw_steer_5");
77  INITDATA(DD_WATER_DEPTH , DC_FLOAT, "water_depth");
78  INITDATA(DD_WATER_SPEED , DC_FLOAT, "water_speed");
79  INITDATA(DD_AEROENGINE_THROTTLE_0 , DC_FLOAT, "aeroengine_throttle_0");
80  INITDATA(DD_AEROENGINE_THROTTLE_1 , DC_FLOAT, "aeroengine_throttle_1");
81  INITDATA(DD_AEROENGINE_THROTTLE_2 , DC_FLOAT, "aeroengine_throttle_2");
82  INITDATA(DD_AEROENGINE_THROTTLE_3 , DC_FLOAT, "aeroengine_throttle_3");
83  INITDATA(DD_AEROENGINE_THROTTLE_4 , DC_FLOAT, "aeroengine_throttle_4");
84  INITDATA(DD_AEROENGINE_THROTTLE_5 , DC_FLOAT, "aeroengine_throttle_5");
85  INITDATA(DD_AEROENGINE_FAILED_0 , DC_BOOL , "aeroengine_failed_0");
86  INITDATA(DD_AEROENGINE_FAILED_1 , DC_BOOL , "aeroengine_failed_1");
87  INITDATA(DD_AEROENGINE_FAILED_2 , DC_BOOL , "aeroengine_failed_2");
88  INITDATA(DD_AEROENGINE_FAILED_3 , DC_BOOL , "aeroengine_failed_3");
89  INITDATA(DD_AEROENGINE_FAILED_4 , DC_BOOL , "aeroengine_failed_4");
90  INITDATA(DD_AEROENGINE_FAILED_5 , DC_BOOL , "aeroengine_failed_5");
91  INITDATA(DD_AEROENGINE_RPM_0 , DC_FLOAT, "aeroengine_rpm_0");
92  INITDATA(DD_AEROENGINE_RPM_1 , DC_FLOAT, "aeroengine_rpm_1");
93  INITDATA(DD_AEROENGINE_RPM_2 , DC_FLOAT, "aeroengine_rpm_2");
94  INITDATA(DD_AEROENGINE_RPM_3 , DC_FLOAT, "aeroengine_rpm_3");
95  INITDATA(DD_AEROENGINE_RPM_4 , DC_FLOAT, "aeroengine_rpm_4");
96  INITDATA(DD_AEROENGINE_RPM_5 , DC_FLOAT, "aeroengine_rpm_5");
97  INITDATA(DD_AIRSPEED , DC_FLOAT, "airspeed");
98  INITDATA(DD_WING_AOA_0 , DC_FLOAT, "wing_aoa_0");
99  INITDATA(DD_WING_AOA_1 , DC_FLOAT, "wing_aoa_1");
100  INITDATA(DD_WING_AOA_2 , DC_FLOAT, "wing_aoa_2");
101  INITDATA(DD_WING_AOA_3 , DC_FLOAT, "wing_aoa_3");
102  INITDATA(DD_WING_AOA_4 , DC_FLOAT, "wing_aoa_4");
103  INITDATA(DD_WING_AOA_5 , DC_FLOAT, "wing_aoa_5");
104  INITDATA(DD_ALTITUDE , DC_FLOAT, "altitude");
105  INITDATA(DD_ALTITUDE_STRING , DC_CHAR , "altitude_string");
106 
107  INITDATA(DD_ODOMETER_TOTAL , DC_FLOAT, "odometer_total");
108  INITDATA(DD_ODOMETER_USER , DC_FLOAT, "odometer_user");
109 
110  // Lights (mirrors RoRnet::Lightmask)
111 
112  INITDATA(DD_CUSTOM_LIGHT1 , DC_BOOL, "custom_light1");
113  INITDATA(DD_CUSTOM_LIGHT2 , DC_BOOL, "custom_light2");
114  INITDATA(DD_CUSTOM_LIGHT3 , DC_BOOL, "custom_light3");
115  INITDATA(DD_CUSTOM_LIGHT4 , DC_BOOL, "custom_light4");
116  INITDATA(DD_CUSTOM_LIGHT5 , DC_BOOL, "custom_light5");
117  INITDATA(DD_CUSTOM_LIGHT6 , DC_BOOL, "custom_light6");
118  INITDATA(DD_CUSTOM_LIGHT7 , DC_BOOL, "custom_light7");
119  INITDATA(DD_CUSTOM_LIGHT8 , DC_BOOL, "custom_light8");
120  INITDATA(DD_CUSTOM_LIGHT9 , DC_BOOL, "custom_light9");
121  INITDATA(DD_CUSTOM_LIGHT10 , DC_BOOL, "custom_light10");
122 
123  INITDATA(DD_HEADLIGHTS , DC_BOOL, "headlights");
124  INITDATA(DD_HIGHBEAMS , DC_BOOL, "highbeams");
125  INITDATA(DD_FOGLIGHTS , DC_BOOL, "foglights");
126  INITDATA(DD_SIDELIGHTS , DC_BOOL, "sidelights");
127  INITDATA(DD_BRAKE_LIGHTS , DC_BOOL, "brake_lights");
128  INITDATA(DD_REVERSE_LIGHT , DC_BOOL, "reverse_light");
129  INITDATA(DD_BEACONS , DC_BOOL, "beacons");
130  INITDATA(DD_LIGHTS_LEGACY , DC_BOOL, "lights"); // Alias of 'sidelights'
131 
132  INITDATA(DD_SIGNAL_TURNLEFT , DC_BOOL, "signal_turnleft");
133  INITDATA(DD_SIGNAL_TURNRIGHT , DC_BOOL, "signal_turnright");
134  INITDATA(DD_SIGNAL_WARNING , DC_BOOL, "signal_warning");
135 
136  // load dash fonts
137  MyGUI::ResourceManager::getInstance().load("MyGUI_FontsDash.xml");
138 }
139 
141 {
142  // free all objects
143  while (m_dashboards.size() > 0)
144  {
145  delete m_dashboards.back();
146  m_dashboards.pop_back();
147  }
148 }
149 
151 {
152  const char* s = str.c_str();
153  for (int i = 0; i < DD_MAX; i++)
154  {
155  if (!strcmp(data[i].name, s))
156  return i;
157  }
158  return -1;
159 }
160 
162 {
163  if (id > 0 && id < DD_MAX)
164  {
165  return data[id].name;
166  }
167  else
168  {
169  return "";
170  }
171 }
172 
173 int DashBoardManager::loadDashBoard(Ogre::String filename, bool textureLayer)
174 {
175 
176  DashBoard* d = new DashBoard(this, filename, textureLayer);
177  d->setVisible(true);
178 
179  m_dashboards.push_back(d);
180 
181  return 0;
182 }
183 
185 {
186  for (DashBoard* d: m_dashboards)
187  {
188  d->update(dt);
189  }
190 }
191 
193 {
194  for (DashBoard* d: m_dashboards)
195  {
196  d->updateFeatures();
197  }
198 }
199 
201 {
202  switch (data[key].type)
203  {
204  case DC_BOOL:
205  return data[key].data.value_bool ? 1.0f : 0.0f;
206  case(DC_INT):
207  return (float)data[key].data.value_int;
208  case(DC_FLOAT):
209  return data[key].data.value_float;
210  }
211  return 0;
212 }
213 
214 void DashBoardManager::setVisible(bool visibility)
215 {
216  visible = visibility;
217  for (DashBoard* d: m_dashboards)
218  {
219  if (!d->getIsTextureLayer())
220  {
221  d->setVisible(visibility);
222  }
223  }
224 }
225 
226 void DashBoardManager::setVisible3d(bool visibility)
227 {
228  for (DashBoard* d: m_dashboards)
229  {
230  if (d->getIsTextureLayer())
231  {
232  d->setVisible(visibility, /*smooth:*/false);
233  }
234  }
235 }
236 
238 {
239  for (DashBoard* d: m_dashboards)
240  {
241  d->windowResized();
242  }
243 }
244 
245 // DASHBOARD class below
246 
247 DashBoard::DashBoard(DashBoardManager* manager, Ogre::String filename, bool _textureLayer)
248  : manager(manager)
249  , filename(filename)
250  , free_controls(0)
251  , visible(false)
252  , mainWidget(nullptr)
253  , textureLayer(_textureLayer)
254 {
255  // use 'this' class pointer to make layout unique
256  prefix = MyGUI::utility::toString(this, "_");
257  memset(&controls, 0, sizeof(controls));
259  // hide first
260  if (mainWidget)
261  mainWidget->setVisible(false);
262 }
263 
265 {
266  // Clear the GUI widgets
267  MyGUI::LayoutManager::getInstance().unloadLayout(widgets);
268  // Force unloading the '.layout' file from memory
269  MyGUI::ResourceManager::getInstance().removeByName(filename);
270 }
271 
273 {
274  // this hides / shows parts of the gui depending on the vehicle features
275  for (int i = 0; i < free_controls; i++)
276  {
277  bool enabled = manager->getEnabled(controls[i].linkID);
278 
279  controls[i].widget->setVisible(enabled);
280  }
281 }
282 
283 void DashBoard::update(float dt)
284 {
285  // walk all controls and animate them
286  for (int i = 0; i < free_controls; i++)
287  {
288  // get its value from its linkage
289  if (controls[i].animationType == ANIM_ROTATE)
290  {
291  // get the value
292  float val = manager->getNumeric(controls[i].linkID);
293  // calculate the angle
294  float angle = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
295 
296  if (fabs(val - controls[i].last) < 0.02f)
297  continue;
298 
299  controls[i].last = val;
300 
301  // enforce limits
302  if (angle < controls[i].wmin)
303  angle = controls[i].wmin;
304  else if (angle > controls[i].wmax)
305  angle = controls[i].wmax;
306  // rotate finally
307  controls[i].rotImg->setAngle(Ogre::Degree(angle).valueRadians());
308  }
309  else if (controls[i].animationType == ANIM_LAMP)
310  {
311  // or a lamp?
312  bool state = false;
313  // conditional
314  if (controls[i].condition == CONDITION_GREATER)
315  {
316  float val = manager->getNumeric(controls[i].linkID);
317  state = (val > controls[i].conditionArgument);
318  }
319  else if (controls[i].condition == CONDITION_LESSER)
320  {
321  float val = manager->getNumeric(controls[i].linkID);
322  state = (val < controls[i].conditionArgument);
323  }
324  else
325  {
326  state = (manager->getNumeric(controls[i].linkID) > 0);
327  }
328 
329  if (state == controls[i].lastState)
330  continue;
331  controls[i].lastState = state;
332 
333  // switch states
334  if (state)
335  {
336  controls[i].img->setImageTexture(String(controls[i].texture) + "-on.png");
337  }
338  else
339  {
340  controls[i].img->setImageTexture(String(controls[i].texture) + "-off.png");
341  }
342  }
343  else if (controls[i].animationType == ANIM_SERIES)
344  {
345  float val = manager->getNumeric(controls[i].linkID);
346 
347  String fn = String(controls[i].texture) + String("-") + TOSTRING((int)val) + String(".png");
348 
349  if (fabs(val - controls[i].last) < 0.2f)
350  continue;
351  controls[i].last = val;
352 
353  controls[i].img->setImageTexture(fn);
354  }
355  else if (controls[i].animationType == ANIM_SCALE)
356  {
357  float val = manager->getNumeric(controls[i].linkID);
358 
359  if (fabs(val - controls[i].last) < 0.2f)
360  continue;
361  controls[i].last = val;
362 
363  float scale = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
364  if (controls[i].direction == DIRECTION_UP)
365  {
366  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top - scale);
367  controls[i].widget->setSize(controls[i].initialSize.width, controls[i].initialSize.height + scale);
368  }
369  else if (controls[i].direction == DIRECTION_DOWN)
370  {
371  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top);
372  controls[i].widget->setSize(controls[i].initialSize.width, controls[i].initialSize.height + scale);
373  }
374  else if (controls[i].direction == DIRECTION_LEFT)
375  {
376  controls[i].widget->setPosition(controls[i].initialPosition.left - scale, controls[i].initialPosition.top);
377  controls[i].widget->setSize(controls[i].initialSize.width + scale, controls[i].initialSize.height);
378  }
379  else if (controls[i].direction == DIRECTION_RIGHT)
380  {
381  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top);
382  controls[i].widget->setSize(controls[i].initialSize.width + scale, controls[i].initialSize.height);
383  }
384  }
385  else if (controls[i].animationType == ANIM_TRANSLATE)
386  {
387  float val = manager->getNumeric(controls[i].linkID);
388 
389  if (fabs(val - controls[i].last) < 0.2f)
390  continue;
391  controls[i].last = val;
392 
393  float translation = (val - controls[i].vmin) * (controls[i].wmax - controls[i].wmin) / (controls[i].vmax - controls[i].vmin) + controls[i].wmin;
394  if (controls[i].direction == DIRECTION_UP)
395  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top - translation);
396  else if (controls[i].direction == DIRECTION_DOWN)
397  controls[i].widget->setPosition(controls[i].initialPosition.left, controls[i].initialPosition.top + translation);
398  else if (controls[i].direction == DIRECTION_LEFT)
399  controls[i].widget->setPosition(controls[i].initialPosition.left - translation, controls[i].initialPosition.top);
400  else if (controls[i].direction == DIRECTION_RIGHT)
401  controls[i].widget->setPosition(controls[i].initialPosition.left + translation, controls[i].initialPosition.top);
402  }
403  else if (controls[i].animationType == ANIM_TEXTFORMAT)
404  {
405  float val = manager->getNumeric(controls[i].linkID);
406 
407  if (fabs(val - controls[i].last) < 0.2f)
408  continue;
409  controls[i].last = val;
410 
411  MyGUI::UString s;
412  if (strlen(controls[i].format) == 0)
413  {
414  s = Ogre::StringConverter::toString(val);
415  }
416  else
417  {
418  char tmp[1024] = "";
419  sprintf(tmp, controls[i].format, val);
420 
421  // Detect and eliminate negative zero (-0) on output
422  if (strcmp(tmp, controls[i].format_neg_zero) == 0)
423  {
424  sprintf(tmp, controls[i].format, 0.f);
425  }
426 
427  s = MyGUI::UString(tmp);
428  }
429 
430  controls[i].txt->setCaption(s);
431  }
432  else if (controls[i].animationType == ANIM_TEXTSTRING)
433  {
434  char* val = manager->getChar(controls[i].linkID);
435  controls[i].txt->setCaption(MyGUI::UString(val));
436  }
437  }
438 }
439 
441 {
442  if (!mainWidget)
443  return;
444  mainWidget->setPosition(0, 0);
445  if (textureLayer)
446  {
447  // texture layers are independent from the screen size, but rather from the layer texture size
448  TexturePtr tex = TextureManager::getSingleton().getByName("RTTTexture1");
449  if (!tex.isNull())
450  mainWidget->setSize(tex->getWidth(), tex->getHeight());
451  }
452  else
453  {
454  MyGUI::IntSize screenSize = MyGUI::RenderManager::getInstance().getViewSize();
455  mainWidget->setSize(screenSize);
456  }
457 }
458 
459 void DashBoard::loadLayoutRecursive(MyGUI::WidgetPtr w)
460 {
461  std::string name = w->getName();
462  std::string anim = w->getUserString("anim");
463  std::string debug = w->getUserString("debug");
464  std::string linkArgs = w->getUserString("link");
465 
466  // make it unclickable
467  w->setUserString("interactive", "0");
468 
469  if (!debug.empty())
470  {
471  w->setVisible(false);
472  return;
473  }
474 
475  // find the root widget and ignore debug widgets
476  if (name.size() > prefix.size())
477  {
478  std::string prefixLessName = name.substr(prefix.size());
479  if (prefixLessName == "_Main")
480  {
481  mainWidget = (MyGUI::WindowPtr)w;
482  // resize it
483  windowResized();
484  }
485 
486  // ignore debug widgets
487  if (prefixLessName == "DEBUG")
488  {
489  w->setVisible(false);
490  return;
491  }
492  }
493 
494  // animations for this control?
495  if (!linkArgs.empty())
496  {
497  layoutLink_t ctrl;
498  memset(&ctrl, 0, sizeof(ctrl));
499 
500  if (!name.empty())
501  strncpy(ctrl.name, name.c_str(), 255);
502  ctrl.widget = w;
503  ctrl.initialSize = w->getSize();
504  ctrl.initialPosition = w->getPosition();
505  ctrl.last = 1337.1337f; // force update
506  ctrl.lastState = false;
507 
508  // establish the link
509  {
510  replaceString(linkArgs, "&gt;", ">");
511  replaceString(linkArgs, "&lt;", "<");
512  String linkName = "";
513  if (linkArgs.empty())
514  {
515  LOG("Dashboard ("+filename+"/"+name+"): empty Link");
516  return;
517  }
518  // conditional checks
519  // TODO: improve the logic, this is crap ...
520  if (linkArgs.find(">") != linkArgs.npos)
521  {
522  Ogre::StringVector args = Ogre::StringUtil::split(linkArgs, ">");
523  if (args.size() == 2)
524  {
525  linkName = args[0];
526  ctrl.conditionArgument = StringConverter::parseReal(args[1]);
528  }
529  else
530  {
531  LOG("Dashboard ("+filename+"/"+name+"): error in conditional Link: " + linkArgs);
532  return;
533  }
534  }
535  else if (linkArgs.find("<") != linkArgs.npos)
536  {
537  Ogre::StringVector args = Ogre::StringUtil::split(linkArgs, "<");
538  if (args.size() == 2)
539  {
540  linkName = args[0];
541  ctrl.conditionArgument = StringConverter::parseReal(args[1]);
543  }
544  else
545  {
546  LOG("Dashboard ("+filename+"/"+name+"): error in conditional Link: " + linkArgs);
547  return;
548  }
549  }
550  else
551  {
552  ctrl.condition = CONDITION_NONE;
553  ctrl.conditionArgument = 0;
554  linkName = linkArgs;
555  }
556 
557  // now try to get the enum id for it
558  int linkID = manager->getLinkIDForName(linkName);
559  if (linkID < 0)
560  {
561  LOG("Dashboard ("+filename+"/"+name+"): unknown Link: " + linkName);
562  return;
563  }
564 
565  ctrl.linkID = linkID;
566  }
567 
568  // parse more attributes
569  ctrl.wmin = StringConverter::parseReal(w->getUserString("min"));
570  ctrl.wmax = StringConverter::parseReal(w->getUserString("max"));
571  ctrl.vmin = StringConverter::parseReal(w->getUserString("vmin"));
572  ctrl.vmax = StringConverter::parseReal(w->getUserString("vmax"));
573 
574  String texture = w->getUserString("texture");
575  if (!texture.empty())
576  strncpy(ctrl.texture, texture.c_str(), 255);
577 
578  String format = w->getUserString("format");
579  if (!format.empty())
580  strncpy(ctrl.format, format.c_str(), 255);
581 
582  String direction = w->getUserString("direction");
583  if (direction == "right")
584  ctrl.direction = DIRECTION_RIGHT;
585  else if (direction == "left")
586  ctrl.direction = DIRECTION_LEFT;
587  else if (direction == "down")
588  ctrl.direction = DIRECTION_DOWN;
589  else if (direction == "up")
590  ctrl.direction = DIRECTION_UP;
591  else if (!direction.empty())
592  {
593  LOG("Dashboard ("+filename+"/"+name+"): unknown direction: " + direction);
594  return;
595  }
596  // then specializations
597  if (anim == "rotate")
598  {
599  ctrl.animationType = ANIM_ROTATE;
600  // check if its the correct control
601  // try to cast, will throw
602  // and if the link is a float
603  /*
604  if (manager->getDataType(ctrl.linkID) != DC_FLOAT)
605  {
606  LOG("Dashboard ("+filename+"/"+name+"): Rotating controls can only link to floats");
607  continue;
608  }
609  */
610 
611  try
612  {
613  ctrl.rotImg = w->getSubWidgetMain()->castType<MyGUI::RotatingSkin>();
614  }
615  catch (...)
616  {
617  LOG("Dashboard ("+filename+"/"+name+"): Rotating controls must use the RotatingSkin");
618  return;
619  }
620  if (!ctrl.rotImg)
621  {
622  LOG("Dashboard ("+filename+"/"+name+"): error loading rotation control");
623  return;
624  }
625 
626  // special: set rotation center now into the middle
627  ctrl.rotImg->setCenter(MyGUI::IntPoint(w->getHeight() * 0.5f, w->getWidth() * 0.5f));
628  }
629  else if (anim == "scale")
630  {
631  ctrl.animationType = ANIM_SCALE;
632  if (ctrl.direction == DIRECTION_NONE)
633  {
634  LOG("Dashboard ("+filename+"/"+name+"): direction empty: scale needs a direction");
635  return;
636  }
637  }
638  else if (anim == "translate")
639  {
641  if (ctrl.direction == DIRECTION_NONE)
642  {
643  LOG("Dashboard ("+filename+"/"+name+"): direction empty: translate needs a direction");
644  return;
645  }
646  }
647  else if (anim == "series")
648  {
649  ctrl.animationType = ANIM_SERIES;
650  ctrl.img = (MyGUI::ImageBox *)w; //w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
651  if (!ctrl.img)
652  {
653  LOG("Dashboard ("+filename+"/"+name+"): error loading series control");
654  return;
655  }
656  }
657  else if (anim == "textcolor" || anim == "textcolour")
658  {
660 
661  // try to cast, will throw
662  try
663  {
664  ctrl.txt = (MyGUI::TextBox *)w;
665  }
666  catch (...)
667  {
668  LOG("Dashboard ("+filename+"/"+name+"): textcolor controls must use the TextBox Control");
669  return;
670  }
671  }
672  else if (anim == "textformat")
673  {
674  // try to cast, will throw
675  try
676  {
677  ctrl.txt = (MyGUI::TextBox *)w; // w->getSubWidgetMain()->castType<MyGUI::TextBox>();
678  }
679  catch (...)
680  {
681  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
682  return;
683  }
685 
686  // Prepare for eliminating negative zero (-0.0) display
687  // Must be done on string-level because -0.001 with format "%1.0f" would still produce "-0"
688  if (std::strlen(ctrl.format))
689  {
690  std::snprintf(ctrl.format_neg_zero, 255, ctrl.format, -0.f);
691  }
692  }
693  else if (anim == "textstring")
694  {
695  // try to cast, will throw
696  try
697  {
698  ctrl.txt = (MyGUI::TextBox *)w; // w->getSubWidgetMain()->castType<MyGUI::TextBox>();
699  }
700  catch (...)
701  {
702  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
703  return;
704  }
706  }
707  else if (anim == "lamp")
708  {
709  // try to cast, will throw
710  /*
711  {
712  try
713  {
714  w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
715  }
716  catch (...)
717  {
718  LOG("Dashboard ("+filename+"/"+name+"): Lamp controls must use the ImageBox Control");
719  continue;
720  }
721  }
722  */
723  ctrl.animationType = ANIM_LAMP;
724  ctrl.img = (MyGUI::ImageBox *)w; //w->getSubWidgetMain()->castType<MyGUI::ImageBox>();
725  if (!ctrl.img)
726  {
727  LOG("Dashboard ("+filename+"/"+name+"): error loading Lamp control");
728  return;
729  }
730  }
731 
732  controls[free_controls] = ctrl;
733  free_controls++;
735  {
736  LOG("maximum amount of controls reached, discarding the rest: " + TOSTRING(MAX_CONTROLS));
737  return;
738  }
739  }
740 
741  // walk the children now
742  MyGUI::EnumeratorWidgetPtr e = w->getEnumerator();
743  while (e.next())
744  {
745  loadLayoutRecursive(e.current());
746  }
747 }
748 
750 {
751  widgets = MyGUI::LayoutManager::getInstance().loadLayout(filename, prefix, nullptr); // never has a parent
752 
753  for (MyGUI::VectorWidgetPtr::iterator iter = widgets.begin(); iter != widgets.end(); ++iter)
754  {
755  loadLayoutRecursive(*iter);
756  }
757 
758  // if this thing should be rendered to texture, relocate the main window to the RTT layer
759  if (textureLayer && mainWidget)
760  mainWidget->detachFromWidget("RTTLayer1");
761 }
762 
763 void DashBoard::setVisible(bool v, bool smooth)
764 {
765  visible = v;
766 
767  if (!mainWidget)
768  {
769  for (MyGUI::VectorWidgetPtr::iterator iter = widgets.begin(); iter != widgets.end(); ++iter)
770  {
771  (*iter)->setVisible(v);
772  }
773  return;
774  }
775 
776  /*
777  // buggy for some reason
778  if (smooth)
779  mainWidget->setVisibleSmooth(v);
780  */
781  mainWidget->setVisible(v);
782 }
RoR::DashBoard::windowResized
void windowResized()
Definition: DashBoardManager.cpp:440
RoR::DashBoard::ANIM_TEXTFORMAT
@ ANIM_TEXTFORMAT
Definition: DashBoardManager.h:277
RoR::DashBoard::DIRECTION_UP
@ DIRECTION_UP
Definition: DashBoardManager.h:288
RoR::DashBoardManager::windowResized
void windowResized()
Definition: DashBoardManager.cpp:237
RoR::DashBoard::widgets
MyGUI::VectorWidgetPtr widgets
Definition: DashBoardManager.h:267
RoR::DashBoardManager::getChar
char * getChar(size_t key)
Definition: DashBoardManager.h:216
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:200
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::DD_ENGINE_SPEEDO_KPH
@ DD_ENGINE_SPEEDO_KPH
Definition: DashBoardManager.h:87
RoR::DashBoard::CONDITION_LESSER
@ CONDITION_LESSER
Definition: DashBoardManager.h:298
RoR::DD_ACCELERATOR
@ DD_ACCELERATOR
Definition: DashBoardManager.h:103
RoR::DashBoard::ANIM_SCALE
@ ANIM_SCALE
Definition: DashBoardManager.h:276
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:140
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:287
RoR::DashBoard::ANIM_TEXTSTRING
@ ANIM_TEXTSTRING
Definition: DashBoardManager.h:278
RoR::DashBoardManager::loadDashBoard
int loadDashBoard(Ogre::String filename, bool textureLayer)
Definition: DashBoardManager.cpp:173
RoR::DashData
DashData
Definition: DashBoardManager.h:84
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::DashBoard::CONDITION_NONE
@ CONDITION_NONE
Definition: DashBoardManager.h:296
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:281
RoR::DD_TIES_MODE
@ DD_TIES_MODE
Definition: DashBoardManager.h:118
RoR::DashBoard::controls
layoutLink_t controls[MAX_CONTROLS]
Definition: DashBoardManager.h:332
RoR::DD_WING_AOA_3
@ DD_WING_AOA_3
Definition: DashBoardManager.h:165
RoR::DD_ENGINE_CLUTCH
@ DD_ENGINE_CLUTCH
automatic gear
Definition: DashBoardManager.h:100
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:272
RoR::DD_SCREW_THROTTLE_2
@ DD_SCREW_THROTTLE_2
Definition: DashBoardManager.h:123
Utils.h
RoR::DC_CHAR
@ DC_CHAR
Definition: DashBoardManager.h:58
RoR::DD_SCREW_STEER_3
@ DD_SCREW_STEER_3
Definition: DashBoardManager.h:131
RoR::DashBoardManager::getLinkNameForID
std::string getLinkNameForID(DashData id)
Definition: DashBoardManager.cpp:161
RoR::DD_WING_AOA_1
@ DD_WING_AOA_1
Definition: DashBoardManager.h:163
w
float w
Definition: (ValueTypes) quaternion.h:4
RoR::replaceString
void replaceString(std::string &str, std::string searchString, std::string replaceString)
Definition: Utils.h:52
RoR::DD_SCREW_STEER_1
@ DD_SCREW_STEER_1
Definition: DashBoardManager.h:129
RoR::DashBoard::loadLayoutInternal
void loadLayoutInternal()
Definition: DashBoardManager.cpp:749
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:763
RoR::DashBoard::visible
bool visible
Definition: DashBoardManager.h:269
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
RoR::DashBoard::filename
Ogre::String filename
Definition: DashBoardManager.h:266
RoR::DD_ENGINE_GEAR
@ DD_ENGINE_GEAR
clutch warning lamp
Definition: DashBoardManager.h:94
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::DD_ROLL
@ DD_ROLL
Definition: DashBoardManager.h:105
RoR::DashBoard::prefix
std::string prefix
Definition: DashBoardManager.h:270
RoR::DD_SIDELIGHTS
@ DD_SIDELIGHTS
Definition: DashBoardManager.h:191
RoR::DD_MAX
@ DD_MAX
Definition: DashBoardManager.h:201
RoR::DashBoardManager::setVisible3d
void setVisible3d(bool visibility)
Definition: DashBoardManager.cpp:226
RoR::dashData_t::name
const char * name
Definition: DashBoardManager.h:67
RoR::DashBoardManager::updateFeatures
void updateFeatures()
Definition: DashBoardManager.cpp:192
RoR::DashBoardManager::data
dashData_t data[DD_MAX]
Definition: DashBoardManager.h:244
RoR::DashBoard::DIRECTION_LEFT
@ DIRECTION_LEFT
Definition: DashBoardManager.h:291
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::DashBoardManager::getLinkIDForName
int getLinkIDForName(Ogre::String &str)
Definition: DashBoardManager.cpp:150
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:264
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:217
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::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:289
RoR::DashBoardManager::m_dashboards
std::vector< DashBoard * > m_dashboards
Definition: DashBoardManager.h:245
RoR::DashBoard::free_controls
int free_controls
Definition: DashBoardManager.h:333
RoR::DD_WING_AOA_0
@ DD_WING_AOA_0
Definition: DashBoardManager.h:162
RoR::DD_SIGNAL_TURNLEFT
@ DD_SIGNAL_TURNLEFT
Left blinker is lit.
Definition: DashBoardManager.h:197
RoR::DashBoardManager
Definition: DashBoardManager.h:205
RoR::dataContainer_t::value_float
float value_float
Definition: DashBoardManager.h:49
RoR::DashBoard::manager
DashBoardManager * manager
Definition: DashBoardManager.h:265
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
INITDATA
#define INITDATA(key, type, name)
Definition: DashBoardManager.cpp:34
RoR::DD_AEROENGINE_THROTTLE_2
@ DD_AEROENGINE_THROTTLE_2
Definition: DashBoardManager.h:141
RoR::DashBoard::loadLayoutRecursive
void loadLayoutRecursive(MyGUI::WidgetPtr ptr)
Definition: DashBoardManager.cpp:459
RoR::DD_AEROENGINE_RPM_3
@ DD_AEROENGINE_RPM_3
Definition: DashBoardManager.h:156
RoR::DashBoard::ANIM_TEXTCOLOR
@ ANIM_TEXTCOLOR
Definition: DashBoardManager.h:282
RoR::DD_AEROENGINE_FAILED_5
@ DD_AEROENGINE_FAILED_5
Definition: DashBoardManager.h:151
RoR::DashBoard::ANIM_LAMP
@ ANIM_LAMP
Definition: DashBoardManager.h:279
RoR::DashBoard
Definition: DashBoardManager.h:248
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:184
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
RoR::DashBoard::DIRECTION_DOWN
@ DIRECTION_DOWN
Definition: DashBoardManager.h:290
Ogre
Definition: ExtinguishableFireAffector.cpp:35
RoR::DashBoard::textureLayer
bool textureLayer
Definition: DashBoardManager.h:269
RoR::DashBoard::CONDITION_GREATER
@ CONDITION_GREATER
Definition: DashBoardManager.h:297
RoR::DashBoardManager::setVisible
void setVisible(bool visibility)
Definition: DashBoardManager.cpp:214
RoR::DashBoard::DashBoard
DashBoard(DashBoardManager *manager, Ogre::String filename, bool textureLayer)
Definition: DashBoardManager.cpp:247
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:280
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
RoR::DD_LOW_PRESSURE
@ DD_LOW_PRESSURE
locked lamp
Definition: DashBoardManager.h:114
RoR::DashBoard::update
void update(float dt)
Definition: DashBoardManager.cpp:283
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
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:268
RoR::DD_ENGINE_GEAR_STRING
@ DD_ENGINE_GEAR_STRING
Definition: DashBoardManager.h:96
RoR::DD_AEROENGINE_FAILED_1
@ DD_AEROENGINE_FAILED_1
Definition: DashBoardManager.h:147
RoR::DashBoardManager::visible
bool visible
Definition: DashBoardManager.h:243
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:275
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