]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/newcache.cxx
initialize release_keys array
[flightgear.git] / src / Scenery / newcache.cxx
index 98122377c99f585a619ab246781e14a486b2af9b..643765d7651d06a7bfa31b2daaf58eb1738d6479 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by Curtis Olson, started December 2000.
 //
-// Copyright (C) 2000  Curtis L. Olson  - curt@flightgear.org
+// Copyright (C) 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
@@ -16,7 +16,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 #  include <config.h>
 #endif
 
-#ifdef HAVE_WINDOWS_H
-#  include <windows.h>
-#endif
-
-#include <GL/glut.h>
-#include <GL/gl.h>
-
-#include <plib/ssg.h>          // plib include
-
 #include <simgear/bucket/newbucket.hxx>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -59,6 +50,7 @@ FGNewCache::FGNewCache( void ) :
 
 // Destructor
 FGNewCache::~FGNewCache( void ) {
+    clear_cache();
 }
 
 
@@ -105,6 +97,7 @@ bool FGNewCache::exists( const SGBucket& b ) const {
 }
 
 
+#if 0
 // Ensure at least one entry is free in the cache
 bool FGNewCache::make_space() {
     SG_LOG( SG_TERRAIN, SG_DEBUG, "Make space in cache" );
@@ -131,7 +124,8 @@ bool FGNewCache::make_space() {
        for ( ; current != end; ++current ) {
            long index = current->first;
            FGTileEntry *e = current->second;
-           if ( e->is_loaded() && (e->get_pending_models() == 0) ) {
+           // if ( e->is_loaded() && (e->get_pending_models() == 0) ) {
+           if ( e->is_loaded() ) {
 
                 timestamp = e->get_timestamp();
                 if ( timestamp < min_time ) {
@@ -143,7 +137,7 @@ bool FGNewCache::make_space() {
                 }
 
            } else {
-                SG_LOG( SG_TERRAIN, SG_INFO, "loaded = " << e->is_loaded()
+                SG_LOG( SG_TERRAIN, SG_DEBUG, "loaded = " << e->is_loaded()
                         << " pending models = " << e->get_pending_models()
                         << " time stamp = " << e->get_timestamp() );
             }
@@ -152,9 +146,9 @@ bool FGNewCache::make_space() {
        // If we made it this far, then there were no open cache entries.
        // We will instead free the oldest cache entry and return true
         
-        SG_LOG( SG_TERRAIN, SG_INFO, "    min_time = " << min_time );
-        SG_LOG( SG_TERRAIN, SG_INFO, "    index = " << max_index );
-        SG_LOG( SG_TERRAIN, SG_INFO, "    max_time = " << max_time );
+        SG_LOG( SG_TERRAIN, SG_DEBUG, "    min_time = " << min_time );
+        SG_LOG( SG_TERRAIN, SG_DEBUG, "    index = " << max_index );
+        SG_LOG( SG_TERRAIN, SG_DEBUG, "    max_time = " << max_time );
        if ( max_index >= 0 ) {
            entry_free( max_index );
            return true;
@@ -169,11 +163,74 @@ bool FGNewCache::make_space() {
             "FGNewCache::make_space()." );
     return false;
 }
+#endif
+
+
+// Return the index of the oldest tile in the cache, return -1 if
+// nothing available to be removed.
+long FGNewCache::get_oldest_tile() {
+    // we need to free the furthest entry
+    long min_index = -1;
+    double timestamp = 0.0;
+    double min_time = 2419200000.0f; // one month should be enough
+    double max_time = 0;
+
+    tile_map_iterator current = tile_cache.begin();
+    tile_map_iterator end = tile_cache.end();
+    
+    for ( ; current != end; ++current ) {
+        long index = current->first;
+        FGTileEntry *e = current->second;
+        if ( e->is_loaded() && (e->get_pending_models() == 0) ) {
+            
+            timestamp = e->get_timestamp();
+            if ( timestamp < min_time ) {
+                min_index = index;
+                min_time = timestamp;
+            }
+            if ( timestamp > max_time ) {
+                max_time = timestamp;
+            }
+
+        } else {
+            SG_LOG( SG_TERRAIN, SG_DEBUG, "loaded = " << e->is_loaded()
+                    << " pending models = " << e->get_pending_models()
+                    << " time stamp = " << e->get_timestamp() );
+        }
+    }
+
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "    min_time = " << min_time );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "    index = " << min_index );
+    SG_LOG( SG_TERRAIN, SG_DEBUG, "    max_time = " << max_time );
+
+    return min_index;
+}
+
+
+// Clear the inner ring flag for all tiles in the cache so that the
+// external tile scheduler can flag the inner ring correctly.
+void FGNewCache::clear_inner_ring_flags() {
+    tile_map_iterator current = tile_cache.begin();
+    tile_map_iterator end = tile_cache.end();
+    
+    for ( ; current != end; ++current ) {
+        FGTileEntry *e = current->second;
+        if ( e->is_loaded() && (e->get_pending_models() == 0) ) {
+            e->set_inner_ring( false );
+        }
+    }
+}
+
+// Clear a cache entry, note that the cache only holds pointers
+// and this does not free the object which is pointed to.
+void FGNewCache::clear_entry( long cache_index ) {
+    tile_cache.erase( cache_index );
+}
 
 
 // Clear all completely loaded tiles (ignores partially loaded tiles)
 void FGNewCache::clear_cache() {
-
+    std::vector<long> indexList;
     tile_map_iterator current = tile_cache.begin();
     tile_map_iterator end = tile_cache.end();
     
@@ -183,12 +240,16 @@ void FGNewCache::clear_cache() {
        FGTileEntry *e = current->second;
         if ( e->is_loaded() && (e->get_pending_models() == 0) ) {
             e->tile_bucket.make_bad();
-            entry_free(index);
+           // entry_free modifies tile_cache, so store index and call entry_free() later;
+           indexList.push_back( index);
         }
     }
-
+    for (unsigned int it = 0; it < indexList.size(); it++) {
+       entry_free( indexList[ it]);
+    }
     // and ... just in case we missed something ... 
-    globals->get_scenery()->get_terrain_branch()->removeAllKids();
+    osg::Group* group = globals->get_scenery()->get_terrain_branch();
+    group->removeChildren(0, group->getNumChildren());
 }
 
 
@@ -198,20 +259,15 @@ void FGNewCache::clear_cache() {
 bool FGNewCache::insert_tile( FGTileEntry *e ) {
     // set time of insertion for tracking age of tiles...
     e->set_timestamp(globals->get_sim_time_sec());
-    // clear out a distant entry in the cache if needed.
-    if ( make_space() ) {
-        // register it in the cache
-        long tile_index = e->get_tile_bucket().gen_index();
-        tile_cache[tile_index] = e;
 
-        return true;
-    } else {
-        // failed to find cache space
+    // register it in the cache
+    long tile_index = e->get_tile_bucket().gen_index();
+    tile_cache[tile_index] = e;
 
-        return false;
-    }
+    return true;
 }
 
+
 // Note this is the old version of FGNewCache::make_space(), currently disabled
 // It uses distance from a center point to determine tiles to be discarded...
 #if 0