X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fbuilders%2Fpipelinetemplate.cpp;fp=source%2Fbuilders%2Fpipelinetemplate.cpp;h=b78b4c40a2fca807017fbbbc29b182408e8f0533;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/builders/pipelinetemplate.cpp b/source/builders/pipelinetemplate.cpp new file mode 100644 index 00000000..b78b4c40 --- /dev/null +++ b/source/builders/pipelinetemplate.cpp @@ -0,0 +1,202 @@ +#include +#include +#include "ambientocclusion.h" +#include "blend.h" +#include "bloom.h" +#include "colorcurve.h" +#include "lighting.h" +#include "pipelinetemplate.h" +#include "tests.h" + +using namespace std; + +namespace Msp { +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("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) +{ + init(); +} + +PipelineTemplate::Loader::Loader(PipelineTemplate &t, Collection &c): + DataFile::CollectionObjectLoader(t, &c) +{ + init(); +} + +void PipelineTemplate::Loader::init() +{ + 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) +{ + obj.required_multisample = samples; + obj.max_multisample = samples; +} + +void PipelineTemplate::Loader::multisample_range(unsigned req, unsigned max) +{ + obj.required_multisample = req; + obj.max_multisample = max; +} + +void PipelineTemplate::Loader::pass(const string &tag, const string &rend) +{ + Pass pss;; + pss.tag = tag; + pss.renderable_name = rend; + if(coll) + load_sub(pss, *coll); + else + load_sub(pss); + + obj.passes.push_back(pss); +} + +void PipelineTemplate::Loader::postprocessor(const std::string &slot) +{ + PostProcLoader ldr; + load_sub_with(ldr); + PostProcessor pp; + pp.postprocessor_template = ldr.get_postprocessor_template(); + pp.slot_name = slot; + obj.postprocessors.push_back(pp); +} + + +PipelineTemplate::Pass::Loader::Loader(Pass &p): + DataFile::CollectionObjectLoader(p, 0) +{ + init(); +} + +PipelineTemplate::Pass::Loader::Loader(Pass &p, Collection &c): + DataFile::CollectionObjectLoader(p, &c) +{ + init(); +} + +void PipelineTemplate::Pass::Loader::init() +{ + add("blend", &Loader::blend); + add("blend", &Loader::blend_predefined); + add("depth_test", &Loader::depth_test); + add("depth_test", &Loader::depth_test_predefined); + add("lighting", &Loader::lighting); + add("lighting", &Loader::lighting_inline); +} + +void PipelineTemplate::Pass::Loader::blend_predefined(const string &name) +{ + const Blend *bln = 0; + if(name=="alpha") + bln = &Blend::alpha(); + else if(name=="additive") + bln = &Blend::additive(); + else if(name=="additive_alpha") + bln = &Blend::additive_alpha(); + else + throw key_error(name); + + obj.blend = bln; + obj.blend.keep(); +} + +void PipelineTemplate::Pass::Loader::blend(BlendFactor src, BlendFactor dest) +{ + obj.blend = new Blend(src, dest); +} + +void PipelineTemplate::Pass::Loader::depth_test_predefined(const string &name) +{ + const DepthTest *dtest = 0; + if(name=="lequal") + dtest = &DepthTest::lequal(); + else + throw key_error(name); + + obj.depth_test = dtest; + obj.depth_test.keep(); +} + +void PipelineTemplate::Pass::Loader::depth_test(Predicate pred) +{ + obj.depth_test = new DepthTest(pred); +} + +void PipelineTemplate::Pass::Loader::lighting_inline() +{ + RefPtr lightn = new Lighting; + load_sub(*lightn); + obj.lighting = lightn; +} + +void PipelineTemplate::Pass::Loader::lighting(const string &name) +{ + obj.lighting = &get_collection().get(name); + obj.lighting.keep(); +} + +/*void PipelineTemplate::Pass::Loader::scene(const string &name) +{ + obj.default_renderable = get_collection().get(name); +}*/ + +} // namespace GL +} // namespace Msp