]> git.tdb.fi Git - libs/gl.git/blobdiff - source/builders/sequencetemplate.cpp
Make it possible to specify explicit clear values
[libs/gl.git] / source / builders / sequencetemplate.cpp
index 46ffec702c300e5ae5f393abdbdabc8929525c9f..6e50c24838aafeebd751008a10e7e36d40022ec9 100644 (file)
@@ -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.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<SequenceTemplate>(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<Step>(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<Lighting> 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<Lighting>(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<GL::Object>(name);
+}
+
+void SequenceTemplate::Step::Loader::scene(const string &name)
 {
-       obj.default_renderable = get_collection().get<Scene>(name);
-}*/
+       obj.default_renderable = &get_collection().get<Scene>(name);
+}
+
+void SequenceTemplate::Step::Loader::stencil_test()
+{
+       load_sub(obj.stencil_test);
+}
 
 } // namespace GL
 } // namespace Msp