]> git.mxchange.org Git - simgear.git/commitdiff
UniformFactory: fix Rembrandt light
authorClément de l'Hamaide <clemaez@hotmail.fr>
Wed, 12 Nov 2014 21:31:19 +0000 (22:31 +0100)
committerClément de l'Hamaide <clemaez@hotmail.fr>
Sun, 16 Nov 2014 19:22:29 +0000 (20:22 +0100)
simgear/scene/material/Effect.cxx
simgear/scene/material/Effect.hxx
simgear/scene/material/makeEffect.cxx

index e36af69836fcb384b9031f2b1b697c9f12c40a5f..6f36c072ad23d8b60f6c0bf989d3ffc92a9b3fa9 100644 (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
 {
index 8ad98307b5c7de327fb963c8eeb5a80715c529a7..50ac5fb7778fbad56591ea9801ffec8c71d4a895 100644 (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&);
index 4abdd4a2da2034e598933ad52453c0234b7669e6..628d71432826761d42cf1ca13a14cd06f9dfd36a 100644 (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");
     }