Fix issue #294: Canvas not working when not rendering to default render target.

This commit is contained in:
vrld
2011-09-07 13:42:51 +02:00
parent 78389d2e69
commit d5dce6284f
2 changed files with 25 additions and 0 deletions
+21
View File
@@ -49,6 +49,27 @@ namespace opengl
bool loadVolatile();
void unloadVolatile();
/// Unbind the current canvas on construction and rebind it upon destruction.
// Exception safe temporary unbinding/rebinding for techniques that require
// the default canvas to work (e.g. stencils).
// XXX: If a canvas is switched between creating and destroying an unbinder
// object, the canvas will not be switched back.
struct TemporaryUnbinder
{
Canvas * canvas;
inline TemporaryUnbinder() : canvas(Canvas::current)
{
if (NULL != canvas)
Canvas::bindDefaultCanvas();
}
inline ~TemporaryUnbinder()
{
if (NULL != canvas && NULL == Canvas::current)
canvas->startGrab();
}
};
private:
friend class PixelEffect;
GLuint getTextureName() const { return img; }
@@ -24,6 +24,7 @@
#include <font/Rasterizer.h>
#include <scripts/graphics.lua.h>
#include <cassert>
namespace love
{
@@ -168,6 +169,9 @@ namespace opengl
static int setStencil(lua_State * L, bool invert)
{
// stencils require the default fb to work properly
Canvas::TemporaryUnbinder unbinder;
// no argument -> clear mask
if (lua_isnoneornil(L, 1)) {
instance->discardStencil();