diff --git a/src/webgl/GeometryBuilder.js b/src/webgl/GeometryBuilder.js index 83d2fb90de..a109988cef 100644 --- a/src/webgl/GeometryBuilder.js +++ b/src/webgl/GeometryBuilder.js @@ -102,6 +102,17 @@ class GeometryBuilder { vertexColors.push(...this.renderer.states.curFillColor); } this.geometry.vertexColors.push(...vertexColors); + // After the existing vertexColors code, add this: + const vertexStrokeColors = [...input.vertexStrokeColors]; + while (vertexStrokeColors.length < input.vertices.length * 4) { + if (this.renderer.states.strokeColor) { + vertexStrokeColors.push(...this.renderer.states.curStrokeColor); + } else { + // Use -1, -1, -1, -1 to indicate fallback to global stroke color + vertexStrokeColors.push(-1, -1, -1, -1); + } + } + this.geometry.vertexStrokeColors.push(...vertexStrokeColors); } /** diff --git a/src/webgl/p5.RendererGL.js b/src/webgl/p5.RendererGL.js index 5e46d2d106..8797639648 100644 --- a/src/webgl/p5.RendererGL.js +++ b/src/webgl/p5.RendererGL.js @@ -489,6 +489,7 @@ class RendererGL extends Renderer { this.geometryBuilder = new GeometryBuilder(this); this.geometryBuilder.prevFillColor = this.states.fillColor; this.fill(new Color([-1, -1, -1, -1])); + this.stroke(new Color([-1, -1, -1, -1])); } /** @@ -508,6 +509,7 @@ class RendererGL extends Renderer { } const geometry = this.geometryBuilder.finish(); this.fill(this.geometryBuilder.prevFillColor); + this.stroke(this.geometryBuilder.prevStrokeColor); this.geometryBuilder = undefined; return geometry; } diff --git a/src/webgl/shaders/line.vert b/src/webgl/shaders/line.vert index de422ad6b6..3d3de09b15 100644 --- a/src/webgl/shaders/line.vert +++ b/src/webgl/shaders/line.vert @@ -99,7 +99,7 @@ void main() { StrokeVertex inputs; inputs.position = aPosition.xyz; - inputs.color = uUseLineColor ? aVertexColor : uMaterialColor; + inputs.color = (uUseLineColor && aVertexColor.x >= 0.0) ? aVertexColor : uMaterialColor; inputs.weight = uStrokeWeight; inputs.tangentIn = aTangentIn; inputs.tangentOut = aTangentOut; diff --git a/test/unit/visual/cases/webgl.js b/test/unit/visual/cases/webgl.js index a670d34387..fe8c5ef0e8 100644 --- a/test/unit/visual/cases/webgl.js +++ b/test/unit/visual/cases/webgl.js @@ -660,4 +660,57 @@ visualSuite('WebGL', function() { screenshot(); }); }); + + visualSuite('buildGeometry stroke colors', () => { + visualTest('Geometry without stroke colors, global stroke override', (p5, screenshot) => { + p5.createCanvas(50, 50, p5.WEBGL); + + // Build geometry without any stroke() calls inside + const geom = p5.buildGeometry(() => { + p5.beginShape(); + p5.vertex(-15, -15, 0); + p5.vertex(15, -15, 0); + p5.vertex(15, 15, 0); + p5.vertex(-15, 15, 0); + p5.endShape(p5.CLOSE); + }); + + p5.background(220); + p5.stroke('red'); // Should override and make all strokes red + p5.strokeWeight(2); + p5.noFill(); + p5.model(geom); + screenshot(); + }); + + visualTest('Geometry with internal stroke colors not overridden', (p5, screenshot) => { + p5.createCanvas(50, 50, p5.WEBGL); + + // Build geometry WITH stroke() calls inside + const geom = p5.buildGeometry(() => { + p5.beginShape(); + + p5.stroke('blue'); + p5.vertex(-15, -15, 0); + + p5.stroke('green'); + p5.vertex(15, -15, 0); + + p5.stroke('purple'); + p5.vertex(15, 15, 0); + + p5.stroke('orange'); + p5.vertex(-15, 15, 0); + + p5.endShape(p5.CLOSE); + }); + + p5.background(220); + p5.stroke('red'); // This should NOT override the internal colors + p5.strokeWeight(2); + p5.noFill(); + p5.model(geom); + screenshot(); + }); + }); }); diff --git a/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/000.png b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/000.png new file mode 100644 index 0000000000..f8a69d112b Binary files /dev/null and b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/000.png differ diff --git a/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/metadata.json b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/metadata.json new file mode 100644 index 0000000000..2d4bfe30da --- /dev/null +++ b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry with internal stroke colors not overridden/metadata.json @@ -0,0 +1,3 @@ +{ + "numScreenshots": 1 +} \ No newline at end of file diff --git a/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/000.png b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/000.png new file mode 100644 index 0000000000..49370c281b Binary files /dev/null and b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/000.png differ diff --git a/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/metadata.json b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/metadata.json new file mode 100644 index 0000000000..2d4bfe30da --- /dev/null +++ b/test/unit/visual/screenshots/WebGL/buildGeometry stroke colors/Geometry without stroke colors, global stroke override/metadata.json @@ -0,0 +1,3 @@ +{ + "numScreenshots": 1 +} \ No newline at end of file