1 #include <msp/core/maputils.h>
2 #include <msp/datafile/collection.h>
3 #include "ambientocclusion.h"
6 #include "colorcurve.h"
11 #include "sequencetemplate.h"
19 SequenceTemplate::SequenceTemplate():
22 required_multisample(0),
26 SequenceTemplate::~SequenceTemplate()
28 for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
29 delete i->postprocessor_template;
33 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
35 static PostProcessorRegistry registry;
36 static bool initialized = false;
39 registry.register_type<AmbientOcclusion>("ambient_occlusion");
40 registry.register_type<Bloom>("bloom");
41 registry.register_type<ColorCurve>("colorcurve");
48 SequenceTemplate::Step::~Step()
52 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
53 postprocessor_template(ppt)
57 SequenceTemplate::PostProcLoader::PostProcLoader()
59 get_postprocessor_registry().invoke_all(*this);
63 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
64 DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
66 add("hdr", &SequenceTemplate::hdr);
67 add("alpha", &SequenceTemplate::alpha);
68 add("multisample", &Loader::multisample);
69 add("multisample", &Loader::multisample_range);
70 add("postprocessor", &Loader::postprocessor);
71 add("step", &Loader::step);
72 add("step", &Loader::step_with_slot);
75 add("pass", &Loader::step_with_slot);
78 void SequenceTemplate::Loader::postprocessor_loaded()
80 obj.postprocessors.push_back(get_postprocessor_template());
83 void SequenceTemplate::Loader::multisample(unsigned samples)
85 obj.required_multisample = samples;
86 obj.max_multisample = samples;
89 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
91 obj.required_multisample = req;
92 obj.max_multisample = max;
95 void SequenceTemplate::Loader::postprocessor(const string &slot)
100 pp.postprocessor_template = ldr.get_postprocessor_template();
102 obj.postprocessors.push_back(pp);
105 void SequenceTemplate::Loader::step(const string &tag)
107 step_with_slot(tag, string());
110 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
114 stp.slot_name = rend;
117 Step::Loader ldr(stp, *coll);
118 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
124 obj.steps.push_back(stp);
128 SequenceTemplate::Step::Loader::Loader(Step &p):
129 DataFile::CollectionObjectLoader<Step>(p, 0)
134 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
135 DataFile::CollectionObjectLoader<Step>(p, &c)
140 void SequenceTemplate::Step::Loader::init()
142 add("blend", &Loader::blend);
143 add("blend", &Loader::blend_factors);
144 add("depth_test", &Loader::depth_test);
145 add("depth_test", &Loader::depth_compare);
146 add("lighting", &Loader::lighting);
147 add("lighting", &Loader::lighting_inline);
148 add("object", &Loader::object);
149 add("scene", &Loader::scene);
150 add("stencil_test", &Loader::stencil_test);
153 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
155 inline_base_name = n;
158 void SequenceTemplate::Step::Loader::blend()
163 void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest)
165 obj.blend = Blend(src, dest);
168 void SequenceTemplate::Step::Loader::depth_test()
170 load_sub(obj.depth_test);
173 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
175 obj.depth_test = DepthTest(c);
178 void SequenceTemplate::Step::Loader::lighting_inline()
180 RefPtr<Lighting> lightn = new Lighting;
182 get_collection().add(inline_base_name+".lightn", lightn.get());
183 obj.lighting = lightn.release();
186 void SequenceTemplate::Step::Loader::lighting(const string &name)
188 obj.lighting = &get_collection().get<Lighting>(name);
191 void SequenceTemplate::Step::Loader::object(const string &name)
193 obj.default_renderable = &get_collection().get<GL::Object>(name);
196 void SequenceTemplate::Step::Loader::scene(const string &name)
198 obj.default_renderable = &get_collection().get<Scene>(name);
201 void SequenceTemplate::Step::Loader::stencil_test()
203 load_sub(obj.stencil_test);