#include "AIBase.hxx"
SG_USING_STD(list);
-
- struct PERF_STRUCT {
- double accel;
- double decel;
- double climb_rate;
- double descent_rate;
- double takeoff_speed;
- double climb_speed;
- double cruise_speed;
- double descent_speed;
- double land_speed;
- };
+class FGAIThermal;
class FGAIManager : public SGSubsystem
ai_list_type ai_list;
ai_list_iterator ai_list_itr;
-public:
+ // array of already-assigned ID's
+ typedef vector <int> id_vector_type;
+ id_vector_type ids;
+ id_vector_type::iterator id_itr;
- enum object_type { otAircraft, otShip, otBallistic, otRocket };
+public:
FGAIManager();
~FGAIManager();
void unbind();
void update(double dt);
+ int assignID();
+ void freeID(int ID);
+
+ int createAircraft( string model_class, // see FGAIAircraft.hxx for possible classes
+ string path, // path to exterior model
+ double latitude, // in degrees -90 to 90
+ double longitude, // in degrees -180 to 180
+ double altitude, // in feet
+ double heading, // true heading in degrees
+ double speed, // in knots true airspeed (KTAS)
+ double pitch = 0, // in degrees
+ double roll = 0 ); // in degrees
+
+ int createShip( string path, // path to exterior model
+ double latitude, // in degrees -90 to 90
+ double longitude, // in degrees -180 to 180
+ double altitude, // in feet (ex. for a lake!)
+ double heading, // true heading in degrees
+ double speed, // in knots true
+ double rudder ); // in degrees (between 0 and 5 works best)
+
+
+ int createBallistic( string path, // path to exterior model
+ double latitude, // in degrees -90 to 90
+ double longitude, // in degrees -180 to 180
+ double altitude, // in feet
+ double azimuth, // in degrees (same as heading)
+ double elevation, // in degrees (same as pitch)
+ double speed ); // in feet per second
+
+ int createStorm( string path, // path to exterior model
+ double latitude, // in degrees -90 to 90
+ double longitude, // in degrees -180 to 180
+ double altitude, // in feet
+ double heading, // true heading in degrees
+ double speed ); // in knots true airspeed (KTAS)
+
+ int createThermal( double latitude, // in degrees -90 to 90
+ double longitude, // in degrees -180 to 180
+ double strength, // in feet per second
+ double diameter ); // in feet
+
+ void destroyObject( int ID );
+
+ inline double get_user_latitude() { return user_latitude; }
+ inline double get_user_longitude() { return user_longitude; }
+ inline double get_user_altitude() { return user_altitude; }
+ inline double get_user_heading() { return user_heading; }
+ inline double get_user_pitch() { return user_pitch; }
+ inline double get_user_yaw() { return user_yaw; }
+ inline double get_user_speed() {return user_speed; }
private:
bool initDone;
+ int numObjects;
+ SGPropertyNode* root;
+ SGPropertyNode* wind_from_down;
+
+ double user_latitude;
+ double user_longitude;
+ double user_altitude;
+ double user_heading;
+ double user_pitch;
+ double user_yaw;
+ double user_speed;
+ double _dt;
+ int dt_count;
+ void fetchUserState( void );
+
+ // used by thermals
+ double range_nearest;
+ double strength;
+ void processThermal( FGAIThermal* thermal );
};