]> git.mxchange.org Git - flightgear.git/commitdiff
Mathias Fröhlich:
authorehofman <ehofman>
Sat, 19 Mar 2005 09:57:18 +0000 (09:57 +0000)
committerehofman <ehofman>
Sat, 19 Mar 2005 09:57:18 +0000 (09:57 +0000)
I have done some cleanup where I moved some values out of classes where they
do not belong and such stuff.
Also the fols offsets are now named in the carrier xml file with a more
verbose name (flols-pos/offset-*) than before (only offset-*).
There is a little preparation for definitions of parking positions on the
carrier which should later be used for starting flightgear directly on the
carrier.

src/AIModel/AIBase.hxx
src/AIModel/AICarrier.cxx
src/AIModel/AICarrier.hxx
src/AIModel/AIManager.cxx
src/AIModel/AIManager.hxx
src/AIModel/AIScenario.cxx
src/AIModel/AIShip.cxx
src/AIModel/AIShip.hxx

index 82c4de8867446b1642bee38aae9562d79b87637a..dacd7f9ecf8d97a4fd12a321497e4ad43a327e5b 100644 (file)
@@ -73,12 +73,13 @@ typedef struct {
    list<string> solid_objects;    // List of solid object names
    list<string> wire_objects;     // List of wire object names
    list<string> catapult_objects; // List of catapult object names
-   double radius;             // used by ship ojects, in feet
-   double x_offset;           // used by ship ojects, in meters
-   double y_offset;           // used by ship ojects, in meters
-   double z_offset;           // used by ship ojects, in meters   
-  string acType;              // used by aircraft objects
-  string company;             // used by aircraft objects
+   list<Point3D> ppositions;  // List of positions on a carrier where an aircraft can start.
+   Point3D flols_offset;      // used by carrier objects, in meters
+   double radius;             // used by ship objects, in feet
+   string name;               // used by carrier objects
+   string pennant_number;     // used by carrier objects
+   string acType;             // used by aircraft objects
+   string company;            // used by aircraft objects
 } FGAIModelEntity;
 
 
@@ -91,7 +92,7 @@ public:
     virtual void update(double dt);
     inline Point3D GetPos() { return(pos); }
 
-    enum object_type { otNull = 0, otAircraft, otShip, otBallistic,
+    enum object_type { otNull = 0, otAircraft, otShip, otCarrier, otBallistic,
                        otRocket, otStorm, otThermal, 
                        MAX_OBJECTS };  // Needs to be last!!!
 
@@ -131,12 +132,6 @@ protected:
     double vs;          // vertical speed, feet per minute  
     double turn_radius_ft; // turn radius ft at 15 kts rudder angle 15 degrees
 
-    // these describe the flols 
-    Point3D flolspos; // WGS84 lat & lon in degrees, elev above sea-level in meters
-    double flols_x_offset;     // longitudinal distance, in meters
-    double flols_y_offset;     // lateral distance, in meters
-    double flols_z_offset;     // height, in meters
-    
     double ft_per_deg_lon;
     double ft_per_deg_lat;
 
@@ -238,17 +233,6 @@ inline void FGAIBase::setRadius( double radius ) {
   turn_radius_ft = radius;
 }
 
-inline void FGAIBase::setXoffset( double x_offset ) {
-  flols_x_offset = x_offset;
-}
-
-inline void FGAIBase::setYoffset( double y_offset ) {
-  flols_y_offset = y_offset;
-}
-
-inline void FGAIBase::setZoffset( double z_offset ) {
-  flols_z_offset = z_offset;
-}
 inline void FGAIBase::setHeading( double heading ) {
   hdg = tgt_heading = heading;
 }
index e6ab561479bb0dc883d06fec71f9f400e49c8b45..45757dd9adf37f7a7e490000ee80c2aac12d50da 100644 (file)
@@ -34,6 +34,8 @@
 
 
 FGAICarrier::FGAICarrier(FGAIManager* mgr) : FGAIShip(mgr) {
+  _type_str = "carrier";
+  _otype = otCarrier;
 }
 
 FGAICarrier::~FGAICarrier() {
@@ -51,6 +53,18 @@ void FGAICarrier::setCatapultObjects(const list<string>& co) {
   catapult_objects = co;
 }
 
+void FGAICarrier::setParkingPositions(const list<Point3D>& p) {
+  ppositions = p;
+}
+
+void FGAICarrier::setSign(const string& s) {
+  sign = s;
+}
+
+void FGAICarrier::setFlolsOffset(const Point3D& off) {
+  flols_off = off;
+}
+
 void FGAICarrier::getVelocityWrtEarth(sgVec3 v) {
   sgCopyVec3(v, vel_wrt_earth );
 }
@@ -96,28 +110,31 @@ bool FGAICarrier::init() {
 
    return true;
 }
+
 void FGAICarrier::bind() {
-   FGAIBase::bind();
+   FGAIShip::bind();
 
    props->tie("controls/flols/source-lights",
                 SGRawValuePointer<int>(&source));
    props->tie("controls/flols/distance-m",
-                SGRawValuePointer<double>(&dist)); 
+                SGRawValuePointer<double>(&dist));
    props->tie("controls/flols/angle-degs",
-                SGRawValuePointer<double>(&angle));                                              
+                SGRawValuePointer<double>(&angle));
    props->setBoolValue("controls/flols/cut-lights", false);
    props->setBoolValue("controls/flols/wave-off-lights", false);
-   props->setBoolValue("controls/flols/cond-datum-lights", true);  
-   props->setBoolValue("controls/crew", false);  
-   }
+   props->setBoolValue("controls/flols/cond-datum-lights", true);
+   props->setBoolValue("controls/crew", false);
+
+   props->setStringValue("sign", sign.c_str());
+}
 
 void FGAICarrier::unbind() {
-    FGAIBase::unbind();
+    FGAIShip::unbind();
     props->untie("controls/flols/source-lights");
-    props->untie("controls/flols/distance-m"); 
-    props->untie("controls/flols/angle-degs");    
+    props->untie("controls/flols/distance-m");
+    props->untie("controls/flols/angle-degs");
 }
-   
+
 void FGAICarrier::mark_nohot(ssgEntity* e) {
   if (e->isAKindOf(ssgTypeBranch())) {
     ssgBranch* br = (ssgBranch*)e;
@@ -300,6 +317,20 @@ bool FGAICarrier::mark_cat(ssgEntity* e, const list<string>& cat_objects, bool m
 }
 
 void FGAICarrier::UpdateFlols( double dt) {
+    
+    float trans[3][3];
+    float in[3];
+    float out[3];
+
+    float cosRx, sinRx;
+    float cosRy, sinRy;
+    float cosRz, sinRz;
+        
+    double flolsXYZ[3], eyeXYZ[3]; 
+    double lat, lon, alt;
+    Point3D eyepos;
+    Point3D flolspos;  
+
 /*    cout << "x_offset " << flols_x_offset 
           << " y_offset " << flols_y_offset 
           << " z_offset " << flols_z_offset << endl;
@@ -326,9 +357,9 @@ void FGAICarrier::UpdateFlols( double dt) {
        << "flols_y_offset " << flols_y_offset << endl
        << "flols_z_offset " << flols_z_offset << endl;*/
      
-  in[0] = flols_x_offset;  
-  in[1] = flols_y_offset;
-  in[2] = flols_z_offset;    
+  in[0] = flols_off.x();  
+  in[1] = flols_off.y();
+  in[2] = flols_off.z();    
 
 // pre-process the trig functions
 
index 6c9e77013ab2e1649bb92e870d80d1f22ad0d4d5..2844e7b4bfdf87fdffe03a06f25e69031fa11e5d 100644 (file)
@@ -78,6 +78,9 @@ public:
         void setSolidObjects(const list<string>& solid_objects);
         void setWireObjects(const list<string>& wire_objects);
         void setCatapultObjects(const list<string>& catapult_objects);
+        void setParkingPositions(const list<Point3D>& p);
+        void setSign(const string& );
+        void setFlolsOffset(const Point3D& off);
 
        void getVelocityWrtEarth(sgVec3 v);
        virtual void bind();
@@ -86,6 +89,8 @@ public:
        
        bool init();
 
+        static SGPropertyNode* getStartPosition(const string& id);
+
 private:
 
        void update(double dt);
@@ -97,29 +102,18 @@ private:
        list<string> solid_objects;       // List of solid object names
        list<string> wire_objects;        // List of wire object names
        list<string> catapult_objects;    // List of catapult object names
+       list<Point3D> ppositions;         // List of positions where an aircraft can start.
+       string sign;                      // The sign of this carrier.
 
        // Velocity wrt earth.
        sgVec3 vel_wrt_earth;
+
+        // these describe the flols 
+        Point3D flols_off;
     
-    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, angle;
-    int source;
-    
-    Point3D eyepos;
-    Point3D flolspos;  
+        double dist;            // the distance of the eyepoint from the flols
+        double angle;
+        int source;             // the flols light which is visible at the moment
 };
 
 #endif  // _FG_AICARRIER_HXX
index 52d8e3da96d7879d967019bf8d173707b1ae397a..6fc225e37997db58bf3fc43c56d9d2ecf058b97b 100644 (file)
@@ -51,7 +51,7 @@ FGAIManager::FGAIManager() {
 }
 
 FGAIManager::~FGAIManager() {
-  ai_list_itr = ai_list.begin();
+  ai_list_iterator ai_list_itr = ai_list.begin();
   while(ai_list_itr != ai_list.end()) {
       (*ai_list_itr)->unbind();
       delete (*ai_list_itr);
@@ -105,7 +105,7 @@ void FGAIManager::update(double dt) {
 
         _dt = dt;
 
-        ai_list_itr = ai_list.begin();
+        ai_list_iterator ai_list_itr = ai_list.begin();
         while(ai_list_itr != ai_list.end()) {
                 if ((*ai_list_itr)->getDie()) {      
                  tmgr->release((*ai_list_itr)->getID());
@@ -191,6 +191,7 @@ FGAIManager::createShip( FGAIModelEntity *entity ) {
         ai_ship->setLongitude(entity->longitude);
         ai_ship->setLatitude(entity->latitude);
         ai_ship->setBank(entity->rudder);
+        ai_ship->setName(entity->name);
 
         if ( entity->fp ) {
            ai_ship->setFlightPlan(entity->fp);
@@ -209,7 +210,7 @@ FGAIManager::createCarrier( FGAIModelEntity *entity ) {
         FGAICarrier* ai_carrier = new FGAICarrier(this);
         ai_list.push_back(ai_carrier);
         ++numObjects[0];
-        ++numObjects[FGAIBase::otShip];
+        ++numObjects[FGAIBase::otCarrier];
         ai_carrier->setHeading(entity->heading);
         ai_carrier->setSpeed(entity->speed);
         ai_carrier->setPath(entity->path.c_str());
@@ -220,10 +221,11 @@ FGAIManager::createCarrier( FGAIModelEntity *entity ) {
         ai_carrier->setSolidObjects(entity->solid_objects);
         ai_carrier->setWireObjects(entity->wire_objects);
         ai_carrier->setCatapultObjects(entity->catapult_objects);
+        ai_carrier->setParkingPositions(entity->ppositions);
         ai_carrier->setRadius(entity->radius);
-        ai_carrier->setXoffset(entity->x_offset);
-        ai_carrier->setYoffset(entity->y_offset);
-        ai_carrier->setZoffset(entity->z_offset);
+        ai_carrier->setSign(entity->pennant_number);
+        ai_carrier->setName(entity->name);
+        ai_carrier->setFlolsOffset(entity->flols_offset);
 
         if ( entity->fp ) {
            ai_carrier->setFlightPlan(entity->fp);
@@ -298,7 +300,7 @@ FGAIManager::createThermal( FGAIModelEntity *entity ) {
 }
 
 void FGAIManager::destroyObject( void* ID ) {
-        ai_list_itr = ai_list.begin();
+        ai_list_iterator ai_list_itr = ai_list.begin();
         while(ai_list_itr != ai_list.end()) {
             if ((*ai_list_itr)->getID() == ID) {
               --numObjects[0];
index 4dfe74932d16018dd5bb505521caa4e0289f4279..9874859aabc78bdb9e4929e8abee1fcc67b5331d 100644 (file)
@@ -69,7 +69,6 @@ private:
     // Everything put in this list should be created dynamically
     // on the heap and ***DELETED WHEN REMOVED!!!!!***
     ai_list_type ai_list;
-    ai_list_iterator ai_list_itr;
   ModelVec loadedModels;
 
 public:
index 6c8a75770058dc47b767ffaeda149a936e6f44e5..f8c6e56ce035595ff4736f93c321fffa3851a3f7 100644 (file)
@@ -34,7 +34,9 @@
 #include "AIFlightPlan.hxx"
 
 static list<string>
-getAllNodeVals(const char* name, SGPropertyNode * entry_node);
+getAllStringNodeVals(const char* name, SGPropertyNode * entry_node);
+static list<Point3D>
+getAllOffsetNodeVals(const char* name, SGPropertyNode * entry_node);
 
 FGAIScenario::FGAIScenario(string &filename)
 {
@@ -96,13 +98,14 @@ FGAIScenario::FGAIScenario(string &filename)
      en->cd              = entry_node->getDoubleValue("cd", 0.029); 
      en->mass            = entry_node->getDoubleValue("mass", 0.007); 
      en->radius          = entry_node->getDoubleValue("turn-radius-ft", 2000);
-     en->x_offset        = entry_node->getDoubleValue("x-offset-m", 5.5); 
-     en->y_offset        = entry_node->getDoubleValue("y-offset-m", 1.0); 
-     en->z_offset        = entry_node->getDoubleValue("z-offset-m", 1.0); 
- /*  en->name            = entry_node->getStringValue("name", "");*/
-     en->wire_objects     = getAllNodeVals("wire", entry_node);
-     en->catapult_objects = getAllNodeVals("catapult", entry_node);
-     en->solid_objects    = getAllNodeVals("solid", entry_node);
+     en->name            = entry_node->getStringValue("name", "");
+     en->pennant_number  = entry_node->getStringValue("pennant-number", "");
+     en->wire_objects     = getAllStringNodeVals("wire", entry_node);
+     en->catapult_objects = getAllStringNodeVals("catapult", entry_node);
+     en->solid_objects    = getAllStringNodeVals("solid", entry_node);
+     en->ppositions       = getAllOffsetNodeVals("parking-pos", entry_node);
+     list<Point3D> flolspos = getAllOffsetNodeVals("flols-pos", entry_node);
+     en->flols_offset     = flolspos.front();
 
      en->fp             = NULL;
      if (en->flightplan != ""){
@@ -139,7 +142,7 @@ int FGAIScenario::nEntries( void )
 }
 
 static list<string>
-getAllNodeVals(const char* name, SGPropertyNode * entry_node)
+getAllStringNodeVals(const char* name, SGPropertyNode * entry_node)
 {
   list<string> retval;
   int i=0;
@@ -157,6 +160,22 @@ getAllNodeVals(const char* name, SGPropertyNode * entry_node)
   return retval;
 }
 
+static list<Point3D>
+getAllOffsetNodeVals(const char* name, SGPropertyNode * entry_node)
+{
+  list<Point3D> retval;
+
+  vector<SGPropertyNode_ptr>::iterator it;
+  vector<SGPropertyNode_ptr> children = entry_node->getChildren(name);
+  for (it = children.begin(); it != children.end(); ++it) {
+    double offset_x = (*it)->getDoubleValue("x-offset-m", 0);
+    double offset_y = (*it)->getDoubleValue("y-offset-m", 0);
+    double offset_z = (*it)->getDoubleValue("z-offset-m", 0);
+    retval.push_back(Point3D(offset_x, offset_y, offset_z));
+  }
+
+  return retval;
+}
 
 // end scenario.cxx
 
index 1aabe5875ecb24a1f39fc0e58920481110e6371d..2d8fc31a88d9bf2c6a3bb2b747781426464bf477 100644 (file)
@@ -49,6 +49,8 @@ void FGAIShip::bind() {
 
     props->tie("surface-positions/rudder-pos-deg",
                 SGRawValuePointer<double>(&rudder));
+
+    props->setStringValue("name", name.c_str());
 }
 
 void FGAIShip::unbind() {
@@ -194,6 +196,10 @@ void FGAIShip::setFlightPlan(FGAIFlightPlan* f) {
   fp = f;
 }
 
+void FGAIShip::setName(const string& n) {
+  name = n;
+}
+
 void FGAIShip::ProcessFlightPlan(double dt) {
   // not implemented yet
 }
index 25d8b449581c447652b8a744abc235dc171fbd5a..97412a9227afe0b9a6e042b6e8a22448d1c7af24 100644 (file)
@@ -36,6 +36,7 @@ public:
         virtual void unbind();
        void update(double dt);
         void setFlightPlan(FGAIFlightPlan* f);
+        void setName(const string&);
         void ProcessFlightPlan( double dt );
 
         void AccelTo(double speed);
@@ -45,6 +46,10 @@ public:
         void ClimbTo(double altitude);
         void TurnTo(double heading);
        
+protected:
+
+       string name; // The name of this ship.
+
 private:
 
         bool hdg_lock;