]> git.tdb.fi Git - libs/gl.git/blob - source/builders/sequencetemplate.cpp
Remove deprecated things related to vertex formats and arrays
[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 { }
24
25 SequenceTemplate::~SequenceTemplate()
26 {
27         for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
28                 delete i->postprocessor_template;
29 }
30
31
32 SequenceTemplate::PostProcessorRegistry &SequenceTemplate::get_postprocessor_registry()
33 {
34         static PostProcessorRegistry registry;
35         static bool initialized = false;
36         if(!initialized)
37         {
38                 registry.register_type<AmbientOcclusion>("ambient_occlusion");
39                 registry.register_type<Bloom>("bloom");
40                 registry.register_type<ColorCurve>("colorcurve");
41                 initialized = true;
42         }
43         return registry;
44 }
45
46
47 SequenceTemplate::Step::~Step()
48 { }
49
50
51 SequenceTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
52         postprocessor_template(ppt)
53 { }
54
55
56 SequenceTemplate::PostProcLoader::PostProcLoader()
57 {
58         get_postprocessor_registry().invoke_all(*this);
59 }
60
61
62 SequenceTemplate::Loader::Loader(SequenceTemplate &t, Collection &c):
63         DataFile::CollectionObjectLoader<SequenceTemplate, Resources>(t, &c)
64 {
65         add("hdr", &SequenceTemplate::hdr);
66         add("alpha", &SequenceTemplate::alpha);
67         add("multisample", &Loader::multisample);
68         add("multisample", &Loader::multisample_range);
69         add("postprocessor", &Loader::postprocessor);
70         add("step", &Loader::step);
71         add("step", &Loader::step_with_slot);
72
73         // Deprecated
74         add("pass", &Loader::step_with_slot);
75 }
76
77 void SequenceTemplate::Loader::postprocessor_loaded()
78 {
79         obj.postprocessors.push_back(get_postprocessor_template());
80 }
81
82 void SequenceTemplate::Loader::multisample(unsigned samples)
83 {
84         obj.required_multisample = samples;
85         obj.max_multisample = samples;
86 }
87
88 void SequenceTemplate::Loader::multisample_range(unsigned req, unsigned max)
89 {
90         obj.required_multisample = req;
91         obj.max_multisample = max;
92 }
93
94 void SequenceTemplate::Loader::postprocessor(const string &slot)
95 {
96         PostProcLoader ldr;
97         load_sub_with(ldr);
98         PostProcessor pp;
99         pp.postprocessor_template = ldr.get_postprocessor_template();
100         pp.slot_name = slot;
101         obj.postprocessors.push_back(pp);
102 }
103
104 void SequenceTemplate::Loader::step(const string &tag)
105 {
106         step_with_slot(tag, string());
107 }
108
109 void SequenceTemplate::Loader::step_with_slot(const string &tag, const string &rend)
110 {
111         Step stp;
112         stp.tag = tag;
113         stp.slot_name = rend;
114         if(coll)
115         {
116                 Step::Loader ldr(stp, *coll);
117                 ldr.set_inline_base_name(format("%s/%d.step", get_source(), obj.steps.size()));
118                 load_sub_with(ldr);
119         }
120         else
121                 load_sub(stp);
122
123         obj.steps.push_back(stp);
124 }
125
126
127 SequenceTemplate::Step::Loader::Loader(Step &p):
128         DataFile::CollectionObjectLoader<Step>(p, 0)
129 {
130         init();
131 }
132
133 SequenceTemplate::Step::Loader::Loader(Step &p, Collection &c):
134         DataFile::CollectionObjectLoader<Step>(p, &c)
135 {
136         init();
137 }
138
139 void SequenceTemplate::Step::Loader::init()
140 {
141         add("blend", &Loader::blend);
142         add("blend", &Loader::blend_factors);
143         add("depth_test", &Loader::depth_test);
144         add("depth_test", &Loader::depth_compare);
145         add("lighting", &Loader::lighting);
146         add("lighting", &Loader::lighting_inline);
147         add("object", &Loader::object);
148         add("scene", &Loader::scene);
149         add("stencil_test", &Loader::stencil_test);
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()
158 {
159         load_sub(obj.blend);
160 }
161
162 void SequenceTemplate::Step::Loader::blend_factors(BlendFactor src, BlendFactor dest)
163 {
164         obj.blend = Blend(src, dest);
165 }
166
167 void SequenceTemplate::Step::Loader::depth_test()
168 {
169         load_sub(obj.depth_test);
170 }
171
172 void SequenceTemplate::Step::Loader::depth_compare(Predicate c)
173 {
174         obj.depth_test = DepthTest(c);
175 }
176
177 void SequenceTemplate::Step::Loader::lighting_inline()
178 {
179         RefPtr<Lighting> lightn = new Lighting;
180         load_sub(*lightn);
181         get_collection().add(inline_base_name+".lightn", lightn.get());
182         obj.lighting = lightn.release();
183 }
184
185 void SequenceTemplate::Step::Loader::lighting(const string &name)
186 {
187         obj.lighting = &get_collection().get<Lighting>(name);
188 }
189
190 void SequenceTemplate::Step::Loader::object(const string &name)
191 {
192         obj.default_renderable = &get_collection().get<GL::Object>(name);
193 }
194
195 void SequenceTemplate::Step::Loader::scene(const string &name)
196 {
197         obj.default_renderable = &get_collection().get<Scene>(name);
198 }
199
200 void SequenceTemplate::Step::Loader::stencil_test()
201 {
202         load_sub(obj.stencil_test);
203 }
204
205 } // namespace GL
206 } // namespace Msp