fix stl export size (kiri). add stl export (mesh)

This commit is contained in:
Stewart Allen 2022-01-10 21:06:38 -05:00
commit 66ca161ccd
4 changed files with 56 additions and 16 deletions

View file

@ -100,22 +100,56 @@ let object = {
let file = {
export(data, send) {
let { format, recs } = data;
let vtot = 0;
for (let rec of recs) {
let { id, matrix, file } = rec;
let vs = rec.varr = Array.from(translate_encode(id, matrix)).map(v => v.round(5));
vtot += (vs.length / 3);
}
switch (format) {
case "obj":
let p = 1;
let obj = [`# Generated By Kiri:Moto (units = millimeters)`];
let obj = [`# Generated By Mesh:Tool @ https://grid.space/mesh (units = millimeters)`];
for (let rec of recs) {
let { id, matrix, file } = rec;
let verts = Array.from(translate_encode(id, matrix)).map(v => v.round(5));
let { id, matrix, file, varr } = rec;
obj.push(`g ${file}`);
for (let i=0; i<verts.length; p += 3) {
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
obj.push(`v ${verts[i++]} ${verts[i++]} ${verts[i++]}`);
for (let i=0; i<varr.length; p += 3) {
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
obj.push(`v ${varr[i++]} ${varr[i++]} ${varr[i++]}`);
obj.push(`f ${p} ${p+1} ${p+2}`);
}
}
return obj.join('\n');
case "stl":
let stl = new Uint8Array(80 + 4 + vtot/3 * 50);
let dat = new DataView(stl.buffer);
let pos = 84;
// todo put Kiri:Moto info in header
dat.setInt32(80, vtot/3, true);
for (let rec of recs) {
let { id, matrix, file, varr } = rec;
for (let i=0, l=varr.length; i<l;) {
let p0 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
let p1 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
let p2 = new THREE.Vector3(varr[i++], varr[i++], varr[i++]);
let norm = THREE.computeFaceNormal(p0, p1, p2);
dat.setFloat32(pos + 0, norm.x, true);
dat.setFloat32(pos + 4, norm.y, true);
dat.setFloat32(pos + 8, norm.z, true);
dat.setFloat32(pos + 12, p0.x, true);
dat.setFloat32(pos + 16, p0.y, true);
dat.setFloat32(pos + 20, p0.z, true);
dat.setFloat32(pos + 24, p1.x, true);
dat.setFloat32(pos + 28, p1.y, true);
dat.setFloat32(pos + 32, p1.z, true);
dat.setFloat32(pos + 36, p2.x, true);
dat.setFloat32(pos + 40, p2.y, true);
dat.setFloat32(pos + 44, p2.z, true);
pos += 50;
}
}
return stl;
default:
throw `invalid format "${format}"`;
}