X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fpipeline.h;h=0d38aaec40181ca402b896c1bf5a4530cb266fb7;hp=9272f5875add3d1605fc6cd33657997552d95fd9;hb=698e78ecfa30cc3580050996bc236c3ebe65aa2a;hpb=7791ca3eac17e355d1de508b1730dc854ed7712d diff --git a/source/pipeline.h b/source/pipeline.h index 9272f587..0d38aaec 100644 --- a/source/pipeline.h +++ b/source/pipeline.h @@ -18,6 +18,7 @@ class Clipping; class DepthTest; class Lighting; class PostProcessor; +class View; /** Top-level content class. Typically a Pipeline is used as the content @@ -43,10 +44,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; } @@ -58,16 +59,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 *); + Slot(Renderable *); }; typedef std::list PassList; @@ -75,7 +76,7 @@ private: PassList passes; const Camera *camera; std::vector renderables; - std::vector postproc; + std::vector > postproc; unsigned width; unsigned height; bool hdr; @@ -85,29 +86,51 @@ private: public: 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(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; + /** 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(); - virtual void render(const Tag &tag = Tag()) const; + void render(); virtual void render(Renderer &, const Tag &tag = Tag()) const; private: