1 #ifndef SEQUENCETEMPLATE_H_
2 #define SEQUENCETEMPLATE_H_
6 #include <msp/core/typeregistry.h>
7 #include <msp/datafile/objectloader.h>
9 #include "postprocessor.h"
10 #include "resources.h"
11 #include "stenciltest.h"
19 class SequenceTemplate
22 class PostProcLoader: virtual public DataFile::Loader
28 void operator()(const std::string &kw, PostProcLoader &ldr) const { ldr.add(kw, &PostProcLoader::postprocessor<T>); }
32 RefPtr<PostProcessor::Template> postproc;
37 PostProcessor::Template *get_postprocessor_template() { return postproc.release(); }
40 virtual void postprocessor_loaded() { }
46 friend class SequenceTemplate;
50 class Loader: public DataFile::CollectionObjectLoader<SequenceTemplate, Resources>, public PostProcLoader
53 Loader(SequenceTemplate &, Collection &);
56 virtual void postprocessor_loaded();
58 void multisample(unsigned);
59 void multisample_range(unsigned, unsigned);
60 void postprocessor(const std::string &);
61 void step(const std::string &);
62 void step_with_slot(const std::string &, const std::string &);
67 class Loader: public DataFile::CollectionObjectLoader<Step>
70 std::string inline_base_name;
73 Loader(Step &, Collection &);
75 void set_inline_base_name(const std::string &);
79 void depth_compare(Predicate);
80 void lighting(const std::string &);
81 void lighting_inline();
82 void object(const std::string &);
83 void scene(const std::string &);
88 const Lighting *lighting = 0;
90 StencilTest stencil_test;
91 std::string slot_name;
92 Renderable *default_renderable = 0;
97 GL::PostProcessor::Template *postprocessor_template;
98 std::string slot_name;
100 PostProcessor(GL::PostProcessor::Template * = 0);
104 class ClearLoader: public DataFile::ObjectLoader<SequenceTemplate>
107 ClearLoader(SequenceTemplate &);
110 void color(float, float, float, float);
115 typedef TypeRegistry<PostProcLoader::AddPostProc, PostProcLoader &> PostProcessorRegistry;
119 unsigned required_multisample = 0;
120 unsigned max_multisample = 0;
121 std::vector<Step> steps;
122 std::vector<PostProcessor> postprocessors;
123 bool clear_enabled = false;
124 std::vector<Color> clear_colors;
125 float clear_depth = 1.0f;
126 int clear_stencil = 0;
131 bool get_hdr() const { return hdr; }
132 bool get_alpha() const { return alpha; }
133 unsigned get_required_multisample() const { return required_multisample; }
134 unsigned get_maximum_multisample() const { return max_multisample; }
135 const std::vector<Step> &get_steps() const { return steps; }
136 const std::vector<PostProcessor> &get_postprocessors() const { return postprocessors; }
137 bool is_clear_enabled() const { return clear_enabled; }
138 const std::vector<Color> &get_clear_colors() const { return clear_colors; }
139 float get_clear_depth() const { return clear_depth; }
140 int get_clear_stencil() const { return clear_stencil; }
143 static void register_postprocessor(const std::string &);
145 static PostProcessorRegistry &get_postprocessor_registry();
149 void SequenceTemplate::register_postprocessor(const std::string &kw)
151 get_postprocessor_registry().register_type<T>(kw);
155 void SequenceTemplate::PostProcLoader::postprocessor()
158 throw std::logic_error("Only one postprocessor allowed per slot");
159 RefPtr<typename T::Template> pp = new typename T::Template;
163 postprocessor_loaded();