]> git.tdb.fi Git - libs/gl.git/blobdiff - source/builders/sequencebuilder.cpp
Support effects and subordinate sequences inside sequence templates
[libs/gl.git] / source / builders / sequencebuilder.cpp
index f007350eeaa0e76ad023055f59d133bd407e368a..dbb675acf2a7925a3ddf1e4b6b3969f04faaf8be 100644 (file)
@@ -49,6 +49,48 @@ void SequenceBuilder::build(Sequence &sequence) const
                sequence.set_debug_name(debug_name);
 #endif
 
+       map<string, Renderable *> final_renderables = renderables;
+       vector<const SequenceTemplate::Renderable *> sequences;
+       for(const SequenceTemplate::Renderable &r: tmpl.get_renderables())
+       {
+               Renderable *&ptr = final_renderables[r.slot_name];
+               if(!ptr)
+               {
+                       if(r.effect_template)
+                       {
+                               Effect *effect = r.effect_template->create(final_renderables);
+#ifdef DEBUG
+                               if(!debug_name.empty())
+                                       effect->set_debug_name(format("%s/%s", debug_name, r.slot_name));
+#endif
+                               ptr = effect;
+                       }
+                       else if(r.sequence_template)
+                       {
+                               Sequence *seq = new Sequence;
+#ifdef DEBUG
+                               if(!debug_name.empty())
+                                       seq->set_debug_name(format("%s/%s", debug_name, r.slot_name));
+#endif
+                               ptr = seq;
+                               sequences.push_back(&r);
+                       }
+                       else
+                               throw invalid_operation("SequenceBuilder::build");
+
+                       sequence.add_owned(ptr);
+               }
+       }
+
+       for(const SequenceTemplate::Renderable *s: sequences)
+       {
+               SequenceBuilder bld(*s->sequence_template);
+               for(const auto &kvp: s->sequence_renderables)
+                       if(Renderable *r = get_item(final_renderables, kvp.second))
+                               bld.set_renderable(kvp.first, *r);
+               bld.build(*static_cast<Sequence *>(get_item(final_renderables, s->slot_name)));
+       }
+
        sequence.set_clear_enabled(tmpl.is_clear_enabled());
        if(tmpl.is_clear_enabled())
        {
@@ -59,11 +101,9 @@ void SequenceBuilder::build(Sequence &sequence) const
 
        for(const SequenceTemplate::Step &s: tmpl.get_steps())
        {
-               Renderable *renderable = get_item(renderables, s.renderable_name);
-               if(!renderable)
-                       throw missing_renderable(s.renderable_name);
-
-               Sequence::Step &step = sequence.add_step(s.tag, *renderable);
+               // Existence is already ensured above
+               Renderable &renderable = *get_item(final_renderables, s.renderable_name);
+               Sequence::Step &step = sequence.add_step(s.tag, renderable);
                step.set_depth_test(s.depth_test);
                step.set_stencil_test(s.stencil_test);
                step.set_lighting(s.lighting);