]> git.mxchange.org Git - flightgear.git/commitdiff
Property predicate for techniques
authortimoore <timoore>
Wed, 15 Jul 2009 23:16:29 +0000 (23:16 +0000)
committerTim Moore <timoore@redhat.com>
Thu, 16 Jul 2009 10:10:48 +0000 (12:10 +0200)
src/Scenery/scenery.cxx

index f16e34ff835a1255ed45181a009bfc835d7fe418..6853cfd9b968cdad339c8786c7031fced1e5bbec 100644 (file)
@@ -35,6 +35,7 @@
 #include <simgear/scene/tgdb/userdata.hxx>
 #include <simgear/scene/material/Effect.hxx>
 #include <simgear/scene/material/EffectGeode.hxx>
+#include <simgear/scene/material/Technique.hxx>
 #include <simgear/scene/material/matlib.hxx>
 #include <simgear/scene/util/SGNodeMasks.hxx>
 #include <simgear/scene/util/SGSceneUserData.hxx>
@@ -233,3 +234,48 @@ SceneryPager* FGScenery::getPagerSingleton()
     static osg::ref_ptr<SceneryPager> pager = new SceneryPager;
     return pager.get();
 }
+
+// Effect initialization stuff
+
+class PropertyExpression : public SGExpression<bool>
+{
+public:
+    PropertyExpression(SGPropertyNode* pnode) : _pnode(pnode) {}
+    
+    void eval(bool& value, const expression::Binding*) const
+    {
+        value = _pnode->getValue<bool>();
+    }
+protected:
+    SGPropertyNode_ptr _pnode;
+};
+
+class EffectPropertyListener : public SGPropertyChangeListener
+{
+public:
+    EffectPropertyListener(Technique* tniq) : _tniq(tniq) {}
+    
+    void valueChanged(SGPropertyNode* node)
+    {
+        _tniq->refreshValidity();
+    }
+protected:
+    osg::ref_ptr<Technique> _tniq;
+};
+
+Expression* propertyExpressionParser(const SGPropertyNode* exp,
+                                     expression::Parser* parser)
+{
+    SGPropertyNode_ptr pnode = fgGetNode(exp->getStringValue(), true);
+    PropertyExpression* pexp = new PropertyExpression(pnode);
+    TechniquePredParser* predParser
+        = dynamic_cast<TechniquePredParser*>(parser);
+    if (predParser)
+        pnode->addChangeListener(new EffectPropertyListener(predParser
+                                                            ->getTechnique()));
+    return pexp;
+}
+
+expression::ExpParserRegistrar propertyRegistrar("property",
+                                                 propertyExpressionParser);
+