X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmaterials%2Ftechnique.cpp;h=122eaf73d412f8f91f5c6fbf3690d6240cfea057;hb=5008778dbb1840bf7c6d479800d2b932f8386fb2;hp=22f8f3b63a0752ce547863a35eafa455f2e4f3ee;hpb=233dff2a6c552e08da832496aecd88ef4f8948f1;p=libs%2Fgl.git diff --git a/source/materials/technique.cpp b/source/materials/technique.cpp index 22f8f3b6..122eaf73 100644 --- a/source/materials/technique.cpp +++ b/source/materials/technique.cpp @@ -1,10 +1,9 @@ #include #include +#include #include #include "material.h" -#include "program.h" #include "programdata.h" -#include "tag.h" #include "technique.h" #include "texture.h" @@ -30,19 +29,19 @@ const RenderPass &Technique::get_pass(Tag tag) const const RenderPass *Technique::find_pass(Tag tag) const { - PassMap::const_iterator i = passes.find(tag); + auto i = passes.find(tag); return (i!=passes.end() ? &i->second : 0); } bool Technique::replace_texture(const string &slot, const Texture &tex) { bool replaced = false; - for(PassMap::iterator i=passes.begin(); i!=passes.end(); ++i) + for(auto &kvp: passes) { - int index = i->second.get_texture_index(slot); - if(index>=0) + Tag tag = kvp.second.get_texture_tag(slot); + if(tag.id) { - i->second.set_texture(index, &tex); + kvp.second.set_texture(tag, &tex); replaced = true; } } @@ -53,12 +52,12 @@ bool Technique::replace_texture(const string &slot, const Texture &tex) bool Technique::replace_material(const string &slot, const Material &mat) { bool replaced = false; - for(PassMap::iterator i=passes.begin(); i!=passes.end(); ++i) + for(auto &kvp: passes) { - const string &pass_slot = i->second.get_material_slot_name(); + const string &pass_slot = kvp.second.get_material_slot_name(); if(!pass_slot.empty() && pass_slot==slot) { - i->second.set_material(&mat); + kvp.second.set_material(&mat); replaced = true; } } @@ -69,57 +68,66 @@ bool Technique::replace_material(const string &slot, const Material &mat) bool Technique::replace_uniforms(const ProgramData &shdata) { bool replaced = false; - const vector &uniform_names = shdata.get_uniform_names(); - for(PassMap::iterator i=passes.begin(); i!=passes.end(); ++i) + const vector &uniform_tags = shdata.get_uniform_tags(); + for(auto &kvp: passes) { RefPtr new_shdata; - for(vector::const_iterator j=uniform_names.begin(); j!=uniform_names.end(); ++j) + for(Tag t: uniform_tags) { - const string &name = i->second.get_slotted_uniform_name(*j); - if(name.empty()) + Tag tag = kvp.second.get_slotted_uniform_tag(t); + if(!tag.id) continue; if(!new_shdata) - new_shdata = new ProgramData(*i->second.get_shader_data()); + new_shdata = new ProgramData(*kvp.second.get_shader_data()); - new_shdata->uniform(name, shdata.get_uniform(*j)); + new_shdata->copy_uniform(shdata, tag); replaced = true; } if(new_shdata) - i->second.set_shader_program(i->second.get_shader_program(), new_shdata.get()); + kvp.second.set_shader_program(kvp.second.get_shader_program(), new_shdata.get()); } return replaced; } -bool Technique::has_shaders() const +void Technique::set_debug_name(const string &name) { - for(PassMap::const_iterator i=passes.begin(); i!=passes.end(); ++i) - if(i->second.get_shader_program()) - return true; - return false; +#ifdef DEBUG + for(auto &kvp: passes) + kvp.second.set_debug_name(format("%s [pass:%s]", name, kvp.first.str())); +#else + (void)name; +#endif } +DataFile::Loader::ActionMap Technique::Loader::shared_actions; + Technique::Loader::Loader(Technique &t): DataFile::CollectionObjectLoader(t, 0) { - init(); + set_actions(shared_actions); } Technique::Loader::Loader(Technique &t, Collection &c): DataFile::CollectionObjectLoader(t, &c) { - init(); + set_actions(shared_actions); } -void Technique::Loader::init() +void Technique::Loader::init_actions() { add("inherit", &Loader::inherit); add("pass", &Loader::pass); } +void Technique::Loader::set_inline_base_name(const string &n) +{ + inline_base_name = n; +} + void Technique::Loader::inherit(const string &n) { obj.passes = get_collection().get(n).get_passes(); @@ -131,7 +139,11 @@ void Technique::Loader::pass(const string &n) { RenderPass p; if(coll) - load_sub(p, get_collection()); + { + RenderPass::Loader ldr(p, get_collection()); + ldr.set_inline_base_name(format("%s/%s.pass", (inline_base_name.empty() ? FS::basename(get_source()) : inline_base_name), n)); + load_sub_with(ldr); + } else load_sub(p); @@ -160,9 +172,9 @@ void Technique::InheritLoader::material(const string &slot, const string &name) RenderPass &pass = get_item(obj.passes, slot); if(const Material *base_mat = pass.get_material()) { - for(PassMap::iterator i=obj.passes.begin(); i!=obj.passes.end(); ++i) - if(i->second.get_material()==base_mat) - i->second.set_material(&mat); + for(auto &kvp: obj.passes) + if(kvp.second.get_material()==base_mat) + kvp.second.set_material(&mat); } else pass.set_material(&mat);