From 6930e28e2f5c64205a95cdf40ef6da0697463599 Mon Sep 17 00:00:00 2001 From: Dave Pagurek Date: Wed, 22 Oct 2025 10:17:22 -0400 Subject: [PATCH] Fix bugs in buildGeometry --- src/webgl/3d_primitives.js | 8 ++++---- src/webgl/p5.RendererGL.js | 6 +++++- test/unit/webgl/p5.RendererGL.js | 27 +++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/webgl/3d_primitives.js b/src/webgl/3d_primitives.js index cc07f71f78..57c4b3921b 100644 --- a/src/webgl/3d_primitives.js +++ b/src/webgl/3d_primitives.js @@ -1726,7 +1726,7 @@ function primitives3D(p5, fn){ this.states.setValue('uModelMatrix', mult); - this._drawGeometry(this.geometryBufferCache.getGeometryByID(gid)); + this.model(this.geometryBufferCache.getGeometryByID(gid)); } finally { this.states.setValue('uModelMatrix', uModelMatrix); } @@ -1858,7 +1858,7 @@ function primitives3D(p5, fn){ this.states.uModelMatrix.translate([x, y, 0]); this.states.uModelMatrix.scale(width, height, 1); - this._drawGeometry(this.geometryBufferCache.getGeometryByID(gid)); + this.model(this.geometryBufferCache.getGeometryByID(gid)); } finally { this.states.setValue('uModelMatrix', uModelMatrix); } @@ -1919,7 +1919,7 @@ function primitives3D(p5, fn){ this.states.uModelMatrix.translate([x, y, 0]); this.states.uModelMatrix.scale(width, height, 1); - this._drawGeometry(this.geometryBufferCache.getGeometryByID(gid)); + this.model(this.geometryBufferCache.getGeometryByID(gid)); } finally { this.states.setValue('uModelMatrix', uModelMatrix); } @@ -2069,7 +2069,7 @@ function primitives3D(p5, fn){ quadGeom.gid = gid; this.geometryBufferCache.ensureCached(quadGeom); } - this._drawGeometry(this.geometryBufferCache.getGeometryByID(gid)); + this.model(this.geometryBufferCache.getGeometryByID(gid)); return this; }; diff --git a/src/webgl/p5.RendererGL.js b/src/webgl/p5.RendererGL.js index 3705bed131..5ff988c3ec 100644 --- a/src/webgl/p5.RendererGL.js +++ b/src/webgl/p5.RendererGL.js @@ -511,7 +511,11 @@ class RendererGL extends Renderer { ); } const geometry = this.geometryBuilder.finish(); - this.fill(this.geometryBuilder.prevFillColor); + if (this.geometryBuilder.prevFillColor) { + this.fill(this.geometryBuilder.prevFillColor); + } else { + this.noFill(); + } this.geometryBuilder = undefined; return geometry; } diff --git a/test/unit/webgl/p5.RendererGL.js b/test/unit/webgl/p5.RendererGL.js index 7b84728695..2e651e1644 100644 --- a/test/unit/webgl/p5.RendererGL.js +++ b/test/unit/webgl/p5.RendererGL.js @@ -2950,4 +2950,31 @@ suite('p5.RendererGL', function() { myp5.checkPMatrix(); }); }); + + suite('buildGeometry', function() { + test('captures geometry without drawing', function() { + myp5.createCanvas(10, 10, myp5.WEBGL); + myp5.background(255, 0, 0); + const geom = myp5.buildGeometry(() => myp5.circle(0, 0, 5)); + expect(geom.vertices.length).toBeGreaterThan(0); + expect(myp5.get(5, 5)).toEqual([255, 0, 0, 255]); + }); + + test('returns fill state back to a previous color', function() { + myp5.createCanvas(10, 10, myp5.WEBGL); + myp5.background(255, 0, 0); + myp5.fill(0, 255, 0); + const geom = myp5.buildGeometry(() => myp5.circle(0, 0, 10)); + myp5.model(geom); + expect(myp5.get(5, 5)).toEqual([0, 255, 0, 255]); + }); + test('returns fill state back to no fill', function() { + myp5.createCanvas(10, 10, myp5.WEBGL); + myp5.background(255, 0, 0); + myp5.noFill(); + const geom = myp5.buildGeometry(() => myp5.circle(0, 0, 10)); + myp5.model(geom); + expect(myp5.get(5, 5)).toEqual([255, 0, 0, 255]); + }); + }); });