X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipelinetemplate.h;h=fb24ea29df547f468ff05ba142631c7bd215107d;hb=2341b3575c874b1960814264fa759ad584bf3134;hp=d98633539e06dff0dac89b3ef71d5f1478243676;hpb=e16855bccb78c721e2fe3f2ea8fc0310e041cb43;p=libs%2Fgl.git diff --git a/source/pipelinetemplate.h b/source/pipelinetemplate.h index d9863353..fb24ea29 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,13 +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; + typedef DataFile::LoadableTypeRegistry PostProcessorRegistry; bool hdr; + bool alpha; unsigned required_multisample; unsigned max_multisample; PassArray passes; @@ -90,6 +117,7 @@ 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; } @@ -108,11 +136,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