Revision: 2622
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2622&view=rev
Author:   ulteq
Date:     2012-05-22 02:35:45 +0000 (Tue, 22 May 2012)
Log Message:
-----------
-Cleanup: major cleanup
added dead zone for g-forces
"Commands:" overlay element always hidden for now

Modified Paths:
--------------
    trunk/source/main/gui/TruckHUD.cpp
    trunk/source/main/gui/TruckHUD.h

Modified: trunk/source/main/gui/TruckHUD.cpp
===================================================================
--- trunk/source/main/gui/TruckHUD.cpp  2012-05-21 23:05:25 UTC (rev 2621)
+++ trunk/source/main/gui/TruckHUD.cpp  2012-05-22 02:35:45 UTC (rev 2622)
@@ -24,82 +24,29 @@
 #include "BeamEngine.h"
 #include "InputEngine.h"
 #include "language.h"
-#include "Ogre.h"
 #include "utils.h"
 
 using namespace Ogre;
 
-TruckHUD::TruckHUD()
+TruckHUD::TruckHUD() :
+         border(0)     
+       , updatetime(0.0f)
+       , width(450)
 {
-       width = 450;
-       border = 10;
-
        // init counters
-       maxVelos[NOT_DRIVEABLE] = -9999;
-       minVelos[NOT_DRIVEABLE] = 9999;
-       avVelos[NOT_DRIVEABLE] = 0;
+       for (int i=NOT_DRIVEABLE; i < AI; i++)
+       {
+               maxVelos[i] = maxPosVerG[i] = maxPosSagG[i] = maxPosLatG[i] = 
-9999;
+               minVelos[i] = maxNegVerG[i] = maxNegSagG[i] = maxNegLatG[i] = 
9999;
+               avVelos[i] = 0;
+       }
 
-       maxVelos[TRUCK] = -9999;
-       minVelos[TRUCK] = 9999;
-       avVelos[TRUCK] = 0;
-
-       maxVelos[AIRPLANE] = -9999;
-       minVelos[AIRPLANE] = 9999;
-       avVelos[AIRPLANE] = 0;
-
-       maxVelos[BOAT] = -9999;
-       minVelos[BOAT] = 9999;
-       avVelos[BOAT] = 0;
-
-       maxVelos[MACHINE] = -9999;
-       minVelos[MACHINE] = 9999;
-       avVelos[MACHINE] = 0;
-
-       maxPosVerG[NOT_DRIVEABLE] =  -9999;
-       maxPosVerG[TRUCK] =  -9999;
-       maxPosVerG[AIRPLANE] = -9999;
-       maxPosVerG[BOAT] = -9999;
-       maxPosVerG[MACHINE] = -9999;
-       maxNegVerG[NOT_DRIVEABLE] =  9999;
-       maxNegVerG[TRUCK] =  9999;
-       maxNegVerG[AIRPLANE] = 9999;
-       maxNegVerG[BOAT] = 9999;
-       maxNegVerG[MACHINE] = 9999;
-
-       maxPosSagG[NOT_DRIVEABLE] =  -9999;
-       maxPosSagG[TRUCK] =  -9999;
-       maxPosSagG[AIRPLANE] = -9999;
-       maxPosSagG[BOAT] = -9999;
-       maxPosSagG[MACHINE] = -9999;
-       maxNegSagG[NOT_DRIVEABLE] =  9999;
-       maxNegSagG[TRUCK] =  9999;
-       maxNegSagG[AIRPLANE] = 9999;
-       maxNegSagG[BOAT] = 9999;
-       maxNegSagG[MACHINE] = 9999;
-
-       maxPosLatG[NOT_DRIVEABLE] =  -9999;
-       maxPosLatG[TRUCK] =  -9999;
-       maxPosLatG[AIRPLANE] = -9999;
-       maxPosLatG[BOAT] = -9999;
-       maxPosLatG[MACHINE] = -9999;
-       maxNegLatG[NOT_DRIVEABLE] =  9999;
-       maxNegLatG[TRUCK] =  9999;
-       maxNegLatG[AIRPLANE] = 9999;
-       maxNegLatG[BOAT] = 9999;
-       maxNegLatG[MACHINE] = 9999;
-
        truckHUD = 
OverlayManager::getSingleton().getByName("tracks/TruckInfoBox");
-
-       updatetime=0;
 }
 
-TruckHUD::~TruckHUD()
-{
-}
-
 void TruckHUD::show(bool value)
 {
-       if(value) {
+       if ( value ) {
                truckHUD->show();
        } else {
                truckHUD->hide();
@@ -114,7 +61,8 @@
 void TruckHUD::checkOverflow(OverlayElement* e)
 {
        int newval = e->getLeft() + e->getWidth() + border;
-       if(newval > this->width)
+
+       if (newval > this->width)
        {
                this->width = newval;
                OverlayElement *panel = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MainPanel");
@@ -124,176 +72,159 @@
 
 bool TruckHUD::update(float dt, Beam *truck, SceneManager *mSceneMgr, Camera* 
mCamera, RenderWindow* mWindow, bool visible)
 {
-       OverlayElement *descl = 0;
+       OverlayElement *overlayElement = 0;
 
-       //only update every 300 ms
-       if(visible)
+       // only update every 300 ms
+       if (visible)
        {
                updatetime -= dt;
-               if(updatetime <= 0)
+               if (updatetime <= 0.0f)
                {
                        // update now, reset timer
-                       updatetime = 0.3;
+                       updatetime = 0.3f;
                } else
-                       // dont update visuals, only count stats
+               {
+                       // don't update visuals, only count stats
                        visible = false;
+               }
        }
 
-
-       if(visible)
+       if (visible)
        {
-               OverlayElement* oTruckname = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Truckname");
-               oTruckname->setCaption(truck->getTruckName());
-               checkOverflow(oTruckname);
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Truckname");
+               overlayElement->setCaption(truck->getTruckName());
+               checkOverflow(overlayElement);
 
-               OverlayElement* oTruckauthor = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Truckauthor");
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Truckauthor");
+               overlayElement->setCaption(_L("(no author information 
available)"));
                std::vector<authorinfo_t> file_authors = truck->getAuthors();
-               if(file_authors.size() > 0)
+               if (!file_authors.empty())
                {
-                       String author_string = String("");
-                       for(unsigned int i=0;i<file_authors.size();i++)
-                               author_string += file_authors[i].name + 
String(" ");
-                       oTruckauthor->setCaption(_L("Authors: ") + 
author_string);
-               } else
+                       String authors = "";
+                       for (std::vector<authorinfo_t>::iterator it = 
file_authors.begin(); it != file_authors.end(); ++it)
+                       {
+                               authors += (*it).name + " ";
+                       }
+                       overlayElement->setCaption(_L("Authors: ") + authors);
+               }
+               checkOverflow(overlayElement);
+
+               std::vector<std::string> description = truck->getDescription();
+               for (unsigned int i=1; i < 3; i++)
                {
-                       oTruckauthor->setCaption(_L("(no author information 
available)"));
+                       overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/DescriptionLine"
 + TOSTRING(i+1));
+                       overlayElement->setCaption("");
+                       if (i < description.size())
+                       {
+                               
overlayElement->setCaption(ANSI_TO_UTF(description[i]));
+                       }
+                       checkOverflow(overlayElement);
                }
-               checkOverflow(oTruckauthor);
-               std::vector<std::string> desc = truck->getDescription();
 
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/DescriptionLine1");
-               if(desc.size() > 0)
-                       descl->setCaption(ANSI_TO_UTF(desc[0]));
-               else
-                       descl->setCaption("");
-               checkOverflow(descl);
-
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/DescriptionLine2");
-               if(desc.size() > 1)
-                       descl->setCaption(ANSI_TO_UTF(desc[1]));
-               else
-                       descl->setCaption("");
-               checkOverflow(descl);
-
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/DescriptionLine3");
-               if(desc.size() > 2)
-                       descl->setCaption(ANSI_TO_UTF(desc[2]));
-               else
-                       descl->setCaption("");
-               checkOverflow(descl);
-
-               int beamCount = truck->getBeamCount();
                beam_t *beam = truck->getBeams();
+               float average_deformation = 0.0f;
+               float beamstress = 0.0f;
+               float current_deformation = 0.0f;
+               float mass = truck->getTotalMass();
+               int beamCount = truck->getBeamCount();
                int beambroken = 0;
-               float beamstress = 0;
                int beamdeformed = 0;
-               float average_deformation = 0;
-               float current_deformation = 0;
-               float mass = truck->getTotalMass();
 
-               for(int i=0; i<beamCount; i++, beam++)
+               for (int i=0; i < beamCount; i++, beam++)
                {
-                       if(beam->broken != 0)
+                       if (beam->broken != 0)
+                       {
                                beambroken++;
+                       }
                        beamstress += beam->stress;
                        current_deformation = fabs(beam->L-beam->refL);
-                       if (fabs(current_deformation) > 0.0001f && beam->type 
!= BEAM_HYDRO && beam->type != BEAM_INVISIBLE_HYDRO) beamdeformed++;
+                       if (fabs(current_deformation) > 0.0001f && beam->type 
!= BEAM_HYDRO && beam->type != BEAM_INVISIBLE_HYDRO)
+                       {
+                               beamdeformed++;
+                       }
                        average_deformation += current_deformation;
                }
 
-               wchar_t beamcountstr[256];
-               swprintf(beamcountstr, 256, L"%d", beamCount);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamTotal");
-               descl->setCaption(_L("beam count: ") + UTFString(beamcountstr));
-               checkOverflow(descl);
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamTotal");
+               overlayElement->setCaption(_L("beam count: ") + 
TOUTFSTRING(beamCount));
+               checkOverflow(overlayElement);
 
-               wchar_t beambrokenstr[256];
-               swprintf(beambrokenstr, 256, L"%0.2f", 
((float)beambroken/(float)beamCount)*100);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamBroken");
-               descl->setCaption(_L("broken: ") + TOUTFSTRING(beambroken) + 
U(" (") + UTFString(beambrokenstr) + U("%)"));
-               checkOverflow(descl);
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamBroken");
+               overlayElement->setCaption(_L("broken: ") + 
TOUTFSTRING(beambroken) + U(" (") + TOUTFSTRING(Round((float)beambroken / 
(float)beamCount, 2) * 100.0f) + U("%)"));
+               checkOverflow(overlayElement);
 
-               wchar_t beamhealthstr[256];
-               float health = ((float)beambroken/(float)beamCount) * 10 + 
((float)beamdeformed/(float)beamCount);
-               if(health<1)
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamHealth");
+               float health = ((float)beambroken / (float)beamCount) * 10.0f + 
((float)beamdeformed / (float)beamCount);
+               if (health < 1.0f)
                {
-                       swprintf(beamhealthstr, 256, L"%0.2f", (1-health)*100);
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamHealth");
-                       descl->setCaption(_L("health: ") + 
UTFString(beamhealthstr) + U("%"));
-                       checkOverflow(descl);
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamHealth");
-                       descl->setColour(ColourValue(0.6,0.8,0.4,1));
-                       checkOverflow(descl);
-               }else if(health>1)
+                       overlayElement->setCaption(_L("health: ") + 
TOUTFSTRING(Round((1.0f - health) * 100.0f, 2)) + U("%"));
+                       overlayElement->setColour(ColourValue(0.6f, 0.8f, 0.4f, 
1.0f));
+               } else if (health >= 1.0f)
                {
-                       health = ((float)beambroken/(float)beamCount) * 3;
-                       if(health>1)
-                               health=1;
-                       swprintf(beamhealthstr, 256, L"%0.2f", (health)*100);
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamHealth");
-                       descl->setCaption(_L("destruction: ") + 
UTFString(beamhealthstr) + U("%"));
-                       checkOverflow(descl);
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamHealth");
-                       descl->setColour(ColourValue(0.8,0.4,0.4,1));
-                       checkOverflow(descl);
+                       health = ((float)beambroken / (float)beamCount) * 3.0f;
+                       health = std::min(health, 1.0f);
+                       overlayElement->setCaption(_L("destruction: ") + 
TOUTFSTRING(Round(health * 100.0f, 2)) + U("%"));
+                       overlayElement->setColour(ColourValue(0.8f, 0.4f, 0.4f, 
1.0f));
                }
-               wchar_t beamdeformedstr[256];
-               swprintf(beamdeformedstr, 256, L"%0.2f", 
((float)beamdeformed/(float)beamCount)*100);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamDeformed");
-               descl->setCaption(_L("deformed: ") + TOUTFSTRING(beamdeformed) 
+ U(" (") + UTFString(beamdeformedstr) + U("%)"));
-               checkOverflow(descl);
+               checkOverflow(overlayElement);
 
-               wchar_t beamavdeformedstr[256];
-               swprintf(beamavdeformedstr, 256, L"%0.4f", 
((float)average_deformation/(float)beamCount));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageBeamDeformation");
-               descl->setCaption(_L("average deformation: ") + 
UTFString(beamavdeformedstr));
-               checkOverflow(descl);
 
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/BeamDeformed");
+               overlayElement->setCaption(_L("deformed: ") + 
TOUTFSTRING(beamdeformed) + U(" (") + TOUTFSTRING(Round((float)beamdeformed / 
(float)beamCount, 2) * 100.0f) + U("%)"));
+               checkOverflow(overlayElement);
+
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageBeamDeformation");
+               overlayElement->setCaption(_L("average deformation: ") + 
TOUTFSTRING(Round((float)average_deformation / (float)beamCount, 4) * 100.0f));
+               checkOverflow(overlayElement);
+               
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageBeamStress");
                wchar_t beamstressstr[256];
                swprintf(beamstressstr, 256, L"%+08.0f", 
1-(float)beamstress/(float)beamCount);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageBeamStress");
-               descl->setCaption(_L("average stress: ") + 
UTFString(beamstressstr));
-               checkOverflow(descl);
+               overlayElement->setCaption(_L("average stress: ") + 
UTFString(beamstressstr));
+               checkOverflow(overlayElement);
 
-               int nodeCount = truck->getNodeCount();
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/NodeCount");
+               int ncount = truck->getNodeCount();
                int wcount =  truck->getWheelNodeCount();
                wchar_t nodecountstr[256];
-               swprintf(nodecountstr, 256, L"%d (wheels: %d)", nodeCount, 
wcount);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/NodeCount");
-               descl->setCaption(_L("node count: ") + UTFString(nodecountstr));
-               checkOverflow(descl);
+               swprintf(nodecountstr, 256, L"%d (wheels: %d)", ncount, wcount);
+               overlayElement->setCaption(_L("node count: ") + 
UTFString(nodecountstr));
+               checkOverflow(overlayElement);
 
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/TruckWeight");
                wchar_t truckmassstr[256];
                UTFString massstr = _L("current mass:");
-               swprintf(truckmassstr, 256, L"%ls %8.2f kg (%.2f tons)", 
massstr.asWStr_c_str(), mass, mass/1000);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/TruckWeight");
-               descl->setCaption(UTFString(truckmassstr));
-               checkOverflow(descl);
+               swprintf(truckmassstr, 256, L"%ls %8.2f kg (%.2f tons)", 
massstr.asWStr_c_str(), mass, mass / 1000.0f);
+               overlayElement->setCaption(UTFString(truckmassstr));
+               checkOverflow(overlayElement);
 
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Gees");
                wchar_t geesstr[256];
                Vector3 gees = truck->getGForces();
+               // apply deadzones ==> no flickering +/-
+               if (fabs(gees.y) < 0.01) gees.y = 0.0f;
+               if (fabs(gees.z) < 0.01) gees.z = 0.0f;
                UTFString tmp = _L("Gees: Vertical %1.2fg // Saggital %1.2fg // 
Lateral %1.2fg");
                swprintf(geesstr, 256, tmp.asWStr_c_str(), gees.x, gees.y, 
gees.z);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Gees");
-               descl->setCaption(UTFString(geesstr));
-               checkOverflow(descl);
+               overlayElement->setCaption(UTFString(geesstr));
+               checkOverflow(overlayElement);
 
-               //maxGees
-               if(truck->driveable == TRUCK || truck->driveable == AIRPLANE || 
truck->driveable == BOAT)
+               // max g-forces
+               if (truck->driveable == TRUCK || truck->driveable == AIRPLANE 
|| truck->driveable == BOAT)
                {
-                       if(gees.x > maxPosVerG[truck->driveable])
+                       if (gees.x > maxPosVerG[truck->driveable])
                                maxPosVerG[truck->driveable] = gees.x;
-                       if(gees.x < maxNegVerG[truck->driveable])
+                       if (gees.x < maxNegVerG[truck->driveable])
                                maxNegVerG[truck->driveable] = gees.x;
 
-                       if(gees.y > maxPosSagG[truck->driveable])
+                       if (gees.y > maxPosSagG[truck->driveable])
                                maxPosSagG[truck->driveable] = gees.y;
-                       if(gees.y < maxNegSagG[truck->driveable])
+                       if (gees.y < maxNegSagG[truck->driveable])
                                maxNegSagG[truck->driveable] = gees.y;
 
-                       if(gees.z > maxPosLatG[truck->driveable])
+                       if (gees.z > maxPosLatG[truck->driveable])
                                maxPosLatG[truck->driveable] = gees.z;
-                       if(gees.z < maxNegLatG[truck->driveable])
+                       if (gees.z < maxNegLatG[truck->driveable])
                                maxNegLatG[truck->driveable] = gees.z;
 
                        tmp = _L("maxG: V %1.2fg %1.2fg // S %1.2fg %1.2fg // L 
%1.2fg %1.2fg");
@@ -306,173 +237,136 @@
                                        maxNegLatG[truck->driveable]
                                );
 
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Gees2");
-                       descl->setCaption(UTFString(geesstr));
-                       checkOverflow(descl);
+                       overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Gees2");
+                       overlayElement->setCaption(UTFString(geesstr));
+                       checkOverflow(overlayElement);
                }
        }
 
        Vector3 hdir = Vector3::ZERO;
-       if(truck->cameranodepos[0]>=0)
-               hdir = 
truck->nodes[truck->cameranodepos[0]].RelPosition-truck->nodes[truck->cameranodedir[0]].RelPosition;
-       hdir.normalise();
-       float g_along_hdir=hdir.dotProduct(truck->ffforce/10000.0);
+       if (truck->cameranodepos[0] >= 0 && truck->cameranodepos[0] < MAX_NODES)
+       {
+               hdir = (truck->nodes[truck->cameranodepos[0]].RelPosition - 
truck->nodes[truck->cameranodedir[0]].RelPosition).normalisedCopy();
+       }
+       float g_along_hdir = hdir.dotProduct(truck->ffforce / 10000.0f);
 
-       //LOG("ffforce: " + TOSTRING(truck->ffforce.x) + ", " + 
TOSTRING(truck->ffforce.y) + ", " + TOSTRING(truck->ffforce.z) + " / direction: 
" + TOSTRING(hdir.x) + ", " + TOSTRING(hdir.y) + ", " + TOSTRING(hdir.z));
-
-
-       // TODO: FIX THIS!
-       //char rpmstring[256];
-       //sprintf(rpmstring, "current GForces: %2.2f", g_along_hdir);
-       
//OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM")->setCaption(rpmstring);
-
        // always update these statistics, also if not visible!
+       overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
+       overlayElement->setCaption("");
        UTFString rpmsstr = _L("current RPM:");
-       if(truck->driveable == TRUCK && truck->engine)
+       if (truck->driveable == TRUCK && truck->engine)
        {
-               wchar_t rpmstring[256];
-               rpmsstr = _L("current RPM:");
-               swprintf(rpmstring, 256, L"%ls %.0f / %.0f", 
rpmsstr.asWStr_c_str(), truck->engine->getRPM(), 
truck->engine->getMaxRPM()*1.25);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
-               descl->setCaption(UTFString(rpmstring));
-               checkOverflow(descl);
-
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
+               overlayElement->setCaption(rpmsstr + U(" ") + 
TOUTFSTRING(ceil(truck->engine->getRPM())) + U(" / ") + 
TOUTFSTRING(ceil(truck->engine->getMaxRPM())));
        } else if (truck->driveable == AIRPLANE)
        {
-               wchar_t rpmstring[256];
-
-               if(truck->aeroengines[0] && truck->aeroengines[1] && 
truck->aeroengines[2] && truck->aeroengines[3])
-                       swprintf(rpmstring, 256, L"%ls %.0f / %.0f / %.0f / 
%.0f", rpmsstr.asWStr_c_str(), truck->aeroengines[0]->getRPM(), 
truck->aeroengines[1]->getRPM(), truck->aeroengines[2]->getRPM(), 
truck->aeroengines[3]->getRPM());
-               else if(truck->aeroengines[0] && truck->aeroengines[1] && 
truck->aeroengines[2] && !truck->aeroengines[3])
-                       swprintf(rpmstring, 256, L"%ls %.0f / %.0f / %.0f", 
rpmsstr.asWStr_c_str(), truck->aeroengines[0]->getRPM(), 
truck->aeroengines[1]->getRPM(), truck->aeroengines[2]->getRPM());
-               else if(truck->aeroengines[0] && truck->aeroengines[1] && 
!truck->aeroengines[2] && !truck->aeroengines[3])
-                       swprintf(rpmstring, 256, L"%ls %.0f / %.0f", 
rpmsstr.asWStr_c_str(), truck->aeroengines[0]->getRPM(), 
truck->aeroengines[1]->getRPM());
-               else if(truck->aeroengines[0] && !truck->aeroengines[1] && 
!truck->aeroengines[2] && !truck->aeroengines[3])
-                       swprintf(rpmstring, 256, L"%ls %.0f", 
rpmsstr.asWStr_c_str(), truck->aeroengines[0]->getRPM());
-
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
-               descl->setCaption(UTFString(rpmstring));
-               checkOverflow(descl);
-       } else
-       {
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
-               descl->setCaption("");
+               for (int i=0; i < 8; i++)
+               {
+                       if (truck->aeroengines[i])
+                       {
+                               rpmsstr = rpmsstr + U(" / ") + 
TOUTFSTRING(ceil(truck->aeroengines[i]->getRPM()));
+                       }
+               }
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentRPM");
+               overlayElement->setCaption(UTFString(rpmsstr));
        }
+       checkOverflow(overlayElement);
 
-       UTFString cspeedstr = _L("current Speed:");
-       UTFString maxspstr = _L("max Speed:");
+       UTFString cspeedstr   = _L("current Speed:") + U(" ");
+       UTFString mspeedstr   = _L("max Speed:")     + U(" ");
+       UTFString altitudestr = _L("Altitude:")      + U(" ");
 
-       if(truck->driveable == TRUCK)
+       if (truck->driveable == TRUCK)
        {
-               wchar_t velostring[256];
-               float velocityKMH = (truck->WheelSpeed * 3.6);
-               if(velocityKMH > maxVelos[truck->driveable])
-                       maxVelos[truck->driveable] = velocityKMH;
-               if(velocityKMH < minVelos[truck->driveable])
-                       minVelos[truck->driveable] = velocityKMH;
+               maxVelos[truck->driveable] = 
std::max(maxVelos[truck->driveable], truck->WheelSpeed);
+               minVelos[truck->driveable] = std::min(truck->WheelSpeed, 
minVelos[truck->driveable]);
 
-               // round values if zero ==> no flickering +/-
-               if (fabs(velocityKMH) < 1)
-                       velocityKMH = 0;
-               float velocityMPH = velocityKMH / 1.609;
-                       swprintf(velostring, 256, L"%ls %+.0f km/h (%+.0f 
mp/h)", cspeedstr.asWStr_c_str(), ceil(velocityKMH), ceil(velocityMPH));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity");
+               float velocityKMH = (truck->WheelSpeed * 3.6f);
+               float velocityMPH = (truck->WheelSpeed * 2.23693629f);
+               // apply a deadzone ==> no flickering +/-
+               if (fabs(truck->WheelSpeed) < 1.0f)
+               {
+                       velocityKMH = velocityMPH = 0.0f;
+               }
+               overlayElement->setCaption(cspeedstr + 
TOUTFSTRING(ceil(velocityKMH)) + U(" km/h (") + TOUTFSTRING(ceil(velocityKMH)) 
+ U(" mph)"));
+               checkOverflow(overlayElement);
 
-               float velocityMaxMPH = maxVelos[truck->driveable] / 1.609;
-               float velocityMinMPH = minVelos[truck->driveable] / 1.609;
-               swprintf(velostring, 256, L"%ls %+.0fkmh/%+.0fmph, min: 
%+.0fkmh/%+.0fmph", maxspstr.asWStr_c_str(), ceil(maxVelos[truck->driveable]), 
ceil(velocityMaxMPH), ceil(minVelos[truck->driveable]), ceil(velocityMinMPH));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity");
-               descl->setCaption("");
-       }
-               else if(truck->driveable == AIRPLANE)
-       {
-               wchar_t velostring[256];
-               float velocity = truck->nodes[0].Velocity.length()*1.9438;
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity");
+               float velocityMaxKMH = maxVelos[truck->driveable] * 3.6f;
+               float velocityMinKMH = minVelos[truck->driveable] * 3.6f;
+               float velocityMaxMPH = maxVelos[truck->driveable] * 2.23693629f;
+               float velocityMinMPH = minVelos[truck->driveable] * 2.23693629f;
+               overlayElement->setCaption(mspeedstr + 
TOUTFSTRING(ceil(velocityMaxKMH)) + U("km/h (") + 
TOUTFSTRING(ceil(velocityMaxMPH)) + U("mph)") + U(", min: ") + 
TOUTFSTRING(ceil(velocityMinKMH)) + U("km/h (") + 
TOUTFSTRING(ceil(velocityMinMPH)) + U("mph)"));
+               checkOverflow(overlayElement);
 
-               if(velocity > maxVelos[truck->driveable])
-                       maxVelos[truck->driveable] = velocity;
-               if(velocity < minVelos[truck->driveable])
-                       minVelos[truck->driveable] = velocity;
-
-               // round values if zero ==> no flickering +/-
-               if (fabs(velocity) < 1)
-                       velocity = 0;
-               swprintf(velostring, 256, L"%ls %+.0f kn", 
cspeedstr.asWStr_c_str(), ceil(velocity));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
-               swprintf(velostring, 256, L"%ls %+.0fkn, min: %+.0f kn", 
maxspstr.asWStr_c_str(), ceil(maxVelos[truck->driveable]), 
ceil(minVelos[truck->driveable]));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
-
-               float alt = truck->nodes[0].AbsPosition.y*1.1811;
-               UTFString altstr = _L("Altitude:");
-               swprintf(velostring, 256, L"%ls %+.0f m", 
altstr.asWStr_c_str(), ceil(alt));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity");
-               descl->setCaption(velostring);
-               checkOverflow(descl);
-       }
-               else if(truck->driveable == BOAT)
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity");
+               overlayElement->setCaption("");
+       } else if (truck->driveable == AIRPLANE || truck->driveable == BOAT)
        {
-               wchar_t velostring[256];
-               
hdir=truck->nodes[truck->cameranodepos[0]].RelPosition-truck->nodes[truck->cameranodedir[0]].RelPosition;
-               hdir.normalise();
-               float 
velocity=hdir.dotProduct(truck->nodes[truck->cameranodepos[0]].Velocity)*1.9438;
+               float velocity = truck->nodes[0].Velocity.length();
+               
+               if (truck->driveable == BOAT)
+               {
+                       hdir = 
(truck->nodes[truck->cameranodepos[0]].RelPosition - 
truck->nodes[truck->cameranodedir[0]].RelPosition).normalisedCopy();
+                       velocity = 
hdir.dotProduct(truck->nodes[truck->cameranodepos[0]].Velocity);
+               }
+               
+               maxVelos[truck->driveable] = 
std::max(maxVelos[truck->driveable], velocity);
+               minVelos[truck->driveable] = std::min(velocity, 
minVelos[truck->driveable]);
 
-               if(velocity > maxVelos[truck->driveable])
-                       maxVelos[truck->driveable] = velocity;
-               if(velocity < minVelos[truck->driveable])
-                       minVelos[truck->driveable] = velocity;
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity");
+               float velocityKN = velocity * 1.94384449f;
+               // apply a deadzone ==> no flickering +/-
+               if (fabs(velocity) < 1.0f)
+               {
+                       velocityKN = 0.0f;
+               }
+               overlayElement->setCaption(cspeedstr + 
TOUTFSTRING(ceil(velocityKN)) + U(" kn"));
+               checkOverflow(overlayElement);
 
-               swprintf(velostring, 256, L"%ls %+.0f kn", 
cspeedstr.asWStr_c_str(),ceil(velocity));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity");
+               float velocityMaxKN = maxVelos[truck->driveable] * 1.94384449f;
+               float velocityMinKN = minVelos[truck->driveable] * 1.94384449f;
+               overlayElement->setCaption(mspeedstr + 
TOUTFSTRING(ceil(maxVelos[truck->driveable])) + U(" kn, min: ") + 
TOUTFSTRING(ceil(minVelos[truck->driveable])) + U(" kn"));
+               checkOverflow(overlayElement);
 
-               swprintf(velostring, 256, L"%ls %+.0fkn, min: %+.0f kn", 
maxspstr.asWStr_c_str(),ceil(maxVelos[truck->driveable]), 
ceil(minVelos[truck->driveable]));
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity");
-               descl->setCaption(UTFString(velostring));
-               checkOverflow(descl);
-
-               descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity");
-               descl->setCaption("");
-       }
-               else if(truck->driveable == MACHINE)
+               overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity");
+               overlayElement->setCaption("");
+               if (truck->driveable == AIRPLANE)
+               {
+                       float altitude = truck->nodes[0].AbsPosition.y * 
1.1811f;
+                       overlayElement->setCaption(altitudestr + 
TOUTFSTRING(ceil(altitude)) + U(" m"));
+                       checkOverflow(overlayElement);
+               }
+       } else if (truck->driveable == MACHINE)
        {
                
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/MaxVelocity")->setCaption("");
                
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CurrentVelocity")->setCaption("");
                
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/AverageVelocity")->setCaption("");
        }
+
        
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/TimeStats")->setCaption("");
 
-       if(visible)
+       if (visible)
        {
                // update commands
 
-               //clear them first
-               for(int i=1; i<=COMMANDS_VISIBLE; i++)
+               // clear them first
+               for (int i=1; i <= COMMANDS_VISIBLE; i++)
                {
-                       char commandOverlayID[256];
-                       sprintf(commandOverlayID, 
"tracks/TruckInfoBox/Command%d", i); // no wchar needed
-                       descl = 
OverlayManager::getSingleton().getOverlayElement(commandOverlayID);
-                       descl->setCaption(String(""));
+                       overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Command" 
+ TOSTRING(i));
+                       overlayElement->setCaption("");
                }
 
-               int j = 0;
-               for(int i=1; i<MAX_COMMANDS && j<COMMANDS_VISIBLE; i+=2)
+               int filledCommands = 0;
+               for (int i=1; i < MAX_COMMANDS && filledCommands < 
COMMANDS_VISIBLE; i += 2)
                {
-                       if (truck->commandkey[i].description.size() == 0)
-                               continue;
+                       if (truck->commandkey[i].description.size() == 0) 
continue;
 
-                       j++;
-                       char commandID[256];
-                       String keyStr="";
+                       filledCommands++;
+                       char commandID[256] = {};
+                       String keyStr = "";
 
                        sprintf(commandID, "COMMANDS_%02d", i);
                        int eventID = 
INPUTENGINE.resolveEventName(String(commandID));
@@ -480,31 +374,27 @@
                        sprintf(commandID, "COMMANDS_%02d", i+1);
                        eventID = 
INPUTENGINE.resolveEventName(String(commandID));
                        String keyb = INPUTENGINE.getEventCommand(eventID);
-                       //cut off expl
-                       if(keya.size()>6 && keya.substr(0,5) == "EXPL+") keya = 
keya.substr(5);
-                       if(keyb.size()>6 && keyb.substr(0,5) == "EXPL+") keyb = 
keyb.substr(5);
 
+                       // cut off expl
+                       if (keya.size() > 6 && keya.substr(0,5) == "EXPL+") 
keya = keya.substr(5);
+                       if (keyb.size() > 6 && keyb.substr(0,5) == "EXPL+") 
keyb = keyb.substr(5);
+
                        keyStr = keya + "/" + keyb;
 
-                       char commandOverlayID[256];
-                       sprintf(commandOverlayID, 
"tracks/TruckInfoBox/Command%d", j);
-                       descl = 
OverlayManager::getSingleton().getOverlayElement(commandOverlayID);
-                       descl->setCaption(keyStr + ": " + 
truck->commandkey[i].description);
-                       checkOverflow(descl);
+                       overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/Command" 
+ TOSTRING(filledCommands));
+                       overlayElement->setCaption(keyStr + ": " + 
truck->commandkey[i].description);
+                       checkOverflow(overlayElement);
                }
 
                // hide command section title if no commands
-               if(j == 0)
+               overlayElement = overlayElement = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CommandsTitleLabel");
+               overlayElement->setCaption("");
+               if (filledCommands > 0)
                {
-                       
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CommandsTitleLabel")->setCaption("");
-               } else
-               {
-                       descl = 
OverlayManager::getSingleton().getOverlayElement("tracks/TruckInfoBox/CommandsTitleLabel");
-                       descl->setCaption(_L("Commands:"));
-                       checkOverflow(descl);
+                       // TODO: Fix the position of this overlay element
+                       //overlayElement->setCaption(_L("Commands:"));
+                       checkOverflow(overlayElement);
                }
-
-
        }
        return true;
 }

Modified: trunk/source/main/gui/TruckHUD.h
===================================================================
--- trunk/source/main/gui/TruckHUD.h    2012-05-21 23:05:25 UTC (rev 2621)
+++ trunk/source/main/gui/TruckHUD.h    2012-05-22 02:35:45 UTC (rev 2622)
@@ -27,7 +27,6 @@
 public:
 
        TruckHUD();
-       ~TruckHUD();
 
        bool update(float dt, Beam *truck, Ogre::SceneManager *sm, 
Ogre::Camera* mCamera, Ogre::RenderWindow* mWindow, bool visible=true);
        void show(bool value);
@@ -35,21 +34,23 @@
 
 protected:
 
-    static TruckHUD *myInstance;
-       std::map<int, float> maxVelos;
-       std::map<int, float> minVelos;
+       Ogre::Overlay *truckHUD;
+       float updatetime;
+       int width, border;
+
        std::map<int, float> avVelos;
-       std::map<int, float> maxPosVerG;
+       std::map<int, float> maxNegLatG;
+       std::map<int, float> maxNegSagG;
        std::map<int, float> maxNegVerG;
+       std::map<int, float> maxPosLatG;
        std::map<int, float> maxPosSagG;
-       std::map<int, float> maxNegSagG;
-       std::map<int, float> maxPosLatG;
-       std::map<int, float> maxNegLatG;
-       Ogre::Overlay *truckHUD;
-       float updatetime;
-       int width, border;
+       std::map<int, float> maxPosVerG;
+       std::map<int, float> maxVelos;
+       std::map<int, float> minVelos;
+
        void checkOverflow(Ogre::OverlayElement* e);
 
+       static TruckHUD *myInstance;
        static const unsigned int COMMANDS_VISIBLE = 25;
 };
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to