#endif
#include <GL/glut.h>
-#include <simgear/xgl/xgl.h>
+#include <GL/gl.h>
#include <plib/ssg.h> // plib include
#include "newcache.hxx"
#include "tileentry.hxx"
-#include "tilemgr.hxx" // temp, need to delete later
-
-SG_USING_NAMESPACE(std);
-// the tile cache
-FGNewCache global_tile_cache;
+SG_USING_NAMESPACE(std);
// Constructor
// Free a tile cache entry
void FGNewCache::entry_free( long cache_index ) {
SG_LOG( SG_TERRAIN, SG_DEBUG, "FREEING CACHE ENTRY = " << cache_index );
- FGTileEntry *e = tile_cache[cache_index];
- e->free_tile();
- delete( e );
+ FGTileEntry *tile = tile_cache[cache_index];
+ tile->disconnect_ssg_nodes();
+ tile->sched_removal();
+
+#if 0
+ tile->free_tile();
+ delete tile;
+#endif
+
tile_cache.erase( cache_index );
}
// Search for the specified "bucket" in the cache
-bool FGNewCache::exists( const SGBucket& b ) {
+bool FGNewCache::exists( const SGBucket& b ) const {
long tile_index = b.gen_index();
- tile_map_iterator it = tile_cache.find( tile_index );
+ const_tile_map_iterator it = tile_cache.find( tile_index );
return ( it != tile_cache.end() );
}
+// depricated for threading
+#if 0
// Fill in a tile cache entry with real data for the specified bucket
void FGNewCache::fill_in( const SGBucket& b ) {
SG_LOG( SG_TERRAIN, SG_DEBUG, "FILL IN CACHE ENTRY = " << b.gen_index() );
// Load the appropriate data file
e->load( tile_path, true );
}
+#endif
// Ensure at least one entry is free in the cache
void FGNewCache::make_space() {
SG_LOG( SG_TERRAIN, SG_DEBUG, "Make space in cache" );
-
-
SG_LOG( SG_TERRAIN, SG_DEBUG, "cache entries = " << tile_cache.size() );
SG_LOG( SG_TERRAIN, SG_DEBUG, "max size = " << max_cache_size );
long index = current->first;
FGTileEntry *e = current->second;
- // calculate approximate distance from view point
- sgdCopyVec3( abs_view_pos,
- globals->get_current_view()->get_abs_view_pos() );
-
- SG_LOG( SG_TERRAIN, SG_DEBUG, "DIST Abs view pos = "
- << abs_view_pos[0] << ","
- << abs_view_pos[1] << ","
- << abs_view_pos[2] );
- SG_LOG( SG_TERRAIN, SG_DEBUG,
- " ref point = " << e->center );
-
- sgdVec3 center;
- sgdSetVec3( center, e->center.x(), e->center.y(), e->center.z() );
- dist = sgdDistanceVec3( center, abs_view_pos );
-
- SG_LOG( SG_TERRAIN, SG_DEBUG, " distance = " << dist );
-
- if ( dist > max_dist ) {
- max_dist = dist;
- max_index = index;
+ if ( e->is_loaded() && e->get_pending_models() == 0 ) {
+ // calculate approximate distance from view point
+ sgdCopyVec3( abs_view_pos,
+ globals->get_current_view()->get_abs_view_pos() );
+
+ SG_LOG( SG_TERRAIN, SG_DEBUG, "DIST Abs view pos = "
+ << abs_view_pos[0] << ","
+ << abs_view_pos[1] << ","
+ << abs_view_pos[2] );
+ SG_LOG( SG_TERRAIN, SG_DEBUG,
+ " ref point = " << e->center );
+
+ sgdVec3 center;
+ sgdSetVec3( center,
+ e->center.x(), e->center.y(), e->center.z() );
+ dist = sgdDistanceVec3( center, abs_view_pos );
+
+ SG_LOG( SG_TERRAIN, SG_DEBUG, " distance = " << dist );
+
+ if ( dist > max_dist ) {
+ max_dist = dist;
+ max_index = index;
+ }
}
}
}
}
}
+
+
+/**
+ * Create a new tile and schedule it for loading.
+ */
+void
+FGNewCache::insert_tile( FGTileEntry *e )
+{
+ // clear out a distant entry in the cache if needed.
+ make_space();
+
+ // register it in the cache
+ long tile_index = e->get_tile_bucket().gen_index();
+ tile_cache[tile_index] = e;
+
+}