It's now stored in a WeakPtr and the postprocessor instances hold
a RefPtr to it, so it will be deleted together with the last
postprocessor.
{
BindRestore bind_fbo(occlude_target.get_framebuffer());
{
BindRestore bind_fbo(occlude_target.get_framebuffer());
}
renderer.set_shader_program(&combine_shader);
}
renderer.set_shader_program(&combine_shader);
Program occlude_shader;
Program combine_shader;
mutable ProgramData shdata;
Program occlude_shader;
Program combine_shader;
mutable ProgramData shdata;
public:
AmbientOcclusion(unsigned, unsigned, float = 1.0f);
public:
AmbientOcclusion(unsigned, unsigned, float = 1.0f);
Renderer::Push push2(renderer);
renderer.set_texture(i ? &target[0]->get_target_texture(RENDER_COLOR) : &src);
renderer.add_shader_data(blur_shdata[i]);
Renderer::Push push2(renderer);
renderer.set_texture(i ? &target[0]->get_target_texture(RENDER_COLOR) : &src);
renderer.add_shader_data(blur_shdata[i]);
}
combine_texturing.attach(0, src);
renderer.set_texturing(&combine_texturing);
renderer.set_shader_program(&combine_shader);
}
combine_texturing.attach(0, src);
renderer.set_texturing(&combine_texturing);
renderer.set_shader_program(&combine_shader);
ProgramData blur_shdata[2];
Program combine_shader;
Texturing combine_texturing;
ProgramData blur_shdata[2];
Program combine_shader;
Texturing combine_texturing;
public:
Bloom(unsigned, unsigned);
public:
Bloom(unsigned, unsigned);
Renderer::Push push(renderer);
renderer.set_shader_program(&shprog, &shdata);
renderer.set_texturing(&texturing);
Renderer::Push push(renderer);
renderer.set_shader_program(&shprog, &shdata);
renderer.set_texturing(&texturing);
ProgramData shdata;
Texture1D curve;
Texturing texturing;
ProgramData shdata;
Texture1D curve;
Texturing texturing;
namespace Msp {
namespace GL {
namespace Msp {
namespace GL {
+WeakPtr<Mesh> PostProcessor::fullscreen_quad;
+
void PostProcessor::render(Renderer &, const Texture2D &color, const Texture2D &depth)
{
render(color, depth);
}
void PostProcessor::render(Renderer &, const Texture2D &color, const Texture2D &depth)
{
render(color, depth);
}
-const Mesh &PostProcessor::get_fullscreen_quad()
-{
- static const Mesh &mesh = create_fullscreen_quad();
- return mesh;
-}
-
-const Mesh &PostProcessor::create_fullscreen_quad()
+RefPtr<Mesh> PostProcessor::get_fullscreen_quad()
- static Mesh 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();
+ RefPtr<Mesh> 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;
+ }
virtual PostProcessor *create(unsigned, unsigned) const = 0;
};
virtual PostProcessor *create(unsigned, unsigned) const = 0;
};
+private:
+ static WeakPtr<Mesh> fullscreen_quad;
+
protected:
PostProcessor() { }
public:
protected:
PostProcessor() { }
public:
protected:
/** Returns a mesh consisting of a single quad, covering the entire screen.
The vertices are in normalized device coordinates. */
protected:
/** Returns a mesh consisting of a single quad, covering the entire screen.
The vertices are in normalized device coordinates. */
- static const Mesh &get_fullscreen_quad();
-
-private:
- static const Mesh &create_fullscreen_quad();
+ static RefPtr<Mesh> get_fullscreen_quad();