1 #include <msp/core/maputils.h>
2 #include <msp/datafile/collection.h>
3 #include <msp/strings/format.h>
4 #include "ambientocclusion.h"
7 #include "colorcurve.h"
10 #include "resources.h"
12 #include "sequencetemplate.h"
19 SequenceTemplate::~SequenceTemplate()
21 for(const PostProcessor &p: postprocessors)
22 delete p.postprocessor_template;
26 SequenceTemplate::TemplateRegistry<GL::PostProcessor> &SequenceTemplate::get_registry<GL::PostProcessor>()
28 static TemplateRegistry<GL::PostProcessor> registry;
29 static bool initialized = false;
32 registry.register_type<AmbientOcclusion::Template>("ambient_occlusion");
33 registry.register_type<Bloom::Template>("bloom");
34 registry.register_type<ColorCurve::Template>("colorcurve");
41 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
42 postprocessor_template(ppt)
46 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
47 CollectionObjectLoader<SequenceTemplate>(t, &c)
49 add("hdr", &SequenceTemplate::hdr);
50 add("alpha", &SequenceTemplate::alpha);
51 add("clear", &Loader::clear);
52 add("multisample", &Loader::multisample);
53 add("multisample", &Loader::multisample_range);
54 add("postprocessor", &Loader::postprocessor);
55 add("postprocessor", &Loader::postprocessor_with_slot);
56 add("renderable", &Loader::renderable);
57 add("renderable", &Loader::renderable_with_default);
58 add("step", &Loader::step);
61 void SequenceTemplate::Loader::clear()
65 obj.clear_enabled = true;
68 void SequenceTemplate::Loader::multisample(unsigned samples)
70 obj.required_multisample = samples;
71 obj.max_multisample = samples;
74 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
76 obj.required_multisample = req;
77 obj.max_multisample = max;
80 void SequenceTemplate::Loader::postprocessor()
82 postprocessor_with_slot(string());
85 void SequenceTemplate::Loader::postprocessor_with_slot(const string &slot)
87 TemplateLoader<GL::PostProcessor> ldr(get_collection());
90 pp.postprocessor_template = ldr.get_object();
92 obj.postprocessors.push_back(pp);
95 void SequenceTemplate::Loader::renderable(const string &slot)
98 rend.slot_name = slot;
99 obj.renderables.push_back(rend);
102 void SequenceTemplate::Loader::renderable_with_default(const string &slot, const string &name)
105 rend.renderable = &get_collection().get<GL::Renderable>(name);
106 rend.slot_name = slot;
107 obj.renderables.push_back(rend);
110 void SequenceTemplate::Loader::step(const string &tag, const string &rend)
114 stp.renderable_name = rend;
115 Step::Loader ldr(stp, get_collection());
116 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
119 obj.steps.push_back(stp);
123 SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t):
124 ObjectLoader<SequenceTemplate>(t)
126 add("color", &ClearLoader::color);
127 add("depth", &ClearLoader::depth);
128 add("stencil", &ClearLoader::stencil);
131 void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a)
133 obj.clear_colors.push_back(Color(r, g, b, a));
136 void SequenceTemplate::ClearLoader::depth(float d)
141 void SequenceTemplate::ClearLoader::stencil(int s)
143 obj.clear_stencil = s;
147 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
148 DataFile::CollectionObjectLoader<Step>(p, &c)
150 add("depth_test", &Loader::depth_test);
151 add("depth_test", &Loader::depth_compare);
152 add("lighting", &Loader::lighting);
153 add("lighting", &Loader::lighting_inline);
154 add("stencil_test", &Loader::stencil_test);
157 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
159 inline_base_name = n;
162 void SequenceTemplate::Step::Loader::depth_test()
164 load_sub(obj.depth_test);
167 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
169 obj.depth_test = DepthTest(c);
172 void SequenceTemplate::Step::Loader::lighting_inline()
174 RefPtr<Lighting> lightn = new Lighting;
175 load_sub(*lightn, get_collection());
176 get_collection().add(inline_base_name+".lightn", lightn.get());
177 obj.lighting = lightn.release();
180 void SequenceTemplate::Step::Loader::lighting(const string &name)
182 obj.lighting = &get_collection().get<Lighting>(name);
185 void SequenceTemplate::Step::Loader::stencil_test()
187 load_sub(obj.stencil_test);