]> git.tdb.fi Git - libs/gl.git/blobdiff - source/pipelinetemplate.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / pipelinetemplate.cpp
index 6dbfd0a247721edbb6e4f88521d6bee02a742b45..b78b4c40a2fca807017fbbbc29b182408e8f0533 100644 (file)
@@ -1,5 +1,6 @@
 #include <msp/core/maputils.h>
 #include <msp/datafile/collection.h>
+#include "ambientocclusion.h"
 #include "blend.h"
 #include "bloom.h"
 #include "colorcurve.h"
@@ -14,15 +15,48 @@ namespace GL {
 
 PipelineTemplate::PipelineTemplate():
        hdr(false),
+       alpha(false),
        required_multisample(0),
        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<AmbientOcclusion>("ambient_occlusion");
+               registry.register_type<Bloom>("bloom");
+               registry.register_type<ColorCurve>("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<PipelineTemplate>(t, 0)
 {
@@ -37,12 +71,17 @@ PipelineTemplate::Loader::Loader(PipelineTemplate &t, Collection &c):
 
 void PipelineTemplate::Loader::init()
 {
-       add("bloom", &Loader::postprocessor<Bloom>);
-       add("colorcurve", &Loader::postprocessor<ColorCurve>);
        add("hdr", &PipelineTemplate::hdr);
+       add("alpha", &PipelineTemplate::alpha);
        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)
@@ -70,12 +109,14 @@ void PipelineTemplate::Loader::pass(const string &tag, const string &rend)
        obj.passes.push_back(pss);
 }
 
-template<typename T>
-void PipelineTemplate::Loader::postprocessor()
+void PipelineTemplate::Loader::postprocessor(const std::string &slot)
 {
-       RefPtr<typename T::Template> 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);
 }
 
 
@@ -103,17 +144,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();
 }