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():
22 required_multisample(0),
29 SequenceTemplate::~SequenceTemplate()
31 for(const PostProcessor &p: postprocessors)
32 delete p.postprocessor_template;
36 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
38 static PostProcessorRegistry registry;
39 static bool initialized = false;
42 registry.register_type<AmbientOcclusion>("ambient_occlusion");
43 registry.register_type<Bloom>("bloom");
44 registry.register_type<ColorCurve>("colorcurve");
51 SequenceTemplate::Step::~Step()
55 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
56 postprocessor_template(ppt)
60 SequenceTemplate::PostProcLoader::PostProcLoader()
62 get_postprocessor_registry().invoke_all(*this);
66 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
67 DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
69 add("hdr", &SequenceTemplate::hdr);
70 add("alpha", &SequenceTemplate::alpha);
71 add("clear", &Loader::clear);
72 add("multisample", &Loader::multisample);
73 add("multisample", &Loader::multisample_range);
74 add("postprocessor", &Loader::postprocessor);
75 add("step", &Loader::step);
76 add("step", &Loader::step_with_slot);
79 add("pass", &Loader::step_with_slot);
82 void SequenceTemplate::Loader::postprocessor_loaded()
84 obj.postprocessors.push_back(get_postprocessor_template());
87 void SequenceTemplate::Loader::clear()
91 obj.clear_enabled = true;
94 void SequenceTemplate::Loader::multisample(unsigned samples)
96 obj.required_multisample = samples;
97 obj.max_multisample = samples;
100 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
102 obj.required_multisample = req;
103 obj.max_multisample = max;
106 void SequenceTemplate::Loader::postprocessor(const string &slot)
111 pp.postprocessor_template = ldr.get_postprocessor_template();
113 obj.postprocessors.push_back(pp);
116 void SequenceTemplate::Loader::step(const string &tag)
118 step_with_slot(tag, string());
121 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
125 stp.slot_name = rend;
126 Step::Loader ldr(stp, *coll);
127 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
130 obj.steps.push_back(stp);
134 SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t):
135 ObjectLoader<SequenceTemplate>(t)
137 add("color", &ClearLoader::color);
138 add("depth", &ClearLoader::depth);
139 add("stencil", &ClearLoader::stencil);
142 void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a)
144 obj.clear_colors.push_back(Color(r, g, b, a));
147 void SequenceTemplate::ClearLoader::depth(float d)
152 void SequenceTemplate::ClearLoader::stencil(int s)
154 obj.clear_stencil = s;
158 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
159 DataFile::CollectionObjectLoader<Step>(p, &c)
161 add("blend", &Loader::blend);
162 add("blend", &Loader::blend_factors);
163 add("depth_test", &Loader::depth_test);
164 add("depth_test", &Loader::depth_compare);
165 add("lighting", &Loader::lighting);
166 add("lighting", &Loader::lighting_inline);
167 add("object", &Loader::object);
168 add("scene", &Loader::scene);
169 add("stencil_test", &Loader::stencil_test);
172 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
174 inline_base_name = n;
177 void SequenceTemplate::Step::Loader::blend()
182 void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest)
184 obj.blend = Blend(src, dest);
187 void SequenceTemplate::Step::Loader::depth_test()
189 load_sub(obj.depth_test);
192 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
194 obj.depth_test = DepthTest(c);
197 void SequenceTemplate::Step::Loader::lighting_inline()
199 RefPtr<Lighting> lightn = new Lighting;
200 load_sub(*lightn, get_collection());
201 get_collection().add(inline_base_name+".lightn", lightn.get());
202 obj.lighting = lightn.release();
205 void SequenceTemplate::Step::Loader::lighting(const string &name)
207 obj.lighting = &get_collection().get<Lighting>(name);
210 void SequenceTemplate::Step::Loader::object(const string &name)
212 obj.default_renderable = &get_collection().get<GL::Object>(name);
215 void SequenceTemplate::Step::Loader::scene(const string &name)
217 obj.default_renderable = &get_collection().get<Scene>(name);
220 void SequenceTemplate::Step::Loader::stencil_test()
222 load_sub(obj.stencil_test);