]> git.mxchange.org Git - flightgear.git/commitdiff
Use an AIEntity variable for the ground elevation instead of SGLocation.
authorfrohlich <frohlich>
Sat, 7 Mar 2009 11:29:32 +0000 (11:29 +0000)
committerTim Moore <timoore@redhat.com>
Wed, 11 Mar 2009 22:14:33 +0000 (23:14 +0100)
Modified Files:
AIEntity.cxx AIEntity.hxx AILocalTraffic.cxx

src/ATCDCL/AIEntity.cxx
src/ATCDCL/AIEntity.hxx
src/ATCDCL/AILocalTraffic.cxx

index f8284c3dbe2149ff331ef1bdde5b21643d07fe75..3f0f1f7ea11074612adaf3d28fb6fe0940decc63 100644 (file)
@@ -39,7 +39,9 @@
 
 #include "AIEntity.hxx"
 
-FGAIEntity::FGAIEntity() {
+FGAIEntity::FGAIEntity() :
+    _ground_elevation_m(0)
+{
 }
 
 FGAIEntity::~FGAIEntity() {
index 1b184a83344ed5282ff7c270c35527b285b76125..2822e0184def2e337f31afb80ab92d0cf6956d71 100644 (file)
@@ -64,6 +64,7 @@ protected:
     char* _model_path; //Path to the 3D model
     osg::ref_ptr<osg::Node> _model;    // Pointer to the model
     SGModelPlacement _aip;
+    double _ground_elevation_m;
 
     void Transform();
 };
index 63c1848c4042869ae0dc0f49016d9d9d6ad9ad78..e99b60936ebda638365699a35a59c815086a8bf5 100644 (file)
@@ -578,8 +578,8 @@ void FGAILocalTraffic::Update(double dt) {
                if(!inAir) {
                        DoGroundElev();
                        if(!elevInitGood) {
-                               if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                                       _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+                               if(_ground_elevation_m > -9990.0) {
+                                       _pos.setelev(_ground_elevation_m + wheelOffset);
                                        //cout << "TAKEOFF_ROLL, POS = " << pos.lon() << ", " << pos.lat() << ", " << pos.elev() << '\n';
                                        //Transform();
                                        _aip.setVisible(true);
@@ -596,8 +596,8 @@ void FGAILocalTraffic::Update(double dt) {
                //cout << "*" << flush;
                if(!elevInitGood) {
                        //DoGroundElev();
-                       if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                               _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+                       if(_ground_elevation_m > -9990.0) {
+                               _pos.setelev(_ground_elevation_m + wheelOffset);
                                //Transform();
                                _aip.setVisible(true);
                                //Transform();
@@ -656,8 +656,8 @@ void FGAILocalTraffic::Update(double dt) {
                //cout << "In PARKED\n";
                if(!elevInitGood) {
                        DoGroundElev();
-                       if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                               _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+                       if(_ground_elevation_m > -9990.0) {
+                               _pos.setelev(_ground_elevation_m + wheelOffset);
                                //Transform();
                                _aip.setVisible(true);
                                //Transform();
@@ -836,8 +836,8 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) {
                        double dveldt = 5.0;
                        vel += dveldt * dt;
                }
-               if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                       _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+               if(_ground_elevation_m > -9990.0) {
+                       _pos.setelev(_ground_elevation_m + wheelOffset);
                }
                IAS = vel + (cos((_hdg - wind_from) * DCL_DEGREES_TO_RADIANS) * wind_speed);
                if(IAS >= 70) {
@@ -1064,12 +1064,12 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) {
                                IAS = 70.0;
                        } else {
                                if(_pos.elev() < (rwy.threshold_pos.elev()+10.0+wheelOffset)) {
-                                       if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                                               if(_pos.elev() < (_aip.getSGLocation()->get_cur_elev_m() + wheelOffset + 1.0)) {
+                                       if(_ground_elevation_m > -9990.0) {
+                                               if(_pos.elev() < (_ground_elevation_m + wheelOffset + 1.0)) {
                                                        slope = -2.0;
                                                        _pitch = 1.0;
                                                        IAS = 55.0;
-                                               } else if(_pos.elev() < (_aip.getSGLocation()->get_cur_elev_m() + wheelOffset + 5.0)) {
+                                               } else if(_pos.elev() < (_ground_elevation_m + wheelOffset + 5.0)) {
                                                        slope = -4.0;
                                                        _pitch = -2.0;
                                                        IAS = 60.0;
@@ -1101,8 +1101,8 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) {
                if(_pos.elev() < (rwy.threshold_pos.elev()+10.0+wheelOffset)) {
                        //slope = -1.0;
                        //_pitch = 1.0;
-                       if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                               if((_aip.getSGLocation()->get_cur_elev_m() + wheelOffset) > _pos.elev()) {
+                       if(_ground_elevation_m > -9990.0) {
+                               if((_ground_elevation_m + wheelOffset) > _pos.elev()) {
                                        slope = 0.0;
                                        _pitch = 0.0;
                                        leg = LANDING_ROLL;
@@ -1118,8 +1118,8 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) {
        case LANDING_ROLL:
                //inAir = false;
                descending = false;
-               if(_aip.getSGLocation()->get_cur_elev_m() > -9990.0) {
-                       _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+               if(_ground_elevation_m > -9990.0) {
+                       _pos.setelev(_ground_elevation_m + wheelOffset);
                }
                track = rwy.hdg;
                dveldt = -5.0;
@@ -1505,8 +1505,8 @@ void FGAILocalTraffic::Taxi(double dt) {
                double slope = 0.0;
                _pos = dclUpdatePosition(_pos, track, slope, dist);
                //cout << "Updated position...\n";
-               if(_aip.getSGLocation()->get_cur_elev_m() > -9990) {
-                       _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+               if(_ground_elevation_m > -9990) {
+                       _pos.setelev(_ground_elevation_m + wheelOffset);
                } // else don't change the elev until we get a valid ground elev again!
        } else if(lastNode) {
                if(taxiState == TD_LINING_UP) {
@@ -1524,8 +1524,8 @@ void FGAILocalTraffic::Taxi(double dt) {
                                double slope = 0.0;
                                _pos = dclUpdatePosition(_pos, track, slope, dist);
                                //cout << "Updated position...\n";
-                               if(_aip.getSGLocation()->get_cur_elev_m() > -9990) {
-                                       _pos.setelev(_aip.getSGLocation()->get_cur_elev_m() + wheelOffset);
+                               if(_ground_elevation_m > -9990) {
+                                       _pos.setelev(_ground_elevation_m + wheelOffset);
                                } // else don't change the elev until we get a valid ground elev again!
                                if(fabs(_hdg - rwy.hdg) <= 1.0) {
                                        operatingState = IN_PATTERN;
@@ -1554,32 +1554,24 @@ void FGAILocalTraffic::Taxi(double dt) {
 // Either this function or the logic of how often it is called
 // will almost certainly change.
 void FGAILocalTraffic::DoGroundElev() {
-       // It would be nice if we could set the correct tile center here in order to get a correct
-       // answer with one call to the function, but what I tried in the two commented-out lines
-       // below only intermittently worked, and I haven't quite groked why yet.
-       //SGBucket buck(pos.lon(), pos.lat());
-       //aip.getSGLocation()->set_tile_center(Point3D(buck.get_center_lon(), buck.get_center_lat(), 0.0));
-       
        // Only do the proper hitlist stuff if we are within visible range of the viewer.
        double visibility_meters = fgGetDouble("/environment/visibility-m");
        FGViewer* vw = globals->get_current_view();
        if(dclGetHorizontalSeparation(_pos, Point3D(vw->getLongitude_deg(), vw->getLatitude_deg(), 0.0)) > visibility_meters) {
-               _aip.getSGLocation()->set_cur_elev_m(aptElev);
+               _ground_elevation_m = aptElev;
                return;
        }
 
         // FIXME: make shure the pos.lat/pos.lon values are in degrees ...
         double range = 500.0;
-        double lat = _aip.getSGLocation()->getLatitude_deg();
-        double lon = _aip.getSGLocation()->getLongitude_deg();
-        if (!globals->get_tile_mgr()->scenery_available(lat, lon, range)) {
+        if (!globals->get_tile_mgr()->scenery_available(_aip.getPosition(), range)) {
           // Try to shedule tiles for that position.
-          globals->get_tile_mgr()->update( _aip.getSGLocation(), range );
+          globals->get_tile_mgr()->update( _aip.getPosition(), range );
         }
 
         // FIXME: make shure the pos.lat/pos.lon values are in degrees ...
         double alt;
-        if (globals->get_scenery()->get_elevation_m(lat, lon, 20000.0, alt, 0))
-          _aip.getSGLocation()->set_cur_elev_m(alt);
+        if (globals->get_scenery()->get_elevation_m(SGGeod::fromGeodM(_aip.getPosition(), 20000), alt, 0))
+          _ground_elevation_m = alt;
 }