]> git.tdb.fi Git - libs/gl.git/blob - source/builders/sequencetemplate.cpp
03c8c7fe1cafa0b26f3fc20e37080e94c8fafe0a
[libs/gl.git] / source / builders / sequencetemplate.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/datafile/collection.h>
3 #include <msp/strings/format.h>
4 #include "ambientocclusion.h"
5 #include "blend.h"
6 #include "bloom.h"
7 #include "colorcurve.h"
8 #include "lighting.h"
9 #include "object.h"
10 #include "resources.h"
11 #include "scene.h"
12 #include "sequencetemplate.h"
13
14 using namespace std;
15
16 namespace Msp {
17 namespace GL {
18
19 SequenceTemplate::~SequenceTemplate()
20 {
21         for(const PostProcessor &p: postprocessors)
22                 delete p.postprocessor_template;
23 }
24
25 template<>
26 SequenceTemplate::TemplateRegistry<GL::PostProcessor> &SequenceTemplate::get_registry<GL::PostProcessor>()
27 {
28         static TemplateRegistry<GL::PostProcessor> registry;
29         static bool initialized = false;
30         if(!initialized)
31         {
32                 registry.register_type<AmbientOcclusion::Template>("ambient_occlusion");
33                 registry.register_type<Bloom::Template>("bloom");
34                 registry.register_type<ColorCurve::Template>("colorcurve");
35                 initialized = true;
36         }
37         return registry;
38 }
39
40
41 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
42         postprocessor_template(ppt)
43 { }
44
45
46 DataFile::Loader::ActionMap SequenceTemplate::Loader::shared_actions;
47
48 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
49         CollectionObjectLoader<SequenceTemplate>(t, &c)
50 {
51         set_actions(shared_actions);
52 }
53
54 void SequenceTemplate::Loader::init_actions()
55 {
56         add("hdr", &SequenceTemplate::hdr);
57         add("alpha", &SequenceTemplate::alpha);
58         add("clear", &Loader::clear);
59         add("multisample", &Loader::multisample);
60         add("multisample", &Loader::multisample_range);
61         add("postprocessor", &Loader::postprocessor);
62         add("postprocessor", &Loader::postprocessor_with_slot);
63         add("renderable", &Loader::renderable);
64         add("renderable", &Loader::renderable_with_default);
65         add("step", &Loader::step);
66 }
67
68 void SequenceTemplate::Loader::clear()
69 {
70         ClearLoader ldr(obj);
71         load_sub_with(ldr);
72         obj.clear_enabled = true;
73 }
74
75 void SequenceTemplate::Loader::multisample(unsigned samples)
76 {
77         obj.required_multisample = samples;
78         obj.max_multisample = samples;
79 }
80
81 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
82 {
83         obj.required_multisample = req;
84         obj.max_multisample = max;
85 }
86
87 void SequenceTemplate::Loader::postprocessor()
88 {
89         postprocessor_with_slot(string());
90 }
91
92 void SequenceTemplate::Loader::postprocessor_with_slot(const string &slot)
93 {
94         TemplateLoader<GL::PostProcessor> ldr(get_collection());
95         load_sub_with(ldr);
96         PostProcessor pp;
97         pp.postprocessor_template = ldr.get_object();
98         pp.slot_name = slot;
99         obj.postprocessors.push_back(pp);
100 }
101
102 void SequenceTemplate::Loader::renderable(const string &slot)
103 {
104         Renderable rend;
105         rend.slot_name = slot;
106         obj.renderables.push_back(rend);
107 }
108
109 void SequenceTemplate::Loader::renderable_with_default(const string &slot, const string &name)
110 {
111         Renderable rend;
112         rend.renderable = &get_collection().get<GL::Renderable>(name);
113         rend.slot_name = slot;
114         obj.renderables.push_back(rend);
115 }
116
117 void SequenceTemplate::Loader::step(const string &tag, const string &rend)
118 {
119         Step stp;
120         stp.tag = tag;
121         stp.renderable_name = rend;
122         Step::Loader ldr(stp, get_collection());
123         ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
124         load_sub_with(ldr);
125
126         obj.steps.push_back(stp);
127 }
128
129
130 DataFile::Loader::ActionMap SequenceTemplate::ClearLoader::shared_actions;
131
132 SequenceTemplate::ClearLoader::ClearLoader(SequenceTemplate &t):
133         ObjectLoader<SequenceTemplate>(t)
134 {
135         set_actions(shared_actions);
136 }
137
138 void SequenceTemplate::ClearLoader::init_actions()
139 {
140         add("color", &ClearLoader::color);
141         add("depth", &ClearLoader::depth);
142         add("stencil", &ClearLoader::stencil);
143 }
144
145 void SequenceTemplate::ClearLoader::color(float r, float g, float b, float a)
146 {
147         obj.clear_colors.push_back(Color(r, g, b, a));
148 }
149
150 void SequenceTemplate::ClearLoader::depth(float d)
151 {
152         obj.clear_depth = d;
153 }
154
155 void SequenceTemplate::ClearLoader::stencil(int s)
156 {
157         obj.clear_stencil = s;
158 }
159
160
161 DataFile::Loader::ActionMap SequenceTemplate::Step::Loader::shared_actions;
162
163 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
164         DataFile::CollectionObjectLoader<Step>(p, &c)
165 {
166         set_actions(shared_actions);
167 }
168
169 void SequenceTemplate::Step::Loader::init_actions()
170 {
171         add("depth_test", &Loader::depth_test);
172         add("depth_test", &Loader::depth_compare);
173         add("lighting", &Loader::lighting);
174         add("lighting", &Loader::lighting_inline);
175         add("stencil_test", &Loader::stencil_test);
176 }
177
178 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
179 {
180         inline_base_name = n;
181 }
182
183 void SequenceTemplate::Step::Loader::depth_test()
184 {
185         load_sub(obj.depth_test);
186 }
187
188 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
189 {
190         obj.depth_test = DepthTest(c);
191 }
192
193 void SequenceTemplate::Step::Loader::lighting_inline()
194 {
195         RefPtr<Lighting> lightn = new Lighting;
196         load_sub(*lightn, get_collection());
197         get_collection().add(inline_base_name+".lightn", lightn.get());
198         obj.lighting = lightn.release();
199 }
200
201 void SequenceTemplate::Step::Loader::lighting(const string &name)
202 {
203         obj.lighting = &get_collection().get<Lighting>(name);
204 }
205
206 void SequenceTemplate::Step::Loader::stencil_test()
207 {
208         load_sub(obj.stencil_test);
209 }
210
211 } // namespace GL
212 } // namespace Msp