X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipelinetemplate.cpp;h=14f6e2c024eed34fc123112161b15465e3f60cb5;hb=c6604d0ee313f60b42b3a205c40ba7e1abbc3cb8;hp=4493e72c80b38e60c008547280f854629f76dabc;hpb=9f5f027d1c93e541a12b8e4c04bd25b11edbe132;p=libs%2Fgl.git diff --git a/source/pipelinetemplate.cpp b/source/pipelinetemplate.cpp index 4493e72c..14f6e2c0 100644 --- a/source/pipelinetemplate.cpp +++ b/source/pipelinetemplate.cpp @@ -19,11 +19,43 @@ PipelineTemplate::PipelineTemplate(): max_multisample(0) { } +PipelineTemplate::~PipelineTemplate() +{ + for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i) + delete i->postprocessor_template; +} + + +PipelineTemplate::PostProcessorRegistry &PipelineTemplate::get_postprocessor_registry() +{ + static PostProcessorRegistry registry; + static bool initialized = false; + if(!initialized) + { + registry.register_type("ambient_occlusion"); + registry.register_type("bloom"); + registry.register_type("colorcurve"); + initialized = true; + } + return registry; +} + PipelineTemplate::Pass::~Pass() { } +PipelineTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt): + postprocessor_template(ppt) +{ } + + +PipelineTemplate::PostProcLoader::PostProcLoader() +{ + get_postprocessor_registry().add_all(*this); +} + + PipelineTemplate::Loader::Loader(PipelineTemplate &t): DataFile::CollectionObjectLoader(t, 0) { @@ -38,13 +70,16 @@ PipelineTemplate::Loader::Loader(PipelineTemplate &t, Collection &c): void PipelineTemplate::Loader::init() { - add("ambient_occlusion", &Loader::postprocessor); - add("bloom", &Loader::postprocessor); - add("colorcurve", &Loader::postprocessor); add("hdr", &PipelineTemplate::hdr); add("multisample", &Loader::multisample); add("multisample", &Loader::multisample_range); add("pass", &Loader::pass); + add("postprocessor", &Loader::postprocessor); +} + +void PipelineTemplate::Loader::postprocessor_loaded() +{ + obj.postprocessors.push_back(get_postprocessor_template()); } void PipelineTemplate::Loader::multisample(unsigned samples) @@ -72,12 +107,14 @@ void PipelineTemplate::Loader::pass(const string &tag, const string &rend) obj.passes.push_back(pss); } -template -void PipelineTemplate::Loader::postprocessor() +void PipelineTemplate::Loader::postprocessor(const std::string &slot) { - RefPtr postproc = new typename T::Template; - load_sub(*postproc); - obj.postprocessors.push_back(postproc.release()); + PostProcLoader ldr; + load_sub_with(ldr); + PostProcessor pp; + pp.postprocessor_template = ldr.get_postprocessor_template(); + pp.slot_name = slot; + obj.postprocessors.push_back(pp); } @@ -105,17 +142,17 @@ void PipelineTemplate::Pass::Loader::init() void PipelineTemplate::Pass::Loader::blend_predefined(const string &name) { - const Blend *blend = 0; + const Blend *bln = 0; if(name=="alpha") - blend = &Blend::alpha(); + bln = &Blend::alpha(); else if(name=="additive") - blend = &Blend::additive(); + bln = &Blend::additive(); else if(name=="additive_alpha") - blend = &Blend::additive_alpha(); + bln = &Blend::additive_alpha(); else throw key_error(name); - obj.blend = blend; + obj.blend = bln; obj.blend.keep(); }