X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipeline.h;h=d07e643176666f861e55dcb75a65f0de28b73021;hb=3b159edbe4e80a2bc19c4c2fcd42cb996b9fbfe0;hp=f7f7e06ca198d84fe0a7b0aad583898f3eabd6cc;hpb=7f888de83aa5398fafaa7661547ee80395377b5c;p=libs%2Fgl.git diff --git a/source/pipeline.h b/source/pipeline.h index f7f7e06c..d07e6431 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -1,30 +1,74 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2009-2011 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GL_PIPELINE_H_ #define MSP_GL_PIPELINE_H_ #include #include -#include "pipelinepass.h" +#include "framebuffer.h" #include "renderable.h" +#include "renderbuffer.h" +#include "texture2d.h" namespace Msp { namespace GL { +class Blend; class Camera; -class Effect; -class Framebuffer; +class Clipping; +class DepthTest; +class Lighting; class PostProcessor; -class Renderbuffer; -class Texture2D; +/** +Encapsulates all of the information used to produce a complete image in the +framebuffer. This is the highest level rendering class. + +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. + +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: + class Pass + { + private: + Tag tag; + const Lighting *lighting; + const DepthTest *depth_test; + const Blend *blend; + const Clipping *clipping; + const Renderable *renderable; + + public: + 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: struct Slot { @@ -34,24 +78,37 @@ private: Slot(const Renderable *); }; - typedef std::map PassMap; + 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; - PassMap passes; - std::vector pass_order; + PassList passes; const Camera *camera; std::vector renderables; - std::vector effects; std::vector postproc; unsigned width; unsigned height; bool hdr; unsigned samples; - Framebuffer *fbo; - Texture2D *color_buf; - Texture2D *depth_buf; - Framebuffer *fbo_ms; - Renderbuffer *color_buf_ms; - Renderbuffer *depth_buf_ms; + RenderTarget *target[2]; + MultisampleTarget *target_ms; + mutable bool in_frame; public: Pipeline(unsigned, unsigned, bool = false); @@ -61,21 +118,27 @@ public: void set_multisample(unsigned); void set_camera(const Camera *); - PipelinePass &add_pass(const Tag &tag); - PipelinePass &get_pass(const Tag &tag); - const PipelinePass &get_pass(const Tag &tag) const; - + // Deprecated + 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_effect(Effect &); + + /** 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 setup_frame() const; + virtual void finish_frame() const; + + virtual void render(const Tag &tag = Tag()) const; virtual void render(Renderer &, const Tag &tag = Tag()) const; - void render_all() const; private: - void create_fbos(); + void create_targets(unsigned); }; } // namespace GL