X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAICarrier.hxx;h=cf9c5cd333e18da2de74d1e9435eeb1b377bde25;hb=4bfd1722df24f5be89459b25010e5d7352720a7b;hp=29f63f73b3b4886cc791503996486bc4e73f4d8f;hpb=499c702ffb6c697303b4f5a28461590c33bd9672;p=flightgear.git diff --git a/src/AIModel/AICarrier.hxx b/src/AIModel/AICarrier.hxx index 29f63f73b..cf9c5cd33 100644 --- a/src/AIModel/AICarrier.hxx +++ b/src/AIModel/AICarrier.hxx @@ -30,95 +30,165 @@ SG_USING_STD(string); SG_USING_STD(list); #include "AIShip.hxx" + +#include "AIManager.hxx" +#include "AIBase.hxx" + class FGAIManager; class FGAICarrier; class FGAICarrierHardware : public ssgBase { public: - enum Type { Catapult, Wire, Solid }; - - FGAICarrier *carrier; - int id; - Type type; - - static FGAICarrierHardware* newCatapult(FGAICarrier *c) { - FGAICarrierHardware* ch = new FGAICarrierHardware; - ch->carrier = c; - ch->type = Catapult; - ch->id = unique_id++; - return ch; - } - static FGAICarrierHardware* newWire(FGAICarrier *c) { - FGAICarrierHardware* ch = new FGAICarrierHardware; - ch->carrier = c; - ch->type = Wire; - ch->id = unique_id++; - return ch; - } - static FGAICarrierHardware* newSolid(FGAICarrier *c) { - FGAICarrierHardware* ch = new FGAICarrierHardware; - ch->carrier = c; - ch->type = Solid; - ch->id = unique_id++; - return ch; - } + enum Type { Catapult, Wire, Solid }; + + FGAICarrier *carrier; + int id; + Type type; + + static FGAICarrierHardware* newCatapult(FGAICarrier *c) { + FGAICarrierHardware* ch = new FGAICarrierHardware; + ch->carrier = c; + ch->type = Catapult; + ch->id = unique_id++; + return ch; + } + static FGAICarrierHardware* newWire(FGAICarrier *c) { + FGAICarrierHardware* ch = new FGAICarrierHardware; + ch->carrier = c; + ch->type = Wire; + ch->id = unique_id++; + return ch; + } + static FGAICarrierHardware* newSolid(FGAICarrier *c) { + FGAICarrierHardware* ch = new FGAICarrierHardware; + ch->carrier = c; + ch->type = Solid; + ch->id = unique_id++; + return ch; + } private: - static int unique_id; + static int unique_id; }; + class FGAICarrier : public FGAIShip { - public: - - FGAICarrier(FGAIManager* mgr); - ~FGAICarrier(); - void setSolidObjects(const list& solid_objects); - void setWireObjects(const list& wire_objects); - void setCatapultObjects(const list& catapult_objects); + FGAICarrier(); + virtual ~FGAICarrier(); - void getVelocityWrtEarth(sgVec3 v); - virtual void bind(); + virtual void readFromScenario(SGPropertyNode* scFileNode); + + void setSign(const string& ); + void setTACANChannelID(const string &); + + void getVelocityWrtEarth(sgdVec3& v, sgdVec3& omega, sgdVec3& pivot); + virtual void bind(); virtual void unbind(); - void UpdateFlols ( double dt ); - - bool init(); + void UpdateFlols ( const sgdMat3& trans ); + void UpdateWind ( double dt ); + void setWind_from_east( double fps ); + void setWind_from_north( double fps ); + void setMaxLat( double deg ); + void setMinLat( double deg ); + void setMaxLong( double deg ); + void setMinLong( double deg ); + void TurnToLaunch(); + void TurnToBase(); + void ReturnToBox(); + float Horizon(float h); + bool OutsideBox(); + + bool init(); + + virtual const char* getTypeString(void) const { return "carrier"; } + + bool getParkPosition(const string& id, Point3D& geodPos, + double& hdng, sgdVec3 uvw); private: - - void update(double dt); - void mark_nohot(ssgEntity*); - bool mark_wires(ssgEntity*, const list&, bool = false); - bool mark_cat(ssgEntity*, const list&, bool = false); - bool mark_solid(ssgEntity*, const list&, bool = false); - - list solid_objects; // List of solid object names - list wire_objects; // List of wire object names - list catapult_objects; // List of catapult object names - - // Velocity wrt earth. - sgVec3 vel_wrt_earth; - - float trans[3][3]; - float in[3]; - float out[3]; - - double Rx, Ry, Rz; - double Sx, Sy, Sz; - double Tx, Ty, Tz; - - float cosRx, sinRx; - float cosRy, sinRy; - float cosRz, sinRz; - - double flolsXYZ[3], eyeXYZ[3]; - double lat, lon, alt; - double dist; - int source; - Point3D eyepos; - Point3D flolspos; + /// Is sufficient to be private, stores a possible position to place an + /// aircraft on start + struct ParkPosition { + ParkPosition(const ParkPosition& pp) + : name(pp.name), offset(pp.offset), heading_deg(pp.heading_deg) + {} + ParkPosition(const string& n, const Point3D& off = Point3D(), double heading = 0) + : name(n), offset(off), heading_deg(heading) + {} + string name; + Point3D offset; + double heading_deg; + }; + + + void update(double dt); + void mark_nohot(ssgEntity*); + + bool mark_wires(ssgEntity*, const list&, bool = false); + bool mark_cat(ssgEntity*, const list&, bool = false); + bool mark_solid(ssgEntity*, const list&, bool = false); + double wind_from_east; // fps + double wind_from_north; // fps + double rel_wind_speed_kts; + double rel_wind_from_deg; + + + list solid_objects; // List of solid object names + list wire_objects; // List of wire object names + list catapult_objects; // List of catapult object names + list ppositions; // List of positions where an aircraft can start. + string sign; // The sign of this carrier. + + // Velocity wrt earth. + sgdVec3 vel_wrt_earth; + sgdVec3 rot_wrt_earth; + sgdVec3 rot_pivot_wrt_earth; + + + // these describe the flols + Point3D flols_off; + + double dist; // the distance of the eyepoint from the flols + double angle; + int source; // the flols light which is visible at the moment + bool wave_off_lights; + + // these are for maneuvering the carrier + Point3D carrierpos; + Point3D initialpos; + + double wind_speed_from_north_kts ; + double wind_speed_from_east_kts ; + double wind_speed_kts; //true wind speed + double wind_from_deg; //true wind direction + double rel_wind; + double max_lat, min_lat, max_long, min_long; + double base_course, base_speed; + + bool turn_to_launch_hdg; + bool returning; // set if the carrier is returning to an operating box + bool InToWind(); // set if the carrier is in to wind + + + SGPropertyNode_ptr _longitude_node; + SGPropertyNode_ptr _latitude_node; + SGPropertyNode_ptr _altitude_node; + SGPropertyNode_ptr _surface_wind_from_deg_node; + SGPropertyNode_ptr _surface_wind_speed_node; + + // this is for tacan + + string TACAN_channel_id; + + // these are for moving the elevators + void UpdateElevator( double dt, double transition_time); + double step; + double pos_norm, raw_pos_norm; + double transition_time, time_constant; + bool elevators; }; #endif // _FG_AICARRIER_HXX