X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Ftechnique.cpp;h=d6ec7115f6e703a5b215803952a27716f934e468;hb=HEAD;hp=e3233eff87cc5c6c7ba15550605b709ee4b55ad4;hpb=cf17331b8ddc0e00c3ba452e0f4dfa183dc8e019;p=libs%2Fgl.git diff --git a/source/technique.cpp b/source/technique.cpp deleted file mode 100644 index e3233eff..00000000 --- a/source/technique.cpp +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include -#include -#include "material.h" -#include "program.h" -#include "programdata.h" -#include "tag.h" -#include "technique.h" -#include "texture.h" - -using namespace std; - -namespace Msp { -namespace GL { - -RenderPass &Technique::add_pass(const Tag &tag) -{ - return insert_unique(passes, tag, RenderPass())->second; -} - -bool Technique::has_pass(const Tag &tag) const -{ - return passes.count(tag); -} - -const RenderPass &Technique::get_pass(const Tag &tag) const -{ - return get_item(passes, tag); -} - -const RenderPass *Technique::find_pass(const Tag &tag) const -{ - PassMap::const_iterator 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) - { - int index = i->second.get_texture_index(slot); - if(index>=0) - { - i->second.set_texture(index, &tex); - replaced = true; - } - } - - 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) - if(i->second.get_shader_program()) - return true; - return false; -} - - -Technique::Loader::Loader(Technique &t): - DataFile::CollectionObjectLoader(t, 0) -{ - init(); -} - -Technique::Loader::Loader(Technique &t, Collection &c): - DataFile::CollectionObjectLoader(t, &c) -{ - init(); -} - -void Technique::Loader::init() -{ - add("inherit", &Loader::inherit); - add("pass", &Loader::pass); -} - -void Technique::Loader::inherit(const string &n) -{ - obj.passes = get_collection().get(n).get_passes(); - InheritLoader ldr(obj, get_collection()); - load_sub_with(ldr); -} - -void Technique::Loader::pass(const string &n) -{ - RenderPass p; - if(coll) - load_sub(p, get_collection()); - else - load_sub(p); - - insert_unique(obj.passes, n, p); -} - - -Technique::InheritLoader::InheritLoader(Technique &t, Collection &c): - DataFile::CollectionObjectLoader(t, &c) -{ - add("material", &InheritLoader::material); - add("texture", &InheritLoader::texture); - add("uniforms", &InheritLoader::uniforms); -} - -void Technique::InheritLoader::material(const string &slot, const string &name) -{ - 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) - if(i->second.get_material()==base_mat) - i->second.set_material(&mat); - } - else - pass.set_material(&mat); -} - -void Technique::InheritLoader::texture(const string &slot, const string &name) -{ - if(!obj.replace_texture(slot, get_collection().get(name))) - throw key_error(slot); -} - -void Technique::InheritLoader::uniforms() -{ - ProgramData shdata; - load_sub(shdata); - obj.replace_uniforms(shdata); -} - -} // namespace GL -} // namespace Msp