1 #include <msp/core/algorithm.h>
2 #include <msp/core/maputils.h>
4 #include "renderbuffer.h"
6 #include "sequencebuilder.h"
7 #include "sequencetemplate.h"
14 SequenceBuilder::SequenceBuilder(const SequenceTemplate &t):
17 const vector<SequenceTemplate::Step> &steps = tmpl.get_steps();
18 for(vector<SequenceTemplate::Step>::const_iterator i=steps.begin(); i!=steps.end(); ++i)
19 renderables[i->slot_name] = i->default_renderable;
20 const vector<SequenceTemplate::PostProcessor> &postprocs = tmpl.get_postprocessors();
21 for(SequenceTemplate::PostProcessorArray::const_iterator i=postprocs.begin(); i!=postprocs.end(); ++i)
22 if(!i->slot_name.empty())
23 postprocessors[i->slot_name] = 0;
26 void SequenceBuilder::set_renderable(const string &name, Renderable &rend)
28 get_item(renderables, name) = &rend;
31 void SequenceBuilder::set_postprocessor(const string &name, PostProcessor &pproc)
33 get_item(postprocessors, name) = &pproc;
36 void SequenceBuilder::build(Sequence &sequence) const
38 sequence.set_hdr(tmpl.get_hdr());
39 sequence.set_alpha(tmpl.get_alpha());
40 unsigned samples = min(tmpl.get_maximum_multisample(), Renderbuffer::get_max_samples());
41 if(samples<tmpl.get_required_multisample())
42 throw invalid_operation("SequenceBuilder::build");
44 sequence.set_multisample(samples);
46 const vector<SequenceTemplate::Step> &steps = tmpl.get_steps();
47 for(vector<SequenceTemplate::Step>::const_iterator i=steps.begin(); i!=steps.end(); ++i)
49 Renderable *renderable = get_item(renderables, i->slot_name);
53 Sequence::Step &step = sequence.add_step(i->tag, *renderable);
54 step.set_blend(i->blend.get());
55 step.set_depth_test(i->depth_test.get());
56 step.set_lighting(i->lighting);
59 const SequenceTemplate::PostProcessorArray &postprocs = tmpl.get_postprocessors();
60 for(SequenceTemplate::PostProcessorArray::const_iterator i=postprocs.begin(); i!=postprocs.end(); ++i)
62 PostProcessor *proc = 0;
63 if(!i->slot_name.empty())
64 proc = get_item(postprocessors, i->slot_name);
66 sequence.add_postprocessor(*proc);
67 else if(i->postprocessor_template)
69 proc = i->postprocessor_template->create(sequence.get_width(), sequence.get_height());
71 sequence.add_postprocessor_owned(proc);
76 Sequence *SequenceBuilder::build(unsigned w, unsigned h) const
78 RefPtr<Sequence> sequence = new Sequence(w, h);
80 return sequence.release();
83 Sequence *SequenceBuilder::build(const View &view) const
85 RefPtr<Sequence> sequence = new Sequence(view);
87 return sequence.release();
90 Sequence *SequenceBuilder::build(const Framebuffer &fbo) const
92 RefPtr<Sequence> sequence = new Sequence(fbo);
94 return sequence.release();