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():
23 required_multisample(0),
27 SequenceTemplate::~SequenceTemplate()
29 for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
30 delete i->postprocessor_template;
33 Resources &SequenceTemplate::get_resources() const
36 throw logic_error("no resources");
41 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
43 static PostProcessorRegistry registry;
44 static bool initialized = false;
47 registry.register_type<AmbientOcclusion>("ambient_occlusion");
48 registry.register_type<Bloom>("bloom");
49 registry.register_type<ColorCurve>("colorcurve");
56 SequenceTemplate::Step::~Step()
60 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
61 postprocessor_template(ppt)
65 SequenceTemplate::PostProcLoader::PostProcLoader()
67 get_postprocessor_registry().invoke_all(*this);
71 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
72 DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
74 add("hdr", &SequenceTemplate::hdr);
75 add("alpha", &SequenceTemplate::alpha);
76 add("multisample", &Loader::multisample);
77 add("multisample", &Loader::multisample_range);
78 add("postprocessor", &Loader::postprocessor);
79 add("step", &Loader::step);
80 add("step", &Loader::step_with_slot);
83 add("pass", &Loader::step_with_slot);
88 void SequenceTemplate::Loader::postprocessor_loaded()
90 obj.postprocessors.push_back(get_postprocessor_template());
93 void SequenceTemplate::Loader::multisample(unsigned samples)
95 obj.required_multisample = samples;
96 obj.max_multisample = samples;
99 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
101 obj.required_multisample = req;
102 obj.max_multisample = max;
105 void SequenceTemplate::Loader::postprocessor(const string &slot)
110 pp.postprocessor_template = ldr.get_postprocessor_template();
112 obj.postprocessors.push_back(pp);
115 void SequenceTemplate::Loader::step(const string &tag)
117 step_with_slot(tag, string());
120 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
124 stp.slot_name = rend;
126 load_sub(stp, *coll);
130 obj.steps.push_back(stp);
134 SequenceTemplate::Step::Loader::Loader(Step &p):
135 DataFile::CollectionObjectLoader<Step>(p, 0)
140 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
141 DataFile::CollectionObjectLoader<Step>(p, &c)
146 void SequenceTemplate::Step::Loader::init()
148 add("blend", &Loader::blend);
149 add("blend", &Loader::blend_predefined);
150 add("depth_test", &Loader::depth_test);
151 add("depth_test", &Loader::depth_test_predefined);
152 add("lighting", &Loader::lighting);
153 add("lighting", &Loader::lighting_inline);
154 add("object", &Loader::object);
155 add("scene", &Loader::scene);
158 void SequenceTemplate::Step::Loader::blend_predefined(const string &name)
160 const Blend *bln = 0;
162 bln = &Blend::alpha();
163 else if(name=="additive")
164 bln = &Blend::additive();
165 else if(name=="additive_alpha")
166 bln = &Blend::additive_alpha();
168 throw key_error(name);
174 void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest)
176 obj.blend = new Blend(src, dest);
179 void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name)
181 const DepthTest *dtest = 0;
183 dtest = &DepthTest::lequal();
185 throw key_error(name);
187 obj.depth_test = dtest;
188 obj.depth_test.keep();
191 void SequenceTemplate::Step::Loader::depth_test(Predicate pred)
193 obj.depth_test = new DepthTest(pred);
196 void SequenceTemplate::Step::Loader::lighting_inline()
198 RefPtr<Lighting> lightn = new Lighting;
200 obj.lighting = lightn;
203 void SequenceTemplate::Step::Loader::lighting(const string &name)
205 obj.lighting = &get_collection().get<Lighting>(name);
209 void SequenceTemplate::Step::Loader::object(const string &name)
211 obj.default_renderable = &get_collection().get<GL::Object>(name);
214 void SequenceTemplate::Step::Loader::scene(const string &name)
216 obj.default_renderable = &get_collection().get<Scene>(name);