X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipelinetemplate.h;fp=source%2Fpipelinetemplate.h;h=a18eead4836401020a7a0e87d7abcaa2fbeee7cb;hp=d98633539e06dff0dac89b3ef71d5f1478243676;hb=e85d8669d6c389ded738c7b536f83ea54176662f;hpb=c3b339da673601c283abf9222b5e8f66ba80a688 diff --git a/source/pipelinetemplate.h b/source/pipelinetemplate.h index d9863353..a18eead4 100644 --- a/source/pipelinetemplate.h +++ b/source/pipelinetemplate.h @@ -17,30 +17,48 @@ class Lighting; class PipelineTemplate { -public: - class Loader: public DataFile::CollectionObjectLoader +private: + class PostProcLoader: virtual public DataFile::Loader { private: template struct AddPostProc { - static void add(Loader &ldr, const std::string &kw) { ldr.add(kw, &Loader::postprocessor); } + 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, public PostProcLoader + { public: Loader(PipelineTemplate &); Loader(PipelineTemplate &, Collection &); 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(); - - friend class PipelineTemplate; + void postprocessor(const std::string &); }; struct Pass @@ -73,11 +91,19 @@ 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; + typedef DataFile::LoadableTypeRegistry PostProcessorRegistry; bool hdr; unsigned required_multisample; @@ -108,11 +134,15 @@ void PipelineTemplate::register_postprocessor(const std::string &kw) } template -void PipelineTemplate::Loader::postprocessor() +void PipelineTemplate::PostProcLoader::postprocessor() { - RefPtr postproc = new typename T::Template; - load_sub(*postproc); - obj.postprocessors.push_back(postproc.release()); + 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