#include <Main/globals.hxx>
#include <Main/fg_props.hxx>
-#include <Main/renderer.hxx>
-#include <Main/viewer.hxx>
+#include <Viewer/renderer.hxx>
+#include <Viewer/splash.hxx>
#include <Scripting/NasalSys.hxx>
+#include <Scripting/NasalModelData.hxx>
#include "scenery.hxx"
#include "SceneryPager.hxx"
_visibilityMeters(fgGetNode("/environment/visibility-m", true)),
_maxTileRangeM(fgGetNode("/sim/rendering/static-lod/bare", true)),
_disableNasalHooks(fgGetNode("/sim/temp/disable-scenery-nasal", true)),
+ _scenery_loaded(fgGetNode("/sim/sceneryloaded", true)),
+ _scenery_override(fgGetNode("/sim/sceneryloaded-override", true)),
_pager(FGScenery::getPagerSingleton())
{
}
void FGTileMgr::reinit()
{
+ _terra_sync = static_cast<simgear::SGTerraSync*> (globals->get_subsystem("terrasync"));
+ if (_terra_sync)
+ _terra_sync->setTileRefreshCb(&refresh_tile, this);
+
// protect against multiple scenery reloads and properly reset flags,
// otherwise aircraft fall through the ground while reloading scenery
if (!fgGetBool("/sim/sceneryloaded",true))
return;
fgSetBool("/sim/sceneryloaded",false);
fgSetDouble("/sim/startup/splash-alpha", 1.0);
+
+ // Reload the materials definitions
+ _options->setMaterialLib(globals->get_matlib());
// remove all old scenery nodes from scenegraph and clear cache
osg::Group* group = globals->get_scenery()->get_terrain_branch();
longitude = latitude = -1000.0;
scheduled_visibility = 100.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);
}
// disk.
void FGTileMgr::update(double)
{
- SGVec3d viewPos = globals->get_current_view()->get_view_pos();
double vis = _visibilityMeters->getDoubleValue();
- schedule_tiles_at(SGGeod::fromCart(viewPos), vis);
+ schedule_tiles_at(globals->get_view_position(), vis);
update_queues();
+
+ // scenery loading check, triggers after each sim (tile manager) reinit
+ if (!_scenery_loaded->getBoolValue())
+ {
+ bool fdmInited = fgGetBool("sim/fdm-initialized");
+ bool positionFinalized = fgGetBool("sim/position-finalized");
+ bool sceneryOverride = _scenery_override->getBoolValue();
+
+ // we are done if final position is set and the scenery & FDM are done.
+ // scenery-override can ignore the last two, but not position finalization.
+ if (positionFinalized && (sceneryOverride || (isSceneryLoaded() && fdmInited)))
+ {
+ _scenery_loaded->setBoolValue(true);
+ fgSplashProgress("");
+ }
+ else
+ {
+ fgSplashProgress(positionFinalized ? "loading-scenery" : "finalize-position");
+ // be nice to loader threads while waiting for initial scenery, reduce to 20fps
+ SGTimeStamp::sleepForMSec(50);
+ }
+ }
}
-// schedule tiles for the viewer bucket (FDM/AI/groundcache/... use
-// "schedule_scenery" instead
-int FGTileMgr::schedule_tiles_at(const SGGeod& location, double range_m)
+// schedule tiles for the viewer bucket
+// (FDM/AI/groundcache/... should use "schedule_scenery" instead)
+void FGTileMgr::schedule_tiles_at(const SGGeod& location, double range_m)
{
longitude = location.getLongitudeDeg();
latitude = location.getLatitudeDeg();
// SG_LOG( SG_TERRAIN, SG_DEBUG, "FGTileMgr::update() for "
- // << longitude << " " << latatitude );
+ // << longitude << " " << latitude );
current_bucket.set_bucket( location );
previous_bucket.make_bad();
}
last_state = state;
-
- return 1;
}
/** Schedules scenery for given position. Load request remains valid for given duration