X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fpipeline.h;h=f6a4ab3371e7317dd904c66b3e7d3547c02a28c5;hb=dafd3a42a2f06bfd8e88f9240fc2f4bd3d401541;hp=d39bce5af9689523532412d05f3cff0eac75ec81;hpb=f48b68626a98c4a0b8991764d174eb57895e805f;p=libs%2Fgl.git diff --git a/source/pipeline.h b/source/pipeline.h index d39bce5a..f6a4ab33 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 { @@ -13,10 +14,24 @@ namespace GL { class Blend; class Camera; +class Clipping; class DepthTest; class Lighting; class PostProcessor; +/** +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,18 +42,23 @@ public: const Lighting *lighting; const DepthTest *depth_test; const Blend *blend; + const Clipping *clipping; + const Renderable *renderable; public: - Pass(const Tag &); + Pass(const Tag &, const 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; } + const Renderable *get_renderable() const { return renderable; } }; private: @@ -50,24 +70,6 @@ private: 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); - }; - typedef std::list PassList; PassList passes; @@ -79,7 +81,7 @@ private: bool hdr; unsigned samples; RenderTarget *target[2]; - MultisampleTarget *target_ms; + RenderTarget *target_ms; public: Pipeline(unsigned, unsigned, bool = false); @@ -87,20 +89,29 @@ 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 &); + + /** Adds a pass to the pipeline. It's permissible to add the same + Renderable multiple times. */ + Pass &add_pass(const Tag &, const Renderable &); + + /** Adds a postprocessor to the pipeline. */ void add_postprocessor(PostProcessor &); - virtual void render(const Tag &tag = Tag()) const; + virtual void setup_frame() const; + virtual void finish_frame() const; + + void render() const; virtual void render(Renderer &, const Tag &tag = Tag()) const; private: - void create_targets(bool); + void create_targets(unsigned); }; } // namespace GL