1 #include <msp/core/maputils.h>
2 #include <msp/datafile/collection.h>
3 #include "ambientocclusion.h"
6 #include "colorcurve.h"
9 #include "sequencetemplate.h"
17 SequenceTemplate::SequenceTemplate():
21 required_multisample(0),
25 SequenceTemplate::~SequenceTemplate()
27 for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
28 delete i->postprocessor_template;
31 Resources &SequenceTemplate::get_resources() const
34 throw logic_error("no resources");
39 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
41 static PostProcessorRegistry registry;
42 static bool initialized = false;
45 registry.register_type<AmbientOcclusion>("ambient_occlusion");
46 registry.register_type<Bloom>("bloom");
47 registry.register_type<ColorCurve>("colorcurve");
54 SequenceTemplate::Step::~Step()
58 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
59 postprocessor_template(ppt)
63 SequenceTemplate::PostProcLoader::PostProcLoader()
65 get_postprocessor_registry().invoke_all(*this);
69 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
70 DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
72 add("hdr", &SequenceTemplate::hdr);
73 add("alpha", &SequenceTemplate::alpha);
74 add("multisample", &Loader::multisample);
75 add("multisample", &Loader::multisample_range);
76 add("postprocessor", &Loader::postprocessor);
77 add("step", &Loader::step);
80 add("pass", &Loader::step);
85 void SequenceTemplate::Loader::postprocessor_loaded()
87 obj.postprocessors.push_back(get_postprocessor_template());
90 void SequenceTemplate::Loader::multisample(unsigned samples)
92 obj.required_multisample = samples;
93 obj.max_multisample = samples;
96 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
98 obj.required_multisample = req;
99 obj.max_multisample = max;
102 void SequenceTemplate::Loader::postprocessor(const string &slot)
107 pp.postprocessor_template = ldr.get_postprocessor_template();
109 obj.postprocessors.push_back(pp);
112 void SequenceTemplate::Loader::step(const string &tag, const string &rend)
116 stp.renderable_name = rend;
118 load_sub(stp, *coll);
122 obj.steps.push_back(stp);
126 SequenceTemplate::Step::Loader::Loader(Step &p):
127 DataFile::CollectionObjectLoader<Step>(p, 0)
132 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
133 DataFile::CollectionObjectLoader<Step>(p, &c)
138 void SequenceTemplate::Step::Loader::init()
140 add("blend", &Loader::blend);
141 add("blend", &Loader::blend_predefined);
142 add("depth_test", &Loader::depth_test);
143 add("depth_test", &Loader::depth_test_predefined);
144 add("lighting", &Loader::lighting);
145 add("lighting", &Loader::lighting_inline);
148 void SequenceTemplate::Step::Loader::blend_predefined(const string &name)
150 const Blend *bln = 0;
152 bln = &Blend::alpha();
153 else if(name=="additive")
154 bln = &Blend::additive();
155 else if(name=="additive_alpha")
156 bln = &Blend::additive_alpha();
158 throw key_error(name);
164 void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest)
166 obj.blend = new Blend(src, dest);
169 void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name)
171 const DepthTest *dtest = 0;
173 dtest = &DepthTest::lequal();
175 throw key_error(name);
177 obj.depth_test = dtest;
178 obj.depth_test.keep();
181 void SequenceTemplate::Step::Loader::depth_test(Predicate pred)
183 obj.depth_test = new DepthTest(pred);
186 void SequenceTemplate::Step::Loader::lighting_inline()
188 RefPtr<Lighting> lightn = new Lighting;
190 obj.lighting = lightn;
193 void SequenceTemplate::Step::Loader::lighting(const string &name)
195 obj.lighting = &get_collection().get<Lighting>(name);
199 /*void SequenceTemplate::Step::Loader::scene(const string &name)
201 obj.default_renderable = get_collection().get<Scene>(name);