X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbuilders%2Fsequencetemplate.cpp;h=2886e0a85ef1d2ee7963be95a3aa6d88eb13d27f;hp=3ad973139010ae60b6e5cc5d602a9a0e1aca8aef;hb=HEAD;hpb=3ac3a51c623271da815c8ee60c484445871753bf diff --git a/source/builders/sequencetemplate.cpp b/source/builders/sequencetemplate.cpp index 3ad97313..2886e0a8 100644 --- a/source/builders/sequencetemplate.cpp +++ b/source/builders/sequencetemplate.cpp @@ -1,52 +1,61 @@ #include #include +#include #include "ambientocclusion.h" #include "blend.h" #include "bloom.h" #include "colorcurve.h" +#include "environmentmap.h" #include "lighting.h" #include "object.h" #include "resources.h" #include "scene.h" #include "sequencetemplate.h" -#include "tests.h" +#include "shadowmap.h" +#include "sky.h" using namespace std; namespace Msp { namespace GL { -SequenceTemplate::SequenceTemplate(): - hdr(false), - alpha(false), - required_multisample(0), - max_multisample(0) -{ } - SequenceTemplate::~SequenceTemplate() { - for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i) - delete i->postprocessor_template; + for(const Renderable &r: renderables) + delete r.effect_template; + for(const PostProcessor &p: postprocessors) + delete p.postprocessor_template; } - -SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry() +template<> +SequenceTemplate::TemplateRegistry &SequenceTemplate::get_registry() { - static PostProcessorRegistry registry; + static TemplateRegistry registry; static bool initialized = false; if(!initialized) { - registry.register_type("ambient_occlusion"); - registry.register_type("bloom"); - registry.register_type("colorcurve"); + registry.register_type("ambient_occlusion"); + registry.register_type("bloom"); + registry.register_type("colorcurve"); initialized = true; } return registry; } - -SequenceTemplate::Step::~Step() -{ } +template<> +SequenceTemplate::TemplateRegistry &SequenceTemplate::get_registry() +{ + static TemplateRegistry registry; + static bool initialized = false; + if(!initialized) + { + registry.register_type("environment_map"); + registry.register_type("shadow_map"); + registry.register_type("sky"); + initialized = true; + } + return registry; +} SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt): @@ -54,30 +63,44 @@ SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt) { } -SequenceTemplate::PostProcLoader::PostProcLoader() +DataFile::Loader::ActionMap SequenceTemplate::Loader::shared_actions; + +SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c): + CollectionObjectLoader(t, &c) { - get_postprocessor_registry().invoke_all(*this); + set_actions(shared_actions); } - -SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c): - DataFile::CollectionObjectLoader(t, &c) +void SequenceTemplate::Loader::init_actions() { add("hdr", &SequenceTemplate::hdr); - add("alpha", &SequenceTemplate::alpha); + add("clear", &Loader::clear); + add("effect", &Loader::effect); add("multisample", &Loader::multisample); add("multisample", &Loader::multisample_range); add("postprocessor", &Loader::postprocessor); + add("postprocessor", &Loader::postprocessor_with_slot); + add("renderable", &Loader::renderable); + add("renderable", &Loader::renderable_with_default); + add("sequence", &Loader::sequence); add("step", &Loader::step); - add("step", &Loader::step_with_slot); +} - // Deprecated - add("pass", &Loader::step_with_slot); +void SequenceTemplate::Loader::clear() +{ + ClearLoader ldr(obj); + load_sub_with(ldr); + obj.clear_enabled = true; } -void SequenceTemplate::Loader::postprocessor_loaded() +void SequenceTemplate::Loader::effect(const string &slot) { - obj.postprocessors.push_back(get_postprocessor_template()); + TemplateLoader ldr(get_collection()); + load_sub_with(ldr); + Renderable rend; + rend.slot_name = slot; + rend.effect_template = ldr.get_object(); + obj.renderables.push_back(rend); } void SequenceTemplate::Loader::multisample(unsigned samples) @@ -92,110 +115,145 @@ void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max) obj.max_multisample = max; } -void SequenceTemplate::Loader::postprocessor(const string &slot) +void SequenceTemplate::Loader::postprocessor() { - PostProcLoader ldr; + postprocessor_with_slot(string()); +} + +void SequenceTemplate::Loader::postprocessor_with_slot(const string &slot) +{ + TemplateLoader ldr(get_collection()); load_sub_with(ldr); PostProcessor pp; - pp.postprocessor_template = ldr.get_postprocessor_template(); + pp.postprocessor_template = ldr.get_object(); pp.slot_name = slot; obj.postprocessors.push_back(pp); } -void SequenceTemplate::Loader::step(const string &tag) +void SequenceTemplate::Loader::renderable(const string &slot) +{ + Renderable rend; + rend.slot_name = slot; + obj.renderables.push_back(rend); +} + +void SequenceTemplate::Loader::renderable_with_default(const string &slot, const string &name) { - step_with_slot(tag, string()); + Renderable rend; + rend.renderable = &get_collection().get(name); + rend.slot_name = slot; + obj.renderables.push_back(rend); } -void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend) +void SequenceTemplate::Loader::sequence(const string &slot, const string &name) +{ + Renderable rend; + rend.sequence_template = &get_collection().get(name); + rend.slot_name = slot; + SequenceLoader ldr(rend); + load_sub_with(ldr); + obj.renderables.push_back(rend); +} + +void SequenceTemplate::Loader::step(const string &tag, const string &rend) { Step stp; stp.tag = tag; - stp.slot_name = rend; - if(coll) - { - Step::Loader ldr(stp, *coll); - ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size())); - load_sub_with(ldr); - } - else - load_sub(stp); + stp.renderable_name = rend; + Step::Loader ldr(stp, get_collection()); + ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size())); + load_sub_with(ldr); obj.steps.push_back(stp); } -SequenceTemplate::Step::Loader::Loader(Step &p): - DataFile::CollectionObjectLoader(p, 0) +DataFile::Loader::ActionMap SequenceTemplate::ClearLoader::shared_actions; + +SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t): + ObjectLoader(t) { - init(); + set_actions(shared_actions); } -SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c): - DataFile::CollectionObjectLoader(p, &c) +void SequenceTemplate::ClearLoader::init_actions() { - init(); + add("color", &ClearLoader::color); + add("depth", &ClearLoader::depth); + add("stencil", &ClearLoader::stencil); } -void SequenceTemplate::Step::Loader::init() +void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a) { - 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); - add("object", &Loader::object); - add("scene", &Loader::scene); + obj.clear_colors.emplace_back(r, g, b, a); } -void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n) +void SequenceTemplate::ClearLoader::depth(float d) { - inline_base_name = n; + obj.clear_depth = d; +} + +void SequenceTemplate::ClearLoader::stencil(int s) +{ + obj.clear_stencil = s; +} + + +DataFile::Loader::ActionMap SequenceTemplate::SequenceLoader::shared_actions; + +SequenceTemplate::SequenceLoader::SequenceLoader(Renderable &r): + ObjectLoader(r) +{ + set_actions(shared_actions); +} + +void SequenceTemplate::SequenceLoader::init_actions() +{ + add("renderable", &SequenceLoader::renderable); } -void SequenceTemplate::Step::Loader::blend_predefined(const string &name) +void SequenceTemplate::SequenceLoader::renderable(const string &slot, 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.sequence_renderables[slot] = name; +} + - obj.blend = bln; - obj.blend.keep(); +DataFile::Loader::ActionMap SequenceTemplate::Step::Loader::shared_actions; + +SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c): + DataFile::CollectionObjectLoader(p, &c) +{ + set_actions(shared_actions); } -void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest) +void SequenceTemplate::Step::Loader::init_actions() { - obj.blend = new Blend(src, dest); + add("depth_test", &Loader::depth_test); + add("depth_test", &Loader::depth_compare); + add("lighting", &Loader::lighting); + add("lighting", &Loader::lighting_inline); + add("stencil_test", &Loader::stencil_test); } -void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name) +void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n) { - const DepthTest *dtest = 0; - if(name=="lequal") - dtest = &DepthTest::lequal(); - else - throw key_error(name); + inline_base_name = n; +} - obj.depth_test = dtest; - obj.depth_test.keep(); +void SequenceTemplate::Step::Loader::depth_test() +{ + load_sub(obj.depth_test); } -void SequenceTemplate::Step::Loader::depth_test(Predicate pred) +void SequenceTemplate::Step::Loader::depth_compare(Predicate c) { - obj.depth_test = new DepthTest(pred); + obj.depth_test = DepthTest(c); } void SequenceTemplate::Step::Loader::lighting_inline() { RefPtr lightn = new Lighting; - load_sub(*lightn); + load_sub(*lightn, get_collection()); get_collection().add(inline_base_name+".lightn", lightn.get()); obj.lighting = lightn.release(); } @@ -205,14 +263,9 @@ void SequenceTemplate::Step::Loader::lighting(const string &name) obj.lighting = &get_collection().get(name); } -void SequenceTemplate::Step::Loader::object(const string &name) -{ - obj.default_renderable = &get_collection().get(name); -} - -void SequenceTemplate::Step::Loader::scene(const string &name) +void SequenceTemplate::Step::Loader::stencil_test() { - obj.default_renderable = &get_collection().get(name); + load_sub(obj.stencil_test); } } // namespace GL