X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftilemgr.cxx;h=4ebce444cabacd8aac80694a2264e70b42bb0ac2;hb=578df0f4845f565592663f86ea690fc5e96a14a4;hp=dcbe391c9b51413b3c911de6ac5a57e2954e1928;hpb=63708fb0df81a357173499d0c1950525f387db44;p=flightgear.git diff --git a/src/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx index dcbe391c9..4ebce444c 100644 --- a/src/Scenery/tilemgr.cxx +++ b/src/Scenery/tilemgr.cxx @@ -29,12 +29,14 @@ #include #include +#include #include #include #include #include -#include +#include +#include #include
#include
@@ -53,41 +55,22 @@ using simgear::TileEntry; using simgear::TileCache; -// helper: listen to property changes affecting tile loading -class LoaderPropertyWatcher : public SGPropertyChangeListener -{ -public: - LoaderPropertyWatcher(FGTileMgr* pTileMgr) : - _pTileMgr(pTileMgr) - { - } - - virtual void valueChanged(SGPropertyNode*) - { - _pTileMgr->configChanged(); - } - -private: - FGTileMgr* _pTileMgr; -}; - - FGTileMgr::FGTileMgr(): state( Start ), + last_state( Running ), vis( 16000 ), - _propListener(new LoaderPropertyWatcher(this)) + _terra_sync(NULL), + _visibilityMeters(fgGetNode("/environment/visibility-m", true)), + _maxTileRangeM(fgGetNode("/sim/rendering/static-lod/bare", true)) { - _randomObjects = fgGetNode("/sim/rendering/random-objects", true); - _randomVegetation = fgGetNode("/sim/rendering/random-vegetation", 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(); } @@ -97,12 +80,9 @@ FGTileMgr::~FGTileMgr() { void FGTileMgr::init() { SG_LOG( SG_TERRAIN, SG_INFO, "Initializing Tile Manager subsystem." ); - _options = new SGReaderWriterBTGOptions; - _options->setMatlib(globals->get_matlib()); - - _randomObjects.get()->addChangeListener(_propListener, false); - _randomVegetation.get()->addChangeListener(_propListener, false); - configChanged(); + _options = new simgear::SGReaderWriterOptions; + _options->setMaterialLib(globals->get_matlib()); + _options->setPropertyNode(globals->get_props()); osgDB::FilePathList &fp = _options->getDatabasePathList(); const string_list &sc = globals->get_fg_scenery(); @@ -110,12 +90,14 @@ void FGTileMgr::init() { std::copy(sc.begin(), sc.end(), back_inserter(fp)); TileEntry::setModelLoadHelper(this); - - _visibilityMeters = fgGetNode("/environment/visibility-m", true); reinit(); } +void FGTileMgr::refresh_tile(void* tileMgr, long tileIndex) +{ + ((FGTileMgr*) tileMgr)->tile_cache.refresh_tile(tileIndex); +} void FGTileMgr::reinit() { @@ -135,17 +117,15 @@ void FGTileMgr::reinit() 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->setTileRefreshCb(&refresh_tile, this); + // force an update now update(0.0); } -void FGTileMgr::configChanged() -{ - _options->setUseRandomObjects(_randomObjects.get()->getBoolValue()); - _options->setUseRandomVegetation(_randomVegetation.get()->getBoolValue()); -} - /* schedule a tile for loading, keep request for given amount of time. * Returns true if tile is already loaded. */ bool FGTileMgr::sched_tile( const SGBucket& b, double priority, bool current_view, double duration) @@ -190,10 +170,7 @@ void FGTileMgr::schedule_needed(const SGBucket& curr_bucket, double vis) 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, @@ -204,8 +181,9 @@ void FGTileMgr::schedule_needed(const SGBucket& curr_bucket, double vis) // cout << "tile width = " << tile_width << " tile_height = " // << tile_height << endl; - xrange = (int)(vis / tile_width) + 1; - yrange = (int)(vis / tile_height) + 1; + double tileRangeM = std::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; } @@ -244,38 +222,42 @@ void FGTileMgr::schedule_needed(const SGBucket& curr_bucket, double vis) osg::Node* FGTileMgr::loadTileModel(const string& modelPath, bool cacheModel) { - SGPath fullPath; - if (fgGetBool("/sim/paths/use-custom-scenery-data") == true) { + SGPath fullPath = modelPath; + if ((fullPath.isRelative())&& + (fgGetBool("/sim/paths/use-custom-scenery-data") == true)) { string_list sc = globals->get_fg_scenery(); for (string_list_iterator it = sc.begin(); it != sc.end(); ++it) { - SGPath tmpPath(*it); - tmpPath.append(modelPath); - if (tmpPath.exists()) { - fullPath = tmpPath; - break; - } + // fg_senery contains empty strings as "markers" (see FGGlobals::set_fg_scenery) + if (!it->empty()) { + SGPath tmpPath(*it); + tmpPath.append(modelPath); + if (tmpPath.exists()) { + fullPath = tmpPath; + break; + } + } } - } else { - fullPath.append(modelPath); } osg::Node* result = 0; try { if(cacheModel) result = SGModelLib::loadModel(fullPath.str(), globals->get_props(), - new FGNasalModelData); + _disableNasalHooks->getBoolValue() ? NULL : new FGNasalModelDataProxy); else + { result= - SGModelLib::loadPagedModel(modelPath, globals->get_props(), - new FGNasalModelData); + SGModelLib::loadDeferredModel(fullPath.str(), globals->get_props(), + _disableNasalHooks->getBoolValue() ? NULL : new FGNasalModelDataProxy); + } } catch (const sg_io_exception& exc) { string m(exc.getMessage()); m += " "; m += exc.getLocation().asString(); - SG_LOG( SG_ALL, SG_ALERT, m ); + SG_LOG( SG_TERRAIN, SG_ALERT, m ); } catch (const sg_exception& exc) { // XXX may be redundant - SG_LOG( SG_ALL, SG_ALERT, exc.getMessage()); + SG_LOG( SG_TERRAIN, SG_ALERT, exc.getMessage()); } return result; } @@ -310,7 +292,8 @@ void FGTileMgr::update_queues() 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, @@ -323,7 +306,7 @@ void FGTileMgr::update_queues() } } else { - SG_LOG(SG_INPUT, SG_ALERT, "warning ... empty tile in cache"); + SG_LOG(SG_TERRAIN, SG_ALERT, "Warning: empty tile in cache!"); } tile_cache.next(); sz++; @@ -360,7 +343,6 @@ void FGTileMgr::update_queues() // disk. void FGTileMgr::update(double) { - SG_LOG( SG_TERRAIN, SG_DEBUG, "FGTileMgr::update()" ); SGVec3d viewPos = globals->get_current_view()->get_view_pos(); double vis = _visibilityMeters->getDoubleValue(); schedule_tiles_at(SGGeod::fromCart(viewPos), vis); @@ -389,25 +371,31 @@ int FGTileMgr::schedule_tiles_at(const SGGeod& location, double range_m) // << 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" ); + if (last_state != state) + { + SG_LOG( SG_TERRAIN, SG_DEBUG, "State == Running" ); + } if (current_bucket != previous_bucket) { // We've moved to a new bucket, we need to schedule any // needed tiles for loading. 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; } else if ( state == Start || state == Inited ) { - SG_LOG( SG_TERRAIN, SG_INFO, "State == Start || Inited" ); + SG_LOG( SG_TERRAIN, SG_DEBUG, "State == Start || Inited" ); // do not update bucket yet (position not valid in initial loop) state = Running; previous_bucket.make_bad(); } + last_state = state; return 1; }