From: James Turner Date: Mon, 24 Oct 2011 22:55:46 +0000 (+0100) Subject: Many NavDisplay bug-fixes - almost usable now! X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=34f86cd317ef78c81f05052aa270d86a0ecb8567;p=flightgear.git Many NavDisplay bug-fixes - almost usable now! --- diff --git a/src/Instrumentation/NavDisplay.cxx b/src/Instrumentation/NavDisplay.cxx index f7cd5d5cd..e27c04361 100644 --- a/src/Instrumentation/NavDisplay.cxx +++ b/src/Instrumentation/NavDisplay.cxx @@ -172,11 +172,20 @@ public: } } // of matches parsing - xy0.x() = node->getFloatValue("x0", -5); - xy0.y() = node->getFloatValue("y0", -5); + if (node->hasChild("width")) { + float w = node->getFloatValue("width"); + float h = node->getFloatValue("height", w); + xy0.x() = -w * 0.5; + xy0.y() = -h * 0.5; + xy1.x() = w * 0.5; + xy1.y() = h * 0.5; + } else { + xy0.x() = node->getFloatValue("x0", 0.0); + xy0.y() = node->getFloatValue("y0", 0.0); xy1.x() = node->getFloatValue("x1", 5); xy1.y() = node->getFloatValue("y1", 5); - + } + double texSize = node->getFloatValue("texture-size", 1.0); uv0.x() = node->getFloatValue("u0", 0) / texSize; @@ -201,7 +210,7 @@ public: drawLine = node->getBoolValue("draw-line", false); lineColor = readColor(node->getChild("line-color"), color); - drawRouteLeg = node->getBoolValue("draw-line", false); + drawRouteLeg = node->getBoolValue("draw-leg", false); stretchSymbol = node->getBoolValue("stretch-symbol", false); if (stretchSymbol) { @@ -250,21 +259,19 @@ public: bool matches(const string_set& states) const { - string_set::const_iterator it = states.begin(), - end = states.end(); - for (; it != end; ++it) { - if (!required_states.empty() && (required_states.count(*it) == 0)) { - // required state not matched + BOOST_FOREACH(const string& s, required_states) { + if (states.count(s) == 0) { return false; } - - if (excluded_states.count(*it) > 0) { - // excluded state matched + } + + BOOST_FOREACH(const string& s, excluded_states) { + if (states.count(s) != 0) { return false; } - } // of applicable states iteration - - return true; // matches! + } + + return true; } }; @@ -287,14 +294,12 @@ public: string text() const { assert(definition->hasText); - string r; - - size_t pos = 0; - int lastPos = 0; + string r; + size_t lastPos = 0; - for (; pos < definition->textTemplate.size();) { - pos = definition->textTemplate.find('{', pos); - if (pos == string::npos) { // no more replacements + while (true) { + size_t pos = definition->textTemplate.find('{', lastPos); + if (pos == string::npos) { // no more replacements r.append(definition->textTemplate.substr(lastPos)); break; } @@ -309,7 +314,7 @@ public: string spec = definition->textTemplate.substr(pos + 1, endReplacement - (pos + 1)); // look for formatter in spec size_t colonPos = spec.find(':'); - if (colonPos == string::npos) { + if (colonPos == string::npos) { // simple replacement r.append(props->getStringValue(spec)); } else { @@ -386,7 +391,10 @@ NavDisplay::init () string path = _Instrument->getStringValue("symbol-texture-path", "Aircraft/Instruments/Textures/nd-symbols.png"); SGPath tpath = globals->resolve_aircraft_path(path); - + if (!tpath.exists()) { + SG_LOG(SG_INSTR, SG_WARN, "ND symbol texture not found:" << path); + } + // no mipmap or else alpha will mix with pixels on the border of shapes, ruining the effect _symbolTexture = SGLoadTexture2D(tpath, NULL, false, false); @@ -427,6 +435,7 @@ NavDisplay::init () _geom->setTexCoordArray(0, _texCoords); _quadColors = new osg::Vec4Array; + _quadColors->setDataVariance(osg::Object::DYNAMIC); _geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); _geom->setColorArray(_quadColors); @@ -436,6 +445,7 @@ NavDisplay::init () _geom->setInitialBound(osg::BoundingBox(osg::Vec3f(-256.0f, -256.0f, 0.0f), osg::Vec3f(256.0f, 256.0f, 0.0f))); + _radarGeode->addDrawable(_geom); _odg->allocRT(); // Texture in the 2D panel system @@ -524,6 +534,7 @@ NavDisplay::update (double delta_time_sec) _vertices->clear(); _lineVertices->clear(); _lineColors->clear(); + _quadColors->clear(); _texCoords->clear(); _textGeode->removeDrawables(0, _textGeode->getNumDrawables()); @@ -609,7 +620,7 @@ void NavDisplay::addSymbolToScene(SymbolInstance* sym) _texCoords->push_back(osg::Vec2(def->uv1.x(), def->uv0.y())); _texCoords->push_back(def->uv1); _texCoords->push_back(osg::Vec2(def->uv0.x(), def->uv1.y())); - + for (int i=0; i<4; ++i) { _vertices->push_back(verts[i] + pos); _quadColors->push_back(def->color); @@ -743,6 +754,8 @@ osg::Vec2 NavDisplay::projectGeod(const SGGeod& geod) const class Filter : public FGPositioned::Filter { public: + double minRunwayLengthFt; + virtual bool pass(FGPositioned* aPos) const { if (aPos->type() == FGPositioned::FIX) { @@ -753,6 +766,13 @@ public: } } + if (aPos->type() == FGPositioned::AIRPORT) { + FGAirport* apt = (FGAirport*) aPos; + if (!apt->hasHardRunwayOfLengthFt(minRunwayLengthFt)) { + return false; + } + } + return true; } @@ -768,6 +788,8 @@ public: void NavDisplay::findItems() { Filter filt; + filt.minRunwayLengthFt = 2000; + FGPositioned::List items = FGPositioned::findWithinRange(_pos, _rangeNm, &filt); @@ -950,7 +972,8 @@ void NavDisplay::computePositionedPropsAndHeading(FGPositioned* pos, SGPropertyN switch (pos->type()) { case FGPositioned::VOR: - case FGPositioned::LOC: { + case FGPositioned::LOC: + case FGPositioned::TACAN: { FGNavRecord* nav = static_cast(pos); nd->setDoubleValue("frequency-mhz", nav->get_freq());