X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipelinetemplate.h;h=a18eead4836401020a7a0e87d7abcaa2fbeee7cb;hb=c6604d0ee313f60b42b3a205c40ba7e1abbc3cb8;hp=56c4da19a0e9efb6eb28b9b4519195a3d0779933;hpb=18240e2bb031551e9c72a55c7d974904d209760a;p=libs%2Fgl.git diff --git a/source/pipelinetemplate.h b/source/pipelinetemplate.h index 56c4da19..a18eead4 100644 --- a/source/pipelinetemplate.h +++ b/source/pipelinetemplate.h @@ -3,6 +3,7 @@ #include #include +#include #include #include "blend.h" #include "postprocessor.h" @@ -16,8 +17,36 @@ class Lighting; class PipelineTemplate { +private: + class PostProcLoader: virtual public DataFile::Loader + { + private: + template + struct AddPostProc + { + static void add(PostProcLoader &ldr, const std::string &kw) { ldr.add(kw, &PostProcLoader::postprocessor); } + }; + + protected: + RefPtr postproc; + + public: + PostProcLoader(); + + PostProcessor::Template *get_postprocessor_template() { return postproc.release(); } + + protected: + virtual void postprocessor_loaded() { } + + private: + template + void postprocessor(); + + friend class PipelineTemplate; + }; + public: - class Loader: public DataFile::CollectionObjectLoader + class Loader: public DataFile::CollectionObjectLoader, public PostProcLoader { public: Loader(PipelineTemplate &); @@ -25,12 +54,11 @@ public: private: void init(); + virtual void postprocessor_loaded(); void multisample(unsigned); void multisample_range(unsigned, unsigned); void pass(const std::string &, const std::string &); - - template - void postprocessor(); + void postprocessor(const std::string &); }; struct Pass @@ -63,10 +91,20 @@ public: ~Pass(); }; + struct PostProcessor + { + GL::PostProcessor::Template *postprocessor_template; + std::string slot_name; + + PostProcessor(GL::PostProcessor::Template * = 0); + }; + typedef std::vector PassArray; - typedef std::vector PostProcessorArray; + typedef std::vector PostProcessorArray; private: + typedef DataFile::LoadableTypeRegistry PostProcessorRegistry; + bool hdr; unsigned required_multisample; unsigned max_multisample; @@ -75,14 +113,38 @@ private: public: PipelineTemplate(); + ~PipelineTemplate(); bool get_hdr() const { return hdr; } unsigned get_required_multisample() const { return required_multisample; } unsigned get_maximum_multisample() const { return max_multisample; } const PassArray &get_passes() const { return passes; } const PostProcessorArray &get_postprocessors() const { return postprocessors; } + + template + static void register_postprocessor(const std::string &); +private: + static PostProcessorRegistry &get_postprocessor_registry(); }; +template +void PipelineTemplate::register_postprocessor(const std::string &kw) +{ + get_postprocessor_registry().register_type(kw); +} + +template +void PipelineTemplate::PostProcLoader::postprocessor() +{ + if(postproc) + throw std::logic_error("Only one postprocessor allowed per slot"); + RefPtr pp = new typename T::Template; + load_sub(*pp); + postproc = pp; + pp = 0; + postprocessor_loaded(); +} + } // namespace GL } // namespace Msp