X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2FEffectBuilder.hxx;h=52e2cf1c98614a2e0c4dee3ea65ff3bf679d7584;hb=f33ad357e928b5210c87cb8977d3cc88deba811b;hp=e9c7b6a97426c1a6726d671c9b9475115a642893;hpb=df0a60caae110cd3fb7dece62e7686404078ffef;p=simgear.git diff --git a/simgear/scene/material/EffectBuilder.hxx b/simgear/scene/material/EffectBuilder.hxx index e9c7b6a9..52e2cf1c 100644 --- a/simgear/scene/material/EffectBuilder.hxx +++ b/simgear/scene/material/EffectBuilder.hxx @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -30,10 +31,9 @@ #include #include -#include #include #include -#include +#include #include #include #include @@ -47,7 +47,7 @@ namespace simgear { class Effect; class Pass; -class SGReaderWriterXMLOptions; +class SGReaderWriterOptions; /** * Builder that returns an object, probably an OSG object. @@ -57,16 +57,16 @@ class EffectBuilder : public SGReferenced { public: virtual ~EffectBuilder() {} - virtual T* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options) = 0; - static T* buildFromType(Effect* effect, const std::string& type, + virtual T* build(Effect* effect, Pass* pass, const SGPropertyNode*, + const SGReaderWriterOptions* options) = 0; + static T* buildFromType(Effect* effect, Pass* pass, const std::string& type, const SGPropertyNode*props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { BuilderMap& builderMap = getMap(); typename BuilderMap::iterator iter = builderMap.find(type); if (iter != builderMap.end()) - return iter->second->build(effect, props, options); + return iter->second->build(effect, pass, props, options); else return 0; } @@ -121,13 +121,20 @@ struct EffectNameValue template struct bidirectional_map { +#if _MSC_VER >= 1600 + struct value_type { + FromType first; + ToType second; + value_type(FromType f, ToType s) : first(f),second(s){} + }; +#else typedef std::pair value_type; +#endif /* A bidirectional map can be simulated as a multi_index_container * of pairs of (FromType,ToType) with two unique indices, one * for each member of the pair. */ - typedef multi_index_container< value_type, indexed_by< @@ -160,7 +167,7 @@ EffectPropertyMap::EffectPropertyMap(const EffectNameValue (&attrs)[N]) template struct SimplePropertyMap { - typedef std::map map_type; + typedef std::map map_type; map_type _map; template SimplePropertyMap(const EffectNameValue (&attrs)[N]) @@ -188,10 +195,10 @@ void findAttr(const effect::EffectPropertyMap& pMap, { using namespace effect; typename EffectPropertyMap::BMap::iterator itr - = pMap._map.get().find(name); + = pMap._map.template get().find(name); if (itr == pMap._map.end()) { - throw effect::BuilderException(string("findAttr: could not find attribute ") - + string(name)); + throw effect::BuilderException(std::string("findAttr: could not find attribute ") + + std::string(name)); } else { result = itr->second; } @@ -226,7 +233,7 @@ const T* findAttr(const effect::EffectPropertyMap& pMap, { using namespace effect; typename EffectPropertyMap::BMap::iterator itr - = pMap._map.get().find(name); + = pMap._map.template get().find(name); if (itr == pMap._map.end()) return 0; else @@ -260,8 +267,8 @@ std::string findName(const effect::EffectPropertyMap& pMap, T value) using namespace effect; std::string result; typename EffectPropertyMap::BMap::template index_iterator::type itr - = pMap._map.get().find(value); - if (itr != pMap._map.get().end()) + = pMap._map.template get().find(value); + if (itr != pMap._map.template get().end()) result = itr->first; return result; } @@ -288,18 +295,18 @@ const SGPropertyNode* getEffectPropertyChild(Effect* effect, const char* name); /** - * Get the name of a node mentioned in a clause from the global property + * Get the name of a node mentioned in a \ clause from the global property * tree. - * @return empty if prop doesn't contain a clause; otherwise the + * @return empty if prop doesn't contain a \ clause; otherwise the * mentioned node name. */ std::string getGlobalProperty(const SGPropertyNode* prop, - const SGReaderWriterXMLOptions *); + const SGReaderWriterOptions *); template std::vector getVectorProperties(const SGPropertyNode* prop, - const SGReaderWriterXMLOptions *options, size_t vecSize, + const SGReaderWriterOptions *options, size_t vecSize, NameItr defaultNames) { using namespace std; @@ -309,12 +316,12 @@ getVectorProperties(const SGPropertyNode* prop, PropertyList useProps = prop->getChildren("use"); if (useProps.size() == 1) { string parentName = useProps[0]->getStringValue(); - if (parentName.size() == 0 || parentName[0] != '/') - parentName = options->getPropRoot()->getPath() + "/" + parentName; + if (parentName.empty() || parentName[0] != '/') + parentName = options->getPropertyNode()->getPath() + "/" + parentName; if (parentName[parentName.size() - 1] != '/') parentName.append("/"); NameItr itr = defaultNames; - for (int i = 0; i < vecSize; ++i, ++itr) + for (size_t i = 0; i < vecSize; ++i, ++itr) result.push_back(parentName + *itr); } else if (useProps.size() == vecSize) { string parentName = useProps[0]->getStringValue(); @@ -324,7 +331,7 @@ getVectorProperties(const SGPropertyNode* prop, itr != end; ++itr) { string childName = (*itr)->getStringValue(); - if (childName.size() == 0 || childName[0] != '/') + if (childName.empty() || childName[0] != '/') result.push_back(parentName + childName); else result.push_back(childName); @@ -342,11 +349,14 @@ protected: struct PassAttrMapSingleton : public simgear::Singleton { PassAttrMap passAttrMap; + }; public: + virtual ~PassAttributeBuilder(); // anchor into the compilation unit. + virtual void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) = 0; static PassAttributeBuilder* find(const std::string& str) { @@ -363,7 +373,7 @@ public: template struct InstallAttributeBuilder { - InstallAttributeBuilder(const string& name) + InstallAttributeBuilder(const std::string& name) { PassAttributeBuilder::PassAttrMapSingleton::instance() ->passAttrMap.insert(make_pair(name, new T)); @@ -486,19 +496,17 @@ make_OSGFunctor(Obj* obj, void (Obj::*const func)(const OSGParam&)) template class ScalarChangeListener : public SGPropertyChangeListener, public InitializeWhenAdded, + public PropertyPoller, public Effect::Updater { public: ScalarChangeListener(ObjType* obj, const F& setter, const std::string& propName) - : _obj(obj), _setter(setter) + : _obj(obj), _setter(setter), _propName(propName) { - _propName = new std::string(propName); } virtual ~ScalarChangeListener() { - delete _propName; - _propName = 0; } void valueChanged(SGPropertyNode* node) { @@ -506,16 +514,20 @@ public: } void initOnAddImpl(Effect* effect, SGPropertyNode* propRoot) { - SGPropertyNode* listenProp = makeNode(propRoot, *_propName); - delete _propName; - _propName = 0; - if (listenProp) - listenProp->addChangeListener(this, true); + _listenProp = makeNode(propRoot, _propName); +// if ( _listenProp.valid() ) +// _listenProp->addChangeListener(this, true); + } + void pollProperties(Effect* effect) + { + if( false == _listenProp.valid() ) return; + valueChanged(_listenProp); } private: + SGPropertyNode_ptr _listenProp; osg::ref_ptr _obj; F _setter; - std::string* _propName; + std::string _propName; }; template @@ -571,12 +583,25 @@ new_EEPropListener(const Func& func, const std::string* propName, (func, 0, namesBegin, namesEnd); } +/** + * Set DYNAMIC data variance on an osg::Object. + */ + +inline void setDynamicVariance(void* obj) +{ +} + +inline void setDynamicVariance(osg::Object* obj) +{ + obj->setDataVariance(osg::Object::DYNAMIC); +} + /** * Initialize the value and the possible updating of an effect * attribute. If the value is specified directly, set it. Otherwise, - * use the tag to look at the parameters. Again, if there is a + * use the \ tag to look at the parameters. Again, if there is a * value there set it directly. Otherwise, the parameter contains its - * own tag referring to a property in the global property tree; + * own \ tag referring to a property in the global property tree; * install a change listener that will set the attribute when the * property changes. * @@ -586,7 +611,7 @@ new_EEPropListener(const Func& func, const std::string* propName, template void initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, - const F& setter, const SGReaderWriterXMLOptions* options) + const F& setter, const SGReaderWriterOptions* options) { const SGPropertyNode* valProp = getEffectPropertyNode(effect, prop); if (!valProp) @@ -594,6 +619,7 @@ initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, if (valProp->nChildren() == 0) { setter(obj, valProp->getValue()); } else { + setDynamicVariance(obj); std::string propName = getGlobalProperty(valProp, options); ScalarChangeListener* listener = new ScalarChangeListener(obj, setter, @@ -606,7 +632,7 @@ template inline void initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, SetterReturn (ObjType::*setter)(const OSGParamType), - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { initFromParameters(effect, prop, obj, boost::bind(setter, _1, _2), options); @@ -617,12 +643,12 @@ initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, * The parameter may be updated at runtime. * * If the value is specified directly, set it. Otherwise, use the - * tag to look at the parameters. Again, if there is a value + * \ tag to look at the parameters. Again, if there is a value * there set it directly. Otherwise, the parameter contains one or several - * tags. If there is one tag, it is a property that is the root + * \ tags. If there is one tag, it is a property that is the root * for the values needed to update the parameter; nameIter holds the * names of the properties relative to the root. If there are several - * tags, they each hold the name of the property holding the + * \ tags, they each hold the name of the property holding the * value for the corresponding vector member. * * Install a change listener that will set the attribute when the @@ -636,7 +662,7 @@ template::sg_type sg_type; const int numComponents = props::NumComponents::num_components; @@ -646,6 +672,7 @@ initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, if (valProp->nChildren() == 0) { // Has ? setter(obj, Bridge::get(valProp->getValue())); } else { + setDynamicVariance(obj); std::vector paramNames = getVectorProperties(valProp, options,numComponents, nameItr); if (paramNames.empty()) @@ -664,7 +691,7 @@ template(effect, prop, obj, boost::bind(setter, _1, _2), nameItr,