X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fwxradar.hxx;h=8f3e5122a7ba1e61cbf297e1d728178135951ab8;hb=43b300fe46d8013a90009ec8e1a923ec53a396b5;hp=1d905b53d6315c98f4b5ee995de93fc2aed4a462;hpb=68f248879cb15562c7b026445f83caf8f2842ae9;p=flightgear.git diff --git a/src/Instrumentation/wxradar.hxx b/src/Instrumentation/wxradar.hxx index 1d905b53d..8f3e5122a 100644 --- a/src/Instrumentation/wxradar.hxx +++ b/src/Instrumentation/wxradar.hxx @@ -1,6 +1,8 @@ // Wx Radar background texture // // Written by Harald JOHNSEN, started May 2005. +// With major amendments by Vivian MEAZZA May 2007 +// Ported to OSG by Tim MOORE Jun 2007 // // Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net // @@ -16,43 +18,170 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA -// -// +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifndef _INST_WXRADAR_HXX #define _INST_WXRADAR_HXX +#include +#include +#include +#include + #include #include +#include -class ssgTexture; +#include +#include +#include +#include +using std::vector; +using std::string; + +class FGAIBase; class FGODGauge; -class wxRadarBg : public SGSubsystem { +class wxRadarBg : public SGSubsystem, public SGPropertyChangeListener { +public: + wxRadarBg(SGPropertyNode *node); + wxRadarBg(); + virtual ~wxRadarBg(); -public: + virtual void init(); + virtual void update(double dt); + virtual void valueChanged(SGPropertyNode *); + +protected: + string _name; + int _num; + double _interval; + double _time; + bool _sim_init_done; - wxRadarBg ( SGPropertyNode *node ); - wxRadarBg (); - virtual ~wxRadarBg (); + SGPropertyNode_ptr _serviceable_node; + SGPropertyNode_ptr _Instrument; + SGPropertyNode_ptr _radar_mode_control_node; - virtual void init (); - virtual void update (double dt); + SGPropertyNode_ptr _user_lat_node; + SGPropertyNode_ptr _user_lon_node; + SGPropertyNode_ptr _user_heading_node; + SGPropertyNode_ptr _user_alt_node; + + FGODGauge *_odg; + + // Convenience function for creating a property node with a + // default value + template + SGPropertyNode *getInstrumentNode(const char *name, DefaultType value); private: + string _texture_path; - string name; - int num; + typedef enum { ARC, MAP, PLAN, ROSE } DisplayMode; + DisplayMode _display_mode; - SGPropertyNode_ptr _serviceable_node; - SGPropertyNode_ptr _Instrument; - ssgTexture *resultTexture; - ssgTexture *wxEcho; - string last_switchKnob; - bool sim_init_done; - FGODGauge *odg; + string _last_switchKnob; + + float _range_nm; + 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; + + SGPropertyNode_ptr _Tacan; + SGPropertyNode_ptr _Radar_controls; + + SGPropertyNode_ptr _user_speed_east_fps_node; + SGPropertyNode_ptr _user_speed_north_fps_node; + + SGPropertyNode_ptr _tacan_serviceable_node; + SGPropertyNode_ptr _tacan_distance_node; + SGPropertyNode_ptr _tacan_name_node; + SGPropertyNode_ptr _tacan_bearing_node; + SGPropertyNode_ptr _tacan_in_range_node; + + 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 _font_node; + SGPropertyNode_ptr _ai_enabled_node; + + osg::ref_ptr _resultTexture; + osg::ref_ptr _wxEcho; + osg::ref_ptr _radarGeode; + osg::ref_ptr _textGeode; + osg::Geometry *_geom; + osg::Vec2Array *_vertices; + osg::Vec2Array *_texCoords; + osg::Matrixf _centerTrans; + osg::ref_ptr _font; + osg::Vec4 _font_color; + float _font_size; + float _font_spacing; + + list_of_SGWxRadarEcho _radarEchoBuffer; + + FGAIManager *_ai; + + void update_weather(); + void update_aircraft(); + void update_tacan(); + void update_heading_marker(); + void update_data(FGAIBase* ac, double radius, double bearing, bool selected); + void center_map(); + void apply_map_offset(); + void updateFont(); + void calcRangeBearing(double lat, double lon, double lat2, double lon2, + double &range, double &bearing) const; + + bool withinRadarHorizon(double user_alt, double alt, double range); + bool inRadarRange(int type, double range); + + float calcRelBearing(float bearing, float heading); }; + +template<> inline +SGPropertyNode *wxRadarBg::getInstrumentNode(const char *name, bool value) +{ + SGPropertyNode *result = _Instrument->getNode(name, true); + if (!result->hasValue()) + result->setBoolValue(value); + return result; +} + + +template<> inline +SGPropertyNode *wxRadarBg::getInstrumentNode(const char *name, double value) +{ + SGPropertyNode *result = _Instrument->getNode(name, true); + if (!result->hasValue()) + result->setDoubleValue(value); + return result; +} + + +template<> inline +SGPropertyNode *wxRadarBg::getInstrumentNode(const char *name, const char *value) +{ + SGPropertyNode *result = _Instrument->getNode(name, true); + if (result->hasValue()) + result->setStringValue(value); + return result; +} + + #endif // _INST_WXRADAR_HXX