From 4787ac64ff9326896c15416d17ff8a7d70b5070b Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Thu, 4 Nov 2010 10:06:13 +0100 Subject: [PATCH] issue 165: fix material animation condition problem 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 | 22 ++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/simgear/scene/model/SGMaterialAnimation.cxx b/simgear/scene/model/SGMaterialAnimation.cxx index 61181aeb..6b5887a1 100644 --- a/simgear/scene/model/SGMaterialAnimation.cxx +++ b/simgear/scene/model/SGMaterialAnimation.cxx @@ -27,6 +27,7 @@ #include #include #include +#include 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 _condition; SGSharedPtr _textureProp; SGSharedPtr _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 -- 2.39.5