]> git.tdb.fi Git - libs/gl.git/blobdiff - source/builders/sequencetemplate.cpp
Support effects and subordinate sequences inside sequence templates
[libs/gl.git] / source / builders / sequencetemplate.cpp
index 03c8c7fe1cafa0b26f3fc20e37080e94c8fafe0a..999d2ae7693baaeea5e0c37229dd54d5b84f5a75 100644 (file)
@@ -5,11 +5,14 @@
 #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 "shadowmap.h"
+#include "sky.h"
 
 using namespace std;
 
@@ -18,6 +21,8 @@ namespace GL {
 
 SequenceTemplate::~SequenceTemplate()
 {
+       for(const Renderable &r: renderables)
+               delete r.effect_template;
        for(const PostProcessor &p: postprocessors)
                delete p.postprocessor_template;
 }
@@ -37,6 +42,21 @@ SequenceTemplate::TemplateRegistry<GL::PostProcessor> &SequenceTemplate::get_reg
        return registry;
 }
 
+template<>
+SequenceTemplate::TemplateRegistry<Effect> &SequenceTemplate::get_registry<Effect>()
+{
+       static TemplateRegistry<Effect> registry;
+       static bool initialized = false;
+       if(!initialized)
+       {
+               registry.register_type<EnvironmentMap::Template>("environment_map");
+               registry.register_type<ShadowMap::Template>("shadow_map");
+               registry.register_type<Sky::Template>("sky");
+               initialized = true;
+       }
+       return registry;
+}
+
 
 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
        postprocessor_template(ppt)
@@ -56,12 +76,14 @@ 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);
 }
 
@@ -72,6 +94,16 @@ void SequenceTemplate::Loader::clear()
        obj.clear_enabled = true;
 }
 
+void SequenceTemplate::Loader::effect(const string &slot)
+{
+       TemplateLoader<Effect> 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)
 {
        obj.required_multisample = samples;
@@ -114,6 +146,16 @@ void SequenceTemplate::Loader::renderable_with_default(const string &slot, const
        obj.renderables.push_back(rend);
 }
 
+void SequenceTemplate::Loader::sequence(const string &slot, const string &name)
+{
+       Renderable rend;
+       rend.sequence_template = &get_collection().get<SequenceTemplate>(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;
@@ -158,6 +200,25 @@ void SequenceTemplate::ClearLoader::stencil(int s)
 }
 
 
+DataFile::Loader::ActionMap SequenceTemplate::SequenceLoader::shared_actions;
+
+SequenceTemplate::SequenceLoader::SequenceLoader(Renderable &r):
+       ObjectLoader<Renderable>(r)
+{
+       set_actions(shared_actions);
+}
+
+void SequenceTemplate::SequenceLoader::init_actions()
+{
+       add("renderable", &SequenceLoader::renderable);
+}
+
+void SequenceTemplate::SequenceLoader::renderable(const string &slot, const string &name)
+{
+       obj.sequence_renderables[slot] = name;
+}
+
+
 DataFile::Loader::ActionMap SequenceTemplate::Step::Loader::shared_actions;
 
 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):