]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/event_mgr.cxx
Merge branch 'topic/gcintersect' into next
[simgear.git] / simgear / structure / event_mgr.cxx
index 32c499f9988961dabc906ee5900cb507a371ad22..a62e83f91df7e26b94a7b42a2259eb02ef100b36 100644 (file)
@@ -4,6 +4,10 @@ void SGEventMgr::add(SGCallback* cb,
                      double interval, double delay,
                      bool repeat, bool simtime)
 {
+    // Clamp the delay value to 1 usec, so that user code can use
+    // "zero" as a synonym for "next frame".
+    if(delay <= 0) delay = 0.000001;
+
     SGTimer* t = new SGTimer;
     t->interval = interval;
     t->callback = cb;
@@ -31,9 +35,10 @@ void SGTimer::run()
 
 void SGEventMgr::update(double delta_time_sec)
 {
-    _rtQueue.update(delta_time_sec);
-    if(!_freezeProp || _freezeProp->getBoolValue() == false)
-        _simQueue.update(delta_time_sec);
+    _simQueue.update(delta_time_sec);
+    
+    double rt = _rtProp ? _rtProp->getDoubleValue() : 0;
+    _rtQueue.update(rt);
 }
 
 ////////////////////////////////////////////////////////////////////////
@@ -59,7 +64,14 @@ SGTimerQueue::SGTimerQueue(int size)
 
 SGTimerQueue::~SGTimerQueue()
 {
+    for(int i=0; i<_numEntries; i++) {
+        delete _table[i].timer;
+        _table[i].timer = 0;
+    }
+    _numEntries = 0;
     delete[] _table;
+    _table = 0;
+    _tableSize = 0;
 }
 
 void SGTimerQueue::update(double deltaSecs)
@@ -73,8 +85,6 @@ void SGTimerQueue::update(double deltaSecs)
 
 void SGTimerQueue::insert(SGTimer* timer, double time)
 {
-    if(time < 0) *(int*)0=0;
-
     if(_numEntries >= _tableSize)
        growArray();
 
@@ -120,21 +130,16 @@ SGTimer* SGTimerQueue::remove()
 
 void SGTimerQueue::siftDown(int n)
 {
-    // While we have a child bigger than us:
-    while(((lchild(n) < (_numEntries-1))
-          && (_table[n].pri < _table[lchild(n)].pri))
-         ||
-         ((rchild(n) < (_numEntries-1))
-          && (_table[n].pri < _table[rchild(n)].pri)))
-    {
-        // Swap us with the biggest child
-        if(_table[lchild(n)].pri > _table[rchild(n)].pri) {
-            swap(n, lchild(n)); 
-            n = lchild(n);
-        } else {
-            swap(n, rchild(n));
-            n = rchild(n);
-        }
+    // While we have children bigger than us, swap us with the biggest
+    // child.
+    while(lchild(n) < _numEntries) {
+        int bigc = lchild(n);
+        if(rchild(n) < _numEntries && pri(rchild(n)) > pri(bigc))
+            bigc = rchild(n);
+        if(pri(bigc) <= pri(n))
+            break;
+        swap(n, bigc);
+        n = bigc;
     }
 }