X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftechnique.cpp;h=d6ec7115f6e703a5b215803952a27716f934e468;hp=def0a84a9dd019ea385919a883ff4c7e15fd3d62;hb=1efd559eb32adf48200941402ccefc6b5422aa4c;hpb=c01b102f54770c37a62870f60a849b479aa3285c diff --git a/source/technique.cpp b/source/technique.cpp index def0a84a..d6ec7115 100644 --- a/source/technique.cpp +++ b/source/technique.cpp @@ -44,6 +44,49 @@ bool Technique::replace_texture(const string &slot, const Texture &tex) return replaced; } +bool Technique::replace_material(const string &slot, const Material &mat) +{ + bool replaced = false; + for(PassMap::iterator i=passes.begin(); i!=passes.end(); ++i) + { + const string &pass_slot = i->second.get_material_slot_name(); + if(!pass_slot.empty() && pass_slot==slot) + { + i->second.set_material(&mat); + replaced = true; + } + } + + return replaced; +} + +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) + { + RefPtr new_shdata; + for(vector::const_iterator j=uniform_names.begin(); j!=uniform_names.end(); ++j) + { + const string &name = i->second.get_slotted_uniform_name(*j); + if(name.empty()) + continue; + + if(!new_shdata) + new_shdata = new ProgramData(*i->second.get_shader_data()); + + new_shdata->uniform(name, shdata.get_uniform(*j)); + replaced = true; + } + + if(new_shdata) + i->second.set_shader_program(i->second.get_shader_program(), new_shdata.get()); + } + + return replaced; +} + bool Technique::has_shaders() const { for(PassMap::const_iterator i=passes.begin(); i!=passes.end(); ++i) @@ -95,12 +138,17 @@ Technique::InheritLoader::InheritLoader(Technique &t, Collection &c): { add("material", &InheritLoader::material); add("texture", &InheritLoader::texture); + add("uniforms", &InheritLoader::uniforms); } -void Technique::InheritLoader::material(const string &pass_tag, const string &name) +void Technique::InheritLoader::material(const string &slot, const string &name) { - RenderPass &pass = get_item(obj.passes, pass_tag); const Material &mat = get_collection().get(name); + if(obj.replace_material(slot, mat)) + return; + + // For backwards compatibility + 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) @@ -117,5 +165,12 @@ void Technique::InheritLoader::texture(const string &slot, const string &name) throw key_error(slot); } +void Technique::InheritLoader::uniforms() +{ + ProgramData shdata; + load_sub(shdata); + obj.replace_uniforms(shdata); +} + } // namespace GL } // namespace Msp