X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpipeline.h;h=f8fdb5450b18d42eb621ff0fb80141918b9ecbc8;hb=904de4f7fd994886adbd3a6c03bc1b7c14ebc562;hp=19bea10a641d9664992013758b1c17a5ec709243;hpb=e17243fb2421977cb781361828b77718e2cf8d48;p=libs%2Fgl.git diff --git a/source/pipeline.h b/source/pipeline.h index 19bea10a..f8fdb545 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -1,56 +1,128 @@ -/* $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 "pipelinepass.h" +#include +#include "framebuffer.h" #include "renderable.h" +#include "renderbuffer.h" +#include "texture2d.h" namespace Msp { namespace GL { -class Effect; -class Framebuffer; +class Blend; +class Camera; +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, combining Renderables +with a camera, lights and some other influential objects. + +A Pipeline is also a Renderable itself. Externally, it only exposes the +default pass. Internally, it can hold any number of passes, which are invoked +in sequence when rendering the default pass is requested. Each pass can have a +Lighting, a DepthTest and a Blend to control how it is rendered. + +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. + +Renderables are rendered in the order they were added to the Pipeline. While +it's possible to remove renderables as well, using a Scene is recommended if +frequent add/remove operations are needed. + +Pipelines may have post-processors to apply full-screen effects. Framebuffer +objects are automatically used to pass render results to the post-processors. +High dynamic range and multisample rendering can also be used. +*/ class Pipeline: public Renderable { +public: + class Pass + { + private: + Tag tag; + const Lighting *lighting; + const DepthTest *depth_test; + const Blend *blend; + + public: + Pass(const Tag &); + + const Tag &get_tag() const { return tag; } + + void set_lighting(const Lighting *); + void set_depth_test(const DepthTest *); + void set_blend(const Blend *); + const Lighting *get_lighting() const { return lighting; } + const DepthTest *get_depth_test() const { return depth_test; } + const Blend *get_blend() const { return blend; } + }; + private: - std::map passes; - std::vector pass_order; - std::vector renderables; - std::vector effects; + struct Slot + { + const 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); + }; + + typedef std::list PassList; + + PassList passes; + const Camera *camera; + std::vector renderables; std::vector postproc; unsigned width; unsigned height; bool hdr; - Framebuffer *fbo; - Texture2D *color_buf; - Renderbuffer *depth_buf; + unsigned samples; + RenderTarget *target[2]; + MultisampleTarget *target_ms; public: - Pipeline(unsigned, unsigned, bool); + Pipeline(unsigned, unsigned, bool = false); ~Pipeline(); - PipelinePass &add_pass(const Tag &tag); - PipelinePass &get_pass(const Tag &tag); - const PipelinePass &get_pass(const Tag &tag) const; - virtual bool has_pass(const Tag &tag) const; + void set_hdr(bool); + void set_multisample(unsigned); + void set_camera(const Camera *); + + Pass &add_pass(const Tag &tag); void add_renderable(const Renderable &); - void add_effect(Effect &); + void add_renderable_for_pass(const Renderable &, const Tag &); + void remove_renderable(const Renderable &); void add_postprocessor(PostProcessor &); - virtual void render(const Tag &tag=Tag()) const; - void render_all() const; + virtual void render(const Tag &tag = Tag()) const; + virtual void render(Renderer &, const Tag &tag = Tag()) const; + +private: + void create_targets(bool); }; } // namespace GL