From: Mikko Rasa Date: Fri, 4 Dec 2009 17:18:21 +0000 (+0000) Subject: Use a struct to store texture slots in Technique X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=3959bf80b361fd1e84bebe22e58f5875e1b68afb;p=libs%2Fgl.git Use a struct to store texture slots in Technique --- diff --git a/source/technique.cpp b/source/technique.cpp index 74cd6c31..53c7a9ae 100644 --- a/source/technique.cpp +++ b/source/technique.cpp @@ -45,8 +45,8 @@ const ObjectPass &Technique::get_pass(const GL::Tag &tag) const unsigned Technique::get_texture_index(const std::string &n) const { - for(unsigned i=0; i=textures.size()) throw KeyError("Texture index out of range"); - return textures[i]; + return textures[i].texture; } @@ -80,7 +80,10 @@ void Technique::Loader::finish() if(i->second.shdata) { for(unsigned j=0; jsecond.shdata->uniform(i->second.shprog->get_uniform_location(tech.tex_names[j]), static_cast(j)); + { + unsigned loc=i->second.shprog->get_uniform_location(tech.textures[j].name); + i->second.shdata->uniform(loc, static_cast(j)); + } } } @@ -120,16 +123,22 @@ void Technique::Loader::shader(const string &n) void Technique::Loader::shader_texture(const string &n) { string::size_type eqsign=n.find('='); + TextureSlot tex; if(eqsign!=string::npos) { - tech.textures.push_back(coll.get(n.substr(eqsign+1))); - tech.tex_names.push_back(n.substr(0, eqsign)); + tex.name=n.substr(0, eqsign); + tex.texture=coll.get(n.substr(eqsign+1)); } else { - tech.textures.push_back(coll.get(n)); - tech.tex_names.push_back(n); + string::size_type dot=n.rfind('.'); + tex.name=n.substr(0, dot); + tex.texture = coll.get(n); } + for(string::iterator i=tex.name.begin(); i!=tex.name.end(); ++i) + if(!isalnum(*i)) + *i='_'; + tech.textures.push_back(tex); } void Technique::Loader::texture(const string &n) @@ -138,14 +147,17 @@ void Technique::Loader::texture(const string &n) throw Exception("Only one main texture may be specified"); tech.main_texture=coll.get(n); - tech.textures.push_back(tech.main_texture); - tech.tex_names.push_back("texture"); + TextureSlot tex; + tex.name="texture"; + tex.texture=tech.main_texture; + tech.textures.push_back(tex); } void Technique::Loader::texture_slot(const string &n) { - tech.tex_names.push_back(n); - tech.textures.push_back(0); + TextureSlot tex; + tex.name=n; + tech.textures.push_back(tex); } } // namespace GL diff --git a/source/technique.h b/source/technique.h index 711db79d..ef7e9e12 100644 --- a/source/technique.h +++ b/source/technique.h @@ -50,8 +50,15 @@ public: }; private: - std::vector tex_names; - std::vector textures; + struct TextureSlot + { + std::string name; + const Texture *texture; + + TextureSlot(): texture(0) { } + }; + + std::vector textures; const Texture *main_texture; std::map passes; ObjectPass *normal_pass; @@ -63,7 +70,7 @@ public: bool has_pass(const GL::Tag &) const; const ObjectPass &get_pass(const GL::Tag &) const; - unsigned get_n_textures() const { return tex_names.size(); } + unsigned get_n_textures() const { return textures.size(); } unsigned get_texture_index(const std::string &) const; const Texture *get_texture(unsigned) const; const Texture *get_main_texture() const { return main_texture; }