#include "mesh.h"
#include "meshbuilder.h"
#include "postprocessor.h"
+#include "sampler.h"
#include "shader.h"
-namespace {
+namespace Msp {
+namespace GL {
-const char fullscreen_vs_source[] =
- "varying vec2 texcoord;\n"
- "void main()\n"
- "{\n"
- " gl_Position = gl_Vertex;\n"
- " texcoord = gl_Vertex.xy*0.5+0.5;\n"
- "}\n";
+WeakPtr<Mesh> PostProcessor::fullscreen_quad;
+WeakPtr<Sampler> PostProcessor::nearest_sampler;
+WeakPtr<Sampler> PostProcessor::linear_sampler;
+void PostProcessor::render(Renderer &, const Texture2D &color, const Texture2D &depth)
+{
+ render(color, depth);
}
+RefPtr<Mesh> PostProcessor::get_fullscreen_quad()
+{
+ RefPtr<Mesh> mesh = fullscreen_quad;
+ if(!mesh)
+ {
+ mesh = new Mesh(VERTEX2);
+ MeshBuilder builder(*mesh);
+ builder.begin(TRIANGLE_STRIP);
+ builder.vertex(-1, 1);
+ builder.vertex(-1, -1);
+ builder.vertex(1, 1);
+ builder.vertex(1, -1);
+ builder.end();
+ fullscreen_quad = mesh;
+ }
+ return mesh;
+}
-namespace Msp {
-namespace GL {
-
-Shader &PostProcessor::get_fullscreen_vertex_shader()
+RefPtr<Sampler> PostProcessor::get_nearest_sampler()
{
- static VertexShader shader(fullscreen_vs_source);
- return shader;
+ RefPtr<Sampler> sampler = nearest_sampler;
+ if(!sampler)
+ {
+ sampler = new Sampler;
+ sampler->set_filter(NEAREST);
+ sampler->set_wrap(CLAMP_TO_EDGE);
+ nearest_sampler = sampler;
+ }
+ return sampler;
}
-const Mesh &PostProcessor::get_fullscreen_quad()
+RefPtr<Sampler> PostProcessor::get_linear_sampler()
{
- static const Mesh &mesh = create_fullscreen_quad();
- return mesh;
+ RefPtr<Sampler> sampler = linear_sampler;
+ if(!sampler)
+ {
+ sampler = new Sampler;
+ sampler->set_filter(LINEAR);
+ sampler->set_wrap(CLAMP_TO_EDGE);
+ linear_sampler = sampler;
+ }
+ return sampler;
}
-const Mesh &PostProcessor::create_fullscreen_quad()
+
+PostProcessor::Template::Template():
+ size_divisor(1)
+{ }
+
+
+PostProcessor::Template::Loader::Loader(Template &t):
+ DataFile::ObjectLoader<Template>(t)
{
- static Mesh mesh(GL::VERTEX2);
- MeshBuilder builder(mesh);
- builder.begin(TRIANGLE_STRIP);
- builder.vertex(-1, 1);
- builder.vertex(-1, -1);
- builder.vertex(1, 1);
- builder.vertex(1, -1);
- builder.end();
- return mesh;
+ add("size_divisor", &Template::size_divisor);
}
} // namespace GL