X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipeline.h;h=1e5b6aa4c9894529e44cb0094c5b9a08837b01e6;hb=0ab875bdc9fbf84ecfce883b188410bb45882447;hp=d07e643176666f861e55dcb75a65f0de28b73021;hpb=aa7955f9adfab4395b00fba84fa2d7c286a83c70;p=libs%2Fgl.git diff --git a/source/pipeline.h b/source/pipeline.h index d07e6431..1e5b6aa4 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -6,6 +6,7 @@ #include "framebuffer.h" #include "renderable.h" #include "renderbuffer.h" +#include "rendertarget.h" #include "texture2d.h" namespace Msp { @@ -19,21 +20,12 @@ class Lighting; class PostProcessor; /** -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 -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 @@ -51,10 +43,10 @@ public: const DepthTest *depth_test; const Blend *blend; const Clipping *clipping; - const Renderable *renderable; + Renderable *renderable; public: - Pass(const Tag &, const Renderable *); + Pass(const Tag &, Renderable *); const Tag &get_tag() const { return tag; } @@ -66,34 +58,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 Renderable *get_renderable() const { return renderable; } + Renderable *get_renderable() const { return renderable; } }; private: struct Slot { - const Renderable *renderable; + Renderable *renderable; std::set passes; - Slot(const Renderable *); - }; - - struct RenderTarget - { - Framebuffer fbo; - Texture2D color; - Texture2D depth; - - RenderTarget(unsigned, unsigned, PixelFormat); - }; - - struct MultisampleTarget - { - Framebuffer fbo; - Renderbuffer color; - Renderbuffer depth; - - MultisampleTarget(unsigned, unsigned, unsigned, PixelFormat); + Slot(Renderable *); }; typedef std::list PassList; @@ -107,8 +81,7 @@ private: bool hdr; unsigned samples; RenderTarget *target[2]; - MultisampleTarget *target_ms; - mutable bool in_frame; + RenderTarget *target_ms; public: Pipeline(unsigned, unsigned, bool = false); @@ -116,25 +89,25 @@ public: void set_hdr(bool); void set_multisample(unsigned); - void set_camera(const Camera *); // Deprecated + void set_camera(const Camera *); 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. */ - Pass &add_pass(const Tag &, const Renderable &); + Pass &add_pass(const Tag &, Renderable &); /** Adds a postprocessor to the pipeline. */ void add_postprocessor(PostProcessor &); - virtual void setup_frame() const; - virtual void finish_frame() const; + 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: