#define MSP_GL_SEQUENCE_H_
#include <vector>
-#include "blend.h"
+#include "color.h"
#include "depthtest.h"
#include "frameformat.h"
#include "renderable.h"
const Lighting *lighting;
DepthTest depth_test;
StencilTest stencil_test;
- Blend blend;
Renderable *renderable;
public:
void set_lighting(const Lighting *);
void set_depth_test(const DepthTest &);
void set_stencil_test(const StencilTest &);
- void set_blend(const Blend &);
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; }
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<Step> steps;
- std::vector<PostProcStep> postproc;
+ std::vector<PostProcessor *> postproc;
unsigned width = 0;
unsigned height = 0;
FrameFormat target_format;
std::vector<Color> clear_colors;
float clear_depth = 1.0f;
int clear_stencil = 0;
+ std::vector<OwnedObject> owned_data;
+
+ static Tag noclear_tag;
public:
Sequence() = default;
Renderable multiple times. */
Step &add_step(Tag, Renderable &);
+ const std::vector<Step> &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<PostProcessor *> &get_postprocessors() const { return postproc; }
-private:
- void add_postprocessor(PostProcessor *, bool);
+ /** Adds an owned object, which will be deleted together with the sequence. */
+ template<typename T>
+ void add_owned(T *p)
+ { owned_data.push_back({ p, [](void *ptr){ delete static_cast<T *>(ptr); } }); }
-public:
virtual void setup_frame(Renderer &);
virtual void finish_frame();