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