]> git.tdb.fi Git - libs/gl.git/blob - source/builders/sequencetemplate.cpp
Add debug name capability to more classes
[libs/gl.git] / source / builders / sequencetemplate.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/datafile/collection.h>
3 #include "ambientocclusion.h"
4 #include "blend.h"
5 #include "bloom.h"
6 #include "colorcurve.h"
7 #include "lighting.h"
8 #include "object.h"
9 #include "resources.h"
10 #include "scene.h"
11 #include "sequencetemplate.h"
12 #include "tests.h"
13
14 using namespace std;
15
16 namespace Msp {
17 namespace GL {
18
19 SequenceTemplate::SequenceTemplate():
20         hdr(false),
21         alpha(false),
22         required_multisample(0),
23         max_multisample(0)
24 { }
25
26 SequenceTemplate::~SequenceTemplate()
27 {
28         for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
29                 delete i->postprocessor_template;
30 }
31
32
33 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
34 {
35         static PostProcessorRegistry registry;
36         static bool initialized = false;
37         if(!initialized)
38         {
39                 registry.register_type<AmbientOcclusion>("ambient_occlusion");
40                 registry.register_type<Bloom>("bloom");
41                 registry.register_type<ColorCurve>("colorcurve");
42                 initialized = true;
43         }
44         return registry;
45 }
46
47
48 SequenceTemplate::Step::~Step()
49 { }
50
51
52 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
53         postprocessor_template(ppt)
54 { }
55
56
57 SequenceTemplate::PostProcLoader::PostProcLoader()
58 {
59         get_postprocessor_registry().invoke_all(*this);
60 }
61
62
63 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
64         DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
65 {
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);
73
74         // Deprecated
75         add("pass", &Loader::step_with_slot);
76 }
77
78 void SequenceTemplate::Loader::postprocessor_loaded()
79 {
80         obj.postprocessors.push_back(get_postprocessor_template());
81 }
82
83 void SequenceTemplate::Loader::multisample(unsigned samples)
84 {
85         obj.required_multisample = samples;
86         obj.max_multisample = samples;
87 }
88
89 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
90 {
91         obj.required_multisample = req;
92         obj.max_multisample = max;
93 }
94
95 void SequenceTemplate::Loader::postprocessor(const string &slot)
96 {
97         PostProcLoader ldr;
98         load_sub_with(ldr);
99         PostProcessor pp;
100         pp.postprocessor_template = ldr.get_postprocessor_template();
101         pp.slot_name = slot;
102         obj.postprocessors.push_back(pp);
103 }
104
105 void SequenceTemplate::Loader::step(const string &tag)
106 {
107         step_with_slot(tag, string());
108 }
109
110 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
111 {
112         Step stp;
113         stp.tag = tag;
114         stp.slot_name = rend;
115         if(coll)
116         {
117                 Step::Loader ldr(stp, *coll);
118                 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
119                 load_sub_with(ldr);
120         }
121         else
122                 load_sub(stp);
123
124         obj.steps.push_back(stp);
125 }
126
127
128 SequenceTemplate::Step::Loader::Loader(Step &p):
129         DataFile::CollectionObjectLoader<Step>(p, 0)
130 {
131         init();
132 }
133
134 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
135         DataFile::CollectionObjectLoader<Step>(p, &c)
136 {
137         init();
138 }
139
140 void SequenceTemplate::Step::Loader::init()
141 {
142         add("blend", &Loader::blend);
143         add("blend", &Loader::blend_predefined);
144         add("depth_test", &Loader::depth_test);
145         add("depth_test", &Loader::depth_test_predefined);
146         add("lighting", &Loader::lighting);
147         add("lighting", &Loader::lighting_inline);
148         add("object", &Loader::object);
149         add("scene", &Loader::scene);
150 }
151
152 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
153 {
154         inline_base_name = n;
155 }
156
157 void SequenceTemplate::Step::Loader::blend_predefined(const string &name)
158 {
159         const Blend *bln = 0;
160         if(name=="alpha")
161                 bln = &Blend::alpha();
162         else if(name=="additive")
163                 bln = &Blend::additive();
164         else if(name=="additive_alpha")
165                 bln = &Blend::additive_alpha();
166         else
167                 throw key_error(name);
168
169         obj.blend = bln;
170         obj.blend.keep();
171 }
172
173 void SequenceTemplate::Step::Loader::blend(BlendFactor src, BlendFactor dest)
174 {
175         obj.blend = new Blend(src, dest);
176 }
177
178 void SequenceTemplate::Step::Loader::depth_test_predefined(const string &name)
179 {
180         const DepthTest *dtest = 0;
181         if(name=="lequal")
182                 dtest = &DepthTest::lequal();
183         else
184                 throw key_error(name);
185
186         obj.depth_test = dtest;
187         obj.depth_test.keep();
188 }
189
190 void SequenceTemplate::Step::Loader::depth_test(Predicate pred)
191 {
192         obj.depth_test = new DepthTest(pred);
193 }
194
195 void SequenceTemplate::Step::Loader::lighting_inline()
196 {
197         RefPtr<Lighting> lightn = new Lighting;
198         load_sub(*lightn);
199         get_collection().add(inline_base_name+".lightn", lightn.get());
200         obj.lighting = lightn.release();
201 }
202
203 void SequenceTemplate::Step::Loader::lighting(const string &name)
204 {
205         obj.lighting = &get_collection().get<Lighting>(name);
206 }
207
208 void SequenceTemplate::Step::Loader::object(const string &name)
209 {
210         obj.default_renderable = &get_collection().get<GL::Object>(name);
211 }
212
213 void SequenceTemplate::Step::Loader::scene(const string &name)
214 {
215         obj.default_renderable = &get_collection().get<Scene>(name);
216 }
217
218 } // namespace GL
219 } // namespace Msp