]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/fgfs.cxx
Moved random ground cover object management code (userdata.[ch]xx) over
[flightgear.git] / src / Main / fgfs.cxx
index b85497fb692bdc69a326c6acd057651d0b0d560f..c92e995267766e0e7ae734ecbdc88ad21fc05631 100644 (file)
@@ -1,6 +1,7 @@
 #include "fgfs.hxx"
 
 #include <simgear/debug/logstream.hxx>
+#include <simgear/misc/exception.hxx>
 
 #include "globals.hxx"
 #include "fg_props.hxx"
@@ -26,6 +27,11 @@ FGSubsystem::init ()
 {
 }
 
+void
+FGSubsystem::reinit ()
+{
+}
+
 void
 FGSubsystem::bind ()
 {
@@ -74,38 +80,63 @@ FGSubsystemGroup::FGSubsystemGroup ()
 
 FGSubsystemGroup::~FGSubsystemGroup ()
 {
-    for (int i = 0; i < _members.size(); i++)
+    for (unsigned int i = 0; i < _members.size(); i++)
         delete _members[i];
 }
 
 void
 FGSubsystemGroup::init ()
 {
-    for (int i = 0; i < _members.size(); i++)
+    for (unsigned int i = 0; i < _members.size(); i++)
         _members[i]->subsystem->init();
 }
 
+void
+FGSubsystemGroup::reinit ()
+{
+    for (unsigned int i = 0; i < _members.size(); i++)
+        _members[i]->subsystem->reinit();
+}
+
 void
 FGSubsystemGroup::bind ()
 {
-    for (int i = 0; i < _members.size(); i++)
+    for (unsigned int i = 0; i < _members.size(); i++)
         _members[i]->subsystem->bind();
 }
 
 void
 FGSubsystemGroup::unbind ()
 {
-    for (int i = 0; i < _members.size(); i++)
+    for (unsigned int i = 0; i < _members.size(); i++)
         _members[i]->subsystem->unbind();
 }
 
 void
 FGSubsystemGroup::update (double delta_time_sec)
 {
-    if (!is_suspended()) {
-        for (int i = 0; i < _members.size(); i++)
-            _members[i]->update(delta_time_sec); // indirect call
-    }
+    for (unsigned int i = 0; i < _members.size(); i++)
+        _members[i]->update(delta_time_sec); // indirect call
+}
+
+void
+FGSubsystemGroup::suspend ()
+{
+    for (unsigned int i = 0; i < _members.size(); i++)
+        _members[i]->subsystem->suspend();
+}
+
+void
+FGSubsystemGroup::resume ()
+{
+    for (unsigned int i = 0; i < _members.size(); i++)
+        _members[i]->subsystem->resume();
+}
+
+bool
+FGSubsystemGroup::is_suspended () const
+{
+    return false;
 }
 
 void
@@ -133,7 +164,7 @@ FGSubsystemGroup::get_subsystem (const string &name)
 void
 FGSubsystemGroup::remove_subsystem (const string &name)
 {
-    for (int i = 0; i < _members.size(); i++) {
+    for (unsigned int i = 0; i < _members.size(); i++) {
         if (name == _members[i]->name) {
             _members.erase(_members.begin() + i);
             return;
@@ -150,7 +181,7 @@ FGSubsystemGroup::has_subsystem (const string &name) const
 FGSubsystemGroup::Member *
 FGSubsystemGroup::get_member (const string &name, bool create)
 {
-    for (int i = 0; i < _members.size(); i++) {
+    for (unsigned int i = 0; i < _members.size(); i++) {
         if (_members[i]->name == name)
             return _members[i];
     }
@@ -194,8 +225,10 @@ FGSubsystemGroup::Member::update (double delta_time_sec)
 {
     elapsed_sec += delta_time_sec;
     if (elapsed_sec >= min_step_sec) {
-        subsystem->update(delta_time_sec);
-        elapsed_sec -= min_step_sec;
+        if (!subsystem->is_suspended()) {
+            subsystem->update(elapsed_sec);
+            elapsed_sec = 0;
+        }
     }
 }
 
@@ -221,6 +254,13 @@ FGSubsystemMgr::init ()
             _groups[i].init();
 }
 
+void
+FGSubsystemMgr::reinit ()
+{
+    for (int i = 0; i < MAX_GROUPS; i++)
+            _groups[i].reinit();
+}
+
 void
 FGSubsystemMgr::bind ()
 {
@@ -238,18 +278,43 @@ FGSubsystemMgr::unbind ()
 void
 FGSubsystemMgr::update (double delta_time_sec)
 {
-    if (!is_suspended()) {
-        for (int i = 0; i < MAX_GROUPS; i++)
-            _groups[i].update(delta_time_sec);
+    for (int i = 0; i < MAX_GROUPS; i++) {
+        _groups[i].update(delta_time_sec);
     }
 }
 
 void
-FGSubsystemMgr::add (GroupType group, const string &name,
-                     FGSubsystem * subsystem, double min_time_sec)
+FGSubsystemMgr::suspend ()
+{
+    for (int i = 0; i < MAX_GROUPS; i++)
+        _groups[i].suspend();
+}
+
+void
+FGSubsystemMgr::resume ()
+{
+    for (int i = 0; i < MAX_GROUPS; i++)
+        _groups[i].resume();
+}
+
+bool
+FGSubsystemMgr::is_suspended () const
+{
+    return false;
+}
+
+void
+FGSubsystemMgr::add (const char * name, FGSubsystem * subsystem,
+                     GroupType group, double min_time_sec)
 {
     SG_LOG(SG_GENERAL, SG_INFO, "Adding subsystem " << name);
     get_group(group)->set_subsystem(name, subsystem, min_time_sec);
+
+    if (_subsystem_map.find(name) != _subsystem_map.end()) {
+        SG_LOG(SG_GENERAL, SG_ALERT, "Adding duplicate subsystem " << name);
+        throw sg_exception("duplicate subsystem");
+    }
+    _subsystem_map[name] = subsystem;
 }
 
 FGSubsystemGroup *
@@ -258,4 +323,15 @@ FGSubsystemMgr::get_group (GroupType group)
     return &(_groups[group]);
 }
 
+FGSubsystem *
+FGSubsystemMgr::get_subsystem (const string &name)
+{
+    map<string,FGSubsystem *>::iterator s =_subsystem_map.find(name);
+
+    if (s == _subsystem_map.end())
+        return 0;
+    else
+        return s->second;
+}
+
 // end of fgfs.cxx