diff --git a/src/geo/render.js b/src/geo/render.js index 866fcc1b..becf435a 100644 --- a/src/geo/render.js +++ b/src/geo/render.js @@ -30,9 +30,10 @@ */ function wireframe(group, points, color) { if (points.length % 3 != 0) throw "invalid line : "+points.length; - let lines = new THREE.Geometry(), + let lines = new THREE.BufferGeometry(), hash = {}, - added = 0; + added = 0, + vertices = []; for (let i = 0; i < points.length; i += 3) { let p1 = points[i], p2 = points[i + 1], @@ -41,22 +42,28 @@ l2 = newOrderedLine(p2, p3), l3 = newOrderedLine(p3, p1); if (!hash[l1.key]) { - lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); - lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); + vertices.appendAll([ + p1.x, p1.y, p1.z, + p2.x, p2.y, p2.z + ]); hash[l1.key] = ++added; } if (!hash[l2.key]) { - lines.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z)); - lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); + vertices.appendAll([ + p2.x, p2.y, p2.z, + p3.x, p3.y, p3.z + ]); hash[l2.key] = ++added; } if (!hash[l3.key]) { - lines.vertices.push(new THREE.Vector3(p3.x, p3.y, p3.z)); - lines.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z)); + vertices.appendAll([ + p3.x, p3.y, p3.z, + p1.x, p1.y, p1.z + ]); hash[l3.key] = ++added; } } - lines.verticesNeedUpdate = true; + lines.setAttribute('position', new THREE.BufferAttribute( vertices.toFloat32(), 3 ) ); let mesh = new THREE.LineSegments(lines, getMaterial(color)); group.add(mesh); return mesh; diff --git a/src/kiri/main.js b/src/kiri/main.js index f0277998..652717d2 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1503,18 +1503,52 @@ let outs = []; widgets.forEach(widget => { 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}); - facets += geo.faces.length; + facets += geo.attributes.position.count; + // facets += geo.faces.length; }); let stl = new Uint8Array(80 + 4 + facets * 50); let dat = new DataView(stl.buffer); let pos = 84; dat.setInt32(80, facets, true); - outs.forEach(out => { - let { faces, vertices } = out.geo; - for (let i=0, il=faces.length; i { + // let { faces, vertices } = out.geo; + // for (let i=0, il=faces.length; i 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 1) { let {x, y, z} = out.widget.track.pos; @@ -1522,21 +1556,21 @@ 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); + dat.setFloat32(pos + 0, nx, true); + dat.setFloat32(pos + 4, ny, true); + dat.setFloat32(pos + 8, nz, true); + dat.setFloat32(pos + 12, pvals[pi + 0] + xo, true); + dat.setFloat32(pos + 16, pvals[pi + 1] + yo, true); + dat.setFloat32(pos + 20, pvals[pi + 2] + zo, true); + dat.setFloat32(pos + 24, pvals[pi + 3] + xo, true); + dat.setFloat32(pos + 28, pvals[pi + 4] + yo, true); + dat.setFloat32(pos + 32, pvals[pi + 5] + zo, true); + dat.setFloat32(pos + 36, pvals[pi + 6] + xo, true); + dat.setFloat32(pos + 40, pvals[pi + 7] + yo, true); + dat.setFloat32(pos + 44, pvals[pi + 8] + zo, true); pos += 50; } - }); + } return stl; }