diff --git a/src/add/array.js b/src/add/array.js index 540804d3..2c48e292 100644 --- a/src/add/array.js +++ b/src/add/array.js @@ -116,6 +116,12 @@ return null; }; + AP.removeAll = function(array) { + for (let i=0, il=array.length; i 0 * diff --git a/src/kiri/init.js b/src/kiri/init.js index 32082eba..33288e06 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -2015,7 +2015,7 @@ API.event.emit('mouse.hover.down', {int, point: int.point}); return; } - return// API.widgets.meshes().slice().append(SPACE.internals().platform); + return; } // lay flat with meta or ctrl clicking a selected face if (int && (event.ctrlKey || event.metaKey || API.feature.on_face_select)) { diff --git a/src/kiri/main.js b/src/kiri/main.js index 47529041..29df95e2 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -73,6 +73,7 @@ drop_layout: true, // layout on new drop preview: true, // allow bypassing preview generation hover: false, // when true fires mouse hover events + hoverAdds: false, // when true only searches widget additions }; const selection = { @@ -580,7 +581,9 @@ function meshArray() { let out = []; forAllWidgets(function(widget) { - out.push(widget.mesh); + if (!feature.hoverAdds) { + out.push(widget.mesh); + } out.appendAll(widget.adds); }); return out; diff --git a/src/kiri/stack.js b/src/kiri/stack.js index f1733066..e86f77a6 100644 --- a/src/kiri/stack.js +++ b/src/kiri/stack.js @@ -6,8 +6,10 @@ class Stack { constructor(view) { + this._view = view; this.view = view.newGroup(); this.slices = []; + this.meshes = []; this.freeMem = true; } @@ -15,7 +17,21 @@ return this.slices.length; } + hide() { + this.view.visible = false; + } + + show() { + this.view.visible = true; + } + + destroy() { + this._view.remove(this.view); + this.view = this.slices = this.meshes = null; + } + setVisible(newMin, newMax) { + this.show(); for (let i=0, s=this.slices, len=s.length; i= newMin && i <= newMax; } @@ -58,6 +74,7 @@ } const { polys, lines, faces, cface, paths, cpath, color, off } = layer; + const meshes = this.meshes; const defstate = !off; const mats = []; mats.state = defstate; @@ -105,6 +122,7 @@ } geo.setFromPoints(vert); const segs = new THREE.LineSegments(geo, mat); + meshes.push(segs); group.add(segs); mats.appendAll(mat); } @@ -132,6 +150,7 @@ const mesh = new THREE.Mesh(geo, mat); mesh.castShadow = true; mesh.receiveShadow = true; + meshes.push(mesh); group.add(mesh); mats.appendAll(mat); } @@ -160,6 +179,7 @@ mesh.position.z = z; mesh.castShadow = true; mesh.receiveShadow = true; + meshes.push(mesh); group.add(mesh); }); mats.appendAll(mat); diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 20e5d97b..7b879be7 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -105,6 +105,7 @@ } }); + // TAB/TRACE BUTTON HANDLERS api.event.on("button.click", target => { switch (target) { case api.ui.tabAdd: @@ -128,6 +129,7 @@ } }); + // TAB FUNCS let showTab, lastTab, tab, iw, ic; api.event.on("cam.tabs.add", func.tabAdd = () => { func.traceDone(); @@ -210,27 +212,44 @@ API.conf.save(); }; + // TRACE FUNCS + let traceOn = false, lastTrace; api.event.on("cam.trace.add", func.traceAdd = () => { + if (traceOn) { + return; + } func.tabDone(); alert = api.show.alert("<esc> key cancels editing traces"); - KIRI.client.traces(done => { - console.log({got_traces: done}); + traceOn = true; + KIRI.client.traces(() => { KIRI.api.widgets.opacity(0.5); - KIRI.api.widgets.all().forEach(widget => { - let stack = STACKS.create(`trace-${widget.id}`, widget.mesh); + KIRI.api.widgets.for(widget => { + let stack = new KIRI.Stack(widget.mesh); + widget.trace_stack = stack; widget.traces.forEach(slice => { - stack.add(slice.layers); + stack.addLayers(slice.layers); }); + widget.adds.appendAll(stack.meshes); }); }); api.feature.hover = true; + api.feature.hoverAdds = true; func.hover = func.traceHover; func.hoverUp = func.traceHoverUp; }); api.event.on("cam.trace.done", func.traceDone = () => { + if (!traceOn) { + return; + } + traceOn = false; KIRI.api.widgets.opacity(1); api.hide.alert(alert); api.feature.hover = false; + api.feature.hoverAdds = false; + KIRI.api.widgets.for(widget => { + widget.adds.removeAll(widget.trace_stack.meshes); + widget.trace_stack.destroy(); + }); }); api.event.on("cam.trace.clear", func.traceClear = () => { func.traceDone(); @@ -239,13 +258,31 @@ }); API.conf.save(); }); - func.traceHover = function(int) { - // console.log({traceHover: int}); + func.traceHover = function(data) { + if (lastTrace) { + let { color, colorSave } = lastTrace.material[0]; + color.r = colorSave.r; + color.g = colorSave.g; + color.b = colorSave.b; + } + if (data.type === 'platform') { + lastTrace = null; + return; + } + lastTrace = data.int.object; + let material = lastTrace.material[0]; + let color = material.color; + let {r, g, b} = color; + material.colorSave = {r, g, b}; + color.r = 255; + color.g = 0; + color.b = 0; }; - func.traceHoverUp = function(data) { - // console.log({traceHoverUp: data}); + func.traceHoverUp = function(int) { + if (int) console.log({traceHoverUp: int}); }; + // COMMON TAB/TRACE EVENT HANDLERS api.event.on("slice.begin", () => { if (isCamMode) { func.tabDone();