--- /dev/null
+#include <msp/core/maputils.h>
+#include <msp/datafile/collection.h>
+#include "ambientocclusion.h"
+#include "blend.h"
+#include "bloom.h"
+#include "colorcurve.h"
+#include "lighting.h"
+#include "resources.h"
+#include "sequencetemplate.h"
+#include "tests.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+SequenceTemplate::SequenceTemplate():
+ resources(0),
+ 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;
+}
+
+Resources &SequenceTemplate::get_resources() const
+{
+ if(!resources)
+ throw logic_error("no resources");
+ return *resources;
+}
+
+
+SequenceTemplate::PostProcessorRegistry &SequenceTemplate::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;
+}
+
+
+SequenceTemplate::Step::~Step()
+{ }
+
+
+SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
+ postprocessor_template(ppt)
+{ }
+
+
+SequenceTemplate::PostProcLoader::PostProcLoader()
+{
+ get_postprocessor_registry().invoke_all(*this);
+}
+
+
+SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
+ DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
+{
+ add("hdr", &SequenceTemplate::hdr);
+ add("alpha", &SequenceTemplate::alpha);
+ add("multisample", &Loader::multisample);
+ add("multisample", &Loader::multisample_range);
+ add("postprocessor", &Loader::postprocessor);
+ add("step", &Loader::step);
+
+ // Deprecated
+ add("pass", &Loader::step);
+
+ obj.resources = &c;
+}
+
+void SequenceTemplate::Loader::postprocessor_loaded()
+{
+ obj.postprocessors.push_back(get_postprocessor_template());
+}
+
+void SequenceTemplate::Loader::multisample(unsigned samples)
+{
+ obj.required_multisample = samples;
+ obj.max_multisample = samples;
+}
+
+void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
+{
+ obj.required_multisample = req;
+ obj.max_multisample = max;
+}
+
+void SequenceTemplate::Loader::postprocessor(const 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);
+}
+
+void SequenceTemplate::Loader::step(const string &tag, const string &rend)
+{
+ Step stp;
+ stp.tag = tag;
+ stp.renderable_name = rend;
+ if(coll)
+ load_sub(stp, *coll);
+ else
+ load_sub(stp);
+
+ obj.steps.push_back(stp);
+}
+
+
+SequenceTemplate::Step::Loader::Loader(Step &p):
+ DataFile::CollectionObjectLoader<Step>(p, 0)
+{
+ init();
+}
+
+SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
+ DataFile::CollectionObjectLoader<Step>(p, &c)
+{
+ init();
+}
+
+void SequenceTemplate::Step::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 SequenceTemplate::Step::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 SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest)
+{
+ obj.blend = new Blend(src, dest);
+}
+
+void SequenceTemplate::Step::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 SequenceTemplate::Step::Loader::depth_test(Predicate pred)
+{
+ obj.depth_test = new DepthTest(pred);
+}
+
+void SequenceTemplate::Step::Loader::lighting_inline()
+{
+ RefPtr<Lighting> lightn = new Lighting;
+ load_sub(*lightn);
+ obj.lighting = lightn;
+}
+
+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)
+{
+ obj.default_renderable = get_collection().get<Scene>(name);
+}*/
+
+} // namespace GL
+} // namespace Msp