X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2FMapWidget.cxx;h=249605c6bfe7f9ac9859cf76c71e0e49a51ac5ed;hb=ee1c8a8d662a0398711ee17c53dd64d249d2e030;hp=ba4174086ea64dea7c217aeb4aaa666f828603c5;hpb=ffac5ff8895d6403d6755578300f3e9341777d4b;p=flightgear.git diff --git a/src/GUI/MapWidget.cxx b/src/GUI/MapWidget.cxx index ba4174086..249605c6b 100644 --- a/src/GUI/MapWidget.cxx +++ b/src/GUI/MapWidget.cxx @@ -21,10 +21,11 @@ #include #include #include -#include +#include #include #include
// fgGetKeyModifiers() #include +#include const char* RULER_LEGEND_KEY = "ruler-legend"; @@ -411,6 +412,7 @@ void MapWidget::setProperty(SGPropertyNode_ptr prop) _root->setIntValue("max-zoom", MAX_ZOOM); _root->setBoolValue("centre-on-aircraft", true); _root->setBoolValue("draw-data", false); + _root->setBoolValue("draw-flight-history", false); _root->setBoolValue("magnetic-headings", true); } @@ -535,8 +537,7 @@ void MapWidget::zoomOut() void MapWidget::draw(int dx, int dy) { - _aircraft = SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"), - fgGetDouble("/position/latitude-deg")); + _aircraft = globals->get_aircraft_position(); bool mag = _root->getBoolValue("magnetic-headings"); if (mag != _magneticHeadings) { @@ -611,6 +612,7 @@ void MapWidget::draw(int dx, int dy) drawNavRadio(fgGetNode("/instrumentation/nav[0]", false)); drawNavRadio(fgGetNode("/instrumentation/nav[1]", false)); paintAircraftLocation(_aircraft); + drawFlightHistory(); paintRoute(); paintRuler(); @@ -748,6 +750,28 @@ void MapWidget::paintRoute() } // of second waypoint iteration } +void MapWidget::drawFlightHistory() +{ + FGFlightHistory* history = (FGFlightHistory*) globals->get_subsystem("history"); + if (!history || !_root->getBoolValue("draw-flight-history")) { + return; + } + + // first pass, draw the actual lines + glLineWidth(2.0); + + SGGeodVec gv(history->pathForHistory()); + glColor4f(0.0, 0.0, 1.0, 0.7); + + glBegin(GL_LINE_STRIP); + for (unsigned int i=0; igetDoubleValue("frequencies/selected-mhz", 0.0); - FGNavRecord* nav = globals->get_navlist()->findByFreq(mhz, _aircraft); + + FGNavRecord* nav = FGNavList::findByFreq(mhz, _aircraft, + FGNavList::navFilter()); if (!nav || (nav->ident() != radio->getStringValue("nav-id"))) { // mismatch between navradio selection logic and ours! return; @@ -1111,7 +1138,7 @@ void MapWidget::drawNavRadio(SGPropertyNode_ptr radio) void MapWidget::drawTunedLocalizer(SGPropertyNode_ptr radio) { double mhz = radio->getDoubleValue("frequencies/selected-mhz", 0.0); - FGNavRecord* loc = globals->get_loclist()->findByFreq(mhz, _aircraft); + FGNavRecord* loc = FGNavList::findByFreq(mhz, _aircraft, FGNavList::locFilter()); if (!loc || (loc->ident() != radio->getStringValue("nav-id"))) { // mismatch between navradio selection logic and ours! return; @@ -1167,23 +1194,32 @@ void MapWidget::drawAirport(FGAirport* apt) return; } - for (unsigned int r=0; rnumRunways(); ++r) { - FGRunway* rwy = apt->getRunwayByIndex(r); - if (!rwy->isReciprocal()) { - drawRunwayPre(rwy); - } + FGRunwayList runways(apt->getRunwaysWithoutReciprocals()); + + for (unsigned int r=0; rnumRunways(); ++r) { - FGRunway* rwy = apt->getRunwayByIndex(r); - if (!rwy->isReciprocal()) { - drawRunway(rwy); - } + for (unsigned int r=0; rILS()) { - drawILS(false, rwy); - } - } // of runway iteration + if (rwy->ILS()) { + drawILS(false, rwy); + } + + if (rwy->reciprocalRunway()) { + FGRunway* recip = rwy->reciprocalRunway(); + if (recip->ILS()) { + drawILS(false, recip); + } + } + } + + for (unsigned int r=0; rnumHelipads(); ++r) { + FGHelipad* hp = apt->getHelipadByIndex(r); + drawHelipad(hp); + } // of runway iteration } @@ -1192,14 +1228,11 @@ int MapWidget::scoreAirportRunways(FGAirport* apt) bool needHardSurface = _root->getBoolValue("hard-surfaced-airports", true); double minLength = _root->getDoubleValue("min-runway-length-ft", 2000.0); - int score = 0; - unsigned int numRunways(apt->numRunways()); - for (unsigned int r=0; rgetRunwayByIndex(r); - if (rwy->isReciprocal()) { - continue; - } + FGRunwayList runways(apt->getRunwaysWithoutReciprocals()); + int score = 0; + for (unsigned int r=0; risHardSurface()) { continue; } @@ -1365,6 +1398,32 @@ void MapWidget::drawTraffic() } // of ai/models iteration } +void MapWidget::drawHelipad(FGHelipad* hp) +{ + SGVec2d pos = project(hp->geod()); + glLineWidth(1.0); + glColor3f(1.0, 1.0, 1.0); + circleAt(pos, 16, 5.0); + + if (validDataForKey(hp)) { + setAnchorForKey(hp, pos); + return; + } + + char buffer[1024]; + ::snprintf(buffer, 1024, "%s\n%03d\n%.0f'", + hp->ident().c_str(), + displayHeading(hp->headingDeg()), + hp->lengthFt()); + + MapData* d = createDataForKey(hp); + d->setText(buffer); + d->setLabel(hp->ident()); + d->setPriority(40); + d->setOffset(MapData::HALIGN_CENTER | MapData::VALIGN_BOTTOM, 8); + d->setAnchor(pos); +} + void MapWidget::drawAIAircraft(const SGPropertyNode* model, const SGGeod& pos, double hdg) {