From 4833301cb36607d0af2a30cf5de6c26fbf238486 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 22 Mar 2020 09:59:22 -0400 Subject: [PATCH] checkpoint selectionToGeometry --- js/meta.js | 127 ++++++++++------------------------------------------- 1 file changed, 24 insertions(+), 103 deletions(-) diff --git a/js/meta.js b/js/meta.js index f5fc3692..06d7caf9 100644 --- a/js/meta.js +++ b/js/meta.js @@ -8,7 +8,6 @@ * TODO show/hide selection (to edit around, prevent mod, etc) * TODO make synth more efficient by only rebuilding if a relevant node has changed * TODO grouping and group naming (helps download / batch download)? - * TODO bit encoding + stl instead of xyz * TODO undo/redo stack ... and revert to previous save hotkey * TODO improve paint/preproc and preview modes * TODO auto-save of workspace, selection and undo/redo stack (on idle) @@ -24,7 +23,7 @@ "use strict"; let gs_meta = exports; -let gs_meta_debug = false; +let gs_meta_debug = false; // 'line', 'poly', or 'cut' THREE.Material.prototype.motoSetup = function() { this.fog = false; @@ -742,7 +741,8 @@ THREE.Face3.prototype.mVisible = function(show) { downloadSelection(); break; case cca('X'): - downloadSelection2() + // debug selectionToGeometry + selectionToGeometry(unitsToMM(spaceUnits)); break; case cca('1'): // toggle control left if (evt.ctrlKey) { @@ -1536,87 +1536,6 @@ THREE.Face3.prototype.mVisible = function(show) { } function selectionToGeometry(scale) { - let vertices = [], - normals = [], - i = 0, cube, j, k, face, pos, off, fix, arr; - - while (i < selected.length) { - cube = selected[i++]; - pos = cube.pos; - if (cube.mesh) { - let k = 0, arr = cube.mesh.geometry.attributes.position.array; - while (k < arr.length) { - vertices.push(arr[k++] + pos.x); - vertices.push(arr[k++] + pos.y); - vertices.push(arr[k++] + pos.z); - } - continue; - } - for (j = 0; j < FACES.length; j++) { - face = cube.faces[FACES[j]]; - if (face.inside && face.mark === MARK.NONE && cube.adjacentCube(face).isSelected()) continue; - off = FACE[face.key]; - // output 2 triangles, 6 points, 18 elements - if (off.ox) { - fix = pos.x + HALF * off.ox; - arr = [ - // triangle 1 - [fix, pos.y - HALF, pos.z - HALF], - [fix, pos.y + HALF, pos.z + HALF], - [fix, pos.y + HALF, pos.z - HALF], - // triangle 2 - [fix, pos.y - HALF, pos.z - HALF], - [fix, pos.y - HALF, pos.z + HALF], - [fix, pos.y + HALF, pos.z + HALF] - ]; - if (off.ox > 0) arr.reverse(); - } - if (off.oy) { - fix = pos.y + HALF * off.oy; - arr = [ - // triangle 1 - [pos.x - HALF, fix, pos.z - HALF], - [pos.x + HALF, fix, pos.z + HALF], - [pos.x + HALF, fix, pos.z - HALF], - // triangle 2 - [pos.x - HALF, fix, pos.z - HALF], - [pos.x - HALF, fix, pos.z + HALF], - [pos.x + HALF, fix, pos.z + HALF] - ]; - if (off.oy < 0) arr.reverse(); - } - if (off.oz) { - fix = pos.z + HALF * off.oz; - arr = [ - // triangle 1 - [pos.x - HALF, pos.y - HALF, fix], - [pos.x + HALF, pos.y + HALF, fix], - [pos.x + HALF, pos.y - HALF, fix], - // triangle 2 - [pos.x - HALF, pos.y - HALF, fix], - [pos.x - HALF, pos.y + HALF, fix], - [pos.x + HALF, pos.y + HALF, fix] - ]; - if (off.oz > 0) arr.reverse(); - } - for (k = 0; k < arr.length; k++) { - vertices.appendAll(arr[k]); - } - normals.appendAll([ - 0,0,0, - 0,0,0 - ]); - } - } - if (scale) { - for (i = 0; i < vertices.length; i++) { - vertices[i] *= scale; - } - } - return {vertices: vertices, normals: null}; - } - - function selectionToGeometry2(scale) { let faceGroups = [], vertices = [], normals = [], @@ -1669,14 +1588,14 @@ THREE.Face3.prototype.mVisible = function(show) { } }); if (newgroup) { + let debug = debugExport === 'line'; let points = []; let map = {}; faceGroups.push({map,points}); group.forEach(face => { let pos = face.pos; let fac = FACE[face.key]; - // let MUL = 0.9; - let MUL = 1.0; + let MUL = debug ? 0.9 : 1.0; let xyz = { x: pos.x + fac.x * MUL, y: pos.y + fac.y * MUL, @@ -1715,6 +1634,15 @@ THREE.Face3.prototype.mVisible = function(show) { if (!op2.p) op2.p = [op1]; else op2.p.push(op1); points.push(op1); points.push(op2); + // debug resulting polygon + if (debugExport === 'line') { + debugLayer.poly(new Polygon() + .add(p1.x,p1.y,p1.z) + .add(p2.x,p2.y,p2.z), + 0x0000ff, true); + debugLayer.render(); + SPACE.refresh(); + } }); }); } @@ -1797,9 +1725,14 @@ THREE.Face3.prototype.mVisible = function(show) { } let poly = new Polygon(); - out.forEach(p => { - poly.add(p.x,p.y,p.z); - }); + out.forEach(p => poly.add(p.x,p.y,p.z)); + + // debug resulting polygon + if (debugExport === 'poly') { + debugLayer.poly(poly.clone(), 0x0000ff, true); + debugLayer.render(); SPACE.refresh(); + } + set.push(poly.ensureXY()); } @@ -1809,8 +1742,8 @@ THREE.Face3.prototype.mVisible = function(show) { let cuts = polys.flat().map(p => p.earcut()).flat().map(p => p.restoreXY()); // debug resulting cuts - if (debugExport) { - cuts.forEach(p => debugLayer.poly(p, 0xff0000, true, false)); + if (debugExport === 'cut') { + cuts.forEach(p => debugLayer.poly(p, 0xff0000, true)); debugLayer.render(); SPACE.refresh(); } @@ -1910,18 +1843,6 @@ THREE.Face3.prototype.mVisible = function(show) { save = saveAs(blob, name+".stl"); } - function downloadSelection2() { - if (selected.length === 0) return alert("make a selection to export"); - let name = debugExport ? 'debug' : prompt("Download Name", spaceName); - if (!name) return; - let scale = unitsToMM(spaceUnits), - geo = selectionToGeometry2(scale); - if (debugExport) return; - let stl = new moto.STL().encode(geo.vertices, geo.normals), - blob = new Blob([stl], {type: 'application/octet-binary'}), - save = saveAs(blob, name+".stl"); - } - function selectAll() { selected = []; for (let i = 0; i < selectable.length; i++) {