Skip to content

Commit caa727c

Browse files
authored
Merge pull request #5914 from davepagurek/fix/tess-normal
2 parents ec08e2c + 2115f35 commit caa727c

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

src/webgl/p5.RendererGL.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -1494,11 +1494,27 @@ p5.RendererGL.prototype._initTessy = function initTesselator() {
14941494
};
14951495

14961496
p5.RendererGL.prototype._triangulate = function(contours) {
1497-
// libtess will take 3d verts and flatten to a plane for tesselation
1498-
// since only doing 2d tesselation here, provide z=1 normal to skip
1499-
// iterating over verts only to get the same answer.
1500-
// comment out to test normal-generation code
1501-
this._tessy.gluTessNormal(0, 0, 1);
1497+
// libtess will take 3d verts and flatten to a plane for tesselation.
1498+
// libtess is capable of calculating a plane to tesselate on, but
1499+
// if all of the vertices have the same z values, we'll just
1500+
// assume the face is facing the camera, letting us skip any performance
1501+
// issues or bugs in libtess's automatic calculation.
1502+
const z = contours[0] ? contours[0][2] : undefined;
1503+
let allSameZ = true;
1504+
for (const contour of contours) {
1505+
for (let j = 0; j < contour.length; j += 12) {
1506+
if (contour[j + 2] !== z) {
1507+
allSameZ = false;
1508+
break;
1509+
}
1510+
}
1511+
}
1512+
if (allSameZ) {
1513+
this._tessy.gluTessNormal(0, 0, 1);
1514+
} else {
1515+
// Let libtess pick a plane for us
1516+
this._tessy.gluTessNormal(0, 0, 0);
1517+
}
15021518

15031519
const triangleVerts = [];
15041520
this._tessy.gluTessBeginPolygon(triangleVerts);

test/unit/webgl/p5.RendererGL.js

+40
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,46 @@ suite('p5.RendererGL', function() {
10101010

10111011
done();
10121012
});
1013+
1014+
test('TESS handles vertex data perpendicular to the camera', function(done) {
1015+
var renderer = myp5.createCanvas(10, 10, myp5.WEBGL);
1016+
1017+
myp5.textureMode(myp5.NORMAL);
1018+
renderer.beginShape(myp5.TESS);
1019+
renderer.vertex(-10, 0, -10);
1020+
renderer.vertex(10, 0, -10);
1021+
renderer.vertex(10, 0, 10);
1022+
renderer.vertex(-10, 0, 10);
1023+
renderer.endShape(myp5.CLOSE);
1024+
1025+
assert.equal(renderer.immediateMode.geometry.vertices.length, 6);
1026+
assert.deepEqual(
1027+
renderer.immediateMode.geometry.vertices[0].array(),
1028+
[10, 0, 10]
1029+
);
1030+
assert.deepEqual(
1031+
renderer.immediateMode.geometry.vertices[1].array(),
1032+
[-10, 0, -10]
1033+
);
1034+
assert.deepEqual(
1035+
renderer.immediateMode.geometry.vertices[2].array(),
1036+
[10, 0, -10]
1037+
);
1038+
assert.deepEqual(
1039+
renderer.immediateMode.geometry.vertices[3].array(),
1040+
[-10, 0, -10]
1041+
);
1042+
assert.deepEqual(
1043+
renderer.immediateMode.geometry.vertices[4].array(),
1044+
[10, 0, 10]
1045+
);
1046+
assert.deepEqual(
1047+
renderer.immediateMode.geometry.vertices[5].array(),
1048+
[-10, 0, 10]
1049+
);
1050+
1051+
done();
1052+
});
10131053
});
10141054

10151055
suite('setAttributes', function() {

0 commit comments

Comments
 (0)