diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index 3182f1159..c6451eef1 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -42,6 +42,7 @@ #include "precipitation_mgr.hxx" #include "ridge_lift.hxx" #include "terrainsampler.hxx" +#include "Airports/simple.hxx" class SGSky; extern SGSky *thesky; @@ -49,8 +50,11 @@ extern SGSky *thesky; FGEnvironmentMgr::FGEnvironmentMgr () : _environment(new FGEnvironment()), fgClouds(new FGClouds()), + _cloudLayersDirty(true), _altitudeNode(fgGetNode("/position/altitude-ft", true)), - _cloudLayersDirty(true) + _longitude_n(fgGetNode( "/position/longitude-deg", true )), + _latitude_n( fgGetNode( "/position/latitude-deg", true )), + _positionTimeToLive(0.0) { set_subsystem("controller", Environment::LayerInterpolateController::createInstance( fgGetNode("/environment/config", true ) )); set_subsystem("realwx", Environment::RealWxController::createInstance( fgGetNode("/environment/realwx", true ) ), 1.0 ); @@ -93,6 +97,7 @@ FGEnvironmentMgr::init () { SG_LOG( SG_GENERAL, SG_INFO, "Initializing environment subsystem"); SGSubsystemGroup::init(); + fgClouds->Init(); } void @@ -107,77 +112,77 @@ FGEnvironmentMgr::bind () { SGSubsystemGroup::bind(); _environment->Tie( fgGetNode("/environment", true ) ); - + _tiedProperties.setRoot( fgGetNode( "/environment", true ) ); _tiedProperties.Tie( "effective-visibility-m", thesky, - &SGSky::get_visibility ); + &SGSky::get_visibility ); _tiedProperties.Tie("rebuild-layers", fgClouds, - &FGClouds::get_update_event, - &FGClouds::set_update_event); + &FGClouds::get_update_event, + &FGClouds::set_update_event); _tiedProperties.Tie("turbulence/use-cloud-turbulence", &sgEnviro, - &SGEnviro::get_turbulence_enable_state, - &SGEnviro::set_turbulence_enable_state); + &SGEnviro::get_turbulence_enable_state, + &SGEnviro::set_turbulence_enable_state); for (int i = 0; i < MAX_CLOUD_LAYERS; i++) { - SGPropertyNode_ptr layerNode = fgGetNode("/environment/clouds",true)->getChild("layer", i, true ); + SGPropertyNode_ptr layerNode = fgGetNode("/environment/clouds",true)->getChild("layer", i, true ); - _tiedProperties.Tie( layerNode->getNode("span-m",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_span_m, - &FGEnvironmentMgr::set_cloud_layer_span_m); + _tiedProperties.Tie( layerNode->getNode("span-m",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_span_m, + &FGEnvironmentMgr::set_cloud_layer_span_m); - _tiedProperties.Tie( layerNode->getNode("elevation-ft",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_elevation_ft, - &FGEnvironmentMgr::set_cloud_layer_elevation_ft); + _tiedProperties.Tie( layerNode->getNode("elevation-ft",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_elevation_ft, + &FGEnvironmentMgr::set_cloud_layer_elevation_ft); - _tiedProperties.Tie( layerNode->getNode("thickness-ft",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_thickness_ft, - &FGEnvironmentMgr::set_cloud_layer_thickness_ft); + _tiedProperties.Tie( layerNode->getNode("thickness-ft",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_thickness_ft, + &FGEnvironmentMgr::set_cloud_layer_thickness_ft); - _tiedProperties.Tie( layerNode->getNode("transition-ft",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_transition_ft, - &FGEnvironmentMgr::set_cloud_layer_transition_ft); + _tiedProperties.Tie( layerNode->getNode("transition-ft",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_transition_ft, + &FGEnvironmentMgr::set_cloud_layer_transition_ft); - _tiedProperties.Tie( layerNode->getNode("coverage",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_coverage, - &FGEnvironmentMgr::set_cloud_layer_coverage); + _tiedProperties.Tie( layerNode->getNode("coverage",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_coverage, + &FGEnvironmentMgr::set_cloud_layer_coverage); - _tiedProperties.Tie( layerNode->getNode("coverage-type",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_coverage_type, - &FGEnvironmentMgr::set_cloud_layer_coverage_type); + _tiedProperties.Tie( layerNode->getNode("coverage-type",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_coverage_type, + &FGEnvironmentMgr::set_cloud_layer_coverage_type); - _tiedProperties.Tie( layerNode->getNode( "visibility-m",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_visibility_m, - &FGEnvironmentMgr::set_cloud_layer_visibility_m); + _tiedProperties.Tie( layerNode->getNode( "visibility-m",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_visibility_m, + &FGEnvironmentMgr::set_cloud_layer_visibility_m); - _tiedProperties.Tie( layerNode->getNode( "alpha",true), this, i, - &FGEnvironmentMgr::get_cloud_layer_maxalpha, - &FGEnvironmentMgr::set_cloud_layer_maxalpha); + _tiedProperties.Tie( layerNode->getNode( "alpha",true), this, i, + &FGEnvironmentMgr::get_cloud_layer_maxalpha, + &FGEnvironmentMgr::set_cloud_layer_maxalpha); } _tiedProperties.setRoot( fgGetNode("/sim/rendering", true ) ); _tiedProperties.Tie( "clouds3d-enable", fgClouds, - &FGClouds::get_3dClouds, - &FGClouds::set_3dClouds); + &FGClouds::get_3dClouds, + &FGClouds::set_3dClouds); _tiedProperties.Tie( "clouds3d-density", thesky, - &SGSky::get_3dCloudDensity, - &SGSky::set_3dCloudDensity); + &SGSky::get_3dCloudDensity, + &SGSky::set_3dCloudDensity); _tiedProperties.Tie("clouds3d-vis-range", thesky, - &SGSky::get_3dCloudVisRange, - &SGSky::set_3dCloudVisRange); - + &SGSky::get_3dCloudVisRange, + &SGSky::set_3dCloudVisRange); + _tiedProperties.Tie("precipitation-enable", &sgEnviro, - &SGEnviro::get_precipitation_enable_state, - &SGEnviro::set_precipitation_enable_state); + &SGEnviro::get_precipitation_enable_state, + &SGEnviro::set_precipitation_enable_state); _tiedProperties.Tie("lightning-enable", &sgEnviro, - &SGEnviro::get_lightning_enable_state, - &SGEnviro::set_lightning_enable_state); + &SGEnviro::get_lightning_enable_state, + &SGEnviro::set_lightning_enable_state); sgEnviro.config(fgGetNode("/sim/rendering/precipitation")); } @@ -194,15 +199,42 @@ void FGEnvironmentMgr::update (double dt) { SGSubsystemGroup::update(dt); - + _environment->set_elevation_ft( _altitudeNode->getDoubleValue() ); simgear::Particles::setWindFrom( _environment->get_wind_from_heading_deg(), - _environment->get_wind_speed_kt() ); + _environment->get_wind_speed_kt() ); if( _cloudLayersDirty ) { _cloudLayersDirty = false; fgClouds->set_update_event( fgClouds->get_update_event()+1 ); } + + _positionTimeToLive -= dt; + if( _positionTimeToLive <= 0.0 ) + { + // 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()); + } + } + } } FGEnvironment @@ -318,31 +350,31 @@ FGEnvironmentMgr::get_cloud_layer_coverage_type (int index) const return thesky->get_cloud_layer(index)->getCoverage(); } -double +double FGEnvironmentMgr::get_cloud_layer_visibility_m (int index) const { return thesky->get_cloud_layer(index)->getVisibility_m(); } -void +void FGEnvironmentMgr::set_cloud_layer_visibility_m (int index, double visibility_m) { thesky->get_cloud_layer(index)->setVisibility_m(visibility_m); } -double +double FGEnvironmentMgr::get_cloud_layer_maxalpha (int index ) const { return thesky->get_cloud_layer(index)->getMaxAlpha(); } -void +void FGEnvironmentMgr::set_cloud_layer_maxalpha (int index, double maxalpha) { thesky->get_cloud_layer(index)->setMaxAlpha(maxalpha); } -void +void FGEnvironmentMgr::set_cloud_layer_coverage_type (int index, int type ) { if( type < 0 || type >= SGCloudLayer::SG_MAX_CLOUD_COVERAGES ) { diff --git a/src/Environment/environment_mgr.hxx b/src/Environment/environment_mgr.hxx index e6041f813..67d929ec8 100644 --- a/src/Environment/environment_mgr.hxx +++ b/src/Environment/environment_mgr.hxx @@ -94,8 +94,11 @@ private: FGEnvironment * _environment; // always the same, for now FGClouds *fgClouds; - SGPropertyNode_ptr _altitudeNode; bool _cloudLayersDirty; + SGPropertyNode_ptr _altitudeNode; + SGPropertyNode_ptr _longitude_n; + SGPropertyNode_ptr _latitude_n; + double _positionTimeToLive; simgear::TiedPropertyList _tiedProperties; }; diff --git a/src/Environment/fgclouds.cxx b/src/Environment/fgclouds.cxx index f5a531382..c57c4ee1d 100644 --- a/src/Environment/fgclouds.cxx +++ b/src/Environment/fgclouds.cxx @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -47,12 +48,13 @@ extern SGSky *thesky; FGClouds::FGClouds() : snd_lightning(0), - clouds_3d_enabled(false) + clouds_3d_enabled(false), + index(0) { update_event = 0; } -FGClouds::~FGClouds() +FGClouds::~FGClouds() { } @@ -65,7 +67,7 @@ void FGClouds::set_update_event(int count) { buildCloudLayers(); } -void FGClouds::init(void) { +void FGClouds::Init(void) { if( snd_lightning == NULL ) { snd_lightning = new SGSoundSample("Sounds/thunder.wav", SGPath()); snd_lightning->set_max_dist(7000.0f); @@ -75,6 +77,10 @@ void FGClouds::init(void) { sgr->add( snd_lightning, "thunder" ); sgEnviro.set_sampleGroup( sgr ); } + + globals->get_commands()->addCommand("add-cloud", do_add_3Dcloud); + globals->get_commands()->addCommand("del-cloud", do_delete_3Dcloud); + globals->get_commands()->addCommand("move-cloud", do_move_3Dcloud); } // Build an invidual cloud. Returns the extents of the cloud for coverage calculations @@ -101,7 +107,10 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ double x = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); double y = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); double z = grid_z_rand * (sg_random() - 0.5); - + + float lon = fgGetNode("/position/longitude-deg", false)->getFloatValue(); + float lat = fgGetNode("/position/latitude-deg", false)->getFloatValue(); + SGVec3f pos(x,y,z); for(int i = 0; i < box_def->nChildren() ; i++) { @@ -111,7 +120,7 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ string type = abox->getStringValue("type", "cu-small"); cld_def = cloud_def_root->getChild(type.c_str()); if ( !cld_def ) return 0.0; - + double w = abox->getDoubleValue("width", 1000.0); double h = abox->getDoubleValue("height", 1000.0); int hdist = abox->getIntValue("hdist", 1); @@ -147,38 +156,10 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ z = h * z + pos[2]; // Up/Down. pos[2] is the cloudbase SGVec3f newpos = SGVec3f(x, y, z); + SGNewCloud cld = SGNewCloud(texture_root, cld_def); - double min_width = cld_def->getDoubleValue("min-cloud-width-m", 500.0); - double max_width = cld_def->getDoubleValue("max-cloud-width-m", 1000.0); - double min_height = cld_def->getDoubleValue("min-cloud-height-m", min_width); - double max_height = cld_def->getDoubleValue("max-cloud-height-m", max_width); - double min_sprite_width = cld_def->getDoubleValue("min-sprite-width-m", 200.0); - double max_sprite_width = cld_def->getDoubleValue("max-sprite-width-m", min_sprite_width); - double min_sprite_height = cld_def->getDoubleValue("min-sprite-height-m", min_sprite_width); - double max_sprite_height = cld_def->getDoubleValue("max-sprite-height-m", max_sprite_width); - int num_sprites = cld_def->getIntValue("num-sprites", 20); - int num_textures_x = cld_def->getIntValue("num-textures-x", 1); - int num_textures_y = cld_def->getIntValue("num-textures-y", 1); - double bottom_shade = cld_def->getDoubleValue("bottom-shade", 1.0); - string texture = cld_def->getStringValue("texture", "cu.png"); - - SGNewCloud cld = - SGNewCloud(type, - texture_root, - texture, - min_width, - max_width, - min_height, - max_height, - min_sprite_width, - max_sprite_width, - min_sprite_height, - max_sprite_height, - bottom_shade, - num_sprites, - num_textures_x, - num_textures_y); - layer->addCloud(newpos, cld.genCloud()); + //layer->addCloud(newpos, cld.genCloud()); + layer->addCloud(lon, lat, z, x, y, index++, cld.genCloud()); } } } @@ -266,7 +247,6 @@ void FGClouds::buildLayer(int iLayer, const string& name, double coverage) { break; } } - } // Now we've built any clouds, enable them and set the density (coverage) @@ -335,7 +315,7 @@ void FGClouds::buildCloudLayers(void) { layer_type = "sc"; } } - + cloud_root->setStringValue("layer-type",layer_type); buildLayer(iLayer, layer_type, coverage_norm); } @@ -349,8 +329,88 @@ void FGClouds::set_3dClouds(bool enable) } } -bool FGClouds::get_3dClouds() const +bool FGClouds::get_3dClouds() const { return clouds_3d_enabled; } +/** + * Adds a 3D cloud to a cloud layer. + * + * Property arguments + * layer - the layer index to add this cloud to. (Defaults to 0) + * index - the index for this cloud (to be used later) + * lon/lat/alt - the position for the cloud + * (Various) - cloud definition properties. See README.3DClouds + * + */ + static bool + do_add_3Dcloud (const SGPropertyNode *arg) + { + int l = arg->getIntValue("layer", 0); + int index = arg->getIntValue("index", 0); + + SGPath texture_root = globals->get_fg_root(); + texture_root.append("Textures"); + texture_root.append("Sky"); + + float lon = arg->getFloatValue("lon-deg", 0.0f); + float lat = arg->getFloatValue("lat-deg", 0.0f); + float alt = arg->getFloatValue("alt-ft", 0.0f); + float x = arg->getFloatValue("x-offset-m", 0.0f); + float y = arg->getFloatValue("y-offset-m", 0.0f); + + + SGCloudField *layer = thesky->get_cloud_layer(l)->get_layer3D(); + SGNewCloud cld = SGNewCloud(texture_root, arg); + bool success = layer->addCloud(lon, lat, alt, x, y, index, cld.genCloud()); + + // Adding a 3D cloud immediately makes this layer 3D. + thesky->get_cloud_layer(l)->set_enable3dClouds(true); + + return success; + } + + /** + * Removes a 3D cloud from a cloud layer + * + * Property arguments + * + * layer - the layer index to remove this cloud from. (defaults to 0) + * index - the cloud index + * + */ + static bool + do_delete_3Dcloud (const SGPropertyNode *arg) + { + int l = arg->getIntValue("layer", 0); + int i = arg->getIntValue("index", 0); + + SGCloudField *layer = thesky->get_cloud_layer(l)->get_layer3D(); + return layer->deleteCloud(i); + } + +/** + * Move a cloud within a 3D layer + * + * Property arguments + * layer - the layer index to add this cloud to. (Defaults to 0) + * index - the cloud index to move. + * lon/lat/alt - the position for the cloud + * + */ + static bool + do_move_3Dcloud (const SGPropertyNode *arg) + { + int l = arg->getIntValue("layer", 0); + int i = arg->getIntValue("index", 0); + + float lon = arg->getFloatValue("lon-deg", 0.0f); + float lat = arg->getFloatValue("lat-deg", 0.0f); + float alt = arg->getFloatValue("alt-ft", 0.0f); + float x = arg->getFloatValue("x-offset-m", 0.0f); + float y = arg->getFloatValue("y-offset-m", 0.0f); + + SGCloudField *layer = thesky->get_cloud_layer(l)->get_layer3D(); + return layer->repositionCloud(i, lon, lat, alt, x, y); + } diff --git a/src/Environment/fgclouds.hxx b/src/Environment/fgclouds.hxx index 34ac595e3..9d26419ff 100644 --- a/src/Environment/fgclouds.hxx +++ b/src/Environment/fgclouds.hxx @@ -47,17 +47,24 @@ private: int update_event; SGSoundSample *snd_lightning; bool clouds_3d_enabled; + int index; public: FGClouds(); ~FGClouds(); - void init(void); + void Init(void); int get_update_event(void) const; void set_update_event(int count); bool get_3dClouds() const; void set_3dClouds(bool enable); + }; +static bool do_delete_3Dcloud (const SGPropertyNode *arg); +static bool do_move_3Dcloud (const SGPropertyNode *arg); +static bool do_add_3Dcloud (const SGPropertyNode *arg); + #endif // _FGCLOUDS_HXX + diff --git a/src/FDM/JSBSim/math/FGLocation.h b/src/FDM/JSBSim/math/FGLocation.h index 23b3845e6..c60e8ea2e 100644 --- a/src/FDM/JSBSim/math/FGLocation.h +++ b/src/FDM/JSBSim/math/FGLocation.h @@ -48,7 +48,7 @@ INCLUDES DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -#define ID_LOCATION "$Id: FGLocation.h,v 1.25 2010/09/18 22:47:24 jberndt Exp $" +#define ID_LOCATION "$Id: FGLocation.h,v 1.27 2010/11/29 12:33:58 jberndt Exp $" /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FORWARD DECLARATIONS @@ -142,14 +142,14 @@ CLASS DOCUMENTATION @see W. C. Durham "Aircraft Dynamics & Control", section 2.2 @author Mathias Froehlich - @version $Id: FGLocation.h,v 1.25 2010/09/18 22:47:24 jberndt Exp $ + @version $Id: FGLocation.h,v 1.27 2010/11/29 12:33:58 jberndt Exp $ */ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ -class FGLocation : virtual FGJSBBase +class FGLocation : public FGJSBBase { public: /** Default constructor. */ diff --git a/src/FDM/JSBSim/models/FGAuxiliary.cpp b/src/FDM/JSBSim/models/FGAuxiliary.cpp old mode 100755 new mode 100644 diff --git a/src/FDM/JSBSim/models/FGInput.cpp b/src/FDM/JSBSim/models/FGInput.cpp old mode 100644 new mode 100755 index 65ab24db2..51b4a3984 --- a/src/FDM/JSBSim/models/FGInput.cpp +++ b/src/FDM/JSBSim/models/FGInput.cpp @@ -53,7 +53,7 @@ using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id: FGInput.cpp,v 1.19 2010/02/25 05:21:36 jberndt Exp $"; +static const char *IdSrc = "$Id: FGInput.cpp,v 1.20 2010/11/18 12:38:06 jberndt Exp $"; static const char *IdHdr = ID_INPUT; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -191,7 +191,7 @@ bool FGInput::Run(void) ostringstream info; info << "JSBSim version: " << JSBSim_version << endl; info << "Config File version: " << needed_cfg_version << endl; -// info << "Aircraft simulated: " << Aircraft->GetAircraftName() << endl; + info << "Aircraft simulated: " << FDMExec->GetAircraft()->GetAircraftName() << endl; info << "Simulation time: " << setw(8) << setprecision(3) << FDMExec->GetSimTime() << endl; socket->Reply(info.str()); diff --git a/src/FDM/JSBSim/models/FGPropagate.cpp b/src/FDM/JSBSim/models/FGPropagate.cpp index ae2174df9..6202ccc1c 100644 --- a/src/FDM/JSBSim/models/FGPropagate.cpp +++ b/src/FDM/JSBSim/models/FGPropagate.cpp @@ -71,7 +71,7 @@ using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id: FGPropagate.cpp,v 1.85 2011/04/03 19:24:58 jberndt Exp $"; +static const char *IdSrc = "$Id: FGPropagate.cpp,v 1.86 2011/04/17 11:27:14 bcoconni Exp $"; static const char *IdHdr = ID_PROPAGATE; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -193,7 +193,6 @@ void FGPropagate::SetInitialState(const FGInitialCondition *FGIC) RecomputeLocalTerrainRadius(); VehicleRadius = GetRadius(); - double radInv = 1.0/VehicleRadius; // Set the angular velocities of the body frame relative to the ECEF frame, // expressed in the body frame. @@ -273,9 +272,10 @@ bool FGPropagate::Run(void) // orientation quaternion and vLocation vector. UpdateBodyMatrices(); - CalculateUVW(); // Translational position derivative (velocities are integrated in the inertial frame) + // Translational position derivative (velocities are integrated in the inertial frame) + CalculateUVW(); - // Set auxililary state variables + // Set auxilliary state variables RecomputeLocalTerrainRadius(); VehicleRadius = GetRadius(); // Calculate current aircraft radius from center of planet @@ -628,9 +628,9 @@ void FGPropagate::UpdateBodyMatrices(void) { Ti2b = VState.qAttitudeECI.GetT(); // ECI to body frame transform Tb2i = Ti2b.Transposed(); // body to ECI frame transform - Tl2b = Ti2b*Tl2i; // local to body frame transform + Tl2b = Ti2b * Tl2i; // local to body frame transform Tb2l = Tl2b.Transposed(); // body to local frame transform - Tec2b = Tl2b * Tec2l; // ECEF to body frame transform + Tec2b = Ti2b * Tec2i; // ECEF to body frame transform Tb2ec = Tec2b.Transposed(); // body to ECEF frame tranform } diff --git a/src/FDM/JSBSim/models/flight_control/FGGain.cpp b/src/FDM/JSBSim/models/flight_control/FGGain.cpp index fac82ab61..fb864e06b 100644 --- a/src/FDM/JSBSim/models/flight_control/FGGain.cpp +++ b/src/FDM/JSBSim/models/flight_control/FGGain.cpp @@ -47,7 +47,7 @@ using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id: FGGain.cpp,v 1.20 2009/10/24 22:59:30 jberndt Exp $"; +static const char *IdSrc = "$Id: FGGain.cpp,v 1.23 2011/04/18 08:51:12 andgi Exp $"; static const char *IdHdr = ID_GAIN; /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -70,7 +70,7 @@ FGGain::FGGain(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) if (Type == "PURE_GAIN") { if ( !element->FindElement("gain") ) { - cout << highint << " No GAIN specified (default: 1.0)" << normint << endl; + cerr << highint << " No GAIN specified (default: 1.0)" << normint << endl; } } diff --git a/src/FDM/JSBSim/models/propulsion/FGTurboProp.cpp b/src/FDM/JSBSim/models/propulsion/FGTurboProp.cpp old mode 100755 new mode 100644 diff --git a/src/FDM/JSBSim/models/propulsion/FGTurboProp.h b/src/FDM/JSBSim/models/propulsion/FGTurboProp.h old mode 100755 new mode 100644 diff --git a/src/FDM/YASim/Airplane.cpp b/src/FDM/YASim/Airplane.cpp index 483da4269..f63eaaa5e 100644 --- a/src/FDM/YASim/Airplane.cpp +++ b/src/FDM/YASim/Airplane.cpp @@ -671,8 +671,8 @@ void Airplane::compile() t->handle = body->addMass(0, t->pos); totalFuel += t->cap; } - _cruiseWeight = _emptyWeight + totalFuel*0.5f; - _approachWeight = _emptyWeight + totalFuel*0.2f; + _cruiseWeight = _emptyWeight + totalFuel*_cruiseFuel; + _approachWeight = _emptyWeight + totalFuel*_approachFuel; body->recalc(); @@ -795,7 +795,7 @@ void Airplane::setupWeights(bool isApproach) void Airplane::runCruise() { - setupState(_cruiseAoA, _cruiseSpeed,_approachGlideAngle, &_cruiseState); + setupState(_cruiseAoA, _cruiseSpeed,_cruiseGlideAngle, &_cruiseState); _model.setState(&_cruiseState); _model.setAir(_cruiseP, _cruiseT, Atmosphere::calcStdDensity(_cruiseP, _cruiseT)); diff --git a/src/GUI/MapWidget.cxx b/src/GUI/MapWidget.cxx index b482ada90..cd648fefb 100644 --- a/src/GUI/MapWidget.cxx +++ b/src/GUI/MapWidget.cxx @@ -527,7 +527,6 @@ void MapWidget::draw(int dx, int dy) if (_root->getBoolValue("centre-on-aircraft")) { _projectionCenter = _aircraft; - _root->setBoolValue("centre-on-aircraft", false); } double julianDate = globals->get_time_params()->getJD(); diff --git a/src/Instrumentation/groundradar.cxx b/src/Instrumentation/groundradar.cxx index ffa2e1fc9..c604cc43c 100644 --- a/src/Instrumentation/groundradar.cxx +++ b/src/Instrumentation/groundradar.cxx @@ -47,7 +47,7 @@ #include "groundradar.hxx" static const char* airport_source_node_name = "airport-id-source"; -static const char* default_airport_node_name = "/sim/tower/airport-id"; +static const char* default_airport_node_name = "/sim/airport/closest-airport-id"; static const char* texture_node_name = "texture-name"; static const char* default_texture_name = "Aircraft/Instruments/Textures/od_groundradar.rgb"; static const char* range_source_node_name = "range-source"; diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 9eb8ae7a9..50329b39f 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -793,14 +793,44 @@ static bool fgSetTowerPosFromAirportID( const string& id) { struct FGTowerLocationListener : SGPropertyChangeListener { void valueChanged(SGPropertyNode* node) { - const string id(node->getStringValue()); + string id(node->getStringValue()); + if (fgGetBool("/sim/tower/auto-position",true)) + { + // enforce using closest airport when auto-positioning is enabled + const char* closest_airport = fgGetString("/sim/airport/closest-airport-id", ""); + if (closest_airport && (id != closest_airport)) + { + id = closest_airport; + node->setStringValue(id); + } + } fgSetTowerPosFromAirportID(id); } }; +struct FGClosestTowerLocationListener : SGPropertyChangeListener +{ + void valueChanged(SGPropertyNode* ) + { + // closest airport has changed + if (fgGetBool("/sim/tower/auto-position",true)) + { + // update tower position + const char* id = fgGetString("/sim/airport/closest-airport-id", ""); + if (id && *id!=0) + fgSetString("/sim/tower/airport-id", id); + } + } +}; + void fgInitTowerLocationListener() { fgGetNode("/sim/tower/airport-id", true) ->addChangeListener( new FGTowerLocationListener(), true ); + FGClosestTowerLocationListener* ntcl = new FGClosestTowerLocationListener(); + fgGetNode("/sim/airport/closest-airport-id", true) + ->addChangeListener(ntcl , true ); + fgGetNode("/sim/tower/auto-position", true) + ->addChangeListener(ntcl, true ); } static void fgApplyStartOffset(const SGGeod& aStartPos, double aHeading, double aTargetHeading = HUGE_VAL) @@ -1163,6 +1193,7 @@ bool fgInitPosition() { // An airport + parking position is requested if ( fgSetPosFromAirportIDandParkpos( apt, parkpos ) ) { // set tower position + fgSetString("/sim/airport/closest-airport-id", apt.c_str()); fgSetString("/sim/tower/airport-id", apt.c_str()); set_pos = true; } @@ -1173,7 +1204,8 @@ bool fgInitPosition() { if ( fgSetPosFromAirportIDandRwy( apt, rwy_no, rwy_req ) ) { // set tower position (a little off the heading for single // runway airports) - fgSetString("/sim/tower/airport-id", apt.c_str()); + fgSetString("/sim/airport/closest-airport-id", apt.c_str()); + fgSetString("/sim/tower/airport-id", apt.c_str()); set_pos = true; } } @@ -1183,7 +1215,8 @@ bool fgInitPosition() { if ( fgSetPosFromAirportIDandHdg( apt, hdg ) ) { // set tower position (a little off the heading for single // runway airports) - fgSetString("/sim/tower/airport-id", apt.c_str()); + fgSetString("/sim/airport/closest-airport-id", apt.c_str()); + fgSetString("/sim/tower/airport-id", apt.c_str()); set_pos = true; } } diff --git a/src/Main/options.cxx b/src/Main/options.cxx index b4a3bc830..99ecbf43b 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -1150,12 +1150,22 @@ fgOptNAV2( const char * arg ) } static int -fgOptADF( const char * arg ) +fgOptADF1( const char * arg ) { double rot, freq; if (parse_colon(arg, &rot, &freq)) - fgSetDouble("/instrumentation/adf/rotation-deg", rot); - fgSetDouble("/instrumentation/adf/frequencies/selected-khz", freq); + fgSetDouble("/instrumentation/adf[0]/rotation-deg", rot); + fgSetDouble("/instrumentation/adf[0]/frequencies/selected-khz", freq); + return FG_OPTIONS_OK; +} + +static int +fgOptADF2( const char * arg ) +{ + double rot, freq; + if (parse_colon(arg, &rot, &freq)) + fgSetDouble("/instrumentation/adf[1]/rotation-deg", rot); + fgSetDouble("/instrumentation/adf[1]/frequencies/selected-khz", freq); return FG_OPTIONS_OK; } @@ -1493,7 +1503,9 @@ struct OptionDesc { {"com2", true, OPTION_DOUBLE, "/instrumentation/comm[1]/frequencies/selected-mhz", false, "", 0 }, {"nav1", true, OPTION_FUNC, "", false, "", fgOptNAV1 }, {"nav2", true, OPTION_FUNC, "", false, "", fgOptNAV2 }, - {"adf", true, OPTION_FUNC, "", false, "", fgOptADF }, + {"adf", /*legacy*/ true, OPTION_FUNC, "", false, "", fgOptADF1 }, + {"adf1", true, OPTION_FUNC, "", false, "", fgOptADF1 }, + {"adf2", true, OPTION_FUNC, "", false, "", fgOptADF2 }, {"dme", true, OPTION_FUNC, "", false, "", fgOptDME }, {"min-status", true, OPTION_STRING, "/sim/aircraft-min-status", false, "all", 0 }, {"livery", true, OPTION_FUNC, "", false, "", fgOptLivery }, diff --git a/src/Main/renderer.cxx b/src/Main/renderer.cxx index d1fa367cf..c88003f1e 100644 --- a/src/Main/renderer.cxx +++ b/src/Main/renderer.cxx @@ -613,11 +613,11 @@ FGRenderer::update( bool refresh_camera_settings ) { if ( fgGetBool("/sim/rendering/textures") ) { SGVec4f clearColor(l->adj_fog_color()); - camera->setClearColor(toOsg(clearColor)); + camera->setClearColor(osg::Vec4(0.0, 0.0, 0.0, 1.0)); } } else { SGVec4f clearColor(l->sky_color()); - camera->setClearColor(toOsg(clearColor)); + camera->setClearColor(osg::Vec4(0.0, 0.0, 0.0, 1.0)); } // update fog params if visibility has changed diff --git a/src/Scenery/tilemgr.cxx b/src/Scenery/tilemgr.cxx index 6c19ec5c0..7b59d60b0 100644 --- a/src/Scenery/tilemgr.cxx +++ b/src/Scenery/tilemgr.cxx @@ -88,6 +88,8 @@ FGTileMgr::~FGTileMgr() { group->removeChildren(0, group->getNumChildren()); delete _propListener; _propListener = NULL; + // clear OSG cache + osgDB::Registry::instance()->clearObjectCache(); } @@ -122,6 +124,12 @@ void FGTileMgr::reinit() 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();