X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fenvironment_mgr.cxx;h=9aca5b0b5a86c7e6e20a7456a3ccf18aed6e4d1b;hb=ee1c8a8d662a0398711ee17c53dd64d249d2e030;hp=fd1804f2f59cb43ea4564dee0fb422bed7fe27c4;hpb=43bc61d1318abd52de6c723dbeef0e4058b1a823;p=flightgear.git diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index fd1804f2f..9aca5b0b5 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -32,6 +32,7 @@ #include
#include
+#include #include #include "environment.hxx" @@ -42,11 +43,9 @@ #include "precipitation_mgr.hxx" #include "ridge_lift.hxx" #include "terrainsampler.hxx" -#include "Airports/simple.hxx" +#include "Airports/airport.hxx" #include "gravity.hxx" - -class SGSky; -extern SGSky *thesky; +#include "magvarmanager.hxx" class FG3DCloudsListener : public SGPropertyChangeListener { public: @@ -57,16 +56,12 @@ public: private: FGClouds * _fgClouds; - SGPropertyNode_ptr _shaderNode; SGPropertyNode_ptr _enableNode; }; FG3DCloudsListener::FG3DCloudsListener( FGClouds * fgClouds ) : _fgClouds( fgClouds ) { - _shaderNode = fgGetNode( "/sim/rendering/shader-effects", true ); - _shaderNode->addChangeListener( this ); - _enableNode = fgGetNode( "/sim/rendering/clouds3d-enable", true ); _enableNode->addChangeListener( this ); @@ -76,12 +71,11 @@ FG3DCloudsListener::FG3DCloudsListener( FGClouds * fgClouds ) : FG3DCloudsListener::~FG3DCloudsListener() { _enableNode->removeChangeListener( this ); - _shaderNode->removeChangeListener( this ); } void FG3DCloudsListener::valueChanged( SGPropertyNode * node ) { - _fgClouds->set_3dClouds( _enableNode->getBoolValue() && _shaderNode->getBoolValue() ); + _fgClouds->set_3dClouds( _enableNode->getBoolValue() ); } FGEnvironmentMgr::FGEnvironmentMgr () : @@ -91,7 +85,8 @@ FGEnvironmentMgr::FGEnvironmentMgr () : _altitude_n(fgGetNode("/position/altitude-ft", true)), _longitude_n(fgGetNode( "/position/longitude-deg", true )), _latitude_n( fgGetNode( "/position/latitude-deg", true )), - _3dCloudsEnableListener(new FG3DCloudsListener(fgClouds) ) + _3dCloudsEnableListener(new FG3DCloudsListener(fgClouds) ), + _sky(globals->get_renderer()->getSky()) { set_subsystem("controller", Environment::LayerInterpolateController::createInstance( fgGetNode("/environment/config", true ) )); set_subsystem("realwx", Environment::RealWxController::createInstance( fgGetNode("/environment/realwx", true ) ), 1.0 ); @@ -99,6 +94,8 @@ FGEnvironmentMgr::FGEnvironmentMgr () : set_subsystem("precipitation", new FGPrecipitationMgr); set_subsystem("terrainsampler", Environment::TerrainSampler::createInstance( fgGetNode("/environment/terrain", true ) )); set_subsystem("ridgelift", new FGRidgeLift); + + set_subsystem("magvar", new FGMagVarManager); } FGEnvironmentMgr::~FGEnvironmentMgr () @@ -125,35 +122,43 @@ FGEnvironmentMgr::~FGEnvironmentMgr () remove_subsystem("controller"); delete subsys; + subsys = get_subsystem("magvar"); + remove_subsystem("magvar"); + delete subsys; + delete fgClouds; delete _environment; delete _3dCloudsEnableListener; } -void -FGEnvironmentMgr::init () +SGSubsystem::InitStatus FGEnvironmentMgr::incrementalInit() { - SG_LOG( SG_ENVIRONMENT, SG_INFO, "Initializing environment subsystem"); - SGSubsystemGroup::init(); - fgClouds->Init(); - - // FIXME: is this really part of the environment_mgr? - // Initialize the longitude, latitude and altitude to the initial position - // of the aircraft so that the atmospheric properties (pressure, temperature - // and density) can be initialized accordingly. - _altitude_n->setDoubleValue(fgGetDouble("/sim/presets/altitude-ft")); - _longitude_n->setDoubleValue(fgGetDouble("/sim/presets/longitude-deg")); - _latitude_n->setDoubleValue(fgGetDouble("/sim/presets/latitude-deg")); - globals->get_event_mgr()->addTask("updateClosestAirport", this, - &FGEnvironmentMgr::updateClosestAirport, 30 ); + InitStatus r = SGSubsystemGroup::incrementalInit(); + if (r == INIT_DONE) { + fgClouds->Init(); + + // FIXME: is this really part of the environment_mgr? + // Initialize the longitude, latitude and altitude to the initial position + // of the aircraft so that the atmospheric properties (pressure, temperature + // and density) can be initialized accordingly. + _altitude_n->setDoubleValue(fgGetDouble("/sim/presets/altitude-ft")); + _longitude_n->setDoubleValue(fgGetDouble("/sim/presets/longitude-deg")); + _latitude_n->setDoubleValue(fgGetDouble("/sim/presets/latitude-deg")); + + globals->get_event_mgr()->addTask("updateClosestAirport", this, + &FGEnvironmentMgr::updateClosestAirport, 30 ); + } + + return r; } void FGEnvironmentMgr::shutdown() { globals->get_event_mgr()->removeTask("updateClosestAirport"); + SGSubsystemGroup::shutdown(); } void @@ -171,7 +176,7 @@ FGEnvironmentMgr::bind () _tiedProperties.setRoot( fgGetNode( "/environment", true ) ); - _tiedProperties.Tie( "effective-visibility-m", thesky, + _tiedProperties.Tie( "effective-visibility-m", _sky, &SGSky::get_visibility ); _tiedProperties.Tie("rebuild-layers", fgClouds, @@ -220,18 +225,38 @@ FGEnvironmentMgr::bind () _tiedProperties.setRoot( fgGetNode("/sim/rendering", true ) ); - _tiedProperties.Tie( "clouds3d-density", thesky, + _tiedProperties.Tie( "clouds3d-density", _sky, &SGSky::get_3dCloudDensity, &SGSky::set_3dCloudDensity); - _tiedProperties.Tie("clouds3d-vis-range", thesky, + _tiedProperties.Tie("clouds3d-vis-range", _sky, &SGSky::get_3dCloudVisRange, &SGSky::set_3dCloudVisRange); - _tiedProperties.Tie("clouds3d-wrap", thesky, + _tiedProperties.Tie("clouds3d-impostor-range", _sky, + &SGSky::get_3dCloudImpostorDistance, + &SGSky::set_3dCloudImpostorDistance); + + _tiedProperties.Tie("clouds3d-lod1-range", _sky, + &SGSky::get_3dCloudLoD1Range, + &SGSky::set_3dCloudLoD1Range); + + _tiedProperties.Tie("clouds3d-lod2-range", _sky, + &SGSky::get_3dCloudLoD2Range, + &SGSky::set_3dCloudLoD2Range); + + _tiedProperties.Tie("clouds3d-wrap", _sky, &SGSky::get_3dCloudWrap, &SGSky::set_3dCloudWrap); + _tiedProperties.Tie("clouds3d-use-impostors", _sky, + &SGSky::get_3dCloudUseImpostors, + &SGSky::set_3dCloudUseImpostors); + + _tiedProperties.Tie("minimum-sky-visibility", _sky, + &SGSky::get_minimum_sky_visibility, + &SGSky::set_minimum_sky_visibility); + // _tiedProperties.Tie("lightning-enable", &sgEnviro, // &SGEnviro::get_lightning_enable_state, // &SGEnviro::set_lightning_enable_state); @@ -325,19 +350,19 @@ FGEnvironmentMgr::getEnvironment(const SGGeod& aPos) const double FGEnvironmentMgr::get_cloud_layer_span_m (int index) const { - return thesky->get_cloud_layer(index)->getSpan_m(); + return _sky->get_cloud_layer(index)->getSpan_m(); } void FGEnvironmentMgr::set_cloud_layer_span_m (int index, double span_m) { - thesky->get_cloud_layer(index)->setSpan_m(span_m); + _sky->get_cloud_layer(index)->setSpan_m(span_m); } double FGEnvironmentMgr::get_cloud_layer_elevation_ft (int index) const { - return thesky->get_cloud_layer(index)->getElevation_m() * SG_METER_TO_FEET; + return _sky->get_cloud_layer(index)->getElevation_m() * SG_METER_TO_FEET; } void @@ -346,88 +371,88 @@ FGEnvironmentMgr::set_cloud_layer_elevation_ft (int index, double elevation_ft) FGEnvironment env = *_environment; env.set_elevation_ft(elevation_ft); - thesky->get_cloud_layer(index) + _sky->get_cloud_layer(index) ->setElevation_m(elevation_ft * SG_FEET_TO_METER); - thesky->get_cloud_layer(index) + _sky->get_cloud_layer(index) ->setSpeed(env.get_wind_speed_kt() * 0.5151); // 1 kt = 0.5151 m/s - thesky->get_cloud_layer(index) + _sky->get_cloud_layer(index) ->setDirection(env.get_wind_from_heading_deg()); } double FGEnvironmentMgr::get_cloud_layer_thickness_ft (int index) const { - return thesky->get_cloud_layer(index)->getThickness_m() * SG_METER_TO_FEET; + return _sky->get_cloud_layer(index)->getThickness_m() * SG_METER_TO_FEET; } void FGEnvironmentMgr::set_cloud_layer_thickness_ft (int index, double thickness_ft) { - thesky->get_cloud_layer(index) + _sky->get_cloud_layer(index) ->setThickness_m(thickness_ft * SG_FEET_TO_METER); } double FGEnvironmentMgr::get_cloud_layer_transition_ft (int index) const { - return thesky->get_cloud_layer(index)->getTransition_m() * SG_METER_TO_FEET; + return _sky->get_cloud_layer(index)->getTransition_m() * SG_METER_TO_FEET; } void FGEnvironmentMgr::set_cloud_layer_transition_ft (int index, double transition_ft) { - thesky->get_cloud_layer(index) + _sky->get_cloud_layer(index) ->setTransition_m(transition_ft * SG_FEET_TO_METER); } const char * FGEnvironmentMgr::get_cloud_layer_coverage (int index) const { - return thesky->get_cloud_layer(index)->getCoverageString().c_str(); + return _sky->get_cloud_layer(index)->getCoverageString().c_str(); } void FGEnvironmentMgr::set_cloud_layer_coverage (int index, const char * coverage_name) { - if( thesky->get_cloud_layer(index)->getCoverageString() == coverage_name ) + if( _sky->get_cloud_layer(index)->getCoverageString() == coverage_name ) return; - thesky->get_cloud_layer(index)->setCoverageString(coverage_name); + _sky->get_cloud_layer(index)->setCoverageString(coverage_name); _cloudLayersDirty = true; } int FGEnvironmentMgr::get_cloud_layer_coverage_type (int index) const { - return thesky->get_cloud_layer(index)->getCoverage(); + return _sky->get_cloud_layer(index)->getCoverage(); } double FGEnvironmentMgr::get_cloud_layer_visibility_m (int index) const { - return thesky->get_cloud_layer(index)->getVisibility_m(); + return _sky->get_cloud_layer(index)->getVisibility_m(); } void FGEnvironmentMgr::set_cloud_layer_visibility_m (int index, double visibility_m) { - thesky->get_cloud_layer(index)->setVisibility_m(visibility_m); + _sky->get_cloud_layer(index)->setVisibility_m(visibility_m); } double FGEnvironmentMgr::get_cloud_layer_maxalpha (int index ) const { - return thesky->get_cloud_layer(index)->getMaxAlpha(); + return _sky->get_cloud_layer(index)->getMaxAlpha(); } void FGEnvironmentMgr::set_cloud_layer_maxalpha (int index, double maxalpha) { - thesky->get_cloud_layer(index)->setMaxAlpha(maxalpha); + _sky->get_cloud_layer(index)->setMaxAlpha(maxalpha); } void @@ -438,10 +463,10 @@ FGEnvironmentMgr::set_cloud_layer_coverage_type (int index, int type ) return; } - if( static_cast(type) == thesky->get_cloud_layer(index)->getCoverage() ) + if( static_cast(type) == _sky->get_cloud_layer(index)->getCoverage() ) return; - thesky->get_cloud_layer(index)->setCoverage(static_cast(type)); + _sky->get_cloud_layer(index)->setCoverage(static_cast(type)); _cloudLayersDirty = true; }