]> git.mxchange.org Git - simgear.git/commitdiff
support for integer uniforms
authorTim Moore <timoore33@gmail.com>
Fri, 13 Aug 2010 10:42:10 +0000 (12:42 +0200)
committerTim Moore <timoore33@gmail.com>
Fri, 13 Aug 2010 10:54:02 +0000 (12:54 +0200)
Also, share common Uniform objects

simgear/scene/material/Effect.cxx

index a7ccbb5968ce183387cdcf38b7622d289668bbf4..d3344b58e68d96bfa9dbc0453272ed58b6a6ac33 100644 (file)
@@ -889,11 +889,27 @@ EffectNameValue<Uniform::Type> uniformTypesInit[] =
 };
 EffectPropertyMap<Uniform::Type> uniformTypes(uniformTypesInit);
 
+// Optimization hack for common uniforms.
+// XXX protect these with a mutex?
+
+ref_ptr<Uniform> texture0;
+ref_ptr<Uniform> colorMode[3];
+
 struct UniformBuilder :public PassAttributeBuilder
 {
     void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop,
                         const SGReaderWriterXMLOptions* options)
     {
+        if (!texture0.valid()) {
+            texture0 = new Uniform(Uniform::SAMPLER_2D, "texture");
+            texture0->set(0);
+            texture0->setDataVariance(Object::STATIC);
+            for (int i = 0; i < 3; ++i) {
+                colorMode[i] = new Uniform(Uniform::INT, "colorMode");
+                colorMode[i]->set(i);
+                colorMode[i]->setDataVariance(Object::STATIC);
+            }
+        }
         if (!isAttributeActive(effect, prop))
             return;
         const SGPropertyNode* nameProp = prop->getChild("name");
@@ -957,6 +973,7 @@ struct UniformBuilder :public PassAttributeBuilder
                                static_cast<bool (Uniform::*)(const Vec4&)>(&Uniform::set),
                                vec4Names, options);
             break;
+        case Uniform::INT:
         case Uniform::SAMPLER_1D:
         case Uniform::SAMPLER_2D:
         case Uniform::SAMPLER_3D:
@@ -970,6 +987,19 @@ struct UniformBuilder :public PassAttributeBuilder
         default: // avoid compiler warning
             break;
         }
+        // optimize common uniforms
+        if (uniformType == Uniform::SAMPLER_2D || uniformType == Uniform::INT)
+        {
+            int val;
+            uniform->get(val);
+            if (uniformType == Uniform::SAMPLER_2D && val == 0
+                && name == "texture") {
+                uniform = texture0;
+            } else if (uniformType == Uniform::INT && val >= 0 && val < 3
+                       && name == "colorMode") {
+                uniform = colorMode[val];
+            }
+        }
         pass->addUniform(uniform.get());
     }
 };