]> git.tdb.fi Git - libs/gl.git/blob - source/builders/sequencetemplate.cpp
83c4b7671f75234b42125b30509dff9e1bde2371
[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 { }
25
26 SequenceTemplate::~SequenceTemplate()
27 {
28         for(const PostProcessor &p: postprocessors)
29                 delete p.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("clear", &Loader::clear);
69         add("multisample", &Loader::multisample);
70         add("multisample", &Loader::multisample_range);
71         add("postprocessor", &Loader::postprocessor);
72         add("step", &Loader::step);
73         add("step", &Loader::step_with_slot);
74
75         // Deprecated
76         add("pass", &Loader::step_with_slot);
77 }
78
79 void SequenceTemplate::Loader::postprocessor_loaded()
80 {
81         obj.postprocessors.push_back(get_postprocessor_template());
82 }
83
84 void SequenceTemplate::Loader::clear()
85 {
86         obj.clear_enabled = true;
87 }
88
89 void SequenceTemplate::Loader::multisample(unsigned samples)
90 {
91         obj.required_multisample = samples;
92         obj.max_multisample = samples;
93 }
94
95 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
96 {
97         obj.required_multisample = req;
98         obj.max_multisample = max;
99 }
100
101 void SequenceTemplate::Loader::postprocessor(const string &slot)
102 {
103         PostProcLoader ldr;
104         load_sub_with(ldr);
105         PostProcessor pp;
106         pp.postprocessor_template = ldr.get_postprocessor_template();
107         pp.slot_name = slot;
108         obj.postprocessors.push_back(pp);
109 }
110
111 void SequenceTemplate::Loader::step(const string &tag)
112 {
113         step_with_slot(tag, string());
114 }
115
116 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
117 {
118         Step stp;
119         stp.tag = tag;
120         stp.slot_name = rend;
121         if(coll)
122         {
123                 Step::Loader ldr(stp, *coll);
124                 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
125                 load_sub_with(ldr);
126         }
127         else
128                 load_sub(stp);
129
130         obj.steps.push_back(stp);
131 }
132
133
134 SequenceTemplate::Step::Loader::Loader(Step &p):
135         DataFile::CollectionObjectLoader<Step>(p, 0)
136 {
137         init();
138 }
139
140 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
141         DataFile::CollectionObjectLoader<Step>(p, &c)
142 {
143         init();
144 }
145
146 void SequenceTemplate::Step::Loader::init()
147 {
148         add("blend", &Loader::blend);
149         add("blend", &Loader::blend_factors);
150         add("depth_test", &Loader::depth_test);
151         add("depth_test", &Loader::depth_compare);
152         add("lighting", &Loader::lighting);
153         add("lighting", &Loader::lighting_inline);
154         add("object", &Loader::object);
155         add("scene", &Loader::scene);
156         add("stencil_test", &Loader::stencil_test);
157 }
158
159 void SequenceTemplate::Step::Loader::set_inline_base_name(const string &n)
160 {
161         inline_base_name = n;
162 }
163
164 void SequenceTemplate::Step::Loader::blend()
165 {
166         load_sub(obj.blend);
167 }
168
169 void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest)
170 {
171         obj.blend = Blend(src, dest);
172 }
173
174 void SequenceTemplate::Step::Loader::depth_test()
175 {
176         load_sub(obj.depth_test);
177 }
178
179 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
180 {
181         obj.depth_test = DepthTest(c);
182 }
183
184 void SequenceTemplate::Step::Loader::lighting_inline()
185 {
186         RefPtr<Lighting> lightn = new Lighting;
187         load_sub(*lightn);
188         get_collection().add(inline_base_name+".lightn", lightn.get());
189         obj.lighting = lightn.release();
190 }
191
192 void SequenceTemplate::Step::Loader::lighting(const string &name)
193 {
194         obj.lighting = &get_collection().get<Lighting>(name);
195 }
196
197 void SequenceTemplate::Step::Loader::object(const string &name)
198 {
199         obj.default_renderable = &get_collection().get<GL::Object>(name);
200 }
201
202 void SequenceTemplate::Step::Loader::scene(const string &name)
203 {
204         obj.default_renderable = &get_collection().get<Scene>(name);
205 }
206
207 void SequenceTemplate::Step::Loader::stencil_test()
208 {
209         load_sub(obj.stencil_test);
210 }
211
212 } // namespace GL
213 } // namespace Msp