]> git.tdb.fi Git - libs/gl.git/blobdiff - source/effects/postprocessor.h
Rearrange soucre files into subdirectories
[libs/gl.git] / source / effects / postprocessor.h
diff --git a/source/effects/postprocessor.h b/source/effects/postprocessor.h
new file mode 100644 (file)
index 0000000..c107d88
--- /dev/null
@@ -0,0 +1,66 @@
+#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