]> git.mxchange.org Git - simgear.git/commitdiff
add ConditionNode scenegraph node
authorTim Moore <moore@cline.(none)>
Thu, 4 Nov 2010 06:01:38 +0000 (07:01 +0100)
committerTim Moore <moore@cline.(none)>
Thu, 4 Nov 2010 06:01:38 +0000 (07:01 +0100)
This class directs its scenegraph traversal by evaluating a condition
and doesn't rely on an update callback.

simgear/scene/model/ConditionNode.cxx [new file with mode: 0644]
simgear/scene/model/ConditionNode.hxx [new file with mode: 0644]
simgear/scene/model/Makefile.am
simgear/scene/model/animation.cxx
simgear/scene/model/animation.hxx

diff --git a/simgear/scene/model/ConditionNode.cxx b/simgear/scene/model/ConditionNode.cxx
new file mode 100644 (file)
index 0000000..e68cfa2
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright (C) 2010 Tim Moore (timoore33@gmail.com)
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+
+#include "ConditionNode.hxx"
+
+namespace simgear
+{
+using namespace osg;
+
+ConditionNode::ConditionNode()
+{
+}
+
+ConditionNode::ConditionNode(const ConditionNode& rhs, const CopyOp& op)
+    : Group(rhs, op), _condition(rhs._condition)
+{
+}
+
+ConditionNode::~ConditionNode()
+{
+}
+
+void ConditionNode::traverse(NodeVisitor& nv)
+{
+    if (nv.getTraversalMode() == NodeVisitor::TRAVERSE_ACTIVE_CHILDREN) {
+        unsigned numChildren = getNumChildren();
+        if (numChildren == 0)
+            return;
+        if (!_condition || _condition->test())
+            getChild(0)->accept(nv);
+        else if (numChildren > 1)
+            getChild(1)->accept(nv);
+        else
+            return;
+    } else {
+        Group::traverse(nv);
+    }
+}
+
+}
diff --git a/simgear/scene/model/ConditionNode.hxx b/simgear/scene/model/ConditionNode.hxx
new file mode 100644 (file)
index 0000000..d36b00f
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright (C) 2010 Tim Moore (timoore33@gmail.com)
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+
+#ifndef SIMGEAR_CONDITIONNODE_HXX
+#define SIMGEAR_CONDITIONNODE_HXX 1
+
+#include <simgear/props/condition.hxx>
+#include <osg/Group>
+
+namespace simgear
+{
+/**
+ * If the condition is true, traverse the first child; otherwise,
+ * traverse the second if it exists.
+ */
+class ConditionNode : public osg::Group
+{
+public:
+    ConditionNode();
+    ConditionNode(const ConditionNode& rhs,
+              const osg::CopyOp& op = osg::CopyOp::SHALLOW_COPY);
+    META_Node(simgear,ConditionNode);
+    ~ConditionNode();
+    const SGCondition* getCondition() { return _condition.ptr(); }
+    void setCondition(const SGCondition* condition) { _condition = condition; }
+
+    virtual void traverse(osg::NodeVisitor& nv);
+protected:
+    SGSharedPtr<SGCondition const> _condition;
+};
+
+}
+#endif
index 7a3f4cfad55e0a080ac08b115c324b5820854083..b36ab8355f92760262267849ba26c62a4c835595 100644 (file)
@@ -13,6 +13,7 @@ include_HEADERS = \
        persparam.hxx \
        placement.hxx \
        CheckSceneryVisitor.hxx \
+       ConditionNode.hxx \
        SGClipGroup.hxx \
        SGInteractionAnimation.hxx \
        SGMaterialAnimation.hxx \
@@ -36,6 +37,7 @@ libsgmodel_a_SOURCES = \
        placement.cxx \
        shadanim.cxx \
        CheckSceneryVisitor.cxx \
+       ConditionNode.cxx \
        SGClipGroup.cxx \
        SGInteractionAnimation.cxx \
        SGMaterialAnimation.cxx \
index e84866530a0eceba2a5e3c69580a87701a63b0f1..489419c24b78dc2d6642bd0e62da28448dd196fc 100644 (file)
@@ -53,6 +53,8 @@
 #include "SGScaleTransform.hxx"
 #include "SGInteractionAnimation.hxx"
 
+#include "ConditionNode.hxx"
+
 using OpenThreads::Mutex;
 using OpenThreads::ReentrantMutex;
 using OpenThreads::ScopedLock;
@@ -1445,25 +1447,6 @@ SGRangeAnimation::createAnimationGroup(osg::Group& parent)
 // Implementation of a select animation
 ////////////////////////////////////////////////////////////////////////
 
-class SGSelectAnimation::UpdateCallback : public osg::NodeCallback {
-public:
-  UpdateCallback(const SGCondition* condition) :
-    _condition(condition)
-  {}
-  virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
-  {
-    osg::Switch* sw = static_cast<osg::Switch*>(node);
-    if (_condition->test())
-      sw->setAllChildrenOn();
-    else
-      sw->setAllChildrenOff();
-    traverse(node, nv);
-  }
-
-private:
-  SGSharedPtr<SGCondition const> _condition;
-};
-
 SGSelectAnimation::SGSelectAnimation(const SGPropertyNode* configNode,
                                      SGPropertyNode* modelRoot) :
   SGAnimation(configNode, modelRoot)
@@ -1479,12 +1462,13 @@ SGSelectAnimation::createAnimationGroup(osg::Group& parent)
   // when the animation installer returns
   if (!condition)
     return new osg::Group;
-
-  osg::Switch* sw = new osg::Switch;
-  sw->setName("select animation node");
-  sw->setUpdateCallback(new UpdateCallback(condition));
-  parent.addChild(sw);
-  return sw;
+  simgear::ConditionNode* cn = new simgear::ConditionNode;
+  cn->setName("select animation node");
+  cn->setCondition(condition.ptr());
+  osg::Group* grp = new osg::Group;
+  cn->addChild(grp);
+  parent.addChild(cn);
+  return grp;
 }
 
 
index 1e2b13319874006ef0999cd130dd8690a30960e6..ae4eaead9abfc70be9bedd2a1cb244be52c3af60 100644 (file)
@@ -232,8 +232,6 @@ public:
   SGSelectAnimation(const SGPropertyNode* configNode,
                     SGPropertyNode* modelRoot);
   virtual osg::Group* createAnimationGroup(osg::Group& parent);
-private:
-  class UpdateCallback;
 };
 
 \f