diff --git a/src/core/p5.Renderer3D.js b/src/core/p5.Renderer3D.js index 6974561b4f..d83df0170d 100644 --- a/src/core/p5.Renderer3D.js +++ b/src/core/p5.Renderer3D.js @@ -137,7 +137,7 @@ export class Renderer3D extends Renderer { this.states._useShininess = 1; this.states._useMetalness = 0; - this.states.tint = new Color([1, 1, 1, 1]); + this.states.tint = null; this.states.constantAttenuation = 1; this.states.linearAttenuation = 0; @@ -1502,7 +1502,10 @@ export class Renderer3D extends Renderer { // works differently and is global p5 state. If the p5 state has // been cleared, we also need to clear the value in uSampler to match. fillShader.setUniform("uSampler", this.states._tex || empty); - fillShader.setUniform("uTint", this.states.tint._getRGBA([255, 255, 255, 255])); + fillShader.setUniform( + "uTint", + this.states.tint?._getRGBA([255, 255, 255, 255]) ?? [255, 255, 255, 255] + ); fillShader.setUniform("uHasSetAmbient", this.states._hasSetAmbient); fillShader.setUniform("uAmbientMatColor", this.states.curAmbientColor); diff --git a/test/unit/visual/cases/webgl.js b/test/unit/visual/cases/webgl.js index fd0cb09d0a..7519d4e2ea 100644 --- a/test/unit/visual/cases/webgl.js +++ b/test/unit/visual/cases/webgl.js @@ -645,6 +645,15 @@ visualSuite('WebGL', function() { p5.circle(0, 0, 50); screenshot(); }); + + visualTest('noTint() before image() does not throw', async (p5, screenshot) => { + p5.createCanvas(50, 50, p5.WEBGL); + const img = await p5.loadImage('/test/unit/assets/cat.jpg'); + p5.noTint(); + p5.imageMode(p5.CENTER); + p5.image(img, 0, 0, 50, 50); + screenshot(); + }); }); visualSuite('Hooks coordinate spaces', () => { diff --git a/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/000.png b/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/000.png new file mode 100644 index 0000000000..c92e8ba0a8 Binary files /dev/null and b/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/000.png differ diff --git a/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/metadata.json b/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/metadata.json new file mode 100644 index 0000000000..2d4bfe30da --- /dev/null +++ b/test/unit/visual/screenshots/WebGL/Opacity/noTint() before image() does not throw/metadata.json @@ -0,0 +1,3 @@ +{ + "numScreenshots": 1 +} \ No newline at end of file diff --git a/test/unit/webgl/p5.RendererGL.js b/test/unit/webgl/p5.RendererGL.js index 93582483b6..079b8000f6 100644 --- a/test/unit/webgl/p5.RendererGL.js +++ b/test/unit/webgl/p5.RendererGL.js @@ -1517,10 +1517,12 @@ suite('p5.RendererGL', function() { }); suite('tint() in WEBGL mode', function() { - test('default tint value is set and not null', function() { + test('default tint value', function() { myp5.createCanvas(100, 100, myp5.WEBGL); - assert.deepEqual(myp5._renderer.states.tint - ._getRGBA([255, 255, 255, 255]), [255, 255, 255, 255]); + assert.deepEqual( + myp5._renderer.states.tint?._getRGBA([255, 255, 255, 255]) ?? [255, 255, 255, 255], + [255, 255, 255, 255] + ); }); @@ -1581,7 +1583,7 @@ suite('p5.RendererGL', function() { }; }); }).then(function(_tint) { - assert.deepEqual(_tint._getRGBA([255, 255, 255, 255]), + assert.deepEqual(_tint?._getRGBA([255, 255, 255, 255]) ?? [255, 255, 255, 255], [255, 255, 255, 255]); }); });