diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index 40ca18f20..c6451eef1 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -97,6 +97,7 @@ FGEnvironmentMgr::init () { SG_LOG( SG_GENERAL, SG_INFO, "Initializing environment subsystem"); SGSubsystemGroup::init(); + fgClouds->Init(); } void @@ -111,7 +112,7 @@ FGEnvironmentMgr::bind () { SGSubsystemGroup::bind(); _environment->Tie( fgGetNode("/environment", true ) ); - + _tiedProperties.setRoot( fgGetNode( "/environment", true ) ); _tiedProperties.Tie( "effective-visibility-m", thesky, @@ -128,27 +129,27 @@ FGEnvironmentMgr::bind () for (int i = 0; i < MAX_CLOUD_LAYERS; i++) { SGPropertyNode_ptr layerNode = fgGetNode("/environment/clouds",true)->getChild("layer", i, true ); - _tiedProperties.Tie( layerNode->getNode("span-m",true), this, i, + _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, + _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, + _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, + _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, + _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, + _tiedProperties.Tie( layerNode->getNode("coverage-type",true), this, i, &FGEnvironmentMgr::get_cloud_layer_coverage_type, &FGEnvironmentMgr::set_cloud_layer_coverage_type); @@ -174,9 +175,9 @@ FGEnvironmentMgr::bind () _tiedProperties.Tie("clouds3d-vis-range", thesky, &SGSky::get_3dCloudVisRange, &SGSky::set_3dCloudVisRange); - + _tiedProperties.Tie("precipitation-enable", &sgEnviro, - &SGEnviro::get_precipitation_enable_state, + &SGEnviro::get_precipitation_enable_state, &SGEnviro::set_precipitation_enable_state); _tiedProperties.Tie("lightning-enable", &sgEnviro, @@ -198,7 +199,7 @@ void FGEnvironmentMgr::update (double dt) { SGSubsystemGroup::update(dt); - + _environment->set_elevation_ft( _altitudeNode->getDoubleValue() ); simgear::Particles::setWindFrom( _environment->get_wind_from_heading_deg(), @@ -226,7 +227,7 @@ FGEnvironmentMgr::update (double dt) } else { - const string currentId = fgGetString("/sim/airport/closest-airport-id", ""); + const string currentId = fgGetString("/sim/airport/closest-airport-id", ""); if (currentId != nearestAirport->ident()) { fgSetString("/sim/airport/closest-airport-id", @@ -349,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/fgclouds.cxx b/src/Environment/fgclouds.cxx index f5a531382..6bd1d5aa7 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,86 @@ 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); + + SGCloudField *layer = thesky->get_cloud_layer(l)->get_layer3D(); + return layer->repositionCloud(i, lon, lat, alt); + } 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/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/Main/.renderer.cxx.swp b/src/Main/.renderer.cxx.swp deleted file mode 100644 index 9ebc72734..000000000 Binary files a/src/Main/.renderer.cxx.swp and /dev/null differ