--- /dev/null
+#ifndef MSP_GL_POSTPROCESSOR_H_
+#define MSP_GL_POSTPROCESSOR_H_
+
+#include <msp/datafile/objectloader.h>
+
+namespace Msp {
+namespace GL {
+
+class Mesh;
+class Renderer;
+class Sampler;
+class Shader;
+class Texture2D;
+
+/**
+Base class for post-processing effects. Post-processors receive the contents
+of the entire framebuffer as a texture and render it back, altering it in the
+process.
+*/
+class PostProcessor
+{
+public:
+ struct Template
+ {
+ class Loader: public Msp::DataFile::ObjectLoader<Template>
+ {
+ public:
+ Loader(Template &);
+ };
+
+ unsigned size_divisor;
+
+ Template();
+ virtual ~Template() { }
+
+ virtual PostProcessor *create(unsigned, unsigned) const = 0;
+ };
+
+private:
+ static WeakPtr<Mesh> fullscreen_quad;
+ static WeakPtr<Sampler> nearest_sampler;
+ static WeakPtr<Sampler> linear_sampler;
+
+protected:
+ PostProcessor() { }
+public:
+ virtual ~PostProcessor() { }
+
+ /// Renders the effect.
+ virtual void render(const Texture2D &, const Texture2D &) { }
+
+ virtual void render(Renderer &, const Texture2D &, const Texture2D &);
+
+protected:
+ /** Returns a mesh consisting of a single quad, covering the entire screen.
+ The vertices are in normalized device coordinates. */
+ static RefPtr<Mesh> get_fullscreen_quad();
+
+ static RefPtr<Sampler> get_nearest_sampler();
+ static RefPtr<Sampler> get_linear_sampler();
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif