Skip to content

Commit 8a5d88d

Browse files
committed
WebGL: Apply per‑vertex stroke color to POINTS
Signed-off-by: yugalkaushik <yugalkaushik14@gmail.com>
1 parent a09cc43 commit 8a5d88d

4 files changed

Lines changed: 41 additions & 13 deletions

File tree

src/webgl/p5.RendererGL.Retained.js

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -244,24 +244,31 @@ p5.RendererGL.prototype._drawElements = function(drawMode, gId) {
244244
}
245245
};
246246

247-
p5.RendererGL.prototype._drawPoints = function(vertices, vertexBuffer) {
247+
p5.RendererGL.prototype._drawPoints = function(vertices, pointBuffers) {
248248
const gl = this.GL;
249249
const pointShader = this._getImmediatePointShader();
250250
this._setPointUniforms(pointShader);
251251

252-
this._bindBuffer(
253-
vertexBuffer,
254-
gl.ARRAY_BUFFER,
255-
this._vToNArray(vertices),
256-
Float32Array,
257-
gl.STATIC_DRAW
258-
);
259-
260-
pointShader.enableAttrib(pointShader.attributes.aPosition, 3);
252+
// Prepare position and optional per-vertex color buffers
253+
if (Array.isArray(pointBuffers)) {
254+
for (const buff of pointBuffers) {
255+
buff._prepareBuffer(this.immediateMode.geometry, pointShader);
256+
}
257+
} else {
258+
// Backward compatibility if a raw GL buffer is passed
259+
this._bindBuffer(
260+
pointBuffers,
261+
gl.ARRAY_BUFFER,
262+
this._vToNArray(vertices),
263+
Float32Array,
264+
gl.STATIC_DRAW
265+
);
266+
pointShader.enableAttrib(pointShader.attributes.aPosition, 3);
267+
}
261268

262269
this._applyColorBlend(this.curStrokeColor);
263270

264-
gl.drawArrays(gl.Points, 0, vertices.length);
271+
gl.drawArrays(gl.POINTS, 0, vertices.length);
265272

266273
pointShader.unbindShader();
267274
};

src/webgl/p5.RendererGL.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,10 @@ p5.RendererGL = class RendererGL extends p5.Renderer {
630630
new p5.RenderBuffer(3, 'lineTangentsOut', 'lineTangentsOutBuffer', 'aTangentOut', this),
631631
new p5.RenderBuffer(1, 'lineSides', 'lineSidesBuffer', 'aSide', this)
632632
],
633-
point: this.GL.createBuffer()
633+
point: [
634+
new p5.RenderBuffer(3, 'vertices', 'pointVertexBuffer', 'aPosition', this, this._vToNArray),
635+
new p5.RenderBuffer(4, 'vertexStrokeColors', 'pointColorBuffer', 'aVertexColor', this)
636+
]
634637
}
635638
};
636639

@@ -2010,6 +2013,7 @@ p5.RendererGL = class RendererGL extends p5.Renderer {
20102013
'vec3 getLocalPosition': '(vec3 position) { return position; }',
20112014
'vec3 getWorldPosition': '(vec3 position) { return position; }',
20122015
'float getPointSize': '(float size) { return size; }',
2016+
'vec4 getVertexColor': '(vec4 color) { return color; }',
20132017
'void afterVertex': '() {}'
20142018
},
20152019
fragment: {
@@ -2361,6 +2365,12 @@ p5.RendererGL = class RendererGL extends p5.Renderer {
23612365
'uPointSize',
23622366
this.pointSize * this._pInst._pixelDensity
23632367
);
2368+
// Enable per-vertex color for POINTS when available
2369+
const useVertexColor =
2370+
(this.immediateMode && this.immediateMode.geometry &&
2371+
this.immediateMode.geometry.vertexStrokeColors &&
2372+
this.immediateMode.geometry.vertexStrokeColors.length > 0);
2373+
pointShader.setUniform('uUseVertexColor', !!useVertexColor);
23642374
}
23652375

23662376
/* Binds a buffer to the drawing context

src/webgl/shaders/point.frag

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
precision mediump int;
22
uniform vec4 uMaterialColor;
33
IN float vStrokeWeight;
4+
IN vec4 vColor;
45

56
void main(){
67
HOOK_beforeFragment();
@@ -24,6 +25,8 @@ void main(){
2425
discard;
2526
}
2627

27-
OUT_COLOR = HOOK_getFinalColor(vec4(uMaterialColor.rgb, 1.) * uMaterialColor.a);
28+
// Use the interpolated vertex color (set in vertex shader)
29+
vec4 baseColor = vColor;
30+
OUT_COLOR = HOOK_getFinalColor(vec4(baseColor.rgb, 1.) * baseColor.a);
2831
HOOK_afterFragment();
2932
}

src/webgl/shaders/point.vert

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
IN vec3 aPosition;
2+
IN vec4 aVertexColor;
23
uniform float uPointSize;
4+
uniform bool uUseVertexColor;
5+
uniform vec4 uMaterialColor;
36
OUT float vStrokeWeight;
7+
OUT vec4 vColor;
48
uniform mat4 uModelViewMatrix;
59
uniform mat4 uProjectionMatrix;
610

@@ -15,5 +19,9 @@ void main() {
1519

1620
gl_PointSize = pointSize;
1721
vStrokeWeight = pointSize;
22+
23+
// Choose per-vertex stroke color when available; otherwise use uniform stroke color
24+
vec4 baseColor = uUseVertexColor ? aVertexColor : uMaterialColor;
25+
vColor = HOOK_getVertexColor(baseColor);
1826
HOOK_afterVertex();
1927
}

0 commit comments

Comments
 (0)