start refactoring to remove dependence on THREE.Geometry
This commit is contained in:
parent
c91fc10f30
commit
59878384c9
2 changed files with 69 additions and 28 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue