]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/tilemgr.cxx
Tweaks to the tile pager so it waits for a signal from the main thread before
[flightgear.git] / src / Scenery / tilemgr.cxx
index 12dbb3abd511a09d783d139673061e478530b57b..44b05269548cee5a8505c559df4ddfb766165a54 100644 (file)
@@ -84,16 +84,16 @@ FGTileMgr::~FGTileMgr() {
 
 // Initialize the Tile Manager subsystem
 int FGTileMgr::init() {
-    FG_LOG( FG_TERRAIN, FG_INFO, "Initializing Tile Manager subsystem." );
+    SG_LOG( SG_TERRAIN, SG_INFO, "Initializing Tile Manager subsystem." );
 
     if ( state != Start ) {
-       FG_LOG( FG_TERRAIN, FG_INFO,
+       SG_LOG( SG_TERRAIN, SG_INFO,
                "... Reinitializing." );
        destroy_queue();
     } else {
-       FG_LOG( FG_TERRAIN, FG_INFO,
+       SG_LOG( SG_TERRAIN, SG_INFO,
                "... First time through." );
-       global_tile_cache.init();
+       tile_cache.init();
     }
 
     hit_list.clear();
@@ -113,29 +113,38 @@ int FGTileMgr::init() {
 // schedule a tile for loading
 void FGTileMgr::sched_tile( const SGBucket& b ) {
     // see if tile already exists in the cache
-    FGTileEntry *t = global_tile_cache.get_tile( b );
+    FGTileEntry *t = tile_cache.get_tile( b );
 
     if ( t == NULL ) {
-        // register a load request
-        load_queue.push_back( b );
+        // create a new entry
+        FGTileEntry *e = new FGTileEntry( b );
+
+        // insert the tile into the cache
+       tile_cache.insert_tile( e );
+
+        // Schedule tile for loading
+        loader.add( e );
     }
 }
 
 
+// depricated for threading
+#if 0
 // load a tile
 void FGTileMgr::load_tile( const SGBucket& b ) {
     // see if tile already exists in the cache
-    FGTileEntry *t = global_tile_cache.get_tile( b );
+    FGTileEntry *t = tile_cache.get_tile( b );
 
     if ( t == NULL ) {
-       FG_LOG( FG_TERRAIN, FG_DEBUG, "Loading tile " << b );
-       global_tile_cache.fill_in( b );
-       t = global_tile_cache.get_tile( b );
+       SG_LOG( SG_TERRAIN, SG_DEBUG, "Loading tile " << b );
+       tile_cache.fill_in( b );
+       t = tile_cache.get_tile( b );
        t->prep_ssg_node( scenery.center, vis);
     } else {
-       FG_LOG( FG_TERRAIN, FG_DEBUG, "Tile already in cache " << b );
+       SG_LOG( SG_TERRAIN, SG_DEBUG, "Tile already in cache " << b );
     }
 }
+#endif
 
 
 static void CurrentNormalInLocalPlane(sgVec3 dst, sgVec3 src) {
@@ -195,7 +204,7 @@ bool FGTileMgr::current_elev_ssg( sgdVec3 abs_view_pos, double *terrain_elev ) {
        // cout << "NED: " << tmp[0] << " " << tmp[1] << " " << tmp[2] << endl;
        return true;
     } else {
-       FG_LOG( FG_TERRAIN, FG_INFO, "no terrain intersection" );
+       SG_LOG( SG_TERRAIN, SG_INFO, "no terrain intersection" );
        *terrain_elev = 0.0;
        float *up = globals->get_current_view()->get_world_up();
        sgdSetVec3(scenery.cur_normal, up[0], up[1], up[2]);
@@ -215,20 +224,20 @@ void FGTileMgr::schedule_needed() {
 #else
     vis = current_weather.get_visibility();
 #endif
-    cout << "visibility = " << vis << endl;
+    // cout << "visibility = " << vis << endl;
 
     double tile_width = current_bucket.get_width_m();
     double tile_height = current_bucket.get_height_m();
-    cout << "tile width = " << tile_width << "  tile_height = " << tile_height
-        << endl;
+    // cout << "tile width = " << tile_width << "  tile_height = "
+    //      << tile_height !<< endl;
 
     xrange = (int)(vis / tile_width) + 1;
     yrange = (int)(vis / tile_height) + 1;
     if ( xrange < 1 ) { xrange = 1; }
     if ( yrange < 1 ) { yrange = 1; }
-    cout << "xrange = " << xrange << "  yrange = " << yrange << endl;
+    // cout << "xrange = " << xrange << "  yrange = " << yrange << endl;
 
-    global_tile_cache.set_max_cache_size( (2*xrange + 2) * (2*yrange + 2) );
+    tile_cache.set_max_cache_size( (2*xrange + 2) * (2*yrange + 2) );
 
     SGBucket b;
 
@@ -236,26 +245,24 @@ void FGTileMgr::schedule_needed() {
     b = sgBucketOffset( longitude, latitude, 0, 0 );
     sched_tile( b );
 
+    int x, y;
+
     // schedule next ring of 8 tiles
-    for ( int x = -1; x <= 1; ++x ) {
-       for ( int y = -1; y <= 1; ++y ) {
+    for ( x = -1; x <= 1; ++x ) {
+       for ( y = -1; y <= 1; ++y ) {
            if ( x != 0 || y != 0 ) {
                b = sgBucketOffset( longitude, latitude, x, y );
-               if ( ! global_tile_cache.exists( b ) ) {
-                   sched_tile( b );
-               }
+               sched_tile( b );
            }
        }
     }
     
     // schedule remaining tiles
-    for ( int x = -xrange; x <= xrange; ++x ) {
-       for ( int y = -yrange; y <= yrange; ++y ) {
+    for ( x = -xrange; x <= xrange; ++x ) {
+       for ( y = -yrange; y <= yrange; ++y ) {
            if ( x < -1 || x > 1 || y < -1 || y > 1 ) {
                SGBucket b = sgBucketOffset( longitude, latitude, x, y );
-               if ( ! global_tile_cache.exists( b ) ) {
-                   sched_tile( b );
-               }
+               sched_tile( b );
            }
        }
     }
@@ -267,13 +274,11 @@ void FGTileMgr::initialize_queue()
     // First time through or we have teleported, initialize the
     // system and load all relavant tiles
 
-    FG_LOG( FG_TERRAIN, FG_INFO, "Updating Tile list for " << current_bucket );
-    cout << "tile cache size = " << global_tile_cache.get_size() << endl;
-
-    int i;
+    SG_LOG( SG_TERRAIN, SG_INFO, "Updating Tile list for " << current_bucket );
+    // cout << "tile cache size = " << tile_cache.get_size() << endl;
 
     // wipe/initialize tile cache
-    // global_tile_cache.init();
+    // tile_cache.init();
     previous_bucket.make_bad();
 
     // build the local area list and schedule tiles for loading
@@ -283,11 +288,14 @@ void FGTileMgr::initialize_queue()
 
     schedule_needed();
 
+    // do we really want to lose this? CLO
+#if 0
     // Now force a load of the center tile and inner ring so we
     // have something to see in our first frame.
+    int i;
     for ( i = 0; i < 9; ++i ) {
         if ( load_queue.size() ) {
-            FG_LOG( FG_TERRAIN, FG_DEBUG, 
+            SG_LOG( SG_TERRAIN, SG_DEBUG, 
                     "Load queue not empty, loading a tile" );
 
             SGBucket pending = load_queue.front();
@@ -295,6 +303,7 @@ void FGTileMgr::initialize_queue()
             load_tile( pending );
         }
     }
+#endif
 }
 
 
@@ -303,7 +312,7 @@ void FGTileMgr::initialize_queue()
 // tile_cache   -- which actually handles all the
 // (de)allocations  
 void FGTileMgr::destroy_queue() {
-    load_queue.clear();
+    // load_queue.clear();
 }
 
 
@@ -311,26 +320,26 @@ void FGTileMgr::destroy_queue() {
 // chunks.  If the chunk isn't already in the cache, then read it from
 // disk.
 int FGTileMgr::update( double lon, double lat ) {
-    FG_LOG( FG_TERRAIN, FG_DEBUG, "FGTileMgr::update()" );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "FGTileMgr::update()" );
 
     // FGInterface *f = current_aircraft.fdm_state;
 
     // lonlat for this update 
-    // longitude = f->get_Longitude() * RAD_TO_DEG;
-    // latitude = f->get_Latitude() * RAD_TO_DEG;
+    // longitude = f->get_Longitude() * SGD_RADIANS_TO_DEGREES;
+    // latitude = f->get_Latitude() * SGD_RADIANS_TO_DEGREES;
     longitude = lon;
     latitude = lat;
-    // FG_LOG( FG_TERRAIN, FG_DEBUG, "lon "<< lonlat[LON] <<
+    // SG_LOG( SG_TERRAIN, SG_DEBUG, "lon "<< lonlat[LON] <<
     //      " lat " << lonlat[LAT] );
 
     current_bucket.set_bucket( longitude, latitude );
-    // FG_LOG( FG_TERRAIN, FG_DEBUG, "Updating Tile list for " << current_bucket );
+    // SG_LOG( SG_TERRAIN, SG_DEBUG, "Updating Tile list for " << current_bucket );
 
-    if ( global_tile_cache.exists( current_bucket ) ) {
-        current_tile = global_tile_cache.get_tile( current_bucket );
+    if ( tile_cache.exists( current_bucket ) ) {
+        current_tile = tile_cache.get_tile( current_bucket );
         scenery.next_center = current_tile->center;
     } else {
-        FG_LOG( FG_TERRAIN, FG_WARN, "Tile not found (Ok if initializing)" );
+        SG_LOG( SG_TERRAIN, SG_WARN, "Tile not found (Ok if initializing)" );
     }
 
     if ( state == Running ) {
@@ -344,14 +353,17 @@ int FGTileMgr::update( double lon, double lat ) {
        state = Running;
     }
 
+    // now handled by threaded tile pager
+#if 0
     if ( load_queue.size() ) {
-       FG_LOG( FG_TERRAIN, FG_INFO, "Load queue size = " << load_queue.size()
+       SG_LOG( SG_TERRAIN, SG_INFO, "Load queue size = " << load_queue.size()
                << " loading a tile" );
 
        SGBucket pending = load_queue.front();
        load_queue.pop_front();
        load_tile( pending );
     }
+#endif
 
     if ( scenery.center == Point3D(0.0) ) {
        // initializing
@@ -359,8 +371,8 @@ int FGTileMgr::update( double lon, double lat ) {
        sgdVec3 tmp_abs_view_pos;
        sgVec3 tmp_view_pos;
 
-       Point3D geod_pos = Point3D( longitude * DEG_TO_RAD,
-                                   latitude * DEG_TO_RAD,
+       Point3D geod_pos = Point3D( longitude * SGD_DEGREES_TO_RADIANS,
+                                   latitude * SGD_DEGREES_TO_RADIANS,
                                    0.0);
        Point3D tmp = sgGeodToCart( geod_pos );
        scenery.center = tmp;
@@ -395,6 +407,13 @@ int FGTileMgr::update( double lon, double lat ) {
     last_longitude = longitude;
     last_latitude  = latitude;
 
+    // activate loader thread one out of every 5 frames
+    counter_hack = (counter_hack + 1) % 5;
+    if ( !counter_hack ) {
+        // Notify the tile loader that it can load another tile
+        loader.update();
+    }
+
     return 1;
 }
 
@@ -417,15 +436,15 @@ void FGTileMgr::prep_ssg_nodes() {
     // selector and transform
 
     FGTileEntry *e;
-    global_tile_cache.reset_traversal();
+    tile_cache.reset_traversal();
 
-    while ( ! global_tile_cache.at_end() ) {
+    while ( ! tile_cache.at_end() ) {
         // cout << "processing a tile" << endl;
-        if ( (e = global_tile_cache.get_current()) ) {
+        if ( (e = tile_cache.get_current()) ) {
            e->prep_ssg_node( scenery.center, vis);
         } else {
             cout << "warning ... empty tile in cache" << endl;
         }
-       global_tile_cache.next();
+       tile_cache.next();
    }
 }