diff --git a/src/Environment/Makefile.am b/src/Environment/Makefile.am index 7b01218f6..decc9a3d6 100644 --- a/src/Environment/Makefile.am +++ b/src/Environment/Makefile.am @@ -5,7 +5,8 @@ noinst_LIBRARIES = libEnvironment.a libEnvironment_a_SOURCES = environment.cxx environment.hxx \ - environment_mgr.cxx environment_mgr.hxx + environment_mgr.cxx environment_mgr.hxx \ + environment_ctrl.cxx environment_ctrl.hxx if OLD_AUTOMAKE INCLUDES += -I$(top_srcdir) -I$(top_srcdir)/src diff --git a/src/Environment/environment.hxx b/src/Environment/environment.hxx index f3a77152d..111af137e 100644 --- a/src/Environment/environment.hxx +++ b/src/Environment/environment.hxx @@ -85,12 +85,6 @@ private: double wind_from_east_fps; double wind_from_down_fps; - // Do these belong here? -#if 0 - GLfloat fog_exp_density; - GLfloat fog_exp2_density; -#endif - }; #endif // _ENVIRONMENT_HXX diff --git a/src/Environment/environment_ctrl.cxx b/src/Environment/environment_ctrl.cxx new file mode 100644 index 000000000..0d57267f6 --- /dev/null +++ b/src/Environment/environment_ctrl.cxx @@ -0,0 +1,154 @@ +// environment_ctrl.cxx -- manager for natural environment information. +// +// Written by David Megginson, started February 2002. +// +// Copyright (C) 2002 David Megginson - david@megginson.com +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + +#include + +#include +#include
+ +#include "environment_ctrl.hxx" + + + +//////////////////////////////////////////////////////////////////////// +// Implementation of FGEnvironmentCtrl abstract base class. +//////////////////////////////////////////////////////////////////////// + +FGEnvironmentCtrl::FGEnvironmentCtrl () + : _environment(0), + _lon_deg(0), + _lat_deg(0), + _elev_ft(0) +{ +} + +FGEnvironmentCtrl::~FGEnvironmentCtrl () +{ +} + +void +FGEnvironmentCtrl::setEnvironment (FGEnvironment * environment) +{ + _environment = environment; +} + +void +FGEnvironmentCtrl::setLongitudeDeg (double lon_deg) +{ + _lon_deg = lon_deg; +} + +void +FGEnvironmentCtrl::setLatitudeDeg (double lat_deg) +{ + _lat_deg = lat_deg; +} + +void +FGEnvironmentCtrl::setElevationFt (double elev_ft) +{ + _elev_ft = elev_ft; +} + +void +FGEnvironmentCtrl::setPosition (double lon_deg, double lat_deg, double elev_ft) +{ + _lon_deg = lon_deg; + _lat_deg = lat_deg; + _elev_ft = elev_ft; +} + + + +//////////////////////////////////////////////////////////////////////// +// Implementation of FGUserDefEnvironmentCtrl. +//////////////////////////////////////////////////////////////////////// + +FGUserDefEnvironmentCtrl::FGUserDefEnvironmentCtrl () + : _base_wind_speed_node(0), + _gust_wind_speed_node(0), + _current_wind_speed_kt(0), + _delta_wind_speed_kt(0) +{ +} + +FGUserDefEnvironmentCtrl::~FGUserDefEnvironmentCtrl () +{ +} + +void +FGUserDefEnvironmentCtrl::init () +{ + // Fill in some defaults. + if (!fgHasNode("/environment/params/base-wind-speed-kt")) + fgSetDouble("/environment/params/base-wind-speed-kt", + fgGetDouble("/environment/wind-speed-kt")); + if (!fgHasNode("/environment/params/gust-wind-speed-kt")) + fgSetDouble("/environment/params/gust-wind-speed-kt", + fgGetDouble("/environment/params/base-wind-speed-kt")); + + _base_wind_speed_node = + fgGetNode("/environment/params/base-wind-speed-kt", true); + _gust_wind_speed_node = + fgGetNode("/environment/params/gust-wind-speed-kt", true); + + _current_wind_speed_kt = _base_wind_speed_node->getDoubleValue(); + _delta_wind_speed_kt = 0.1; +} + +void +FGUserDefEnvironmentCtrl::update (int dt) +{ + double base_wind_speed = _base_wind_speed_node->getDoubleValue(); + double gust_wind_speed = _gust_wind_speed_node->getDoubleValue(); + + if (base_wind_speed == gust_wind_speed) { + _current_wind_speed_kt = base_wind_speed; + } else { + int rn = rand() % 128; + int sign = (_delta_wind_speed_kt < 0 ? -1 : 1); + double gust = _current_wind_speed_kt - base_wind_speed; + double incr = gust / 50; + + if (rn == 0) + _delta_wind_speed_kt = - _delta_wind_speed_kt; + else if (rn < 4) + _delta_wind_speed_kt -= incr * sign; + else if (rn < 16) + _delta_wind_speed_kt += incr * sign; + + _current_wind_speed_kt += _delta_wind_speed_kt; + + if (_current_wind_speed_kt < base_wind_speed) { + _current_wind_speed_kt = base_wind_speed; + _delta_wind_speed_kt = 0.01; + } else if (_current_wind_speed_kt > gust_wind_speed) { + _current_wind_speed_kt = gust_wind_speed; + _delta_wind_speed_kt = -0.01; + } + } + + if (_environment != 0) + _environment->set_wind_speed_kt(_current_wind_speed_kt); +} + +// end of environment_ctrl.cxx diff --git a/src/Environment/environment_ctrl.hxx b/src/Environment/environment_ctrl.hxx new file mode 100644 index 000000000..d50dba79e --- /dev/null +++ b/src/Environment/environment_ctrl.hxx @@ -0,0 +1,100 @@ +// environment-ctrl.hxx -- controller for environment information. +// +// Written by David Megginson, started May 2002. +// +// Copyright (C) 2002 David Megginson - david@megginson.com +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + +#ifndef _ENVIRONMENT_CTRL_HXX +#define _ENVIRONMENT_CTRL_HXX + +#include + +#ifdef SG_HAVE_STD_INCLUDES +# include +#else +# include +#endif + +class SGPropertyNode; + +#include "environment.hxx" + + + +/** + * Interface to control environment information for a specific location. + */ +class FGEnvironmentCtrl +{ + +public: + + FGEnvironmentCtrl (); + virtual ~FGEnvironmentCtrl (); + + virtual void setEnvironment (FGEnvironment * environment); + + virtual FGEnvironment * getEnvironment () const { return _environment; } + + virtual void setLongitudeDeg (double lon_deg); + virtual void setLatitudeDeg (double lat_deg); + virtual void setElevationFt (double elev_ft); + virtual void setPosition (double lon_deg, double lat_deg, double elev_ft); + + virtual double getLongitudeDeg () const { return _lon_deg; } + virtual double getLatitudeDeg () const { return _lat_deg; } + virtual double getElevationFt () const { return _elev_ft; } + + virtual void init () = 0; + virtual void update (int dt) = 0; + +protected: + + FGEnvironment * _environment; + double _lon_deg; + double _lat_deg; + double _elev_ft; + +}; + + + +/** + * Environment controller using user-supplied parameters. + */ +class FGUserDefEnvironmentCtrl : public FGEnvironmentCtrl +{ +public: + FGUserDefEnvironmentCtrl (); + virtual ~FGUserDefEnvironmentCtrl (); + + virtual void init (); + virtual void update (int dt); + +private: + + SGPropertyNode * _base_wind_speed_node; + SGPropertyNode * _gust_wind_speed_node; + + double _current_wind_speed_kt; + double _delta_wind_speed_kt; + +}; + +#endif // _ENVIRONMENT_CTRL_HXX diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index 188d73a20..4f3388954 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -25,23 +25,29 @@ #include
#include +#include "environment.hxx" +#include "environment_ctrl.hxx" #include "environment_mgr.hxx" FGEnvironmentMgr::FGEnvironmentMgr () + : _environment(new FGEnvironment), + _controller(new FGUserDefEnvironmentCtrl) { - _environment = new FGEnvironment(); } FGEnvironmentMgr::~FGEnvironmentMgr () { delete _environment; + delete _controller; } void FGEnvironmentMgr::init () { SG_LOG( SG_GENERAL, SG_INFO, "Initializing environment subsystem"); + _controller->setEnvironment(_environment); + _controller->init(); } void @@ -91,6 +97,7 @@ FGEnvironmentMgr::unbind () void FGEnvironmentMgr::update (int dt) { + _controller->update(dt); // FIXME: the FDMs should update themselves current_aircraft.fdm_state ->set_Velocities_Local_Airmass(_environment->get_wind_from_north_fps(), diff --git a/src/Environment/environment_mgr.hxx b/src/Environment/environment_mgr.hxx index 3238c9bf9..d8757900b 100644 --- a/src/Environment/environment_mgr.hxx +++ b/src/Environment/environment_mgr.hxx @@ -33,7 +33,8 @@ # include #endif -#include "environment.hxx" +class FGEnvironment; +class FGEnvironmentCtrl; /** @@ -67,6 +68,7 @@ public: private: FGEnvironment * _environment; // always the same, for now + FGEnvironmentCtrl * _controller; // always the same, for now };