]> git.mxchange.org Git - flightgear.git/commitdiff
Many NavDisplay bug-fixes - almost usable now!
authorJames Turner <zakalawe@mac.com>
Mon, 24 Oct 2011 22:55:46 +0000 (23:55 +0100)
committerJames Turner <zakalawe@mac.com>
Mon, 24 Oct 2011 22:55:46 +0000 (23:55 +0100)
src/Instrumentation/NavDisplay.cxx

index f7cd5d5cd40a3dfc0a3a466c18d5949760ac969a..e27c04361dd39978b12304ca877b063bfae7a220 100644 (file)
@@ -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<FGNavRecord*>(pos);
         nd->setDoubleValue("frequency-mhz", nav->get_freq());