#include <vector>
#include <string>
+#include <memory>
+
+#include <Navaids/positioned.hxx>
class FGODGauge;
class FGRouteMgr;
+class FGNavRecord;
+
+class SymbolInstance;
+class SymbolDef;
+class SymbolRule;
+
+namespace flightgear
+{
+ class Waypt;
+}
+
+typedef std::set<std::string> string_set;
+typedef std::vector<SymbolRule*> SymbolRuleVector;
+typedef std::vector<SymbolDef*> SymbolDefVector;
class NavDisplay : public SGSubsystem
{
virtual void init();
virtual void update(double dt);
+ void invalidatePositionedCache()
+ {
+ _cachedItemsValid = false;
+ }
+
+ double textureSize() const
+ { return _textureSize; }
+
+ void forceUpdate()
+ { _forceUpdate = true; }
+
protected:
- string _name;
+ std::string _name;
int _num;
double _time;
- double _interval;
- double _elapsed_time;
- double _persistance;
- bool _sim_init_done;
-
+ double _updateInterval;
+ bool _forceUpdate;
+
SGPropertyNode_ptr _serviceable_node;
SGPropertyNode_ptr _Instrument;
SGPropertyNode_ptr _radar_mode_control_node;
-
- SGPropertyNode_ptr _user_lat_node;
- SGPropertyNode_ptr _user_lon_node;
SGPropertyNode_ptr _user_heading_node;
- SGPropertyNode_ptr _user_alt_node;
-
+ SGPropertyNode_ptr _testModeNode;
+
FGODGauge *_odg;
// Convenience function for creating a property node with a
SGPropertyNode *getInstrumentNode(const char *name, DefaultType value);
private:
- string _texture_path;
-
- typedef enum { ARC, MAP, PLAN, ROSE, BSCAN} DisplayMode;
- DisplayMode _display_mode;
+ friend class SymbolRule;
+ friend class SymbolDef;
+
+ void addRule(SymbolRule*);
+
+ void addSymbolsToScene();
+ void addSymbolToScene(SymbolInstance* sym);
+ void limitDisplayedSymbols();
+
+ void findItems();
+ void foundPositionedItem(FGPositioned* pos);
+ void computePositionedPropsAndHeading(FGPositioned* pos, SGPropertyNode* nd, double& heading);
+ void computePositionedState(FGPositioned* pos, string_set& states);
+ void processRoute();
+ void computeWayptPropsAndHeading(flightgear::Waypt* wpt, const SGGeod& pos, SGPropertyNode* nd, double& heading);
+ void processNavRadios();
+ FGNavRecord* processNavRadio(const SGPropertyNode_ptr& radio);
+ void processAI();
+ void computeAIStates(const SGPropertyNode* ai, string_set& states);
+
+ bool anyRuleForType(const std::string& type) const;
+ bool anyRuleMatches(const std::string& type, const string_set& states) const;
+ void findRules(const std::string& type, const string_set& states, SymbolRuleVector& rules);
+
+ SymbolInstance* addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars);
+ void addLine(osg::Vec2 a, osg::Vec2 b, const osg::Vec4& color);
+ osg::Vec2 projectBearingRange(double bearingDeg, double rangeNm) const;
+ osg::Vec2 projectGeod(const SGGeod& geod) const;
+ bool isProjectedClipped(const osg::Vec2& projected) const;
+ void updateFont();
+
+ void addTestSymbol(const std::string& type, const std::string& states, const SGGeod& pos, double heading, SGPropertyNode* vars);
+ void addTestSymbols();
+
+ std::string _texture_path;
+ unsigned int _textureSize;
float _scale; // factor to convert nm to display units
- float _angle_offset;
float _view_heading;
- float _x_offset, _y_offset;
-
- double _radar_ref_rng;
- double _lat, _lon;
-
- bool _drawData;
SGPropertyNode_ptr _Radar_controls;
- SGPropertyNode_ptr _radar_weather_node;
- SGPropertyNode_ptr _radar_position_node;
- SGPropertyNode_ptr _radar_data_node;
- SGPropertyNode_ptr _radar_symbol_node;
-
- SGPropertyNode_ptr _radar_centre_node;
- SGPropertyNode_ptr _radar_coverage_node;
- SGPropertyNode_ptr _radar_ref_rng_node;
- SGPropertyNode_ptr _radar_hdg_marker_node;
- SGPropertyNode_ptr _radar_rotate_node;
- SGPropertyNode_ptr _radar_tcas_node;
- SGPropertyNode_ptr _radar_absalt_node;
+
SGPropertyNode_ptr _font_node;
SGPropertyNode_ptr _ai_enabled_node;
-
+ SGPropertyNode_ptr _navRadio1Node;
+ SGPropertyNode_ptr _navRadio2Node;
+ SGPropertyNode_ptr _xCenterNode, _yCenterNode;
+
osg::ref_ptr<osg::Texture2D> _resultTexture;
- osg::ref_ptr<osg::Texture2D> _symbols;
+ osg::ref_ptr<osg::Texture2D> _symbolTexture;
osg::ref_ptr<osg::Geode> _radarGeode;
osg::ref_ptr<osg::Geode> _textGeode;
osg::DrawArrays* _symbolPrimSet;
osg::Vec2Array *_vertices;
osg::Vec2Array *_texCoords;
-
+ osg::Vec4Array* _quadColors;
+
osg::Geometry* _lineGeometry;
osg::DrawArrays* _linePrimSet;
osg::Vec2Array* _lineVertices;
- osg::Vec3Array* _lineColors;
+ osg::Vec4Array* _lineColors;
osg::Matrixf _centerTrans;
+ osg::Matrixf _projectMat;
+
osg::ref_ptr<osgText::Font> _font;
osg::Vec4 _font_color;
- osg::Vec4 _tcas_colors[4];
float _font_size;
float _font_spacing;
FGRouteMgr* _route;
SGGeod _pos;
double _rangeNm;
+ SGPropertyNode_ptr _rangeNode;
- void update_route();
- void update_aircraft();
- bool update_tcas(const SGPropertyNode *model,double range,double user_alt,double alt,
- double bearing,double radius, bool absMode);
- void update_data(const SGPropertyNode *ac, double altitude, double heading,
- double radius, double bearing, bool selected);
- void updateFont();
+ SymbolDefVector _definitions;
+ SymbolRuleVector _rules;
+ FGNavRecord* _nav1Station;
+ FGNavRecord* _nav2Station;
+ std::vector<SymbolInstance*> _symbols;
+ std::set<FGPositioned*> _routeSources;
+
+ bool _cachedItemsValid;
+ SGVec3d _cachedPos;
+ FGPositioned::List _itemsInRange;
+ SGPropertyNode_ptr _excessDataNode;
+
+ class CacheListener;
+ std::auto_ptr<CacheListener> _cacheListener;
- osg::Matrixf project(const SGGeod& geod) const;
- void addSymbol(const SGGeod& pos, int symbolIndex, const std::string& data);
+ class ForceUpdateListener;
+ std::auto_ptr<ForceUpdateListener> _forceUpdateListener;
};
#endif // _INST_ND_HXX