From 33574454b62f35654caedc8b392a973e6f047022 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 30 Nov 2020 18:46:56 -0500 Subject: [PATCH] checkpoint tracing work --- src/kiri/main.js | 7 ++ src/mode/cam/client.js | 142 ++++++++++++++++++++++++----------------- src/mode/cam/driver.js | 16 +++-- 3 files changed, 103 insertions(+), 62 deletions(-) diff --git a/src/kiri/main.js b/src/kiri/main.js index 19211707..47529041 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -315,6 +315,13 @@ unit_scale: unitScale }, widgets: { + map: function() { + let map = {}; + WIDGETS.forEach(widget => { + map[widget.id] = widget; + }); + return map; + }, new: newWidget, all: function() { return WIDGETS.slice() }, for: forAllWidgets, diff --git a/src/mode/cam/client.js b/src/mode/cam/client.js index 3c64dffc..fa6ee1d6 100644 --- a/src/mode/cam/client.js +++ b/src/mode/cam/client.js @@ -128,9 +128,13 @@ } }); + let showTab, lastTab, tab, iw, ic; api.event.on("cam.tabs.add", func.tabAdd = () => { + func.traceDone(); alert = api.show.alert("<esc> key cancels editing tabs"); api.feature.hover = true; + func.hover = func.tabHover; + func.hoverUp = func.tabHoverUp; }); api.event.on("cam.tabs.done", func.tabDone = () => { delbox('tabb'); @@ -144,15 +148,87 @@ }); API.conf.save(); }); + func.tabHover = function(data) { + delbox('tabb'); + const { int, type, point } = data; + const object = int ? int.object : null; + const tab = int ? object.tab : null; + if (lastTab) { + lastTab.box.material.color.r = 0; + lastTab = null; + } + if (tab) { + tab.box.material.color.r = 0.5; + lastTab = tab; + return; + } + if (type !== 'widget') { + iw = null; + return; + } + let n = int.face.normal; + iw = int.object.widget; + ic = int.point; + // only near vertical faces + if (Math.abs(n.z) > 0.1) { + return; + } + showTab = createTabBox(iw, ic, n); + }; + func.tabHoverUp = function(int) { + delbox('tabb'); + if (lastTab) { + const {widget, box, id} = lastTab; + widget.adds.remove(box); + widget.mesh.remove(box); + delete widget.tabs[id]; + let ta = API.widgets.annotate(widget.id).tab; + let ix = 0; + ta.forEach((rec,i) => { + if (rec.id === id) { + ix = i; + } + }); + ta.splice(ix,1); + API.conf.save(); + return; + } + if (!iw) return; + let ip = iw.track.pos; + let wa = api.widgets.annotate(iw.id); + let wt = (wa.tab = wa.tab || []); + let pos = { + x: showTab.pos.x - ip.x, + y: -showTab.pos.z - ip.y, + z: showTab.pos.y + ip.z, + } + let id = Date.now(); + let { dim, rot } = showTab; + let rec = { pos, dim, rot, id }; + wt.push(Object.clone(rec)); + addWidgetTab(iw, rec); + API.conf.save(); + }; api.event.on("cam.trace.add", func.traceAdd = () => { + func.tabDone(); alert = api.show.alert("<esc> key cancels editing traces"); KIRI.client.traces(done => { console.log({got_traces: done}); + KIRI.api.widgets.opacity(0.5); + KIRI.api.widgets.all().forEach(widget => { + let stack = STACKS.create(`trace-${widget.id}`, widget.mesh); + widget.traces.forEach(slice => { + stack.add(slice.render); + }); + }); }); api.feature.hover = true; + func.hover = func.traceHover; + func.hoverUp = func.traceHoverUp; }); api.event.on("cam.trace.done", func.traceDone = () => { + KIRI.api.widgets.opacity(1); api.hide.alert(alert); api.feature.hover = false; }); @@ -163,6 +239,12 @@ }); API.conf.save(); }); + func.traceHover = function(int) { + // console.log({traceHover: int}); + }; + func.traceHoverUp = function(data) { + // console.log({traceHoverUp: data}); + }; api.event.on("slice.begin", () => { if (isCamMode) { @@ -214,69 +296,13 @@ if (!isCamMode) { return; } - delbox('tabb'); - if (lastTab) { - const {widget, box, id} = lastTab; - widget.adds.remove(box); - widget.mesh.remove(box); - delete widget.tabs[id]; - let ta = API.widgets.annotate(widget.id).tab; - let ix = 0; - ta.forEach((rec,i) => { - if (rec.id === id) { - ix = i; - } - }); - ta.splice(ix,1); - API.conf.save(); - return; - } - if (!iw) return; - let ip = iw.track.pos; - let wa = api.widgets.annotate(iw.id); - let wt = (wa.tab = wa.tab || []); - let pos = { - x: showTab.pos.x - ip.x, - y: -showTab.pos.z - ip.y, - z: showTab.pos.y + ip.z, - } - let id = Date.now(); - let { dim, rot } = showTab; - let rec = { pos, dim, rot, id }; - wt.push(Object.clone(rec)); - addWidgetTab(iw, rec); - API.conf.save(); + func.hoverUp(int); }); - let showTab, lastTab, tab, iw, ic; api.event.on("mouse.hover", data => { if (!isCamMode) { return; } - delbox('tabb'); - const { int, type, point } = data; - const object = int ? int.object : null; - const tab = int ? object.tab : null; - if (lastTab) { - lastTab.box.material.color.r = 0; - lastTab = null; - } - if (tab) { - tab.box.material.color.r = 0.5; - lastTab = tab; - return; - } - if (type !== 'widget') { - iw = null; - return; - } - let n = int.face.normal; - iw = int.object.widget; - ic = int.point; - // only near vertical faces - if (Math.abs(n.z) > 0.1) { - return; - } - showTab = createTabBox(iw, ic, n); + func.hover(data); }); }; diff --git a/src/mode/cam/driver.js b/src/mode/cam/driver.js index ddcf9500..87767ee6 100644 --- a/src/mode/cam/driver.js +++ b/src/mode/cam/driver.js @@ -27,9 +27,14 @@ if (KIRI.client) KIRI.client.traces = function(ondone) { KIRI.client.sync(); - send("traces", { - settings: API.conf.get() - }, ondone); + let settings = API.conf.get(); + let widgets = API.widgets.map(); + send("traces", { settings }, output => { + KIRI.codec.decode(output).forEach(rec => { + widgets[rec.id].traces = rec.traces; + }); + ondone(true); + }); }; if (KIRI.worker) @@ -37,7 +42,10 @@ const { settings } = data; const widgets = Object.values(cache); widgets.forEach(widget => CAM.traces(settings, widget)); - send.done(123); + send.done(KIRI.codec.encode(widgets.map(widget => {return { + id: widget.id, + traces: widget.traces + }}))); }; });