]> git.mxchange.org Git - simgear.git/commitdiff
issue 165: fix material animation condition problem
authorTim Moore <moore@cline.(none)>
Thu, 4 Nov 2010 09:06:13 +0000 (10:06 +0100)
committerTim Moore <moore@cline.(none)>
Thu, 4 Nov 2010 09:06:13 +0000 (10:06 +0100)
The evaluation of the condition is moved to a ConditionNode and
separated from the animation of values via properties. Previously the
conditional application of static values was broken.

simgear/scene/model/SGMaterialAnimation.cxx

index 61181aeb22c2ba70464dbd11808316a16c91d6e4..6b5887a102b23f965fa7c9afdc4ab12e95ea4ab7 100644 (file)
@@ -27,6 +27,7 @@
 #include <simgear/scene/material/Pass.hxx>
 #include <simgear/scene/material/Technique.hxx>
 #include <simgear/scene/model/model.hxx>
+#include <simgear/scene/model/ConditionNode.hxx>
 
 using namespace std;
 using namespace simgear;
@@ -340,9 +341,7 @@ public:
 class UpdateCallback : public osg::NodeCallback {
 public:
   UpdateCallback(const osgDB::FilePathList& texturePathList,
-                 const SGCondition* condition,
                  const SGPropertyNode* configNode, SGPropertyNode* modelRoot) :
-    _condition(condition),
     _materialProps(configNode, modelRoot),
     _texturePathList(texturePathList),
     _prevState(false)
@@ -360,7 +359,7 @@ public:
   virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
   {
     osg::StateSet* stateSet = node->getStateSet();
-    if ((!_condition || _condition->test()) && stateSet) {
+    if (stateSet) {
       if (_textureProp) {
         std::string textureName = _textureProp->getStringValue();
         if (_textureName != textureName) {
@@ -400,7 +399,6 @@ public:
     traverse(node, nv);
   }
 private:
-  SGSharedPtr<const SGCondition> _condition;
   SGSharedPtr<const SGPropertyNode> _textureProp;
   SGSharedPtr<const SGPropertyNode> _thresholdProp;
   std::string _textureName;
@@ -557,13 +555,23 @@ SGMaterialAnimation::createAnimationGroup(osg::Group& parent)
       || getConfig()->hasChild("threshold-prop") || getCondition()) {
     stateSet->setDataVariance(osg::Object::DYNAMIC);
     group->setUpdateCallback(new UpdateCallback(texturePathList,
-                                                getCondition(),
                                                 getConfig(), inputRoot));
   } else {
     stateSet->setDataVariance(osg::Object::STATIC);
   }
-  parent.addChild(group);
-  return group;
+  if (getCondition()) {
+    ConditionNode* cn = new ConditionNode;
+    cn->setCondition(getCondition());
+    osg::Group* modelGroup = new osg::Group;
+    group->addChild(modelGroup);
+    cn->addChild(group);
+    cn->addChild(modelGroup);
+    parent.addChild(cn);
+    return modelGroup;
+  } else {
+    parent.addChild(group);
+    return group;
+  }
 }
 
 void