Add an alpha channel flag to Pipeline
authorMikko Rasa <tdb@tdb.fi>
Sat, 27 Jul 2019 23:05:05 +0000 (02:05 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 27 Jul 2019 23:05:05 +0000 (02:05 +0300)
source/pipeline.cpp
source/pipeline.h
source/pipelinebuilder.cpp
source/pipelinetemplate.cpp
source/pipelinetemplate.h

index 53b51d7924bc91cfeb6b8c4e84ef6cf24134061a..fa06fc5c0a985021a20353b1752cb849664e2a59 100644 (file)
@@ -38,6 +38,7 @@ void Pipeline::init(unsigned w, unsigned h)
        width = w;
        height = h;
        hdr = false;
+       alpha = false;
        samples = 0;
        target_ms = 0;
        target[0] = 0;
@@ -69,6 +70,24 @@ void Pipeline::set_hdr(bool h)
        }
 }
 
+void Pipeline::set_alpha(bool a)
+{
+       if(a==alpha)
+               return;
+
+       bool old_alpha = alpha;
+       alpha = a;
+       try
+       {
+               create_targets(2);
+       }
+       catch(...)
+       {
+               alpha = old_alpha;
+               throw;
+       }
+}
+
 void Pipeline::set_multisample(unsigned s)
 {
        if(s==samples)
@@ -269,7 +288,7 @@ void Pipeline::create_targets(unsigned recreate)
                target_ms = 0;
        }
 
-       PixelFormat color_pf = (hdr ? RGB16F : RGB);
+       PixelFormat color_pf = (hdr ? (alpha ? RGBA16F : RGB16F) : (alpha ? RGBA : RGB));
        RenderTargetFormat fmt = (RENDER_COLOR,color_pf, RENDER_DEPTH);
        if(!postproc.empty() || samples)
        {
index 0d38aaec40181ca402b896c1bf5a4530cb266fb7..e8ffaf5ee46f3bcc3500143769e9c4ab2744ab42 100644 (file)
@@ -80,6 +80,7 @@ private:
        unsigned width;
        unsigned height;
        bool hdr;
+       bool alpha;
        unsigned samples;
        RenderTarget *target[2];
        RenderTarget *target_ms;
@@ -97,6 +98,10 @@ public:
        A ColorCurve postprocessor is recommended for full benefit. */
        void set_hdr(bool);
 
+       /* Enable or disable alpha channel.  When enabled, all render targets are
+       created with an RGBA pixel format instead of RGB. */
+       void set_alpha(bool);
+
        void set_multisample(unsigned);
 
        unsigned get_width() const { return width; }
index fcd5efbc18a6b3829d870465747f90800cbd0494..51e9cc855f8b73d1cb7b4cd49f616a4cc3faea58 100644 (file)
@@ -36,6 +36,7 @@ void PipelineBuilder::set_postprocessor(const string &name, PostProcessor &pproc
 void PipelineBuilder::build(Pipeline &pipeline) const
 {
        pipeline.set_hdr(tmpl.get_hdr());
+       pipeline.set_alpha(tmpl.get_alpha());
        unsigned samples = min(tmpl.get_maximum_multisample(), Renderbuffer::get_max_samples());
        if(samples<tmpl.get_required_multisample())
                throw invalid_operation("PipelineBuilder::build");
index 14f6e2c024eed34fc123112161b15465e3f60cb5..b78b4c40a2fca807017fbbbc29b182408e8f0533 100644 (file)
@@ -15,6 +15,7 @@ namespace GL {
 
 PipelineTemplate::PipelineTemplate():
        hdr(false),
+       alpha(false),
        required_multisample(0),
        max_multisample(0)
 { }
@@ -71,6 +72,7 @@ PipelineTemplate::Loader::Loader(PipelineTemplate &t, Collection &c):
 void PipelineTemplate::Loader::init()
 {
        add("hdr", &PipelineTemplate::hdr);
+       add("alpha", &PipelineTemplate::alpha);
        add("multisample", &Loader::multisample);
        add("multisample", &Loader::multisample_range);
        add("pass", &Loader::pass);
index a18eead4836401020a7a0e87d7abcaa2fbeee7cb..fb24ea29df547f468ff05ba142631c7bd215107d 100644 (file)
@@ -106,6 +106,7 @@ private:
        typedef DataFile::LoadableTypeRegistry<PostProcLoader, PostProcLoader::AddPostProc> PostProcessorRegistry;
 
        bool hdr;
+       bool alpha;
        unsigned required_multisample;
        unsigned max_multisample;
        PassArray passes;
@@ -116,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; }