-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2009 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#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.
+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:
- /**
- Renders the effect. Takes the source texture as a parameter.
- */
- virtual void render(const Texture2D &) =0;
+ 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