]> git.mxchange.org Git - simgear.git/commitdiff
Introduce "PRESERVE" flag to protect properties on sim reset.
authorThorstenB <brehmt@gmail.com>
Sun, 12 Jun 2011 18:32:13 +0000 (20:32 +0200)
committerThorstenB <brehmt@gmail.com>
Sun, 12 Jun 2011 18:32:13 +0000 (20:32 +0200)
Some specific properties need protection and shouldn't be restored to their
original values on sim-reset.

simgear/props/props.hxx
simgear/props/props_io.cxx
simgear/scene/tsync/terrasync.cxx

index e870f4407bbd5c76d90a3b18829a49636f495dde..60da557d87a136838eb93ad1d79672f9d49b83be 100644 (file)
@@ -760,7 +760,8 @@ public:
     REMOVED = 8,
     TRACE_READ = 16,
     TRACE_WRITE = 32,
-    USERARCHIVE = 64
+    USERARCHIVE = 64,
+    PRESERVE = 128
   };
 
 
index e3ceaddb0dcb58a75c93c20cf9d46fd0f05b7e66..9fea449730bf94122e3eea9c23c826b4eae5de68 100644 (file)
@@ -227,6 +227,9 @@ PropsVisitor::startElement (const char * name, const XMLAttributes &atts)
     attval = atts.getValue("userarchive");
     if (checkFlag(attval, false))
       mode |= SGPropertyNode::USERARCHIVE;
+    attval = atts.getValue("preserve");
+    if (checkFlag(attval, false))
+      mode |= SGPropertyNode::PRESERVE;
 
                                // Check for an alias.
     attval = atts.getValue("alias");
@@ -691,8 +694,12 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out,
   int nChildren = in->nChildren();
   for (int i = 0; i < nChildren; i++) {
     const SGPropertyNode * in_child = in->getChild(i);
-    if (!in_child->hasValue() ||
-        (in_child->getAttributes() & attr_mask) == attr_value)
+    int mask = attr_mask;
+    /* attributes have no meaning for nodes without values - except
+     * the PRESERVE flag. So ignore them. */
+    if (!in_child->hasValue())
+        mask &= SGPropertyNode::PRESERVE;
+    if ((in_child->getAttributes() & mask) == (attr_value & mask))
     {
       SGPropertyNode * out_child = out->getChild(in_child->getNameString(),
                              in_child->getIndex(),
@@ -704,9 +711,13 @@ copyProperties (const SGPropertyNode *in, SGPropertyNode *out,
                                     true);
       }
       else
-      if (out_child->hasValue() &&
-          (out_child->getAttributes() & attr_mask) != attr_value)
-          out_child = NULL;
+      {
+          mask = attr_mask;
+          if (!out_child->hasValue())
+              mask &= SGPropertyNode::PRESERVE;
+          if ((out_child->getAttributes() & mask) != (attr_value & mask))
+              out_child = NULL;
+      }
       if (out_child &&
           (!copyProperties(in_child, out_child, attr_value, attr_mask)))
           retval = false;
index e2d288601f25180df34bb97c3234699f52b204cc..939ff6fb6640c27ad26150406aa59ce2fa4c5c11 100644 (file)
@@ -627,6 +627,7 @@ void SGTerraSync::bind()
     // stalled is used as a signal handler (to connect listeners triggering GUI pop-ups)
     _stalled_node = _terraRoot->getNode("stalled", true);
     _stalled_node->setBoolValue(_svnThread->_stalled);
+    _stalled_node->setAttribute(SGPropertyNode::PRESERVE,true);
 }
 
 void SGTerraSync::unbind()