27 #include <Overlay/OgreOverlayManager.h>
28 #include <Overlay/OgreOverlay.h>
29 #include <Overlay/OgreFontManager.h>
57 OverlayWrapper::OverlayWrapper()
63 OverlayWrapper::~OverlayWrapper()
65 showDashboardOverlays(
false,
nullptr);
69 void OverlayWrapper::resizePanel(OverlayElement* oe)
73 oe->setHeight(oe->getHeight() * (Real)win->getWidth() / (Real)win->getHeight());
74 oe->setTop(oe->getTop() * (Real)win->getWidth() / (Real)win->getHeight());
77 void OverlayWrapper::reposPanel(OverlayElement* oe)
81 oe->setTop(oe->getTop() * (Real)win->getWidth() / (Real)win->getHeight());
84 void OverlayWrapper::placeNeedle(SceneNode* node,
float x,
float y,
float len)
86 node->setPosition((
x - 640.0) / 444.0, (512 -
y) / 444.0, -2.0);
87 node->setScale(0.0025, 0.007 * len, 0.007);
90 Overlay* OverlayWrapper::loadOverlay(String name,
bool autoResizeRation)
92 Overlay* o = OverlayManager::getSingleton().getByName(name);
103 m_loaded_overlays.push_back(lo);
112 float w = win->getWidth();
113 float h = win->getHeight();
114 float s = (4.0f / 3.0f) / (
w / h);
118 s = (3.0f / 4.0f) / (h /
w);
122 lo.
o->setScroll(0, 0);
125 lo.
o->setScale(s, s);
126 lo.
o->scroll(1 - s, s - 1);
129 void OverlayWrapper::windowResized()
131 for (
auto it = m_loaded_overlays.begin(); it != m_loaded_overlays.end(); it++)
137 OverlayElement* OverlayWrapper::loadOverlayElement(String name)
139 return OverlayManager::getSingleton().getOverlayElement(name);
142 Ogre::TextureUnitState*
GetTexUnit(Ogre::String material_name)
144 return MaterialManager::getSingleton().getByName(material_name)->getTechnique(0)->getPass(0)->getTextureUnitState(0);
147 int OverlayWrapper::init()
149 m_machine_dashboard_overlay = loadOverlay(
"tracks/MachineDashboardOverlay");
150 m_aerial_dashboard.dash_overlay = loadOverlay(
"tracks/AirDashboardOverlay",
false);
151 m_aerial_dashboard.needles_overlay = loadOverlay(
"tracks/AirNeedlesOverlay",
false);
152 m_marine_dashboard_overlay = loadOverlay(
"tracks/BoatDashboardOverlay");
153 m_marine_dashboard_needles_overlay = loadOverlay(
"tracks/BoatNeedlesOverlay");
157 resizePanel(loadOverlayElement(
"tracks/pressureo"));
158 resizePanel(loadOverlayElement(
"tracks/pressureneedle"));
159 MaterialPtr m = MaterialManager::getSingleton().getByName(
"tracks/pressureneedle_mat");
161 pressuretexture = m->getTechnique(0)->getPass(0)->getTextureUnitState(0);
163 pressuretexture =
nullptr;
165 resizePanel(loadOverlayElement(
"tracks/machineinstructions"));
166 resizePanel(loadOverlayElement(
"tracks/machinehelppanel"));
168 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/machinedashbar"));
169 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/machinedashfiller"));
171 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/airdashbar"));
172 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/airdashfiller"));
174 OverlayElement* tempoe;
175 resizePanel(tempoe = OverlayManager::getSingleton().getOverlayElement(
"tracks/thrusttrack1"));
177 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/thrusttrack2"));
178 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/thrusttrack3"));
179 resizePanel(OverlayManager::getSingleton().getOverlayElement(
"tracks/thrusttrack4"));
181 resizePanel(m_aerial_dashboard.engines[0].thr_element = loadOverlayElement(
"tracks/thrust1"));
182 resizePanel(m_aerial_dashboard.engines[1].thr_element = loadOverlayElement(
"tracks/thrust2"));
183 resizePanel(m_aerial_dashboard.engines[2].thr_element = loadOverlayElement(
"tracks/thrust3"));
184 resizePanel(m_aerial_dashboard.engines[3].thr_element = loadOverlayElement(
"tracks/thrust4"));
186 thrtop = 1.0f + tempoe->getTop() + m_aerial_dashboard.engines[0].thr_element->getHeight() * 0.5f;
187 thrheight = tempoe->getHeight() - m_aerial_dashboard.engines[0].thr_element->getHeight() * 2.0f;
188 throffset = m_aerial_dashboard.engines[0].thr_element->getHeight() * 0.5f;
190 m_aerial_dashboard.thrust_track_top = thrtop;
191 m_aerial_dashboard.thrust_track_height = thrheight;
193 m_aerial_dashboard.engines[0].Setup(
"tracks/engfire1",
"tracks/thrust1");
194 m_aerial_dashboard.engines[1].Setup(
"tracks/engfire2",
"tracks/thrust2");
195 m_aerial_dashboard.engines[2].Setup(
"tracks/engfire3",
"tracks/thrust3");
196 m_aerial_dashboard.engines[3].Setup(
"tracks/engfire4",
"tracks/thrust4");
197 m_aerial_dashboard.engstarts[0].Setup(
"tracks/engstart1",
"tracks/engstart-on",
"tracks/engstart-off");
198 m_aerial_dashboard.engstarts[1].Setup(
"tracks/engstart2",
"tracks/engstart-on",
"tracks/engstart-off");
199 m_aerial_dashboard.engstarts[2].Setup(
"tracks/engstart3",
"tracks/engstart-on",
"tracks/engstart-off");
200 m_aerial_dashboard.engstarts[3].Setup(
"tracks/engstart4",
"tracks/engstart-on",
"tracks/engstart-off");
201 resizePanel(loadOverlayElement(
"tracks/airrpm1"));
202 resizePanel(loadOverlayElement(
"tracks/airrpm2"));
203 resizePanel(loadOverlayElement(
"tracks/airrpm3"));
204 resizePanel(loadOverlayElement(
"tracks/airrpm4"));
205 resizePanel(loadOverlayElement(
"tracks/airpitch1"));
206 resizePanel(loadOverlayElement(
"tracks/airpitch2"));
207 resizePanel(loadOverlayElement(
"tracks/airpitch3"));
208 resizePanel(loadOverlayElement(
"tracks/airpitch4"));
209 resizePanel(loadOverlayElement(
"tracks/airtorque1"));
210 resizePanel(loadOverlayElement(
"tracks/airtorque2"));
211 resizePanel(loadOverlayElement(
"tracks/airtorque3"));
212 resizePanel(loadOverlayElement(
"tracks/airtorque4"));
213 resizePanel(loadOverlayElement(
"tracks/airspeed"));
214 resizePanel(loadOverlayElement(
"tracks/vvi"));
215 resizePanel(loadOverlayElement(
"tracks/altimeter"));
216 resizePanel(loadOverlayElement(
"tracks/altimeter_val"));
217 m_aerial_dashboard.alt_value_textarea = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/altimeter_val");
218 boat_depth_value_taoe = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/boatdepthmeter_val");
219 resizePanel(loadOverlayElement(
"tracks/adi-tape"));
220 resizePanel(loadOverlayElement(
"tracks/adi"));
221 resizePanel(loadOverlayElement(
"tracks/adi-bugs"));
222 m_aerial_dashboard.adibugstexture =
GetTexUnit(
"tracks/adi-bugs");
223 m_aerial_dashboard.aditapetexture =
GetTexUnit(
"tracks/adi-tape");
224 resizePanel(loadOverlayElement(
"tracks/aoa"));
225 resizePanel(loadOverlayElement(
"tracks/hsi"));
226 resizePanel(loadOverlayElement(
"tracks/hsi-rose"));
227 resizePanel(loadOverlayElement(
"tracks/hsi-bug"));
228 resizePanel(loadOverlayElement(
"tracks/hsi-v"));
229 resizePanel(loadOverlayElement(
"tracks/hsi-h"));
230 m_aerial_dashboard.hsirosetexture =
GetTexUnit(
"tracks/hsi-rose");
231 m_aerial_dashboard.hsibugtexture =
GetTexUnit(
"tracks/hsi-bug");
232 m_aerial_dashboard.hsivtexture =
GetTexUnit(
"tracks/hsi-v");
233 m_aerial_dashboard.hsihtexture =
GetTexUnit(
"tracks/hsi-h");
235 reposPanel(loadOverlayElement(
"tracks/ap_hdg_pack"));
236 reposPanel(loadOverlayElement(
"tracks/ap_wlv_but"));
237 reposPanel(loadOverlayElement(
"tracks/ap_nav_but"));
238 reposPanel(loadOverlayElement(
"tracks/ap_alt_pack"));
239 reposPanel(loadOverlayElement(
"tracks/ap_vs_pack"));
240 reposPanel(loadOverlayElement(
"tracks/ap_ias_pack"));
241 reposPanel(loadOverlayElement(
"tracks/ap_gpws_but"));
242 reposPanel(loadOverlayElement(
"tracks/ap_brks_but"));
243 m_aerial_dashboard.hdg.Setup(
"tracks/ap_hdg_but",
"tracks/hdg-on",
"tracks/hdg-off");
244 m_aerial_dashboard.hdg_trim.Setup(
"tracks/ap_hdg_up",
"tracks/ap_hdg_dn",
"tracks/ap_hdg_val");
245 m_aerial_dashboard.wlv.Setup(
"tracks/ap_wlv_but",
"tracks/wlv-on",
"tracks/wlv-off");
246 m_aerial_dashboard.nav.Setup(
"tracks/ap_nav_but",
"tracks/nav-on",
"tracks/nav-off");
247 m_aerial_dashboard.alt.Setup(
"tracks/ap_alt_but",
"tracks/hold-on",
"tracks/hold-off");
248 m_aerial_dashboard.alt_trim.Setup(
"tracks/ap_alt_up",
"tracks/ap_alt_dn",
"tracks/ap_alt_val");
249 m_aerial_dashboard.vs.Setup(
"tracks/ap_vs_but",
"tracks/vs-on",
"tracks/vs-off");
250 m_aerial_dashboard.vs_trim.Setup(
"tracks/ap_vs_up",
"tracks/ap_vs_dn",
"tracks/ap_vs_val");
251 m_aerial_dashboard.ias.Setup(
"tracks/ap_ias_but",
"tracks/athr-on",
"tracks/athr-off");
252 m_aerial_dashboard.ias_trim.Setup(
"tracks/ap_ias_up",
"tracks/ap_ias_dn",
"tracks/ap_ias_val");
253 m_aerial_dashboard.gpws.Setup(
"tracks/ap_gpws_but",
"tracks/gpws-on",
"tracks/gpws-off");
254 m_aerial_dashboard.brks.Setup(
"tracks/ap_brks_but",
"tracks/brks-on",
"tracks/brks-off");
257 resizePanel(loadOverlayElement(
"tracks/boatdashbar"));
258 resizePanel(loadOverlayElement(
"tracks/boatdashfiller"));
259 resizePanel(loadOverlayElement(
"tracks/boatthrusttrack1"));
260 resizePanel(loadOverlayElement(
"tracks/boatthrusttrack2"));
265 resizePanel(bthro1 = loadOverlayElement(
"tracks/boatthrust1"));
266 resizePanel(bthro2 = loadOverlayElement(
"tracks/boatthrust2"));
268 resizePanel(loadOverlayElement(
"tracks/boatspeed"));
269 resizePanel(loadOverlayElement(
"tracks/boatsteer"));
270 resizePanel(loadOverlayElement(
"tracks/boatspeedneedle"));
271 resizePanel(loadOverlayElement(
"tracks/boatsteer/fg"));
272 boatspeedtexture = ((MaterialPtr)(MaterialManager::getSingleton().getByName(
"tracks/boatspeedneedle_mat")))->getTechnique(0)->getPass(0)->getTextureUnitState(0);
273 boatsteertexture = ((MaterialPtr)(MaterialManager::getSingleton().getByName(
"tracks/boatsteer/fg_mat")))->getTechnique(0)->getPass(0)->getTextureUnitState(0);
276 speedotexture = ((MaterialPtr)(MaterialManager::getSingleton().getByName(
"tracks/speedoneedle_mat")))->getTechnique(0)->getPass(0)->getTextureUnitState(0);
277 tachotexture = ((MaterialPtr)(MaterialManager::getSingleton().getByName(
"tracks/tachoneedle_mat"))) ->getTechnique(0)->getPass(0)->getTextureUnitState(0);
279 resizePanel(loadOverlayElement(
"tracks/airspeedneedle"));
280 m_aerial_dashboard.airspeedtexture =
GetTexUnit(
"tracks/airspeedneedle_mat");
282 resizePanel(loadOverlayElement(
"tracks/altimeterneedle"));
283 m_aerial_dashboard.altimetertexture =
GetTexUnit(
"tracks/altimeterneedle_mat");
285 resizePanel(loadOverlayElement(
"tracks/vvineedle"));
286 m_aerial_dashboard.vvitexture =
GetTexUnit(
"tracks/vvineedle_mat");
288 resizePanel(loadOverlayElement(
"tracks/aoaneedle"));
289 m_aerial_dashboard.aoatexture =
GetTexUnit(
"tracks/aoaneedle_mat");
291 resizePanel(loadOverlayElement(
"tracks/airrpm1needle"));
292 m_aerial_dashboard.engines[0].rpm_texture =
GetTexUnit(
"tracks/airrpm1needle_mat");
293 resizePanel(loadOverlayElement(
"tracks/airrpm2needle"));
294 m_aerial_dashboard.engines[1].rpm_texture =
GetTexUnit(
"tracks/airrpm2needle_mat");
295 resizePanel(loadOverlayElement(
"tracks/airrpm3needle"));
296 m_aerial_dashboard.engines[2].rpm_texture =
GetTexUnit(
"tracks/airrpm3needle_mat");
297 resizePanel(loadOverlayElement(
"tracks/airrpm4needle"));
298 m_aerial_dashboard.engines[3].rpm_texture =
GetTexUnit(
"tracks/airrpm4needle_mat");
300 resizePanel(loadOverlayElement(
"tracks/airpitch1needle"));
301 m_aerial_dashboard.engines[0].pitch_texture =
GetTexUnit(
"tracks/airpitch1needle_mat");
302 resizePanel(loadOverlayElement(
"tracks/airpitch2needle"));
303 m_aerial_dashboard.engines[1].pitch_texture =
GetTexUnit(
"tracks/airpitch2needle_mat");
304 resizePanel(loadOverlayElement(
"tracks/airpitch3needle"));
305 m_aerial_dashboard.engines[2].pitch_texture =
GetTexUnit(
"tracks/airpitch3needle_mat");
306 resizePanel(loadOverlayElement(
"tracks/airpitch4needle"));
307 m_aerial_dashboard.engines[3].pitch_texture =
GetTexUnit(
"tracks/airpitch4needle_mat");
309 resizePanel(loadOverlayElement(
"tracks/airtorque1needle"));
310 m_aerial_dashboard.engines[0].torque_texture =
GetTexUnit(
"tracks/airtorque1needle_mat");
311 resizePanel(loadOverlayElement(
"tracks/airtorque2needle"));
312 m_aerial_dashboard.engines[1].torque_texture =
GetTexUnit(
"tracks/airtorque2needle_mat");
313 resizePanel(loadOverlayElement(
"tracks/airtorque3needle"));
314 m_aerial_dashboard.engines[2].torque_texture =
GetTexUnit(
"tracks/airtorque3needle_mat");
315 resizePanel(loadOverlayElement(
"tracks/airtorque4needle"));
316 m_aerial_dashboard.engines[3].torque_texture =
GetTexUnit(
"tracks/airtorque4needle_mat");
318 guiGear = loadOverlayElement(
"tracks/Gear");
319 guiGear3D = loadOverlayElement(
"tracks/3DGear");
321 guiAuto[0] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/AGearR");
322 guiAuto[1] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/AGearN");
323 guiAuto[2] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/AGearD");
324 guiAuto[3] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/AGear2");
325 guiAuto[4] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/AGear1");
327 guiAuto3D[0] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/3DAGearR");
328 guiAuto3D[1] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/3DAGearN");
329 guiAuto3D[2] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/3DAGearD");
330 guiAuto3D[3] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/3DAGear2");
331 guiAuto3D[4] = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/3DAGear1");
333 m_truck_pressure_overlay = loadOverlay(
"tracks/PressureOverlay");
334 m_truck_pressure_needle_overlay = loadOverlay(
"tracks/PressureNeedleOverlay");
336 m_racing_overlay = loadOverlay(
"tracks/Racing",
false);
337 laptime = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/Racing/LapTime");
338 bestlaptime = (TextAreaOverlayElement*)loadOverlayElement(
"tracks/Racing/BestLapTime");
341 m_aerial_dashboard.SetupMouseHovers();
346 void OverlayWrapper::update(
float dt)
348 if (mTimeUntilNextToggle > 0)
349 mTimeUntilNextToggle -= dt;
352 void OverlayWrapper::showPressureOverlay(
bool show)
354 if (m_truck_pressure_overlay)
358 m_truck_pressure_overlay->show();
359 m_truck_pressure_needle_overlay->show();
363 m_truck_pressure_overlay->hide();
364 m_truck_pressure_needle_overlay->hide();
369 void OverlayWrapper::ToggleDashboardOverlays(
ActorPtr actor)
371 showDashboardOverlays(!m_dashboard_visible, actor);
376 m_dashboard_visible =
show;
391 m_aerial_dashboard.needles_overlay->show();
392 m_aerial_dashboard.dash_overlay->show();
394 else if (mode ==
BOAT)
396 m_marine_dashboard_needles_overlay->show();
397 m_marine_dashboard_overlay->show();
401 Ogre::OverlayElement* help_elem = OverlayManager::getSingleton().getOverlayElement(
"tracks/machinehelppanel");
408 help_elem->setMaterialName(
"tracks/black");
410 m_machine_dashboard_overlay->show();
415 m_aerial_dashboard.needles_overlay->hide();
416 m_aerial_dashboard.dash_overlay->hide();
418 m_marine_dashboard_needles_overlay->hide();
419 m_marine_dashboard_overlay->hide();
421 m_machine_dashboard_overlay->hide();
425 void OverlayWrapper::updateStats(
bool detailed)
427 static std::string currFps =
_L(
"Current FPS: ");
428 static std::string avgFps =
_L(
"Average FPS: ");
429 static std::string bestFps =
_L(
"Best FPS: ");
430 static std::string worstFps =
_L(
"Worst FPS: ");
431 static std::string tris =
_L(
"Triangle Count: ");
432 const RenderTarget::FrameStats& stats = win->getStatistics();
437 OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement(
"Core/AverageFps");
438 OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement(
"Core/CurrFps");
439 OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement(
"Core/BestFps");
440 OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement(
"Core/WorstFps");
442 guiAvg->setCaption(avgFps +
TOSTRING(stats.avgFPS));
443 guiCurr->setCaption(currFps +
TOSTRING(stats.lastFPS));
444 guiBest->setCaption(bestFps +
TOSTRING(stats.bestFPS) + (
" ") +
TOSTRING(stats.bestFrameTime) + (
" ms"));
445 guiWorst->setCaption(worstFps +
TOSTRING(stats.worstFPS) + (
" ") +
TOSTRING(stats.worstFrameTime) + (
" ms"));
447 OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement(
"Core/NumTris");
448 std::string triss = tris +
TOSTRING(stats.triangleCount);
449 if (stats.triangleCount > 1000000)
450 triss = tris +
TOSTRING(stats.triangleCount/1000000.0f) + (
" M");
451 else if (stats.triangleCount > 1000)
452 triss = tris +
TOSTRING(stats.triangleCount/1000.0f) + (
" k");
453 guiTris->setCaption(triss);
456 std::string memoryText;
457 if (TextureManager::getSingleton().getMemoryUsage() > 1)
458 memoryText = memoryText +
_L(
"Textures: ") +
formatBytes(TextureManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(TextureManager::getSingleton().getMemoryBudget()) + (
"\n");
459 if (CompositorManager::getSingleton().getMemoryUsage() > 1)
460 memoryText = memoryText +
_L(
"Compositors: ") +
formatBytes(CompositorManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(CompositorManager::getSingleton().getMemoryBudget()) + (
"\n");
461 if (FontManager::getSingleton().getMemoryUsage() > 1)
462 memoryText = memoryText +
_L(
"Fonts: ") +
formatBytes(FontManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(FontManager::getSingleton().getMemoryBudget()) + (
"\n");
463 if (GpuProgramManager::getSingleton().getMemoryUsage() > 1)
464 memoryText = memoryText +
_L(
"GPU Program: ") +
formatBytes(GpuProgramManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(GpuProgramManager::getSingleton().getMemoryBudget()) + (
"\n");
465 if (HighLevelGpuProgramManager::getSingleton().getMemoryUsage() > 1)
466 memoryText = memoryText +
_L(
"HL GPU Program: ") +
formatBytes(HighLevelGpuProgramManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(HighLevelGpuProgramManager::getSingleton().getMemoryBudget()) + (
"\n");
467 if (MaterialManager::getSingleton().getMemoryUsage() > 1)
468 memoryText = memoryText +
_L(
"Materials: ") +
formatBytes(MaterialManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(MaterialManager::getSingleton().getMemoryBudget()) + (
"\n");
469 if (MeshManager::getSingleton().getMemoryUsage() > 1)
470 memoryText = memoryText +
_L(
"Meshes: ") +
formatBytes(MeshManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(MeshManager::getSingleton().getMemoryBudget()) + (
"\n");
471 if (SkeletonManager::getSingleton().getMemoryUsage() > 1)
472 memoryText = memoryText +
_L(
"Skeletons: ") +
formatBytes(SkeletonManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(SkeletonManager::getSingleton().getMemoryBudget()) + (
"\n");
473 if (MaterialManager::getSingleton().getMemoryUsage() > 1)
474 memoryText = memoryText +
_L(
"Materials: ") +
formatBytes(MaterialManager::getSingleton().getMemoryUsage()) + (
" / ") +
formatBytes(MaterialManager::getSingleton().getMemoryBudget()) + (
"\n");
475 memoryText = memoryText + (
"\n");
477 OverlayElement* memoryDbg = OverlayManager::getSingleton().getOverlayElement(
"Core/MemoryText");
478 memoryDbg->setCaption(memoryText);
480 float sumMem = TextureManager::getSingleton().getMemoryUsage() + CompositorManager::getSingleton().getMemoryUsage() + FontManager::getSingleton().getMemoryUsage() + GpuProgramManager::getSingleton().getMemoryUsage() + HighLevelGpuProgramManager::getSingleton().getMemoryUsage() + MaterialManager::getSingleton().getMemoryUsage() + MeshManager::getSingleton().getMemoryUsage() + SkeletonManager::getSingleton().getMemoryUsage() + MaterialManager::getSingleton().getMemoryUsage();
481 String sumMemoryText =
_L(
"Memory (Ogre): ") +
formatBytes(sumMem) + (
"\n");
483 OverlayElement* memorySumDbg = OverlayManager::getSingleton().getOverlayElement(
"Core/CurrMemory");
484 memorySumDbg->setCaption(sumMemoryText);
492 bool OverlayWrapper::handleMousePressed()
496 || !m_aerial_dashboard.needles_overlay->isVisible()
497 || !m_aerial_dashboard.hovered_widget)
508 OverlayElement* element = m_aerial_dashboard.hovered_widget->GetHoveredElement();
512 for (
int i = 0; i < num_engines; ++i)
514 if (element == m_aerial_dashboard.engines[i].thr_element)
516 m_aerial_dashboard.mouse_drag_in_progress =
true;
520 for (
int i = 0; i < num_engines; ++i)
522 if (element == m_aerial_dashboard.engstarts[i].element)
528 if (player_actor->
ar_autopilot && mTimeUntilNextToggle <= 0)
531 if (element == m_aerial_dashboard.hdg.element)
533 mTimeUntilNextToggle = 0.2;
536 if (element == m_aerial_dashboard.wlv.element)
538 mTimeUntilNextToggle = 0.2;
541 if (element == m_aerial_dashboard.nav.element)
543 mTimeUntilNextToggle = 0.2;
547 if (element == m_aerial_dashboard.alt.element)
549 mTimeUntilNextToggle = 0.2;
552 if (element == m_aerial_dashboard.vs.element)
554 mTimeUntilNextToggle = 0.2;
558 if (element == m_aerial_dashboard.ias.element)
560 mTimeUntilNextToggle = 0.2;
564 if (element == m_aerial_dashboard.gpws.element)
566 mTimeUntilNextToggle = 0.2;
570 if (element == m_aerial_dashboard.brks.element)
572 mTimeUntilNextToggle = 0.2;
576 if (element == m_aerial_dashboard.hdg_trim.up_button)
578 mTimeUntilNextToggle = 0.1;
581 if (element == m_aerial_dashboard.hdg_trim.dn_button)
583 mTimeUntilNextToggle = 0.1;
586 if (element == m_aerial_dashboard.alt_trim.up_button)
588 mTimeUntilNextToggle = 0.1;
591 if (element == m_aerial_dashboard.alt_trim.dn_button)
593 mTimeUntilNextToggle = 0.1;
596 if (element == m_aerial_dashboard.vs_trim.up_button)
598 mTimeUntilNextToggle = 0.1;
601 if (element == m_aerial_dashboard.vs_trim.dn_button)
603 mTimeUntilNextToggle = 0.1;
606 if (element == m_aerial_dashboard.ias_trim.up_button)
608 mTimeUntilNextToggle = 0.1;
611 if (element == m_aerial_dashboard.ias_trim.dn_button)
613 mTimeUntilNextToggle = 0.1;
622 bool OverlayWrapper::handleMouseMoved()
625 if (!player_actor || !m_aerial_dashboard.needles_overlay->isVisible())
631 if (m_aerial_dashboard.mouse_drag_in_progress)
634 float thr_value = 1.0f - ((mousepos.y - thrtop - throffset) / thrheight);
635 for (
int i = 0; i < num_engines; ++i)
637 if (m_aerial_dashboard.hovered_widget == &m_aerial_dashboard.engines[i])
646 m_aerial_dashboard.UpdateMouseHovers();
651 bool OverlayWrapper::handleMouseReleased()
657 if (!ms.buttonDown(OIS::MB_Left))
659 m_aerial_dashboard.mouse_drag_in_progress =
false;
669 this->showPressureOverlay(
true);
671 Real angle = 135.0 - pressure * 2.7;
672 pressuretexture->setTextureRotate(Degree(angle));
676 this->showPressureOverlay(
false);
684 if (vehicle_getgear > 0)
688 guiGear->setCaption(gearstr);
689 guiGear3D->setCaption(gearstr);
691 else if (vehicle_getgear == 0)
693 guiGear->setCaption(
"N");
694 guiGear3D->setCaption(
"N");
698 guiGear->setCaption(
"R");
699 guiGear3D->setCaption(
"R");
704 for (
int i = 0; i < 5; i++)
710 guiAuto[i]->setColourTop(ColourValue(1.0, 0.2, 0.2, 1.0));
711 guiAuto[i]->setColourBottom(ColourValue(0.8, 0.1, 0.1, 1.0));
712 guiAuto3D[i]->setColourTop(ColourValue(1.0, 0.2, 0.2, 1.0));
713 guiAuto3D[i]->setColourBottom(ColourValue(0.8, 0.1, 0.1, 1.0));
717 guiAuto[i]->setColourTop(ColourValue(1.0, 1.0, 1.0, 1.0));
718 guiAuto[i]->setColourBottom(ColourValue(0.8, 0.8, 0.8, 1.0));
719 guiAuto3D[i]->setColourTop(ColourValue(1.0, 1.0, 1.0, 1.0));
720 guiAuto3D[i]->setColourBottom(ColourValue(0.8, 0.8, 0.8, 1.0));
727 guiAuto[i]->setColourTop(ColourValue(0.4, 0.05, 0.05, 1.0));
728 guiAuto[i]->setColourBottom(ColourValue(0.3, 0.02, 0.2, 1.0));
729 guiAuto3D[i]->setColourTop(ColourValue(0.4, 0.05, 0.05, 1.0));
730 guiAuto3D[i]->setColourBottom(ColourValue(0.3, 0.02, 0.2, 1.0));
734 guiAuto[i]->setColourTop(ColourValue(0.4, 0.4, 0.4, 1.0));
735 guiAuto[i]->setColourBottom(ColourValue(0.3, 0.3, 0.3, 1.0));
736 guiAuto3D[i]->setColourTop(ColourValue(0.4, 0.4, 0.4, 1.0));
737 guiAuto3D[i]->setColourBottom(ColourValue(0.3, 0.3, 0.3, 1.0));
745 angle = std::max(-140.0f, angle);
746 speedotexture->setTextureRotate(Degree(angle));
749 Real tachoFactor = 0.072;
755 angle = std::max(-120.0f, angle);
756 angle = std::min(angle, 121.0f);
757 tachotexture->setTextureRotate(Degree(angle));
766 int num_ae =
static_cast<int>( simbuf_ae.size() );
769 m_aerial_dashboard.SetThrottle(0,
true, simbuf_ae[0].simbuf_ae_throttle);
770 m_aerial_dashboard.SetThrottle(1, (num_ae > 1), (num_ae > 1) ? simbuf_ae[1].simbuf_ae_throttle : 0.f);
771 m_aerial_dashboard.SetThrottle(2, (num_ae > 2), (num_ae > 2) ? simbuf_ae[2].simbuf_ae_throttle : 0.f);
772 m_aerial_dashboard.SetThrottle(3, (num_ae > 3), (num_ae > 3) ? simbuf_ae[3].simbuf_ae_throttle : 0.f);
775 m_aerial_dashboard.SetEngineFailed(0, simbuf_ae[0].simbuf_ae_failed);
776 m_aerial_dashboard.SetEngineFailed(1, num_ae > 1 && simbuf_ae[1].simbuf_ae_failed);
777 m_aerial_dashboard.SetEngineFailed(2, num_ae > 2 && simbuf_ae[2].simbuf_ae_failed);
778 m_aerial_dashboard.SetEngineFailed(3, num_ae > 3 && simbuf_ae[3].simbuf_ae_failed);
785 float altitude =
nodes[0].AbsPosition.y;
787 float sea_level_pressure = 101325;
789 float airpressure = sea_level_pressure * pow(1.0 - 0.0065 * altitude / 288.15, 5.24947);
790 float airdensity = airpressure * 0.0000120896;
792 float kt = ground_speed_kt * sqrt(airdensity / 1.225);
796 angle = ((kt - 23.0) / 1.111);
798 angle = (24.0 + (kt - 50.0) / 0.8621);
800 angle = (82.0 + (kt - 100.0) / 0.8065);
804 m_aerial_dashboard.airspeedtexture->setTextureRotate(Degree(-angle));
810 float absangle = angle;
812 absangle = -absangle;
825 m_aerial_dashboard.aoatexture->setTextureRotate(Degree(-angle * 4.7 + 90.0));
828 angle =
nodes[0].AbsPosition.y * 1.1811;
829 m_aerial_dashboard.altimetertexture->setTextureRotate(Degree(-angle));
831 sprintf(altc,
"%03u", (
int)(
nodes[0].AbsPosition.y / 30.48));
832 m_aerial_dashboard.alt_value_textarea->setCaption(altc);
838 float rollangle = asin(rollv.dotProduct(Vector3::UNIT_Y));
842 float pitchangle = asin(dirv.dotProduct(Vector3::UNIT_Y));
843 Vector3 upv = dirv.crossProduct(-rollv);
845 rollangle = 3.14159 - rollangle;
846 m_aerial_dashboard.adibugstexture->setTextureRotate(Radian(-rollangle));
847 m_aerial_dashboard.aditapetexture->setTextureVScroll(-pitchangle * 0.25);
848 m_aerial_dashboard.aditapetexture->setTextureRotate(Radian(-rollangle));
851 float dirangle = atan2(dirv.dotProduct(Vector3::UNIT_X), dirv.dotProduct(-Vector3::UNIT_Z));
852 m_aerial_dashboard.hsirosetexture->setTextureRotate(Radian(dirangle));
868 m_aerial_dashboard.hsivtexture->setTextureUScroll(-hdev * 0.02);
873 m_aerial_dashboard.hsihtexture->setTextureVScroll(-vdev * 0.02);
877 if (vvi < 1000.0 && vvi > -1000.0)
879 if (vvi > 1000.0 && vvi < 6000.0)
880 angle = 47.0 + (vvi - 1000.0) * 0.01175;
883 if (vvi < -1000.0 && vvi > -6000.0)
884 angle = -47.0 + (vvi + 1000.0) * 0.01175;
887 m_aerial_dashboard.vvitexture->setTextureRotate(Degree(-angle + 90.0));
889 const bool is_prop = simbuf_ae[0].simbuf_ae_type == AeroEngineType::AE_XPROP;
892 m_aerial_dashboard.SetEngineRpm(0, simbuf_ae[0].simbuf_ae_rpmpc);
893 m_aerial_dashboard.SetEngineRpm(1, (num_ae > 1) ? simbuf_ae[1].simbuf_ae_rpmpc : 0.f);
894 m_aerial_dashboard.SetEngineRpm(2, (num_ae > 2) ? simbuf_ae[2].simbuf_ae_rpmpc : 0.f);
895 m_aerial_dashboard.SetEngineRpm(3, (num_ae > 3) ? simbuf_ae[3].simbuf_ae_rpmpc : 0.f);
898 m_aerial_dashboard.SetEnginePitch(0, (is_prop) ? simbuf_ae[0].simbuf_tp_aepitch : 0.f);
899 m_aerial_dashboard.SetEnginePitch(1, (num_ae > 1 && is_prop) ? simbuf_ae[1].simbuf_tp_aepitch : 0.f);
900 m_aerial_dashboard.SetEnginePitch(2, (num_ae > 2 && is_prop) ? simbuf_ae[2].simbuf_tp_aepitch : 0.f);
901 m_aerial_dashboard.SetEnginePitch(3, (num_ae > 3 && is_prop) ? simbuf_ae[3].simbuf_tp_aepitch : 0.f);
904 m_aerial_dashboard.SetEngineTorque(0, (is_prop) ? simbuf_ae[0].simbuf_tp_aetorque : 0.f);
905 m_aerial_dashboard.SetEngineTorque(1, (num_ae > 1 && is_prop) ? simbuf_ae[1].simbuf_tp_aetorque : 0.f);
906 m_aerial_dashboard.SetEngineTorque(2, (num_ae > 2 && is_prop) ? simbuf_ae[2].simbuf_tp_aetorque : 0.f);
907 m_aerial_dashboard.SetEngineTorque(3, (num_ae > 3 && is_prop) ? simbuf_ae[3].simbuf_tp_aetorque : 0.f);
910 m_aerial_dashboard.SetIgnition(0,
true, simbuf_ae[0].simbuf_ae_ignition);
911 m_aerial_dashboard.SetIgnition(1, num_ae > 1, num_ae > 1 && simbuf_ae[1].simbuf_ae_ignition);
912 m_aerial_dashboard.SetIgnition(2, num_ae > 2, num_ae > 2 && simbuf_ae[2].simbuf_ae_ignition);
913 m_aerial_dashboard.SetIgnition(3, num_ae > 3, num_ae > 3 && simbuf_ae[3].simbuf_ae_ignition);
934 m_aerial_dashboard.vs_trim.display->setCaption(
"000");
941 void OverlayWrapper::UpdateMarineHUD(
ActorPtr vehicle)
953 if (height > 0.1 && height < 99.9)
955 sprintf(tmp,
"%2.1f", height);
956 boat_depth_value_taoe->setCaption(tmp);
960 boat_depth_value_taoe->setCaption(
"--.-");
966 float kt = cam_dir.dotProduct(velocity) * 1.9438;
967 float angle = kt * 4.2;
968 boatspeedtexture->setTextureRotate(Degree(-angle));
972 void OverlayWrapper::ShowRacingOverlay()
974 m_racing_overlay->show();
977 void OverlayWrapper::HideRacingOverlay()
979 m_racing_overlay->hide();
985 std::string txt =
StringUtil::format(
"%.2i'%.2i.%.2i", (
int)(time) / 60, (
int)(time) % 60, (
int)(time * 100.0) % 100);
986 this->laptime->setCaption(txt);
990 txt =
StringUtil::format(
"%.2i'%.2i.%.2i", (
int)(time) / 60, (
int)(time) % 60, (
int)(time * 100.0) % 100);
991 this->bestlaptime->setCaption(txt);
992 this->bestlaptime->show();
996 this->bestlaptime->hide();
1000 Ogre::ColourValue colour = Ogre::ColourValue::White;
1001 if (time_diff > 0.0f)
1003 colour = ColourValue(0.8, 0.0, 0.0);
1005 else if (time_diff < 0.0f)
1007 colour = ColourValue(0.0, 0.8, 0.0);
1009 this->laptime->setColourTop(colour);
1010 this->laptime->setColourBottom(colour);
1013 void AeroDashOverlay::SetThrottle(
int engine,
bool visible,
float value)
1017 engines[engine].thr_element->show();
1018 engines[engine].thr_element->setTop(
1019 thrust_track_top + thrust_track_height * (1.0 - value) - 1.0);
1023 engines[engine].thr_element->hide();
1027 void AeroDashOverlay::SetEngineFailed(
int engine,
bool value)
1029 engines[engine].engfire_element->setMaterialName(
1030 value ?
"tracks/engfire-on" :
"tracks/engfire-off");
1033 void AeroDashOverlay::SetEngineRpm(
int engine,
float pcent)
1037 angle = -5.0 + pcent * 1.9167;
1038 else if (pcent < 110.0)
1039 angle = 110.0 + (pcent - 60.0) * 4.075;
1042 engines[engine].rpm_texture->setTextureRotate(Ogre::Degree(-angle));
1045 void AeroDashOverlay::SetEnginePitch(
int engine,
float value)
1047 engines[engine].pitch_texture->setTextureRotate(Degree(-value * 2.0));
1050 void AeroDashOverlay::SetEngineTorque(
int engine,
float pcent)
1054 angle = -5.0 + pcent * 1.9167;
1055 else if (pcent < 110.0)
1056 angle = 110.0 + (pcent - 60.0) * 4.075;
1059 engines[engine].torque_texture->setTextureRotate(Degree(-angle));
1062 void AeroDashOverlay::SetIgnition(
int engine,
bool visible,
bool ignited)
1066 engstarts[engine].element->show();
1067 engstarts[engine].SetActive(ignited);
1071 engstarts[engine].element->hide();
1078 void AeroEngineWidget::Setup(std::string
const& engfire_elemname, std::string
const& thr_elemname)
1081 engfire_element = Ogre::OverlayManager::getSingleton().getOverlayElement(engfire_elemname);
1082 thr_element = Ogre::OverlayManager::getSingleton().getOverlayElement(thr_elemname);
1083 thr_material = thr_element->getMaterial()->clone(thr_element->getMaterial()->getName() +
"@" + thr_elemname);
1084 thr_element->setMaterial(thr_material);
1087 AeroEngineWidget::~AeroEngineWidget()
1090 Ogre::MaterialManager::getSingleton().remove(thr_material);
1093 bool AeroEngineWidget::UpdateMouseHover()
1096 bool retval =
false;
1097 if (retval = thr_element->contains(mouse_pos.x, mouse_pos.y))
1099 AeroDashOverlay::SetMaterialHighlighted(thr_element->getMaterial(),
true);
1103 AeroDashOverlay::SetMaterialHighlighted(thr_element->getMaterial(),
false);
1108 Ogre::OverlayElement* AeroEngineWidget::GetHoveredElement()
const
1116 void AeroSwitchWidget::SetActive(
bool value)
1118 element->setMaterial(value ? on_material : off_material);
1121 void AeroSwitchWidget::Setup(std::string
const & elem_name, std::string
const & mat_on, std::string
const & mat_off)
1124 element = Ogre::OverlayManager::getSingleton().getOverlayElement(elem_name);
1125 on_material = Ogre::MaterialManager::getSingleton().getByName(mat_on)->clone(elem_name +
"@" + mat_on);
1126 off_material = Ogre::MaterialManager::getSingleton().getByName(mat_off)->clone(elem_name +
"@" + mat_off);
1129 AeroSwitchWidget::~AeroSwitchWidget()
1132 Ogre::MaterialManager::getSingleton().remove(on_material);
1133 Ogre::MaterialManager::getSingleton().remove(off_material);
1136 bool AeroSwitchWidget::UpdateMouseHover()
1140 bool retval =
false;
1141 if (retval = element->contains(mouse_pos.x, mouse_pos.y))
1143 AeroDashOverlay::SetMaterialHighlighted(on_material,
true);
1144 AeroDashOverlay::SetMaterialHighlighted(off_material,
true);
1148 AeroDashOverlay::SetMaterialHighlighted(on_material,
false);
1149 AeroDashOverlay::SetMaterialHighlighted(off_material,
false);
1154 Ogre::OverlayElement* AeroSwitchWidget::GetHoveredElement()
const
1162 void AeroTrimWidget::Setup(std::string
const & up, std::string
const & dn, std::string
const & disp)
1165 display = Ogre::OverlayManager::getSingleton().getOverlayElement(disp);
1166 up_button = Ogre::OverlayManager::getSingleton().getOverlayElement(up);
1167 up_material = up_button->getMaterial()->clone(up +
"$" + disp);
1168 up_button->setMaterial(up_material);
1169 dn_button = Ogre::OverlayManager::getSingleton().getOverlayElement(dn);
1170 down_material = dn_button->getMaterial()->clone(dn +
"$" + disp);
1171 dn_button->setMaterial(down_material);
1174 AeroTrimWidget::~AeroTrimWidget()
1177 Ogre::MaterialManager::getSingleton().remove(up_material);
1178 Ogre::MaterialManager::getSingleton().remove(down_material);
1181 bool AeroTrimWidget::UpdateMouseHover()
1185 bool retval =
false;
1186 if (retval = up_button->contains(mouse_pos.x, mouse_pos.y))
1188 hovered_button = up_button;
1189 AeroDashOverlay::SetMaterialHighlighted(up_button->getMaterial(),
true);
1190 AeroDashOverlay::SetMaterialHighlighted(dn_button->getMaterial(),
false);
1192 else if (retval = dn_button->contains(mouse_pos.x, mouse_pos.y))
1194 hovered_button = dn_button;
1195 AeroDashOverlay::SetMaterialHighlighted(up_button->getMaterial(),
false);
1196 AeroDashOverlay::SetMaterialHighlighted(dn_button->getMaterial(),
true);
1200 hovered_button =
nullptr;
1201 AeroDashOverlay::SetMaterialHighlighted(up_button->getMaterial(),
false);
1202 AeroDashOverlay::SetMaterialHighlighted(dn_button->getMaterial(),
false);
1207 Ogre::OverlayElement* AeroTrimWidget::GetHoveredElement()
const
1209 return hovered_button;
1212 void AeroTrimWidget::DisplayFormat(
const char* fmt, ...)
1214 char buffer[500] = {};
1217 va_start(args, fmt);
1218 vsprintf(buffer, fmt, args);
1221 display->setCaption(buffer);
1227 void AeroDashOverlay::SetMaterialHighlighted(Ogre::MaterialPtr mat,
bool val)
1236 mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setColourOperationEx(
1237 Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_CURRENT);
1242 mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setColourOperationEx(
1243 Ogre::LBX_ADD, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL, Ogre::ColourValue::White, ColourValue(0.32, 0.3, 0.25));
1247 void AeroDashOverlay::SetupMouseHovers()
1250 aero_widgets.push_back(&engines[0]);
1251 aero_widgets.push_back(&engines[1]);
1252 aero_widgets.push_back(&engines[2]);
1253 aero_widgets.push_back(&engines[3]);
1256 aero_widgets.push_back(&engstarts[0]);
1257 aero_widgets.push_back(&engstarts[1]);
1258 aero_widgets.push_back(&engstarts[2]);
1259 aero_widgets.push_back(&engstarts[3]);
1262 aero_widgets.push_back(&hdg );
1263 aero_widgets.push_back(&wlv );
1264 aero_widgets.push_back(&nav );
1265 aero_widgets.push_back(&alt );
1266 aero_widgets.push_back(&vs );
1267 aero_widgets.push_back(&ias );
1268 aero_widgets.push_back(&gpws );
1269 aero_widgets.push_back(&brks );
1272 aero_widgets.push_back(&hdg_trim);
1273 aero_widgets.push_back(&alt_trim);
1274 aero_widgets.push_back(&vs_trim);
1275 aero_widgets.push_back(&ias_trim);
1278 void AeroDashOverlay::UpdateMouseHovers()
1280 for (
auto elem : aero_widgets)
1282 if (elem->UpdateMouseHover())
1284 hovered_widget = elem;