]> git.mxchange.org Git - flightgear.git/commitdiff
NavDisplay - custom symbol support enabled.
authorJames Turner <jmt@Bishop.local>
Mon, 24 Dec 2012 23:13:18 +0000 (23:13 +0000)
committerJames Turner <jmt@Bishop.local>
Mon, 24 Dec 2012 23:13:18 +0000 (23:13 +0000)
src/Cockpit/NavDisplay.cxx
src/Cockpit/NavDisplay.hxx

index caf70b0ff1528ff3ee9d38570099efd0cf2fcb54..6c344aa9d08a228341d41f9209f9fd5b6fd6ca2e 100644 (file)
@@ -566,6 +566,8 @@ NavDisplay::init ()
     _userLonNode = _Instrument->getChild("user-longitude-deg", 0, true);
     _userPositionEnable = _Instrument->getChild("user-position", 0, true);
     
+    _customSymbols = _Instrument->getChild("symbols", 0, true);
+    
 // OSG geometry setup
     _radarGeode = new osg::Geode;
 
@@ -745,6 +747,7 @@ NavDisplay::update (double delta_time_sec)
     processRoute();
     processNavRadios();
     processAI();
+    processCustomSymbols();
     findItems();
     limitDisplayedSymbols();
   }
@@ -1439,3 +1442,39 @@ void NavDisplay::addRule(SymbolRule* r)
     _rules.push_back(r);
 }
 
+void NavDisplay::computeCustomSymbolStates(const SGPropertyNode* sym, string_set& states)
+{
+  BOOST_FOREACH(SGPropertyNode* st, sym->getChildren("state")) {
+    states.insert(st->getStringValue());
+  }
+}
+
+void NavDisplay::processCustomSymbols()
+{
+  for (int i = _customSymbols->nChildren() - 1; i >= 0; i--) {
+    SGPropertyNode *symNode = _customSymbols->getChild(i);
+    if (!symNode->nChildren()) {
+      continue;
+    }
+    string_set ss;
+    computeCustomSymbolStates(symNode, ss);
+    SymbolRuleVector rules;
+    findRules(symNode->getName(), ss, rules);
+    if (rules.empty()) {
+      return; // no rules matched, we can skip this item
+    }
+    
+    double heading = symNode->getDoubleValue("true-heading-deg", 0.0);
+    SGGeod pos = SGGeod::fromDegFt(symNode->getDoubleValue("longitude-deg"),
+                                          symNode->getDoubleValue("latitude-deg"),
+                                          symNode->getDoubleValue("altitude-ft"));
+    
+    osg::Vec2 projected = projectGeod(pos);
+    BOOST_FOREACH(SymbolRule* r, rules) {
+      addSymbolInstance(projected, heading, r->getDefinition(), symNode);
+    }
+  } // of custom symbols iteration
+}
+
+
index b45caed6c645c435fe96816c08b0e9ed4577f4d8..62e9d45a7e6e59002a5dc7189c7989bbbab6d8bb 100644 (file)
@@ -121,6 +121,9 @@ private:
     void processAI();
     void computeAIStates(const SGPropertyNode* ai, string_set& states);
     
+    void computeCustomSymbolStates(const SGPropertyNode* sym, string_set& states);
+    void processCustomSymbols();
+    
     void findRules(const std::string& type, const string_set& states, SymbolRuleVector& rules);
     
     SymbolInstance* addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars);
@@ -192,7 +195,8 @@ private:
     FGPositioned::List _itemsInRange;
     SGPropertyNode_ptr _excessDataNode;
     int _maxSymbols;
-  
+    SGPropertyNode_ptr _customSymbols;
+    
     class CacheListener;
     std::auto_ptr<CacheListener> _cacheListener;