X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fsequence.h;h=dd9fd8849b62b47f338970bdb9206f240c4470b6;hb=77a534371433054384d213922a2e8c55f8a69ad6;hp=ebdb55dd664636936ea9caea0c01de1a11c2a843;hpb=5bb193f930fb8738d099d630c4d625d82c1215b5;p=libs%2Fgl.git diff --git a/source/render/sequence.h b/source/render/sequence.h index ebdb55dd..dd9fd884 100644 --- a/source/render/sequence.h +++ b/source/render/sequence.h @@ -2,7 +2,7 @@ #define MSP_GL_SEQUENCE_H_ #include -#include "blend.h" +#include "color.h" #include "depthtest.h" #include "frameformat.h" #include "renderable.h" @@ -11,7 +11,6 @@ namespace Msp { namespace GL { -class Clipping; class Lighting; class PostProcessor; class RenderTarget; @@ -21,9 +20,9 @@ Top-level content class. Typically a Sequence is used as the content Renderable for a View or effects such as ShadowMap or EnvironmentMap. A Sequence consists of a number of steps. Each step is defined with a -Renderable and a tag to render it with and may also have Lighting, Clipping, -DepthTest and Blend states. Scenes can be used to further organize Renderables -within a step. +Renderable and a tag to render it with and may also have Lighting, DepthTest +and Blend states. Scenes can be used to further organize Renderables within a +step. PostProcessors can be applied after all of the steps in the Sequence have been processed. Framebuffer objects are automatically used to pass render results @@ -40,8 +39,6 @@ public: const Lighting *lighting; DepthTest depth_test; StencilTest stencil_test; - Blend blend; - const Clipping *clipping; Renderable *renderable; public: @@ -52,39 +49,38 @@ public: void set_lighting(const Lighting *); void set_depth_test(const DepthTest &); void set_stencil_test(const StencilTest &); - 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 StencilTest &get_stencil_test() const { return stencil_test; } - const Blend &get_blend() const { return blend; } - const Clipping *get_clipping() const { return clipping; } Renderable *get_renderable() const { return renderable; } }; private: - struct PostProcStep + struct OwnedObject { - PostProcessor *postproc; - bool owned; + void *pointer = 0; + void (*delete_func)(void *) = 0; - PostProcStep(PostProcessor *pp, bool o): postproc(pp), owned(o) { } + OwnedObject(void *p, void (*d)(void *)): pointer(p), delete_func(d) { } }; std::vector steps; - std::vector postproc; - unsigned width; - unsigned height; + std::vector postproc; + unsigned width = 0; + unsigned height = 0; FrameFormat target_format; - RenderTarget *target[2]; - RenderTarget *target_ms; - bool clear_enabled; + RenderTarget *target[2] = { 0, 0 }; + RenderTarget *target_ms = 0; + bool clear_enabled = false; std::vector clear_colors; - float clear_depth; - int clear_stencil; + float clear_depth = 1.0f; + int clear_stencil = 0; + std::vector owned_data; + + static Tag noclear_tag; public: - Sequence(); + Sequence() = default; Sequence(unsigned, unsigned, const FrameFormat &); ~Sequence(); @@ -101,18 +97,18 @@ public: Renderable multiple times. */ Step &add_step(Tag, Renderable &); + const std::vector &get_steps() const { return steps; } + /** Adds a postprocessor to the sequence. */ void add_postprocessor(PostProcessor &); - /** Adds a postprocessor to the sequence, transferring ownership. The - postprocessor will be deleted together with with sequence. It is also - deleted if this call throws an exception. */ - void add_postprocessor_owned(PostProcessor *); + const std::vector &get_postprocessors() const { return postproc; } -private: - void add_postprocessor(PostProcessor *, bool); + /** Adds an owned object, which will be deleted together with the sequence. */ + template + void add_owned(T *p) + { owned_data.push_back({ p, [](void *ptr){ delete static_cast(ptr); } }); } -public: virtual void setup_frame(Renderer &); virtual void finish_frame();