From: timoore Date: Wed, 15 Jul 2009 23:16:29 +0000 (+0000) Subject: Property predicate for techniques X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=e2b21c1e0c78df1099b64a5347555b3bc76f6b2e;p=flightgear.git Property predicate for techniques --- diff --git a/src/Scenery/scenery.cxx b/src/Scenery/scenery.cxx index f16e34ff8..6853cfd9b 100644 --- a/src/Scenery/scenery.cxx +++ b/src/Scenery/scenery.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -233,3 +234,48 @@ SceneryPager* FGScenery::getPagerSingleton() static osg::ref_ptr pager = new SceneryPager; return pager.get(); } + +// Effect initialization stuff + +class PropertyExpression : public SGExpression +{ +public: + PropertyExpression(SGPropertyNode* pnode) : _pnode(pnode) {} + + void eval(bool& value, const expression::Binding*) const + { + value = _pnode->getValue(); + } +protected: + SGPropertyNode_ptr _pnode; +}; + +class EffectPropertyListener : public SGPropertyChangeListener +{ +public: + EffectPropertyListener(Technique* tniq) : _tniq(tniq) {} + + void valueChanged(SGPropertyNode* node) + { + _tniq->refreshValidity(); + } +protected: + osg::ref_ptr _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(parser); + if (predParser) + pnode->addChangeListener(new EffectPropertyListener(predParser + ->getTechnique())); + return pexp; +} + +expression::ExpParserRegistrar propertyRegistrar("property", + propertyExpressionParser); +