X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbuilders%2Fsequencetemplate.cpp;h=6e50c24838aafeebd751008a10e7e36d40022ec9;hp=bfab28042a9d596e6c0194ba94602b919b9220d5;hb=006bdb4f8660098fc524dcca80b24c943c65b249;hpb=dff7004fa078d55911664c0f513b5dc6c9449420 diff --git a/source/builders/sequencetemplate.cpp b/source/builders/sequencetemplate.cpp index bfab2804..6e50c248 100644 --- a/source/builders/sequencetemplate.cpp +++ b/source/builders/sequencetemplate.cpp @@ -5,9 +5,10 @@ #include "bloom.h" #include "colorcurve.h" #include "lighting.h" +#include "object.h" #include "resources.h" +#include "scene.h" #include "sequencetemplate.h" -#include "tests.h" using namespace std; @@ -15,24 +16,19 @@ namespace Msp { namespace GL { SequenceTemplate::SequenceTemplate(): - resources(0), hdr(false), alpha(false), required_multisample(0), - max_multisample(0) + max_multisample(0), + clear_enabled(false), + clear_depth(1.0f), + clear_stencil(0) { } SequenceTemplate::~SequenceTemplate() { - for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i) - delete i->postprocessor_template; -} - -Resources &SequenceTemplate::get_resources() const -{ - if(!resources) - throw logic_error("no resources"); - return *resources; + for(const PostProcessor &p: postprocessors) + delete p.postprocessor_template; } @@ -71,15 +67,15 @@ SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c): { add("hdr", &SequenceTemplate::hdr); add("alpha", &SequenceTemplate::alpha); + add("clear", &Loader::clear); add("multisample", &Loader::multisample); add("multisample", &Loader::multisample_range); add("postprocessor", &Loader::postprocessor); add("step", &Loader::step); + add("step", &Loader::step_with_slot); // Deprecated - add("pass", &Loader::step); - - obj.resources = &c; + add("pass", &Loader::step_with_slot); } void SequenceTemplate::Loader::postprocessor_loaded() @@ -87,6 +83,13 @@ void SequenceTemplate::Loader::postprocessor_loaded() obj.postprocessors.push_back(get_postprocessor_template()); } +void SequenceTemplate::Loader::clear() +{ + ClearLoader ldr(obj); + load_sub_with(ldr); + obj.clear_enabled = true; +} + void SequenceTemplate::Loader::multisample(unsigned samples) { obj.required_multisample = samples; @@ -109,13 +112,22 @@ void SequenceTemplate::Loader::postprocessor(const string &slot) obj.postprocessors.push_back(pp); } -void SequenceTemplate::Loader::step(const string &tag, const string &rend) +void SequenceTemplate::Loader::step(const string &tag) +{ + step_with_slot(tag, string()); +} + +void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend) { Step stp; stp.tag = tag; - stp.renderable_name = rend; + stp.slot_name = rend; if(coll) - load_sub(stp, *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); @@ -123,6 +135,30 @@ void SequenceTemplate::Loader::step(const string &tag, const string &rend) } +SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t): + ObjectLoader(t) +{ + add("color", &ClearLoader::color); + add("depth", &ClearLoader::depth); + add("stencil", &ClearLoader::stencil); +} + +void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a) +{ + obj.clear_colors.push_back(Color(r, g, b, a)); +} + +void SequenceTemplate::ClearLoader::depth(float d) +{ + obj.clear_depth = d; +} + +void SequenceTemplate::ClearLoader::stencil(int s) +{ + obj.clear_stencil = s; +} + + SequenceTemplate::Step::Loader::Loader(Step &p): DataFile::CollectionObjectLoader(p, 0) { @@ -138,68 +174,68 @@ SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c): void SequenceTemplate::Step::Loader::init() { add("blend", &Loader::blend); - add("blend", &Loader::blend_predefined); + add("blend", &Loader::blend_factors); add("depth_test", &Loader::depth_test); - add("depth_test", &Loader::depth_test_predefined); + add("depth_test", &Loader::depth_compare); add("lighting", &Loader::lighting); add("lighting", &Loader::lighting_inline); + add("object", &Loader::object); + add("scene", &Loader::scene); + add("stencil_test", &Loader::stencil_test); } -void SequenceTemplate::Step::Loader::blend_predefined(const string &name) +void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n) { - 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(); + inline_base_name = n; } -void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest) +void SequenceTemplate::Step::Loader::blend() { - obj.blend = new Blend(src, dest); + load_sub(obj.blend); } -void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name) +void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest) { - const DepthTest *dtest = 0; - if(name=="lequal") - dtest = &DepthTest::lequal(); - else - throw key_error(name); + obj.blend = Blend(src, dest); +} - 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); - obj.lighting = lightn; + get_collection().add(inline_base_name+".lightn", lightn.get()); + obj.lighting = lightn.release(); } void SequenceTemplate::Step::Loader::lighting(const string &name) { obj.lighting = &get_collection().get(name); - obj.lighting.keep(); } -/*void SequenceTemplate::Step::Loader::scene(const string &name) +void SequenceTemplate::Step::Loader::object(const string &name) +{ + obj.default_renderable = &get_collection().get(name); +} + +void SequenceTemplate::Step::Loader::scene(const string &name) { - obj.default_renderable = get_collection().get(name); -}*/ + obj.default_renderable = &get_collection().get(name); +} + +void SequenceTemplate::Step::Loader::stencil_test() +{ + load_sub(obj.stencil_test); +} } // namespace GL } // namespace Msp