PipelineTemplate::PipelineTemplate():
hdr(false),
+ alpha(false),
required_multisample(0),
max_multisample(0)
{ }
PipelineTemplate::~PipelineTemplate()
{
for(PostProcessorArray::iterator i=postprocessors.begin(); i!=postprocessors.end(); ++i)
- delete *i;
+ delete i->postprocessor_template;
+}
+
+
+PipelineTemplate::PostProcessorRegistry &PipelineTemplate::get_postprocessor_registry()
+{
+ static PostProcessorRegistry registry;
+ static bool initialized = false;
+ if(!initialized)
+ {
+ registry.register_type<AmbientOcclusion>("ambient_occlusion");
+ registry.register_type<Bloom>("bloom");
+ registry.register_type<ColorCurve>("colorcurve");
+ initialized = true;
+ }
+ return registry;
}
{ }
+PipelineTemplate::PostProcessor::PostProcessor(GL::PostProcessor::Template *ppt):
+ postprocessor_template(ppt)
+{ }
+
+
+PipelineTemplate::PostProcLoader::PostProcLoader()
+{
+ get_postprocessor_registry().add_all(*this);
+}
+
+
PipelineTemplate::Loader::Loader(PipelineTemplate &t):
DataFile::CollectionObjectLoader<PipelineTemplate>(t, 0)
{
void PipelineTemplate::Loader::init()
{
- add("ambient_occlusion", &Loader::postprocessor<AmbientOcclusion>);
- add("bloom", &Loader::postprocessor<Bloom>);
- add("colorcurve", &Loader::postprocessor<ColorCurve>);
add("hdr", &PipelineTemplate::hdr);
+ add("alpha", &PipelineTemplate::alpha);
add("multisample", &Loader::multisample);
add("multisample", &Loader::multisample_range);
add("pass", &Loader::pass);
+ add("postprocessor", &Loader::postprocessor);
+}
+
+void PipelineTemplate::Loader::postprocessor_loaded()
+{
+ obj.postprocessors.push_back(get_postprocessor_template());
}
void PipelineTemplate::Loader::multisample(unsigned samples)
obj.passes.push_back(pss);
}
-template<typename T>
-void PipelineTemplate::Loader::postprocessor()
+void PipelineTemplate::Loader::postprocessor(const std::string &slot)
{
- RefPtr<typename T::Template> postproc = new typename T::Template;
- load_sub(*postproc);
- obj.postprocessors.push_back(postproc.release());
+ PostProcLoader ldr;
+ load_sub_with(ldr);
+ PostProcessor pp;
+ pp.postprocessor_template = ldr.get_postprocessor_template();
+ pp.slot_name = slot;
+ obj.postprocessors.push_back(pp);
}
void PipelineTemplate::Pass::Loader::blend_predefined(const string &name)
{
- const Blend *blend = 0;
+ const Blend *bln = 0;
if(name=="alpha")
- blend = &Blend::alpha();
+ bln = &Blend::alpha();
else if(name=="additive")
- blend = &Blend::additive();
+ bln = &Blend::additive();
else if(name=="additive_alpha")
- blend = &Blend::additive_alpha();
+ bln = &Blend::additive_alpha();
else
throw key_error(name);
- obj.blend = blend;
+ obj.blend = bln;
obj.blend.keep();
}