X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fenvironment_mgr.cxx;h=606a3e74ccd1088484ff09ff988d3efee5ac8405;hb=58e79013e3c1d412d8e1f8adc0c39a400484c5ae;hp=0f1b201df3f63c1f49a0781f6afffeab7e6497d0;hpb=2ef1e5be521fffae3f8ce73b4ef09351ce516852;p=flightgear.git diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index 0f1b201df..606a3e74c 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -28,8 +28,10 @@ #include #include #include +#include #include
+#include
#include
#include @@ -44,9 +46,6 @@ #include "Airports/simple.hxx" #include "gravity.hxx" -class SGSky; -extern SGSky *thesky; - class FG3DCloudsListener : public SGPropertyChangeListener { public: FG3DCloudsListener( FGClouds * fgClouds ); @@ -56,16 +55,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 ); @@ -75,12 +70,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 () : @@ -90,8 +84,8 @@ FGEnvironmentMgr::FGEnvironmentMgr () : _altitude_n(fgGetNode("/position/altitude-ft", true)), _longitude_n(fgGetNode( "/position/longitude-deg", true )), _latitude_n( fgGetNode( "/position/latitude-deg", true )), - _positionTimeToLive(0.0), - _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 ); @@ -134,7 +128,7 @@ FGEnvironmentMgr::~FGEnvironmentMgr () void FGEnvironmentMgr::init () { - SG_LOG( SG_GENERAL, SG_INFO, "Initializing environment subsystem"); + SG_LOG( SG_ENVIRONMENT, SG_INFO, "Initializing environment subsystem"); SGSubsystemGroup::init(); fgClouds->Init(); @@ -145,12 +139,21 @@ FGEnvironmentMgr::init () _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 ); +} + +void +FGEnvironmentMgr::shutdown() +{ + globals->get_event_mgr()->removeTask("updateClosestAirport"); } void FGEnvironmentMgr::reinit () { - SG_LOG( SG_GENERAL, SG_INFO, "Reinitializing environment subsystem"); + SG_LOG( SG_ENVIRONMENT, SG_INFO, "Reinitializing environment subsystem"); SGSubsystemGroup::reinit(); } @@ -162,7 +165,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, @@ -211,14 +214,34 @@ 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-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("lightning-enable", &sgEnviro, // &SGEnviro::get_lightning_enable_state, // &SGEnviro::set_lightning_enable_state); @@ -254,33 +277,30 @@ FGEnvironmentMgr::update (double dt) _latitude_n->getDoubleValue(), _altitude_n->getDoubleValue() ))); +} - _positionTimeToLive -= dt; - if( _positionTimeToLive <= 0.0 ) +void +FGEnvironmentMgr::updateClosestAirport() +{ + SG_LOG(SG_ENVIRONMENT, SG_DEBUG, "FGEnvironmentMgr::update: updating closest airport"); + + SGGeod pos = globals->get_aircraft_position(); + FGAirport * nearestAirport = FGAirport::findClosest(pos, 100.0); + if( nearestAirport == NULL ) + { + SG_LOG(SG_ENVIRONMENT,SG_WARN,"FGEnvironmentMgr::update: No airport within 100NM range"); + } + else { - // update closest airport information - _positionTimeToLive = 30.0; - - SG_LOG(SG_ALL, SG_INFO, "FGEnvironmentMgr::update: updating closest airport"); - - SGGeod pos = SGGeod::fromDeg(_longitude_n->getDoubleValue(), - _latitude_n->getDoubleValue()); - - FGAirport * nearestAirport = FGAirport::findClosest(pos, 100.0); - if( nearestAirport == NULL ) - { - SG_LOG(SG_ALL,SG_WARN,"FGEnvironmentMgr::update: No airport within 100NM range"); - } - else - { - const string currentId = fgGetString("/sim/airport/closest-airport-id", ""); - if (currentId != nearestAirport->ident()) - { - fgSetString("/sim/airport/closest-airport-id", - nearestAirport->ident().c_str()); - } - } + const string currentId = fgGetString("/sim/airport/closest-airport-id", ""); + if (currentId != nearestAirport->ident()) + { + SG_LOG(SG_ENVIRONMENT, SG_INFO, "FGEnvironmentMgr::updateClosestAirport: selected:" << nearestAirport->ident()); + fgSetString("/sim/airport/closest-airport-id", + nearestAirport->ident().c_str()); + } } + } FGEnvironment @@ -315,19 +335,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 @@ -336,102 +356,102 @@ 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 FGEnvironmentMgr::set_cloud_layer_coverage_type (int index, int type ) { if( type < 0 || type >= SGCloudLayer::SG_MAX_CLOUD_COVERAGES ) { - SG_LOG(SG_ALL,SG_WARN,"Unknown cloud layer type " << type << " ignored" ); + SG_LOG(SG_ENVIRONMENT,SG_WARN,"Unknown cloud layer type " << type << " ignored" ); 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; }