]> git.tdb.fi Git - libs/gl.git/commitdiff
Reintroduce named texture slots for Technique inheritance
authorMikko Rasa <tdb@tdb.fi>
Mon, 17 Jan 2011 17:43:10 +0000 (17:43 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 17 Jan 2011 17:43:10 +0000 (17:43 +0000)
source/renderpass.cpp
source/renderpass.h
source/technique.cpp
source/technique.h

index d15a70983637f876de06a12bc3a0b9a8a393b4f8..b95bd4bcfe1977c9ce327c0e5189883efd97800a 100644 (file)
@@ -33,7 +33,8 @@ RenderPass::RenderPass(const RenderPass &other):
        shprog(other.shprog),
        shdata(other.shdata ? new ProgramData(*other.shdata) : 0),
        material(other.material),
-       texturing(other.texturing ? new Texturing(*other.texturing) : 0)
+       texturing(other.texturing ? new Texturing(*other.texturing) : 0),
+       tex_names(other.tex_names)
 { }
 
 RenderPass::~RenderPass()
@@ -56,6 +57,14 @@ void RenderPass::set_texture(unsigned index, const Texture *tex)
        texturing->attach(index, *tex);
 }
 
+int RenderPass::get_texture_index(const string &n) const
+{
+       map<string, unsigned>::const_iterator i = tex_names.find(n);
+       if(i==tex_names.end())
+               return -1;
+       return i->second;
+}
+
 
 RenderPass::Loader::Loader(RenderPass &p):
        DataFile::CollectionObjectLoader<RenderPass>(p, 0)
@@ -77,6 +86,7 @@ void RenderPass::Loader::init()
        add("material", &Loader::material_inline);
        add("material", &Loader::material);
        add("texunit",  &Loader::texunit);
+       add("texunit",  &Loader::texunit_named);
        add("uniforms", &Loader::uniforms);
 }
 
@@ -101,6 +111,12 @@ void RenderPass::Loader::texunit(unsigned i)
        load_sub_with(ldr);
 }
 
+void RenderPass::Loader::texunit_named(unsigned i, const string &n)
+{
+       texunit(i);
+       obj.tex_names[n] = i;
+}
+
 void RenderPass::Loader::uniforms()
 {
        if(!obj.shprog)
index 5c1b84520db58ef8d38e894066de2f8f56a2b1f5..c201eb07c807564a58c1edaa8446d0e83af2e9f6 100644 (file)
@@ -42,6 +42,7 @@ public:
                void material_inline();
                void material(const std::string &);
                void texunit(unsigned);
+               void texunit_named(unsigned, const std::string &);
                void uniforms();
        };
 
@@ -67,6 +68,7 @@ private:
        ProgramData *shdata;
        RefPtr<const Material> material;
        Texturing *texturing;
+       std::map<std::string, unsigned> tex_names;
 
        RenderPass &operator=(const RenderPass &);
 public:
@@ -80,6 +82,7 @@ public:
        const Material *get_material() const { return material.get(); }
        void set_texture(unsigned, const Texture *);
        const Texturing *get_texturing() const { return texturing; }
+       int get_texture_index(const std::string &) const;
 };
 
 } // namespace GL
index 9d13a8976ac4b40f56f077b4a4fcf5120bdea4f1..49b487982993d259f3807c8b3820f9991cf85998 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2008-2011  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -88,17 +88,15 @@ Technique::InheritLoader::InheritLoader(Technique &t, Collection &c):
        add("texture", &InheritLoader::texture);
 }
 
-void Technique::InheritLoader::texture(unsigned index, const string &name)
+void Technique::InheritLoader::texture(const std::string &slot, const string &name)
 {
        Texture *tex = get_collection().get<Texture>(name);
        for(PassMap::iterator i=obj.passes.begin(); i!=obj.passes.end(); ++i)
        {
-               try
-               {
-                       i->second.set_texture(index, tex);
-               }
-               catch(const KeyError &)
-               { }
+               int index = i->second.get_texture_index(slot);
+               if(index<0)
+                       continue;
+               i->second.set_texture(index, tex);
        }
 }
 
index 608af19d9fc8a6af523d03cdcaf1201e79ac3abb..b06ddcbb702f001e0106890c1c134e45cd5ffcde 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2008-2011  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -41,7 +41,7 @@ private:
                InheritLoader(Technique &, Collection &);
        
        private:
-               void texture(unsigned, const std::string &);
+               void texture(const std::string &, const std::string &);
        };
 
        typedef std::map<Tag, RenderPass> PassMap;