]> git.mxchange.org Git - flightgear.git/blob - src/Main/fgfs.cxx
Oops missed some more usage of opengl extensions that may not be on everyone's systems.
[flightgear.git] / src / Main / fgfs.cxx
1 #include "fgfs.hxx"
2
3 #include <simgear/debug/logstream.hxx>
4
5 #include "globals.hxx"
6 #include "fg_props.hxx"
7
8
9 \f
10 ////////////////////////////////////////////////////////////////////////
11 // Implementation of FGSubsystem
12 ////////////////////////////////////////////////////////////////////////
13
14
15 FGSubsystem::FGSubsystem ()
16   : _suspended(false)
17 {
18 }
19
20 FGSubsystem::~FGSubsystem ()
21 {
22 }
23
24 void
25 FGSubsystem::init ()
26 {
27 }
28
29 void
30 FGSubsystem::reinit ()
31 {
32 }
33
34 void
35 FGSubsystem::bind ()
36 {
37 }
38
39 void
40 FGSubsystem::unbind ()
41 {
42 }
43
44 void
45 FGSubsystem::suspend ()
46 {
47   _suspended = true;
48 }
49
50 void
51 FGSubsystem::suspend (bool suspended)
52 {
53   _suspended = suspended;
54 }
55
56 void
57 FGSubsystem::resume ()
58 {
59   _suspended = false;
60 }
61
62 bool
63 FGSubsystem::is_suspended () const
64 {
65   if (!_freeze_master_node.valid())
66     _freeze_master_node = fgGetNode("/sim/freeze/master", true);
67   return _suspended || _freeze_master_node->getBoolValue();
68 }
69
70
71 \f
72 ////////////////////////////////////////////////////////////////////////
73 // Implementation of FGSubsystemGroup.
74 ////////////////////////////////////////////////////////////////////////
75
76 FGSubsystemGroup::FGSubsystemGroup ()
77 {
78 }
79
80 FGSubsystemGroup::~FGSubsystemGroup ()
81 {
82     for (int i = 0; i < _members.size(); i++)
83         delete _members[i];
84 }
85
86 void
87 FGSubsystemGroup::init ()
88 {
89     for (int i = 0; i < _members.size(); i++)
90         _members[i]->subsystem->init();
91 }
92
93 void
94 FGSubsystemGroup::bind ()
95 {
96     for (int i = 0; i < _members.size(); i++)
97         _members[i]->subsystem->bind();
98 }
99
100 void
101 FGSubsystemGroup::unbind ()
102 {
103     for (int i = 0; i < _members.size(); i++)
104         _members[i]->subsystem->unbind();
105 }
106
107 void
108 FGSubsystemGroup::update (double delta_time_sec)
109 {
110     if (!is_suspended()) {
111         for (int i = 0; i < _members.size(); i++)
112             _members[i]->update(delta_time_sec); // indirect call
113     }
114 }
115
116 void
117 FGSubsystemGroup::set_subsystem (const string &name, FGSubsystem * subsystem,
118                                  double min_step_sec)
119 {
120     Member * member = get_member(name, true);
121     if (member->subsystem != 0)
122         delete member->subsystem;
123     member->name = name;
124     member->subsystem = subsystem;
125     member->min_step_sec = min_step_sec;
126 }
127
128 FGSubsystem *
129 FGSubsystemGroup::get_subsystem (const string &name)
130 {
131     Member * member = get_member(name);
132     if (member != 0)
133         return member->subsystem;
134     else
135         return 0;
136 }
137
138 void
139 FGSubsystemGroup::remove_subsystem (const string &name)
140 {
141     for (int i = 0; i < _members.size(); i++) {
142         if (name == _members[i]->name) {
143             _members.erase(_members.begin() + i);
144             return;
145         }
146     }
147 }
148
149 bool
150 FGSubsystemGroup::has_subsystem (const string &name) const
151 {
152     return (((FGSubsystemGroup *)this)->get_member(name) != 0);
153 }
154
155 FGSubsystemGroup::Member *
156 FGSubsystemGroup::get_member (const string &name, bool create)
157 {
158     for (int i = 0; i < _members.size(); i++) {
159         if (_members[i]->name == name)
160             return _members[i];
161     }
162     if (create) {
163         Member * member = new Member;
164         _members.push_back(member);
165         return member;
166     } else {
167         return 0;
168     }
169 }
170
171
172 \f
173 ////////////////////////////////////////////////////////////////////////
174 // Implementation of FGSubsystemGroup::Member
175 ////////////////////////////////////////////////////////////////////////
176
177
178 FGSubsystemGroup::Member::Member ()
179     : name(""),
180       subsystem(0),
181       min_step_sec(0),
182       elapsed_sec(0)
183 {
184 }
185
186 FGSubsystemGroup::Member::Member (const Member &)
187 {
188     Member();
189 }
190
191 FGSubsystemGroup::Member::~Member ()
192 {
193                                 // FIXME: causes a crash
194 //     delete subsystem;
195 }
196
197 void
198 FGSubsystemGroup::Member::update (double delta_time_sec)
199 {
200     elapsed_sec += delta_time_sec;
201     if (elapsed_sec >= min_step_sec) {
202         subsystem->update(delta_time_sec);
203         elapsed_sec -= min_step_sec;
204     }
205 }
206
207
208 \f
209 ////////////////////////////////////////////////////////////////////////
210 // Implementation of FGSubsystemMgr.
211 ////////////////////////////////////////////////////////////////////////
212
213
214 FGSubsystemMgr::FGSubsystemMgr ()
215 {
216 }
217
218 FGSubsystemMgr::~FGSubsystemMgr ()
219 {
220 }
221
222 void
223 FGSubsystemMgr::init ()
224 {
225     for (int i = 0; i < MAX_GROUPS; i++)
226             _groups[i].init();
227 }
228
229 void
230 FGSubsystemMgr::bind ()
231 {
232     for (int i = 0; i < MAX_GROUPS; i++)
233         _groups[i].bind();
234 }
235
236 void
237 FGSubsystemMgr::unbind ()
238 {
239     for (int i = 0; i < MAX_GROUPS; i++)
240         _groups[i].unbind();
241 }
242
243 void
244 FGSubsystemMgr::update (double delta_time_sec)
245 {
246     if (!is_suspended()) {
247         for (int i = 0; i < MAX_GROUPS; i++)
248             _groups[i].update(delta_time_sec);
249     }
250 }
251
252 void
253 FGSubsystemMgr::add (GroupType group, const string &name,
254                      FGSubsystem * subsystem, double min_time_sec)
255 {
256     SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
257     get_group(group)->set_subsystem(name, subsystem, min_time_sec);
258 }
259
260 FGSubsystemGroup *
261 FGSubsystemMgr::get_group (GroupType group)
262 {
263     return &(_groups[group]);
264 }
265
266 // end of fgfs.cxx