X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.h;h=e8ffaf5ee46f3bcc3500143769e9c4ab2744ab42;hp=c14245fa9d83b81c637c4fc530223db9477ea3a0;hb=39488946c441f4007396e438f522609a8b2943ce;hpb=5eb4e7ebd0dc36bc0d9817dedcc152f3bd581f70 diff --git a/source/pipeline.h b/source/pipeline.h index c14245fa..e8ffaf5e 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -3,20 +3,36 @@ #include #include +#include "framebuffer.h" #include "renderable.h" +#include "renderbuffer.h" +#include "rendertarget.h" +#include "texture2d.h" namespace Msp { namespace GL { class Blend; class Camera; +class Clipping; class DepthTest; -class Framebuffer; class Lighting; class PostProcessor; -class Renderbuffer; -class Texture2D; +class View; +/** +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 +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 +the PostProcessors. High dynamic range and multisample rendering can be +requested for increased quality. +*/ class Pipeline: public Renderable { public: @@ -27,27 +43,32 @@ public: const Lighting *lighting; const DepthTest *depth_test; const Blend *blend; + const Clipping *clipping; + Renderable *renderable; public: - Pass(const Tag &); + Pass(const Tag &, Renderable *); const Tag &get_tag() const { return tag; } void set_lighting(const Lighting *); void set_depth_test(const DepthTest *); void set_blend(const Blend *); + void set_clipping(const Clipping *); const Lighting *get_lighting() const { return lighting; } const DepthTest *get_depth_test() const { return depth_test; } const Blend *get_blend() const { return blend; } + const Clipping *get_clipping() const { return clipping; } + Renderable *get_renderable() const { return renderable; } }; private: struct Slot { - const Renderable *renderable; + Renderable *renderable; std::set passes; - Slot(const Renderable *); + Slot(Renderable *); }; typedef std::list PassList; @@ -55,38 +76,70 @@ private: PassList passes; const Camera *camera; std::vector renderables; - std::vector postproc; + std::vector > postproc; unsigned width; unsigned height; bool hdr; + bool alpha; unsigned samples; - Framebuffer *fbo; - Texture2D *color_buf; - Texture2D *depth_buf; - Framebuffer *fbo_ms; - Renderbuffer *color_buf_ms; - Renderbuffer *depth_buf_ms; + RenderTarget *target[2]; + RenderTarget *target_ms; public: Pipeline(unsigned, unsigned, bool = false); + Pipeline(const View &); + Pipeline(const Framebuffer &); +private: + void init(unsigned, unsigned); +public: ~Pipeline(); + /* Sets high dynamic range mode. Requires floating-point texture support. + 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); - 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 + void set_camera(const Camera *); Pass &add_pass(const Tag &tag); + 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. */ + Pass &add_pass(const Tag &, Renderable &); - void add_renderable(const Renderable &); - void add_renderable_for_pass(const Renderable &, const Tag &); - void remove_renderable(const Renderable &); + /** Adds a postprocessor to the pipeline. */ void add_postprocessor(PostProcessor &); - virtual void render(const Tag &tag = Tag()) 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(); + + void render(); virtual void render(Renderer &, const Tag &tag = Tag()) const; private: - void create_fbos(); + void create_targets(unsigned); }; } // namespace GL