]> git.tdb.fi Git - libs/gl.git/blobdiff - source/pipeline.h
Add an alpha channel flag to Pipeline
[libs/gl.git] / source / pipeline.h
index e3f95994defff957a831987716901620aab94ad1..e8ffaf5ee46f3bcc3500143769e9c4ab2744ab42 100644 (file)
@@ -18,23 +18,15 @@ class Clipping;
 class DepthTest;
 class Lighting;
 class PostProcessor;
 class DepthTest;
 class Lighting;
 class PostProcessor;
+class View;
 
 /**
 
 /**
-Encapsulates all of the information used to produce a complete image in the
-framebuffer.  This is the highest level rendering class.
+Top-level content class.  Typically a Pipeline is used as the content
+Renderable for a View or effects such as ShadowMap or EnvironmentMap.
 
 A Pipeline contains a sequence of passes.  Each pass has a Renderable along
 with Lighting, Clipping, DepthTest and Blend states.  Scenes can be used to
 
 A Pipeline contains a sequence of passes.  Each pass has a Renderable along
 with Lighting, Clipping, DepthTest and Blend states.  Scenes can be used to
-organize Renderables within a pass.  A Camera can be specified for the entire
-Pipeline.
-
-A Pipeline is also a Renderable itself.  It will only respond to the default
-pass.  The Renderables within the Pipeline will be invoked with whatever tags
-were specified when adding them.
-
-A Pipeline's render method should normally be called without a Renderer; it
-will create one itself, using the camera specified for the Pipeline.  If a
-Renderer is passed, its camera will be used instead.
+organize Renderables within a pass.
 
 PostProcessors can be applied after all of the passes in the Pipeline have been
 rendered.  Framebuffer objects are automatically used to pass render results to
 
 PostProcessors can be applied after all of the passes in the Pipeline have been
 rendered.  Framebuffer objects are automatically used to pass render results to
@@ -52,10 +44,10 @@ public:
                const DepthTest *depth_test;
                const Blend *blend;
                const Clipping *clipping;
                const DepthTest *depth_test;
                const Blend *blend;
                const Clipping *clipping;
-               const Renderable *renderable;
+               Renderable *renderable;
 
        public:
 
        public:
-               Pass(const Tag &, const Renderable *);
+               Pass(const Tag &, Renderable *);
 
                const Tag &get_tag() const { return tag; }
 
 
                const Tag &get_tag() const { return tag; }
 
@@ -67,16 +59,16 @@ public:
                const DepthTest *get_depth_test() const { return depth_test; }
                const Blend *get_blend() const { return blend; }
                const Clipping *get_clipping() const { return clipping; }
                const DepthTest *get_depth_test() const { return depth_test; }
                const Blend *get_blend() const { return blend; }
                const Clipping *get_clipping() const { return clipping; }
-               const Renderable *get_renderable() const { return renderable; }
+               Renderable *get_renderable() const { return renderable; }
        };
 
 private:
        struct Slot
        {
        };
 
 private:
        struct Slot
        {
-               const Renderable *renderable;
+               Renderable *renderable;
                std::set<Tag> passes;
 
                std::set<Tag> passes;
 
-               Slot(const Renderable *);
+               Slot(Renderable *);
        };
 
        typedef std::list<Pass> PassList;
        };
 
        typedef std::list<Pass> PassList;
@@ -84,40 +76,66 @@ private:
        PassList passes;
        const Camera *camera;
        std::vector<Slot> renderables;
        PassList passes;
        const Camera *camera;
        std::vector<Slot> renderables;
-       std::vector<PostProcessor *> postproc;
+       std::vector<RefPtr<PostProcessor> > postproc;
        unsigned width;
        unsigned height;
        bool hdr;
        unsigned width;
        unsigned height;
        bool hdr;
+       bool alpha;
        unsigned samples;
        RenderTarget *target[2];
        RenderTarget *target_ms;
        unsigned samples;
        RenderTarget *target[2];
        RenderTarget *target_ms;
-       mutable bool in_frame;
 
 public:
        Pipeline(unsigned, unsigned, bool = false);
 
 public:
        Pipeline(unsigned, unsigned, bool = false);
+       Pipeline(const View &);
+       Pipeline(const Framebuffer &);
+private:
+       void init(unsigned, unsigned);
+public:
        ~Pipeline();
 
        ~Pipeline();
 
+       /* Sets high dynamic range mode.  Requires floating-point texture support.
+       A ColorCurve postprocessor is recommended for full benefit. */
        void set_hdr(bool);
        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);
        void set_multisample(unsigned);
-       void set_camera(const Camera *);
+
+       unsigned get_width() const { return width; }
+       unsigned get_height() const { return height; }
+       bool get_hdr() const { return hdr; }
+       unsigned get_multisample() const { return samples; }
 
        // Deprecated
 
        // Deprecated
+       void set_camera(const Camera *);
        Pass &add_pass(const Tag &tag);
        Pass &add_pass(const Tag &tag);
-       void add_renderable(const Renderable &);
-       void add_renderable_for_pass(const Renderable &, const Tag &);
-       void remove_renderable(const Renderable &);
+       void add_renderable(Renderable &);
+       void add_renderable_for_pass(Renderable &, const Tag &);
+       void remove_renderable(Renderable &);
 
        /** Adds a pass to the pipeline.  It's permissible to add the same
        Renderable multiple times. */
 
        /** Adds a pass to the pipeline.  It's permissible to add the same
        Renderable multiple times. */
-       Pass &add_pass(const Tag &, const Renderable &);
+       Pass &add_pass(const Tag &, Renderable &);
 
        /** Adds a postprocessor to the pipeline. */
        void add_postprocessor(PostProcessor &);
 
 
        /** Adds a postprocessor to the pipeline. */
        void add_postprocessor(PostProcessor &);
 
-       virtual void setup_frame() const;
-       virtual void finish_frame() const;
+       /** Adds a postprocessor to the pipeline, transferring ownership.  The
+       postprocessor will be deleted together with with pipeline.  It is also
+       deleted if this call throws an exception. */
+       void add_postprocessor_owned(PostProcessor *);
+
+private:
+       void add_postprocessor(PostProcessor *, bool);
+
+public:
+       virtual void setup_frame(Renderer &);
+       virtual void finish_frame();
 
 
-       virtual void render(const Tag &tag = Tag()) const;
+       void render();
        virtual void render(Renderer &, const Tag &tag = Tag()) const;
 
 private:
        virtual void render(Renderer &, const Tag &tag = Tag()) const;
 
 private: