start refactoring to remove dependence on THREE.Geometry

This commit is contained in:
Stewart Allen 2021-03-01 18:12:34 -05:00
commit 59878384c9
2 changed files with 69 additions and 28 deletions

View file

@ -30,9 +30,10 @@
*/ */
function wireframe(group, points, color) { function wireframe(group, points, color) {
if (points.length % 3 != 0) throw "invalid line : "+points.length; if (points.length % 3 != 0) throw "invalid line : "+points.length;
let lines = new THREE.Geometry(), let lines = new THREE.BufferGeometry(),
hash = {}, hash = {},
added = 0; added = 0,
vertices = [];
for (let i = 0; i < points.length; i += 3) { for (let i = 0; i < points.length; i += 3) {
let p1 = points[i], let p1 = points[i],
p2 = points[i + 1], p2 = points[i + 1],
@ -41,22 +42,28 @@
l2 = newOrderedLine(p2, p3), l2 = newOrderedLine(p2, p3),
l3 = newOrderedLine(p3, p1); l3 = newOrderedLine(p3, p1);
if (!hash[l1.key]) { if (!hash[l1.key]) {
lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); vertices.appendAll([
lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); p1.x, p1.y, p1.z,
p2.x, p2.y, p2.z
]);
hash[l1.key] = ++added; hash[l1.key] = ++added;
} }
if (!hash[l2.key]) { if (!hash[l2.key]) {
lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); vertices.appendAll([
lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); p2.x, p2.y, p2.z,
p3.x, p3.y, p3.z
]);
hash[l2.key] = ++added; hash[l2.key] = ++added;
} }
if (!hash[l3.key]) { if (!hash[l3.key]) {
lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); vertices.appendAll([
lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); p3.x, p3.y, p3.z,
p1.x, p1.y, p1.z
]);
hash[l3.key] = ++added; hash[l3.key] = ++added;
} }
} }
lines.verticesNeedUpdate = true; lines.setAttribute('position', new THREE.BufferAttribute( vertices.toFloat32(), 3 ) );
let mesh = new THREE.LineSegments(lines, getMaterial(color)); let mesh = new THREE.LineSegments(lines, getMaterial(color));
group.add(mesh); group.add(mesh);
return mesh; return mesh;

View file

@ -1503,18 +1503,52 @@
let outs = []; let outs = [];
widgets.forEach(widget => { widgets.forEach(widget => {
let mesh = widget.mesh; let mesh = widget.mesh;
let geo = new THREE.Geometry().fromBufferGeometry(mesh.geometry); let geo = mesh.geometry;
// let geo = new THREE.Geometry().fromBufferGeometry(mesh.geometry);
outs.push({geo, widget}); outs.push({geo, widget});
facets += geo.faces.length; facets += geo.attributes.position.count;
// facets += geo.faces.length;
}); });
let stl = new Uint8Array(80 + 4 + facets * 50); let stl = new Uint8Array(80 + 4 + facets * 50);
let dat = new DataView(stl.buffer); let dat = new DataView(stl.buffer);
let pos = 84; let pos = 84;
dat.setInt32(80, facets, true); dat.setInt32(80, facets, true);
outs.forEach(out => { // outs.forEach(out => {
let { faces, vertices } = out.geo; // let { faces, vertices } = out.geo;
for (let i=0, il=faces.length; i<il; i++) { // for (let i=0, il=faces.length; i<il; i++) {
let {a, b, c, normal} = faces[i]; // let {a, b, c, normal} = faces[i];
// let xo = 0, yo = 0, zo = 0;
// if (outs.length > 1) {
// let {x, y, z} = out.widget.track.pos;
// xo = x;
// yo = y;
// zo = z;
// }
// dat.setFloat32(pos + 0, normal.x, true);
// dat.setFloat32(pos + 4, normal.y, true);
// dat.setFloat32(pos + 8, normal.z, true);
// dat.setFloat32(pos + 12, vertices[a].x + xo, true);
// dat.setFloat32(pos + 16, vertices[a].y + yo, true);
// dat.setFloat32(pos + 20, vertices[a].z + zo, true);
// dat.setFloat32(pos + 24, vertices[b].x + xo, true);
// dat.setFloat32(pos + 28, vertices[b].y + yo, true);
// dat.setFloat32(pos + 32, vertices[b].z + zo, true);
// dat.setFloat32(pos + 36, vertices[c].x + xo, true);
// dat.setFloat32(pos + 40, vertices[c].y + yo, true);
// dat.setFloat32(pos + 44, vertices[c].z + zo, true);
// pos += 50;
// }
// });
for (let out of outs) {
let { normal, position } = out.geo.attributes;
let nvals = normal.array;
let pvals = position.array;
for (let i=0, il=position.count; i<il; i += 3) {
let pi = i * position.itemSize;
// average vertex normals to produce a face normal
let nx = (nvals[pi + 0] + nvals[pi + 3] + nvals[pi + 6]) / 3;
let ny = (nvals[pi + 1] + nvals[pi + 4] + nvals[pi + 7]) / 3;
let nz = (nvals[pi + 2] + nvals[pi + 5] + nvals[pi + 8]) / 3;
let xo = 0, yo = 0, zo = 0; let xo = 0, yo = 0, zo = 0;
if (outs.length > 1) { if (outs.length > 1) {
let {x, y, z} = out.widget.track.pos; let {x, y, z} = out.widget.track.pos;
@ -1522,21 +1556,21 @@
yo = y; yo = y;
zo = z; zo = z;
} }
dat.setFloat32(pos + 0, normal.x, true); dat.setFloat32(pos + 0, nx, true);
dat.setFloat32(pos + 4, normal.y, true); dat.setFloat32(pos + 4, ny, true);
dat.setFloat32(pos + 8, normal.z, true); dat.setFloat32(pos + 8, nz, true);
dat.setFloat32(pos + 12, vertices[a].x + xo, true); dat.setFloat32(pos + 12, pvals[pi + 0] + xo, true);
dat.setFloat32(pos + 16, vertices[a].y + yo, true); dat.setFloat32(pos + 16, pvals[pi + 1] + yo, true);
dat.setFloat32(pos + 20, vertices[a].z + zo, true); dat.setFloat32(pos + 20, pvals[pi + 2] + zo, true);
dat.setFloat32(pos + 24, vertices[b].x + xo, true); dat.setFloat32(pos + 24, pvals[pi + 3] + xo, true);
dat.setFloat32(pos + 28, vertices[b].y + yo, true); dat.setFloat32(pos + 28, pvals[pi + 4] + yo, true);
dat.setFloat32(pos + 32, vertices[b].z + zo, true); dat.setFloat32(pos + 32, pvals[pi + 5] + zo, true);
dat.setFloat32(pos + 36, vertices[c].x + xo, true); dat.setFloat32(pos + 36, pvals[pi + 6] + xo, true);
dat.setFloat32(pos + 40, vertices[c].y + yo, true); dat.setFloat32(pos + 40, pvals[pi + 7] + yo, true);
dat.setFloat32(pos + 44, vertices[c].z + zo, true); dat.setFloat32(pos + 44, pvals[pi + 8] + zo, true);
pos += 50; pos += 50;
} }
}); }
return stl; return stl;
} }