X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipelinetemplate.h;h=fb24ea29df547f468ff05ba142631c7bd215107d;hp=cdf73ac7c01c465764464863218e2ff5cc67db6b;hb=39488946c441f4007396e438f522609a8b2943ce;hpb=59489e302517943f637bffea953671abc4e43cb6 diff --git a/source/pipelinetemplate.h b/source/pipelinetemplate.h index cdf73ac7..fb24ea29 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,11 +91,22 @@ 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; + bool alpha; unsigned required_multisample; unsigned max_multisample; PassArray passes; @@ -78,12 +117,36 @@ public: ~PipelineTemplate(); bool get_hdr() const { return hdr; } + bool get_alpha() const { return alpha; } 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