]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/tileentry.cxx
Check for the plib version when using display lists, just to be sure.
[flightgear.git] / src / Scenery / tileentry.cxx
index 7e71d5da5a594ae7f9286184ef02e3beb215788b..108e6d0c831835dd0d15d0d7fc2d0997db2a08bc 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <simgear/bucket/newbucket.hxx>
 #include <simgear/debug/logstream.hxx>
+#include <simgear/math/polar3d.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/math/sg_random.h>
 #include <simgear/misc/sgstream.hxx>
@@ -41,6 +42,7 @@
 #include <simgear/scene/material/matlib.hxx>
 #include <simgear/scene/tgdb/apt_signs.hxx>
 #include <simgear/scene/tgdb/obj.hxx>
+#include <simgear/scene/tgdb/vasi.hxx>
 
 #include <Aircraft/aircraft.hxx>
 #include <Include/general.hxx>
@@ -70,6 +72,7 @@ FGTileEntry::FGTileEntry ( const SGBucket& b )
       taxi_lights_selector( new ssgSelector ),
       loaded(false),
       pending_models(0),
+      is_inner_ring(false),
       free_tracker(0)
 {
     // update the contents
@@ -396,9 +399,9 @@ void FGTileEntry::prep_ssg_node( const Point3D& p, sgVec3 up, float vis) {
         }
         
         if ( general.get_glDepthBits() > 16 ) {
-            sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+            sgScaleVec3( lift_vec, 0.25 + agl / 400.0 + agl*agl / 5000000.0 );
         } else {
-            sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+            sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
         }
 
         sgVec3 lt_trans;
@@ -430,9 +433,9 @@ void FGTileEntry::prep_ssg_node( const Point3D& p, sgVec3 up, float vis) {
         }
         
         if ( general.get_glDepthBits() > 16 ) {
-            sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+            sgScaleVec3( lift_vec, 0.01 + agl / 400.0 + agl*agl / 5000000.0 );
         } else {
-            sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+            sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
         }
 
         sgVec3 lt_trans;
@@ -470,9 +473,9 @@ void FGTileEntry::prep_ssg_node( const Point3D& p, sgVec3 up, float vis) {
         }
         
         if ( general.get_glDepthBits() > 16 ) {
-            sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+            sgScaleVec3( lift_vec, 0.01 + agl / 400.0 + agl*agl / 5000000.0 );
         } else {
-            sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+            sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
         }
 
         sgVec3 lt_trans;
@@ -490,6 +493,55 @@ void FGTileEntry::prep_ssg_node( const Point3D& p, sgVec3 up, float vis) {
             taxi_lights_selector->select(0x00);
         }
     }
+
+    if ( vasi_lights_transform && is_inner_ring ) {
+        // now we need to traverse the list of vasi lights and update
+        // their coloring (but only for the inner ring, no point in
+        // doing this extra work for tiles that are relatively far
+        // away.)
+        for ( int i = 0; i < vasi_lights_transform->getNumKids(); ++i ) {
+            // cout << "vasi root = " << i << endl;
+            ssgBranch *v = (ssgBranch *)vasi_lights_transform->getKid(i);
+            for ( int j = 0; j < v->getNumKids(); ++j ) {
+                // cout << "  vasi branch = " << j << endl;
+                ssgTransform *kid = (ssgTransform *)v->getKid(j);
+                SGVASIUserData *vasi = (SGVASIUserData *)kid->getUserData();
+
+                if ( vasi != NULL ) {
+                    sgdVec3 s;
+                    sgdCopyVec3( s, vasi->get_abs_pos() );
+                    Point3D start(s[0], s[1], s[2]);
+
+                    sgdVec3 d;
+                    sgdCopyVec3( d, globals->get_current_view()->get_absolute_view_pos() );
+
+                    double dist = sgdDistanceVec3( s, d );
+
+                    if ( dist < 10000 ) {
+                        double cur_alt
+                            = globals->get_current_view()->getAltitudeASL_ft()
+                            * SG_FEET_TO_METER;
+
+                        double y = cur_alt - vasi->get_alt_m();
+
+                        double angle;
+                        if ( dist != 0 ) {
+                            angle = asin( y / dist );
+                        } else {
+                            angle = 0.0;
+                        }
+
+                        vasi->set_color(angle * SG_RADIANS_TO_DEGREES);
+                    }
+                    // cout << "    dist = " << dist
+                    //      << " angle = " << angle * SG_RADIANS_TO_DEGREES
+                    //      << endl;
+                } else {
+                    SG_LOG( SG_TERRAIN, SG_ALERT, "no vasi data!" );
+                }
+            }
+        }
+    }
 }
 
 
@@ -610,29 +662,24 @@ bool FGTileEntry::obj_load( const string& path,
 
 
 void
-FGTileEntry::load( const string &base_path, bool is_base )
+FGTileEntry::load( const string_list &path_list, bool is_base )
 {
-    SG_LOG( SG_TERRAIN, SG_INFO, "load() base search path = "
-            << base_path );
-
     bool found_tile_base = false;
 
-    string_list search = sgPathSplit( base_path );
-
     // obj_load() will generate ground lighting for us ...
     ssgVertexArray *light_pts = new ssgVertexArray( 100 );
 
     ssgBranch* new_tile = new ssgBranch;
 
     unsigned int i = 0;
-    while ( i < search.size() ) {
+    while ( i < path_list.size() ) {
 
         bool has_base = false;
 
         // Generate names for later use
         string index_str = tile_bucket.gen_index_str();
 
-        SGPath tile_path = search[i];
+        SGPath tile_path = path_list[i];
         tile_path.append( tile_bucket.gen_base_path() );
 
         SGPath basename = tile_path;
@@ -673,6 +720,9 @@ FGTileEntry::load( const string &base_path, bool is_base )
                                        geometry, NULL, NULL, NULL, light_pts,
                                        true ) )
                             {
+                                geometry->getKid( 0 )->setTravCallback( 
+                                                        SSG_CALLBACK_PRETRAV,
+                                                        &FGTileMgr::tile_filter_cb );
                                 new_tile -> addKid( geometry );
                             } else {
                                 delete geometry;
@@ -700,6 +750,9 @@ FGTileEntry::load( const string &base_path, bool is_base )
                                        taxi_lights, NULL, false ) )
                             {
                                 if ( geometry -> getNumKids() > 0 ) {
+                                    geometry->getKid( 0 )->setTravCallback(
+                                                                SSG_CALLBACK_PRETRAV,
+                                                                &FGTileMgr::tile_filter_cb );
                                     new_tile -> addKid( geometry );
                                 } else {
                                     delete geometry;
@@ -765,6 +818,7 @@ FGTileEntry::load( const string &base_path, bool is_base )
                     FGDeferredModel *dm
                         = new FGDeferredModel( custom_path.str(),
                                                tile_path.str(),
+                                               tile_bucket,
                                                this, obj_trans );
                     FGTileMgr::model_ready( dm );
 
@@ -860,7 +914,7 @@ FGTileEntry::load( const string &base_path, bool is_base )
         ssgBranch *geometry = new ssgBranch;
         Point3D c;
         double br;
-        if ( sgGenTile( search[0], tile_bucket, &c, &br,
+        if ( sgGenTile( path_list[0], tile_bucket, &c, &br,
                         globals->get_matlib(), geometry ) )
         {
             center = c;
@@ -928,6 +982,19 @@ FGTileEntry::load( const string &base_path, bool is_base )
     }
 }
 
+void
+FGTileEntry::makeDList( ssgBranch *b )
+{
+    int nb = b->getNumKids();
+    for (int i = 0; i<nb; i++) {
+        ssgEntity *e = b->getKid(i);
+        if (e->isAKindOf(ssgTypeLeaf())) {
+            ((ssgLeaf*)e)->makeDList();
+        } else if (e->isAKindOf(ssgTypeBranch())) {
+            makeDList( (ssgBranch*)e );
+        }
+    }
+}
 
 void
 FGTileEntry::add_ssg_nodes( ssgBranch *terrain_branch,
@@ -938,6 +1005,10 @@ FGTileEntry::add_ssg_nodes( ssgBranch *terrain_branch,
 {
     // bump up the ref count so we can remove this later without
     // having ssg try to free the memory.
+#if PLIB_VERSION > 183
+    makeDList( terra_transform );
+#endif
+
     terra_transform->ref();
     terrain_branch->addKid( terra_transform );