]> git.tdb.fi Git - libs/gl.git/blob - source/builders/sequencetemplate.cpp
Make it possible to specify explicit clear values
[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
13 using namespace std;
14
15 namespace Msp {
16 namespace GL {
17
18 SequenceTemplate::SequenceTemplate():
19         hdr(false),
20         alpha(false),
21         required_multisample(0),
22         max_multisample(0),
23         clear_enabled(false),
24         clear_depth(1.0f),
25         clear_stencil(0)
26 { }
27
28 SequenceTemplate::~SequenceTemplate()
29 {
30         for(const PostProcessor &p: postprocessors)
31                 delete p.postprocessor_template;
32 }
33
34
35 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
36 {
37         static PostProcessorRegistry registry;
38         static bool initialized = false;
39         if(!initialized)
40         {
41                 registry.register_type<AmbientOcclusion>("ambient_occlusion");
42                 registry.register_type<Bloom>("bloom");
43                 registry.register_type<ColorCurve>("colorcurve");
44                 initialized = true;
45         }
46         return registry;
47 }
48
49
50 SequenceTemplate::Step::~Step()
51 { }
52
53
54 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
55         postprocessor_template(ppt)
56 { }
57
58
59 SequenceTemplate::PostProcLoader::PostProcLoader()
60 {
61         get_postprocessor_registry().invoke_all(*this);
62 }
63
64
65 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
66         DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
67 {
68         add("hdr", &SequenceTemplate::hdr);
69         add("alpha", &SequenceTemplate::alpha);
70         add("clear", &Loader::clear);
71         add("multisample", &Loader::multisample);
72         add("multisample", &Loader::multisample_range);
73         add("postprocessor", &Loader::postprocessor);
74         add("step", &Loader::step);
75         add("step", &Loader::step_with_slot);
76
77         // Deprecated
78         add("pass", &Loader::step_with_slot);
79 }
80
81 void SequenceTemplate::Loader::postprocessor_loaded()
82 {
83         obj.postprocessors.push_back(get_postprocessor_template());
84 }
85
86 void SequenceTemplate::Loader::clear()
87 {
88         ClearLoader ldr(obj);
89         load_sub_with(ldr);
90         obj.clear_enabled = true;
91 }
92
93 void SequenceTemplate::Loader::multisample(unsigned samples)
94 {
95         obj.required_multisample = samples;
96         obj.max_multisample = samples;
97 }
98
99 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
100 {
101         obj.required_multisample = req;
102         obj.max_multisample = max;
103 }
104
105 void SequenceTemplate::Loader::postprocessor(const string &slot)
106 {
107         PostProcLoader ldr;
108         load_sub_with(ldr);
109         PostProcessor pp;
110         pp.postprocessor_template = ldr.get_postprocessor_template();
111         pp.slot_name = slot;
112         obj.postprocessors.push_back(pp);
113 }
114
115 void SequenceTemplate::Loader::step(const string &tag)
116 {
117         step_with_slot(tag, string());
118 }
119
120 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
121 {
122         Step stp;
123         stp.tag = tag;
124         stp.slot_name = rend;
125         if(coll)
126         {
127                 Step::Loader ldr(stp, *coll);
128                 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
129                 load_sub_with(ldr);
130         }
131         else
132                 load_sub(stp);
133
134         obj.steps.push_back(stp);
135 }
136
137
138 SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t):
139         ObjectLoader<SequenceTemplate>(t)
140 {
141         add("color", &ClearLoader::color);
142         add("depth", &ClearLoader::depth);
143         add("stencil", &ClearLoader::stencil);
144 }
145
146 void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a)
147 {
148         obj.clear_colors.push_back(Color(r, g, b, a));
149 }
150
151 void SequenceTemplate::ClearLoader::depth(float d)
152 {
153         obj.clear_depth = d;
154 }
155
156 void SequenceTemplate::ClearLoader::stencil(int s)
157 {
158         obj.clear_stencil = s;
159 }
160
161
162 SequenceTemplate::Step::Loader::Loader(Step &p):
163         DataFile::CollectionObjectLoader<Step>(p, 0)
164 {
165         init();
166 }
167
168 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
169         DataFile::CollectionObjectLoader<Step>(p, &c)
170 {
171         init();
172 }
173
174 void SequenceTemplate::Step::Loader::init()
175 {
176         add("blend", &Loader::blend);
177         add("blend", &Loader::blend_factors);
178         add("depth_test", &Loader::depth_test);
179         add("depth_test", &Loader::depth_compare);
180         add("lighting", &Loader::lighting);
181         add("lighting", &Loader::lighting_inline);
182         add("object", &Loader::object);
183         add("scene", &Loader::scene);
184         add("stencil_test", &Loader::stencil_test);
185 }
186
187 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
188 {
189         inline_base_name = n;
190 }
191
192 void SequenceTemplate::Step::Loader::blend()
193 {
194         load_sub(obj.blend);
195 }
196
197 void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest)
198 {
199         obj.blend = Blend(src, dest);
200 }
201
202 void SequenceTemplate::Step::Loader::depth_test()
203 {
204         load_sub(obj.depth_test);
205 }
206
207 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
208 {
209         obj.depth_test = DepthTest(c);
210 }
211
212 void SequenceTemplate::Step::Loader::lighting_inline()
213 {
214         RefPtr<Lighting> lightn = new Lighting;
215         load_sub(*lightn);
216         get_collection().add(inline_base_name+".lightn", lightn.get());
217         obj.lighting = lightn.release();
218 }
219
220 void SequenceTemplate::Step::Loader::lighting(const string &name)
221 {
222         obj.lighting = &get_collection().get<Lighting>(name);
223 }
224
225 void SequenceTemplate::Step::Loader::object(const string &name)
226 {
227         obj.default_renderable = &get_collection().get<GL::Object>(name);
228 }
229
230 void SequenceTemplate::Step::Loader::scene(const string &name)
231 {
232         obj.default_renderable = &get_collection().get<Scene>(name);
233 }
234
235 void SequenceTemplate::Step::Loader::stencil_test()
236 {
237         load_sub(obj.stencil_test);
238 }
239
240 } // namespace GL
241 } // namespace Msp