#include <simgear/structure/exception.hxx>
#include <simgear/scene/model/modellib.hxx>
#include <simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx>
+#include <simgear/scene/tsync/terrasync.hxx>
#include <Main/globals.hxx>
#include <Main/fg_props.hxx>
FGTileMgr::FGTileMgr():
state( Start ),
vis( 16000 ),
+ _terra_sync(NULL),
_propListener(new LoaderPropertyWatcher(this))
{
_randomObjects = fgGetNode("/sim/rendering/random-objects", true);
_randomVegetation = fgGetNode("/sim/rendering/random-vegetation", true);
+ _maxTileRangeM = fgGetNode("/sim/rendering/static-lod/bare", true);
}
-FGTileMgr::~FGTileMgr() {
+FGTileMgr::~FGTileMgr()
+{
// remove all nodes we might have left behind
osg::Group* group = globals->get_scenery()->get_terrain_branch();
group->removeChildren(0, group->getNumChildren());
delete _propListener;
_propListener = NULL;
+ // clear OSG cache
+ osgDB::Registry::instance()->clearObjectCache();
}
void FGTileMgr::reinit()
{
+ // remove all old scenery nodes from scenegraph and clear cache
+ osg::Group* group = globals->get_scenery()->get_terrain_branch();
+ group->removeChildren(0, group->getNumChildren());
tile_cache.init();
+ // clear OSG cache, except on initial start-up
+ if (state != Start)
+ {
+ osgDB::Registry::instance()->clearObjectCache();
+ }
+
state = Inited;
previous_bucket.make_bad();
current_bucket.make_bad();
longitude = latitude = -1000.0;
-
+
+ _terra_sync = (simgear::SGTerraSync*) globals->get_subsystem("terrasync");
+ if (_terra_sync)
+ _terra_sync->setTileCache(&tile_cache);
+
// force an update now
update(0.0);
}
SG_LOG( SG_TERRAIN, SG_ALERT,
"Attempting to schedule tiles for bogus lon and lat = ("
<< longitude << "," << latitude << ")" );
- return; // FIXME
- SG_LOG( SG_TERRAIN, SG_ALERT,
- "This is a FATAL error. Exiting!" );
- exit(-1);
+ return;
}
SG_LOG( SG_TERRAIN, SG_INFO,
// cout << "tile width = " << tile_width << " tile_height = "
// << tile_height << endl;
- xrange = (int)(vis / tile_width) + 1;
- yrange = (int)(vis / tile_height) + 1;
+ double tileRangeM = min(vis,_maxTileRangeM->getDoubleValue());
+ xrange = (int)(tileRangeM / tile_width) + 1;
+ yrange = (int)(tileRangeM / tile_height) + 1;
if ( xrange < 1 ) { xrange = 1; }
if ( yrange < 1 ) { yrange = 1; }
e->prep_ssg_node(vis);
if (( !e->is_loaded() )&&
- ( !e->is_expired(current_time) ))
+ ((!e->is_expired(current_time))||
+ e->is_current_view() ))
{
// schedule tile for loading with osg pager
pager->queueRequest(e->tileFileName,
}
} else
{
- SG_LOG(SG_INPUT, SG_ALERT, "warning ... empty tile in cache");
+ SG_LOG(SG_INPUT, SG_ALERT, "Warning: empty tile in cache!");
}
tile_cache.next();
sz++;
// << current_bucket );
fgSetInt( "/environment/current-tile-id", current_bucket.gen_index() );
- // do tile load scheduling.
+ // do tile load scheduling.
// Note that we need keep track of both viewer buckets and fdm buckets.
if ( state == Running ) {
SG_LOG( SG_TERRAIN, SG_DEBUG, "State == Running" );
SG_LOG( SG_TERRAIN, SG_INFO, "FGTileMgr::update()" );
scheduled_visibility = range_m;
schedule_needed(current_bucket, range_m);
+ if (_terra_sync)
+ _terra_sync->schedulePosition(latitude,longitude);
}
// save bucket
previous_bucket = current_bucket;