// 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();
// 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) {
// 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]);
#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;
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 );
}
}
}
// 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
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();
load_tile( pending );
}
}
+#endif
}
// tile_cache -- which actually handles all the
// (de)allocations
void FGTileMgr::destroy_queue() {
- load_queue.clear();
+ // load_queue.clear();
}
// 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 ) {
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
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;
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;
}
// 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();
}
}