From ef4aa35b4b72369e8f9a0c76c9b8c0baa1de92b1 Mon Sep 17 00:00:00 2001 From: Dave Pagurek Date: Mon, 22 Apr 2024 12:29:58 -0400 Subject: [PATCH] Fix main canvas clipping getting applied to framebuffers --- src/webgl/p5.Framebuffer.js | 1 + test/unit/webgl/p5.RendererGL.js | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/webgl/p5.Framebuffer.js b/src/webgl/p5.Framebuffer.js index 28b0c6ec61..1347bed038 100644 --- a/src/webgl/p5.Framebuffer.js +++ b/src/webgl/p5.Framebuffer.js @@ -849,6 +849,7 @@ class Framebuffer { this.target._renderer.uMVMatrix.set( this.target._renderer._curCamera.cameraMatrix ); + this.target._renderer._applyStencilTestIfClipping(); } /** diff --git a/test/unit/webgl/p5.RendererGL.js b/test/unit/webgl/p5.RendererGL.js index e747b12d36..1c2672b587 100644 --- a/test/unit/webgl/p5.RendererGL.js +++ b/test/unit/webgl/p5.RendererGL.js @@ -2462,5 +2462,42 @@ suite('p5.RendererGL', function() { } } ); + + test( + 'Main canvas masks do not apply to framebuffers', + function() { + myp5.createCanvas(50, 50, myp5.WEBGL); + const fbo = myp5.createFramebuffer({ antialias: false }); + myp5.rectMode(myp5.CENTER); + myp5.background('red'); + expect(myp5._renderer._stencilTestOn).to.equal(false); + myp5.push(); + myp5.beginClip(); + myp5.rect(-20, -20, 40, 40); + myp5.endClip(); + expect(myp5._renderer._stencilTestOn).to.equal(true); + + fbo.begin(); + expect(myp5._renderer._stencilTestOn).to.equal(false); + myp5.noStroke(); + myp5.fill('blue'); + myp5.rect(0, 0, myp5.width, myp5.height); + fbo.end(); + + expect(myp5._renderer._stencilTestOn).to.equal(true); + myp5.pop(); + expect(myp5._renderer._stencilTestOn).to.equal(false); + + myp5.imageMode(myp5.CENTER); + myp5.image(fbo, 0, 0); + + // In the middle of the canvas, the framebuffer's clip and the + // main canvas's clip intersect, so the blue should show through + assert.deepEqual( + myp5.get(myp5.width / 2, myp5.height / 2), + [0, 0, 255, 255] + ); + } + ); }); });