]> git.mxchange.org Git - flightgear.git/blob - src/Environment/environment_ctrl.cxx
Moved some of the low level scene graph construction code over to simgear.
[flightgear.git] / src / Environment / environment_ctrl.cxx
1 // environment_ctrl.cxx -- manager for natural environment information.
2 //
3 // Written by David Megginson, started February 2002.
4 //
5 // Copyright (C) 2002  David Megginson - david@megginson.com
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23 #include <simgear/debug/logstream.hxx>
24
25 #include <stdlib.h>
26 #include <Main/fg_props.hxx>
27
28 #include "environment_ctrl.hxx"
29
30
31 \f
32 ////////////////////////////////////////////////////////////////////////
33 // Implementation of FGEnvironmentCtrl abstract base class.
34 ////////////////////////////////////////////////////////////////////////
35
36 FGEnvironmentCtrl::FGEnvironmentCtrl ()
37   : _environment(0),
38     _lon_deg(0),
39     _lat_deg(0),
40     _elev_ft(0)
41 {
42 }
43
44 FGEnvironmentCtrl::~FGEnvironmentCtrl ()
45 {
46 }
47
48 void
49 FGEnvironmentCtrl::setEnvironment (FGEnvironment * environment)
50 {
51   _environment = environment;
52 }
53
54 void
55 FGEnvironmentCtrl::setLongitudeDeg (double lon_deg)
56 {
57   _lon_deg = lon_deg;
58 }
59
60 void
61 FGEnvironmentCtrl::setLatitudeDeg (double lat_deg)
62 {
63   _lat_deg = lat_deg;
64 }
65
66 void
67 FGEnvironmentCtrl::setElevationFt (double elev_ft)
68 {
69   _elev_ft = elev_ft;
70 }
71
72 void
73 FGEnvironmentCtrl::setPosition (double lon_deg, double lat_deg, double elev_ft)
74 {
75   _lon_deg = lon_deg;
76   _lat_deg = lat_deg;
77   _elev_ft = elev_ft;
78 }
79
80
81 \f
82 ////////////////////////////////////////////////////////////////////////
83 // Implementation of FGUserDefEnvironmentCtrl.
84 ////////////////////////////////////////////////////////////////////////
85
86 FGUserDefEnvironmentCtrl::FGUserDefEnvironmentCtrl ()
87   : _base_wind_speed_node(0),
88     _gust_wind_speed_node(0),
89     _current_wind_speed_kt(0),
90     _delta_wind_speed_kt(0)
91 {
92 }
93
94 FGUserDefEnvironmentCtrl::~FGUserDefEnvironmentCtrl ()
95 {
96 }
97
98 void
99 FGUserDefEnvironmentCtrl::init ()
100 {
101                                 // Fill in some defaults.
102   if (!fgHasNode("/environment/params/base-wind-speed-kt"))
103     fgSetDouble("/environment/params/base-wind-speed-kt",
104                 fgGetDouble("/environment/wind-speed-kt"));
105   if (!fgHasNode("/environment/params/gust-wind-speed-kt"))
106     fgSetDouble("/environment/params/gust-wind-speed-kt",
107                 fgGetDouble("/environment/params/base-wind-speed-kt"));
108
109   _base_wind_speed_node =
110     fgGetNode("/environment/params/base-wind-speed-kt", true);
111   _gust_wind_speed_node =
112     fgGetNode("/environment/params/gust-wind-speed-kt", true);
113
114   _current_wind_speed_kt = _base_wind_speed_node->getDoubleValue();
115   _delta_wind_speed_kt = 0.1;
116 }
117
118 void
119 FGUserDefEnvironmentCtrl::update (double dt)
120 {
121   double base_wind_speed = _base_wind_speed_node->getDoubleValue();
122   double gust_wind_speed = _gust_wind_speed_node->getDoubleValue();
123
124   if (gust_wind_speed < base_wind_speed) {
125       gust_wind_speed = base_wind_speed;
126       _gust_wind_speed_node->setDoubleValue(gust_wind_speed);
127   }
128
129   if (base_wind_speed == gust_wind_speed) {
130     _current_wind_speed_kt = base_wind_speed;
131   } else {
132     int rn = rand() % 128;
133     int sign = (_delta_wind_speed_kt < 0 ? -1 : 1);
134     double gust = _current_wind_speed_kt - base_wind_speed;
135     double incr = gust / 50;
136
137     if (rn == 0)
138       _delta_wind_speed_kt = - _delta_wind_speed_kt;
139     else if (rn < 4)
140       _delta_wind_speed_kt -= incr * sign;
141     else if (rn < 16)
142       _delta_wind_speed_kt += incr * sign;
143
144     _current_wind_speed_kt += _delta_wind_speed_kt;
145
146     if (_current_wind_speed_kt < base_wind_speed) {
147       _current_wind_speed_kt = base_wind_speed;
148       _delta_wind_speed_kt = 0.01;
149     } else if (_current_wind_speed_kt > gust_wind_speed) {
150       _current_wind_speed_kt = gust_wind_speed;
151       _delta_wind_speed_kt = -0.01;
152     }
153   }
154   
155   if (_environment != 0)
156     _environment->set_wind_speed_kt(_current_wind_speed_kt);
157 }
158
159 // end of environment_ctrl.cxx