UniformFactory: fix Rembrandt light

This commit is contained in:
Clément de l'Hamaide 2014-11-12 22:31:19 +01:00
parent 07e09bb88c
commit 46fe57fb8d
3 changed files with 13 additions and 2 deletions

View File

@ -105,7 +105,7 @@ private:
SGMutex _mutex;
typedef boost::tuple<std::string, Uniform::Type, std::string> UniformCacheKey;
typedef boost::tuple<std::string, Uniform::Type, std::string, std::string> UniformCacheKey;
typedef boost::tuple<ref_ptr<Uniform>, SGPropertyChangeListener*> UniformCacheValue;
std::map<UniformCacheKey,ref_ptr<Uniform> > uniformCache;
@ -145,7 +145,7 @@ ref_ptr<Uniform> UniformFactoryImpl::getUniform( Effect * effect,
}
}
UniformCacheKey key = boost::make_tuple(name, uniformType, val);
UniformCacheKey key = boost::make_tuple(name, uniformType, val, effect->getName());
ref_ptr<Uniform> uniform = uniformCache[key];
if (uniform.valid()) {
@ -1107,6 +1107,7 @@ InstallAttributeBuilder<UniformBuilder> installUniform("uniform");
// Not sure what to do with "name". At one point I wanted to use it to
// order the passes, but I do support render bin and stuff too...
// Clément de l'Hamaide 10/2014: "name" is now used in the UniformCacheKey
struct NameBuilder : public PassAttributeBuilder
{

View File

@ -99,6 +99,9 @@ public:
{
void doUpdate(osg::Node* node, osg::NodeVisitor* nv);
};
std::string getName(){return _name;}
void setName(std::string name){_name = name;}
protected:
~Effect();
// Support for a cache of effects that inherit from this one, so
@ -137,6 +140,7 @@ protected:
friend Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques,
const SGReaderWriterOptions* options);
bool _isRealized;
std::string _name;
};
// Automatic support for boost hash function
size_t hash_value(const Effect::Key&);

View File

@ -187,6 +187,10 @@ Effect* makeEffect(SGPropertyNode* prop,
}
}
ref_ptr<Effect> effect;
if(!prop->hasChild("name")){
setValue(prop->getChild("name", 0, true), "noname");
}
SGPropertyNode_ptr nameProp = prop->getChild("name");
// Merge with the parent effect, if any
SGPropertyNode_ptr inheritProp = prop->getChild("inherits-from");
Effect* parent = 0;
@ -214,6 +218,7 @@ Effect* makeEffect(SGPropertyNode* prop,
}
if (!effect.valid()) {
effect = new Effect;
effect->setName(nameProp->getStringValue());
effect->root = new SGPropertyNode;
mergePropertyTrees(effect->root, prop, parent->root);
effect->parametersProp = effect->root->getChild("parameters");
@ -237,6 +242,7 @@ Effect* makeEffect(SGPropertyNode* prop,
}
} else {
effect = new Effect;
effect->setName(nameProp->getStringValue());
effect->root = prop;
effect->parametersProp = effect->root->getChild("parameters");
}