+inline void FGAIBase::calcRangeBearing(double lat, double lon, double lat2, double lon2,
+ double &range, double &bearing) const
+{
+ // calculate the bearing and range of the second pos from the first
+ double az2, distance;
+ geo_inverse_wgs_84(lat, lon, lat2, lon2, &bearing, &az2, &distance);
+ range = distance * SG_METER_TO_NM;
+}
+
+inline double FGAIBase::calcRelBearingDeg(double bearing, double heading){
+ double angle = bearing - heading;
+ SG_NORMALIZE_RANGE(angle, -180.0, 180.0);
+ return angle;
+}
+
+inline double FGAIBase::calcTrueBearingDeg(double bearing, double heading){
+ double angle = bearing + heading;
+ SG_NORMALIZE_RANGE(angle, 0.0, 360.0);
+ return angle;
+}
+
+inline double FGAIBase::calcRecipBearingDeg(double bearing){
+ double angle = bearing - 180;
+ SG_NORMALIZE_RANGE(angle, 0.0, 360.0);
+ return angle;
+}
+
+inline void FGAIBase::setMaxSpeed(double m) {
+ _max_speed = m;
+}
+
+
+class FGAIModelData : public simgear::SGModelData {
+public:
+ FGAIModelData(SGPropertyNode *root = 0);
+ ~FGAIModelData();
+
+ /** osg callback, thread-safe */
+ void modelLoaded(const string& path, SGPropertyNode *prop, osg::Node *n);
+
+ /** init hook to be called after model is loaded.
+ * Not thread-safe. Call from main thread only. */
+ void init(void) { _initialized = true; }
+
+ bool needInitilization(void) { return _ready && !_initialized;}
+ bool isInitialized(void) { return _initialized;}
+ inline std::string& get_sound_path() { return _fxpath;}
+
+private:
+ FGNasalModelDataProxy *_nasal;
+ std::string _fxpath;
+ bool _ready;
+ bool _initialized;
+};
+
+#endif // _FG_AIBASE_HXX