]> git.tdb.fi Git - libs/gl.git/blobdiff - source/pipelinetemplate.h
Add an alpha channel flag to Pipeline
[libs/gl.git] / source / pipelinetemplate.h
index cdf73ac7c01c465764464863218e2ff5cc67db6b..fb24ea29df547f468ff05ba142631c7bd215107d 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include <msp/datafile/loadabletyperegistry.h>
 #include <msp/datafile/objectloader.h>
 #include "blend.h"
 #include "postprocessor.h"
@@ -16,8 +17,36 @@ class Lighting;
 
 class PipelineTemplate
 {
+private:
+       class PostProcLoader: virtual public DataFile::Loader
+       {
+       private:
+               template<typename T>
+               struct AddPostProc
+               {
+                       static void add(PostProcLoader &ldr, const std::string &kw) { ldr.add(kw, &PostProcLoader::postprocessor<T>); }
+               };
+
+       protected:
+               RefPtr<PostProcessor::Template> postproc;
+
+       public:
+               PostProcLoader();
+
+               PostProcessor::Template *get_postprocessor_template() { return postproc.release(); }
+
+       protected:
+               virtual void postprocessor_loaded() { }
+
+       private:
+               template<typename T>
+               void postprocessor();
+
+               friend class PipelineTemplate;
+       };
+
 public:
-       class Loader: public DataFile::CollectionObjectLoader<PipelineTemplate>
+       class Loader: public DataFile::CollectionObjectLoader<PipelineTemplate>, 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<typename T>
-               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<Pass> PassArray;
-       typedef std::vector<PostProcessor::Template *> PostProcessorArray;
+       typedef std::vector<PostProcessor> PostProcessorArray;
 
 private:
+       typedef DataFile::LoadableTypeRegistry<PostProcLoader, PostProcLoader::AddPostProc> 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<typename T>
+       static void register_postprocessor(const std::string &);
+private:
+       static PostProcessorRegistry &get_postprocessor_registry();
 };
 
+template<typename T>
+void PipelineTemplate::register_postprocessor(const std::string &kw)
+{
+       get_postprocessor_registry().register_type<T>(kw);
+}
+
+template<typename T>
+void PipelineTemplate::PostProcLoader::postprocessor()
+{
+       if(postproc)
+               throw std::logic_error("Only one postprocessor allowed per slot");
+       RefPtr<typename T::Template> pp = new typename T::Template;
+       load_sub(*pp);
+       postproc = pp;
+       pp = 0;
+       postprocessor_loaded();
+}
+
 } // namespace GL
 } // namespace Msp