X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.h;h=0d38aaec40181ca402b896c1bf5a4530cb266fb7;hp=a63eeb5f686a2deb4cd541e60cd0b05ab0a7101a;hb=e37d3b91500994df3de4fe47bd3d3e75d3104b46;hpb=c216893af147042e40c389e2530e71277c343044 diff --git a/source/pipeline.h b/source/pipeline.h index a63eeb5f..0d38aaec 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -1,72 +1,140 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2009 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 "rendertarget.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; +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: + class Pass + { + private: + Tag tag; + const Lighting *lighting; + const DepthTest *depth_test; + const Blend *blend; + const Clipping *clipping; + Renderable *renderable; + + public: + 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::map PassMap; + typedef std::list PassList; - PassMap passes; - std::vector pass_order; + PassList passes; const Camera *camera; std::vector renderables; - std::vector effects; - std::vector postproc; + std::vector > postproc; unsigned width; unsigned height; bool hdr; - Framebuffer *fbo; - Texture2D *color_buf; - Texture2D *depth_buf; + unsigned samples; + RenderTarget *target[2]; + RenderTarget *target_ms; public: - Pipeline(unsigned, unsigned, bool); + 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); + + void set_multisample(unsigned); + + 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 &); - PipelinePass &add_pass(const Tag &tag); - PipelinePass &get_pass(const Tag &tag); - const PipelinePass &get_pass(const Tag &tag) const; + /** 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 &); - void add_effect(Effect &); + /** Adds a postprocessor to the pipeline. */ void add_postprocessor(PostProcessor &); - virtual void render(const Tag &tag = Tag()) const; - void render_all() 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_targets(unsigned); }; } // namespace GL