X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIBase.hxx;h=726ce303bef95d5d008609686c5d2757b84b7cd5;hb=04395fa9a5e2e1fe82652666252f597f51de3ebd;hp=46d287f732778dd4397f07fb6bf7cf6fccba2057;hpb=89010e6b0ac344970dfe3e802e4e51703fedc8ff;p=flightgear.git diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index 46d287f73..726ce303b 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -1,7 +1,7 @@ // FGAIBase.hxx - abstract base class for AI objects // Written by David Culp, started Nov 2003, based on // David Luff's FGAIEntity class. -// - davidculp2@comcast.net +// - davidculp2@comcast.net // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -29,6 +29,10 @@ #include #include #include +#include + +#include + #include
@@ -36,18 +40,20 @@ using std::string; using std::list; +class SGMaterial; class FGAIManager; class FGAIFlightPlan; +class FGFX; -class FGAIBase : public osg::Referenced { +class FGAIBase : public SGReferenced { public: enum object_type { otNull = 0, otAircraft, otShip, otCarrier, otBallistic, - otRocket, otStorm, otThermal, otStatic, otWingman, - otMultiplayer, - MAX_OBJECTS }; // Needs to be last!!! + otRocket, otStorm, otThermal, otStatic, otWingman, otGroundVehicle, + otEscort, otMultiplayer, + MAX_OBJECTS }; // Needs to be last!!! - FGAIBase(object_type ot); + FGAIBase(object_type ot, bool enableHot); virtual ~FGAIBase(); virtual void readFromScenario(SGPropertyNode* scFileNode); @@ -59,12 +65,14 @@ public: virtual void unbind(); virtual void reinit() {} + void updateLOD(); void setManager(FGAIManager* mgr, SGPropertyNode* p); void setPath( const char* model ); void setSMPath( const string& p ); void setCallSign(const string& ); void setSpeed( double speed_KTAS ); void setAltitude( double altitude_ft ); + void setAltitudeAGL( double altitude_agl_ft ); void setHeading( double heading ); void setLatitude( double latitude ); void setLongitude( double longitude ); @@ -84,6 +92,17 @@ public: void setImpactLat( double lat ); void setImpactLon( double lon ); void setImpactElev( double e ); + void setParentName(const string& p); + void setName(const string& n); + void setMaxSpeed(double kts); + + void calcRangeBearing(double lat, double lon, double lat2, double lon2, + double &range, double &bearing) const; + double calcRelBearingDeg(double bearing, double heading); + double calcTrueBearingDeg(double bearing, double heading); + double calcRecipBearingDeg(double bearing); + + bool setParentNode(); int getID() const; int _getSubID() const; @@ -93,6 +112,12 @@ public: SGVec3d getCartPosAt(const SGVec3d& off) const; SGVec3d getCartPos() const; + bool getGroundElevationM(const SGGeod& pos, double& elev, + const SGMaterial** material) const; + + double _elevation_m; + const SGMaterial* _material; + double _getCartPosX() const; double _getCartPosY() const; double _getCartPosZ() const; @@ -105,16 +130,20 @@ public: double _roll_offset; double _yaw_offset; + double _max_speed; + string _path; string _callsign; string _submodel; - string _name; + std::string _name; + string _parent; SGGeod userpos; protected: + SGPropertyNode_ptr _selected_ac; SGPropertyNode_ptr props; SGPropertyNode_ptr trigger_node; SGPropertyNode_ptr model_removed; // where to report model removal @@ -131,6 +160,7 @@ protected: double speed_north_deg_sec; double speed_east_deg_sec; double turn_radius_ft; // turn radius ft at 15 kts rudder angle 15 degrees + double altitude_agl_ft; double ft_per_deg_lon; double ft_per_deg_lat; @@ -158,13 +188,13 @@ protected: double ht_diff; // value used by radar display instrument string model_path; //Path to the 3D model - osg::ref_ptr model; //The 3D model object SGModelPlacement aip; bool delete_me; bool invisible; bool no_roll; bool serviceable; + bool _installed; int _subID; double life; @@ -173,6 +203,7 @@ protected: bool _impact_reported; bool _collision_reported; + bool _expiry_reported; double _impact_lat; double _impact_lon; @@ -186,12 +217,16 @@ protected: void CalculateMach(); double UpdateRadar(FGAIManager* manager); + void removeModel(); + static int _newAIModelID(); private: int _refID; object_type _otype; bool _initialized; + osg::ref_ptr _model; //The 3D model LOD object + SGSharedPtr _fx; public: object_type getType(); @@ -207,6 +242,8 @@ public: void _setSubID( int s ); void _setUserPos(); + double _getAltitudeAGL(SGGeod inpos, double start); + double _getVS_fps() const; double _getAltitude() const; double _getLongitude() const; @@ -242,6 +279,7 @@ public: bool _getImpact(); bool _getImpactData(); bool _getCollisionData(); + bool _getExpiryData(); SGPropertyNode* _getProps() const; @@ -267,10 +305,9 @@ public: inline double _getRange() { return range; }; inline double _getBearing() { return bearing; }; - virtual osg::Node* load3DModel(const string &path, - SGPropertyNode *prop_root); - static bool _isNight(); + + string & getCallSign(); }; inline void FGAIBase::setManager(FGAIManager* mgr, SGPropertyNode* p) { @@ -307,6 +344,10 @@ inline void FGAIBase::setAltitude( double alt_ft ) { pos.setElevationFt(altitude_ft); } +inline void FGAIBase::setAltitudeAGL( double alt_ft ) { + altitude_agl_ft = alt_ft; +} + inline void FGAIBase::setBank( double bank ) { roll = tgt_roll = bank; no_roll = false; @@ -327,6 +368,10 @@ inline void FGAIBase::setLatitude ( double latitude ) { inline void FGAIBase::setCallSign(const string& s) { _callsign = s; } +inline string& FGAIBase::getCallSign() { + return _callsign; +} + inline void FGAIBase::setXoffset(double x) { _x_offset = x; } @@ -351,10 +396,49 @@ inline void FGAIBase::setYawoffset(double y) { _yaw_offset = y; } +inline void FGAIBase::setParentName(const string& p) { + _parent = p; +} + +inline void FGAIBase::setName(const string& n) { + _name = n; +} + inline void FGAIBase::setDie( bool die ) { delete_me = die; } inline bool FGAIBase::getDie() { return delete_me; } inline FGAIBase::object_type FGAIBase::getType() { return _otype; } +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; +} + #endif // _FG_AIBASE_HXX