// 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
#include <simgear/constants.h>
#include <simgear/math/SGMath.hxx>
-#include <simgear/math/point3d.hxx>
#include <simgear/scene/model/placement.hxx>
+#include <simgear/scene/model/modellib.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/structure/SGReferenced.hxx>
+#include <simgear/sg_inlines.h>
+
+#include <simgear/math/sg_geodesy.hxx>
#include <Main/fg_props.hxx>
using std::string;
using std::list;
+class SGMaterial;
class FGAIManager;
class FGAIFlightPlan;
+class FGFX;
+class FGNasalModelData;
+class FGAIModelData; // defined below
+
-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);
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 );
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;
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;
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
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;
double ht_diff; // value used by radar display instrument
string model_path; //Path to the 3D model
- osg::ref_ptr<osg::Node> model; //The 3D model object
SGModelPlacement aip;
bool delete_me;
bool invisible;
bool no_roll;
bool serviceable;
+ bool _installed;
int _subID;
double life;
bool _impact_reported;
bool _collision_reported;
+ bool _expiry_reported;
double _impact_lat;
double _impact_lon;
void CalculateMach();
double UpdateRadar(FGAIManager* manager);
+ void removeModel();
+
static int _newAIModelID();
private:
int _refID;
object_type _otype;
bool _initialized;
+ osg::ref_ptr<osg::LOD> _model; //The 3D model LOD object
+
+ FGAIModelData* _aimodel;
+
+ string _fxpath;
+ SGSharedPtr<FGFX> _fx;
public:
object_type getType();
void _setSubID( int s );
void _setUserPos();
+ double _getAltitudeAGL(SGGeod inpos, double start);
+
double _getVS_fps() const;
double _getAltitude() const;
double _getLongitude() const;
bool _getImpact();
bool _getImpactData();
bool _getCollisionData();
+ bool _getExpiryData();
SGPropertyNode* _getProps() const;
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) {
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;
inline void FGAIBase::setCallSign(const string& s) {
_callsign = s;
}
+inline string& FGAIBase::getCallSign() {
+ return _callsign;
+}
+
inline void FGAIBase::setXoffset(double x) {
_x_offset = x;
}
_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;
+}
+
+
+class FGAIModelData : public simgear::SGModelData {
+public:
+ FGAIModelData(SGPropertyNode *root = 0);
+ ~FGAIModelData();
+ void modelLoaded(const string& path, SGPropertyNode *prop, osg::Node *n);
+ inline string& get_sound_path() { return _path; };
+
+private:
+ FGNasalModelData *_nasal;
+ string _path;
+};
+
#endif // _FG_AIBASE_HXX