rm dead code. clean up slicing path marginally. bug fix belt support render

This commit is contained in:
Stewart Allen 2024-07-06 19:09:36 -04:00
commit 9d6e4a6512
6 changed files with 59 additions and 65 deletions

View file

@ -132,6 +132,7 @@ FDM.init = function(kiri, api) {
}; };
} }
} }
api.event.on("function.animate", (mode) => { api.event.on("function.animate", (mode) => {
if (!(isFdmMode && lastView === VIEWS.PREVIEW)) { if (!(isFdmMode && lastView === VIEWS.PREVIEW)) {
return; return;
@ -145,6 +146,7 @@ FDM.init = function(kiri, api) {
$('anim-slider').value = 500; $('anim-slider').value = 500;
api.const.STACKS.setFraction(0.5); api.const.STACKS.setFraction(0.5);
}); });
api.event.on("mode.set", mode => { api.event.on("mode.set", mode => {
isFdmMode = mode === 'FDM'; isFdmMode = mode === 'FDM';
lastMode = mode; lastMode = mode;
@ -152,12 +154,13 @@ FDM.init = function(kiri, api) {
for (let el of [...document.getElementsByClassName('mode-fdm')]) { for (let el of [...document.getElementsByClassName('mode-fdm')]) {
api.uc.setClass(el, 'hide', !isFdmMode); api.uc.setClass(el, 'hide', !isFdmMode);
} }
updateVisiblity(); updateSupportVisiblity();
}); });
api.event.on("view.set", view => { api.event.on("view.set", view => {
$('top-slider').style.display = 'none'; $('top-slider').style.display = 'none';
lastView = view; lastView = view;
updateVisiblity(); updateSupportVisiblity();
filterSynth(); filterSynth();
func.sdone(); func.sdone();
// let ranges = api.conf.get().process.ranges; // let ranges = api.conf.get().process.ranges;
@ -175,27 +178,28 @@ FDM.init = function(kiri, api) {
} }
} }
}); });
api.event.on("range.updates", updateRanges); api.event.on("range.updates", updateRanges);
api.event.on("settings.load", (settings) => { api.event.on("settings.load", (settings) => {
if (settings.mode !== 'FDM') return; if (settings.mode !== 'FDM') return;
restoreSupports(api.widgets.all()); restoreSupports(api.widgets.all());
updateRanges(settings.process.ranges); updateRanges(settings.process.ranges);
}); });
api.event.on("settings.saved", (settings) => { api.event.on("settings.saved", (settings) => {
updateRanges(settings.process.ranges); updateRanges(settings.process.ranges);
}); });
api.event.on("button.click", target => { api.event.on("button.click", target => {
switch (target) { switch (target) {
case api.ui.ssaGen: return func.sgen(); case api.ui.ssaGen: return func.sgen();
case api.ui.ssmAdd: return func.sadd(); case api.ui.ssmAdd: return func.sadd();
case api.ui.ssmDun: return func.sdone(); case api.ui.ssmDun: return func.sdone();
case api.ui.ssmClr: case api.ui.ssmClr: return func.sclear();
// return api.uc.confirm("clear supports?").then(ok => {
// if (ok) func.sclear();
// });
func.sclear();
} }
}); });
api.event.on("fdm.supports.detect", func.sgen = () => { api.event.on("fdm.supports.detect", func.sgen = () => {
let alerts = []; let alerts = [];
let { process, device } = api.conf.get(); let { process, device } = api.conf.get();
@ -232,10 +236,12 @@ FDM.init = function(kiri, api) {
api.event.emit("fdm.supports.detected"); api.event.emit("fdm.supports.detected");
}); });
}); });
api.event.on("fdm.supports.add", func.sadd = () => { api.event.on("fdm.supports.add", func.sadd = () => {
alert = api.show.alert("[esc] key cancels support editing"); alert = api.show.alert("[esc] key cancels support editing");
api.feature.hover = addingSupports = true; api.feature.hover = addingSupports = true;
}); });
api.event.on("fdm.supports.done", func.sdone = () => { api.event.on("fdm.supports.done", func.sdone = () => {
delbox('intZ'); delbox('intZ');
delbox('intW'); delbox('intW');
@ -244,22 +250,22 @@ FDM.init = function(kiri, api) {
api.feature.hover = addingSupports = false; api.feature.hover = addingSupports = false;
fromPillar = undefined; fromPillar = undefined;
}); });
api.event.on("fdm.supports.clear", func.sclear = () => { api.event.on("fdm.supports.clear", func.sclear = () => {
func.sdone(); func.sdone();
if (clearAllWidgetSupports()) { if (clearAllWidgetSupports()) {
api.conf.save(); api.conf.save();
} }
}); });
api.event.on("slice.begin", () => { api.event.on("slice.begin", () => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
} }
func.sdone(); func.sdone();
updateVisiblity(); updateSupportVisiblity();
// synth support widget for each widget group // synth support widget for each widget group
// iow, create support meshes based on support widget annotation // iow, create support meshes based on support widget annotation
let synth = [];
for (let group of kiri.Widget.Groups.list()) { for (let group of kiri.Widget.Groups.list()) {
let merge = group.filter(w => w.sups).map(w => Object.values(w.sups)).flat(); let merge = group.filter(w => w.sups).map(w => Object.values(w.sups)).flat();
if (!merge.length) { if (!merge.length) {
@ -285,27 +291,32 @@ FDM.init = function(kiri, api) {
kiri.space.world.add(sw.mesh); kiri.space.world.add(sw.mesh);
} }
}); });
api.event.on("slice.end", () => { api.event.on("slice.end", () => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
} }
}); });
api.event.on("key.esc", () => { api.event.on("key.esc", () => {
if (isFdmMode) { if (isFdmMode) {
func.sdone() func.sdone()
} }
}); });
api.event.on("selection.scale", () => { api.event.on("selection.scale", () => {
if (isFdmMode) { if (isFdmMode) {
clearRanges(); clearRanges();
func.sclear(); func.sclear();
} }
}); });
api.event.on("widget.delete", widget => { api.event.on("widget.delete", widget => {
if (isFdmMode) { if (isFdmMode) {
clearRanges(); clearRanges();
} }
}); });
api.event.on("widget.duplicate", (widget, oldwidget) => { api.event.on("widget.duplicate", (widget, oldwidget) => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
@ -318,6 +329,7 @@ FDM.init = function(kiri, api) {
restoreSupports([widget]); restoreSupports([widget]);
} }
}); });
api.event.on("widget.mirror", widget => { api.event.on("widget.mirror", widget => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
@ -329,6 +341,7 @@ FDM.init = function(kiri, api) {
wsup.box.position.x = wsup.x = sup.x = -sup.x; wsup.box.position.x = wsup.x = sup.x = -sup.x;
}); });
}); });
api.event.on("widget.rotate", rot => { api.event.on("widget.rotate", rot => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
@ -351,6 +364,7 @@ FDM.init = function(kiri, api) {
}); });
} }
}); });
api.event.on("mouse.hover.up", func.hoverup = (on = {}) => { api.event.on("mouse.hover.up", func.hoverup = (on = {}) => {
let { event } = on; let { event } = on;
if (!isFdmMode) { if (!isFdmMode) {
@ -405,6 +419,7 @@ FDM.init = function(kiri, api) {
fromPillar = addWidgetSupport(iw, rec); fromPillar = addWidgetSupport(iw, rec);
api.conf.save(); api.conf.save();
}); });
function addSupportAtPoint(targets, point, ip, angle, id) { function addSupportAtPoint(targets, point, ip, angle, id) {
let up = new Vector3(0,1,0) let up = new Vector3(0,1,0)
let dn = new Vector3(0,-1,0) let dn = new Vector3(0,-1,0)
@ -432,6 +447,7 @@ FDM.init = function(kiri, api) {
} }
} }
} }
api.event.on("mouse.hover", data => { api.event.on("mouse.hover", data => {
if (!isFdmMode) { if (!isFdmMode) {
return; return;
@ -489,6 +505,7 @@ FDM.init = function(kiri, api) {
return func.hoverup(); return func.hoverup();
} }
}); });
api.event.on("export.debug", msg => { api.event.on("export.debug", msg => {
if (msg.arcQ && msg.arcQ.length > 2) { if (msg.arcQ && msg.arcQ.length > 2) {
if (xpdebug) { if (xpdebug) {
@ -539,17 +556,6 @@ function scheduleSupportSave(widget) {
}, 50); }, 50);
} }
function activeSupports() {
const active = [];
api.widgets.all().forEach(widget => {
Object.values(widget.sups || {}).forEach(support => {
active.push(support.box);
support.box.support = true;
});
});
return active;
}
function restoreSupports(widgets) { function restoreSupports(widgets) {
widgets.forEach(widget => { widgets.forEach(widget => {
const supports = api.widgets.annotate(widget.id).support || []; const supports = api.widgets.annotate(widget.id).support || [];
@ -594,10 +600,11 @@ function removeWidgetSupport(widget, rec) {
fromPillar = undefined; fromPillar = undefined;
} }
function updateVisiblity() { function updateSupportVisiblity() {
api.widgets.all().forEach(w => { const visible = (lastMode === 'FDM' && lastView === VIEWS.ARRANGE);
setSupportVisiblity(w, lastMode === 'FDM' && lastView === VIEWS.ARRANGE); for (let w of api.widgets.all()) {
}); setSupportVisiblity(w, visible);
}
} }
function setSupportVisiblity(widget, bool) { function setSupportVisiblity(widget, bool) {

View file

@ -302,21 +302,7 @@ kiri.worker = {
// widget sync // widget sync
sync(data, send) { sync(data, send) {
if (data.valid) { // ensure each widget belongs to at least one group
// remove widgets not present in valid list
for (let key in wcache) {
if (data.valid.indexOf(key) < 0) {
delete wcache[key];
for (let [id,group] of Object.entries(wgroup)) {
wgroup[id] = group = group.filter(v => v.id !== key);
group.id = id;
}
}
}
send.done(data.id);
return;
}
let group = wgroup[data.group]; let group = wgroup[data.group];
if (!group) { if (!group) {
group = []; group = [];
@ -380,13 +366,14 @@ kiri.worker = {
for (let w of group) { for (let w of group) {
w.moveMesh(0, miny, 0); w.moveMesh(0, miny, 0);
} }
// rotating the root of the group rotates all widgets in the group
widget.rotate(rotation, 0, 0, true, false); widget.rotate(rotation, 0, 0, true, false);
let minr = gmin(group);
widget.belt = { widget.belt = {
angle: 45, angle: 45,
// used during prepare
xpos, xpos,
ypos, ypos,
yadd: minr.maxy - minr.miny, // used during slice
dy: - miny - yoff, dy: - miny - yoff,
dz: 0 dz: 0
}; };

View file

@ -155,12 +155,10 @@ const client = exports({
}, },
// widget sync // widget sync
sync(widgets, copy) { sync(widgets) {
if (!widgets) { if (!widgets) {
widgets = kiri.api.widgets.all(); widgets = kiri.api.widgets.all();
} }
// send list of currently valid widgets
send("sync", { valid: widgets.map(w => w.id) }, () => {});
// sync any widget that has changed // sync any widget that has changed
for (let widget of widgets.filter(w => w.modified || !syncd[w.id])) { for (let widget of widgets.filter(w => w.modified || !syncd[w.id])) {
syncd[widget.id] = true; syncd[widget.id] = true;
@ -170,7 +168,7 @@ const client = exports({
meta: widget.meta, meta: widget.meta,
group: widget.group.id, group: widget.group.id,
track: widget.track, track: widget.track,
vertices: copy ? vertices.slice() : vertices, vertices,
position: widget.mesh.position, position: widget.mesh.position,
}, done => { }, done => {
widget.modified = false; widget.modified = false;

View file

@ -72,7 +72,6 @@ function prepareSlices(callback, scale = 1, offset = 0) {
// refresh widget list because 'slice.begin' may generate support widgets // refresh widget list because 'slice.begin' may generate support widgets
const slicing = api.widgets.all() const slicing = api.widgets.all()
.slice()
.filter(w => !w.track.ignore && !w.meta.disabled); .filter(w => !w.track.ignore && !w.meta.disabled);
if (slicing.length === 0) { if (slicing.length === 0) {
@ -117,17 +116,13 @@ function prepareSlices(callback, scale = 1, offset = 0) {
process.beltAnchor = process.firstLayerBeltLead; process.beltAnchor = process.firstLayerBeltLead;
} }
stacks.clear(); stacks.clear(); // clear rendered stacks
client.clear(); // clear worker cache
client.sync(); // send fresh widget data to worker
if (isBelt) { if (isBelt) {
// clearing cache causes data to be re-sent to worker
client.clear();
// we send copies of vertices in belt mode only (possibly obsolete?)
client.sync(undefined, true);
// belt op required to rotate meshes for slicing // belt op required to rotate meshes for slicing
client.rotate(settings); client.rotate(settings);
} else {
// send updated vertices if widget has been rotated/scaled
client.sync();
} }
function sliceNext() { function sliceNext() {
@ -141,12 +136,9 @@ function prepareSlices(callback, scale = 1, offset = 0) {
} }
function sliceWidget(widget) { function sliceWidget(widget) {
widget.stack = stacks.create(widget.id, widget.mesh); // weight each widget progress % by their # vertices
let factor = (widget.getVertices().count / defvert); let factor = (widget.getVertices().count / defvert);
// compensate for zcut (widget moved through floor)
widget.stack.obj.view.position.z = widget.track.zcut || 0;
widget.slice(settings, (sliced, error) => { widget.slice(settings, (sliced, error) => {
let mark = Date.now(); let mark = Date.now();
// update UI info // update UI info
@ -229,8 +221,6 @@ function prepareSlices(callback, scale = 1, offset = 0) {
if (scale === 1) { if (scale === 1) {
show.progress(0); show.progress(0);
} }
// cause visuals to update
space.scene.active();
// mark slicing complete for prep/preview // mark slicing complete for prep/preview
complete.slice = true; complete.slice = true;
event.emit('slice.end', settings.mode); event.emit('slice.end', settings.mode);
@ -240,9 +230,16 @@ function prepareSlices(callback, scale = 1, offset = 0) {
if (callback && typeof callback === 'function') { if (callback && typeof callback === 'function') {
callback(); callback();
} }
if (isBelt) {
// required to render supports properly (in belt mode)
// because this updates widget top z which is affected by rotation
api.platform.update_top_z();
}
// refresh / repaint workspace
space.refresh();
} }
// kick of slicing chain // kick off slicing chain
sliceNext(); sliceNext();
} }

View file

@ -742,6 +742,10 @@ class Widget {
onupdate(0.0001, "slicing"); onupdate(0.0001, "slicing");
if (kiri.client && !widget.inWorker) { if (kiri.client && !widget.inWorker) {
// store slicing visuals
widget.stack = kiri.stacks.create(widget.id, widget.mesh);
// compensate for zcut (widget moved through floor)
widget.stack.obj.view.position.z = widget.track.zcut || 0;
// in case result of slice is nothing, do not preserve previous // in case result of slice is nothing, do not preserve previous
widget.slices = [] widget.slices = []

View file

@ -1433,26 +1433,27 @@ gapp.register("moto.space", [], (root, exports) => {
let animates = 0; let animates = 0;
let rateStart = Date.now(); let rateStart = Date.now();
let renders = [];
let renderStart; let renderStart;
let renders = [];
function animate() { function animate() {
animates++; animates++;
const now = Date.now(); const now = Date.now();
if (now - rateStart > 1000) { if (now - rateStart > 1000) {
// compute stats roughly every second
const delta = now - rateStart; const delta = now - rateStart;
fps = 1000 * animates / delta; fps = 1000 * animates / delta;
animates = 0; animates = 0;
rateStart = now; rateStart = now;
// look for slowest rendered frame
renderTime = Math.max(0, ...renders); renderTime = Math.max(0, ...renders);
renders.length = 0; renders.length = 0;
} }
requestAnimationFrame(animate); requestAnimationFrame(animate);
if (docVisible && !freeze && Date.now() - lastAction < 1500) { if (docVisible && !freeze && Date.now() - lastAction < 1500) {
renderStart = Date.now(); renderStart = Date.now();
renderer.render(SCENE, camera); renderer.render(SCENE, camera);
// track frame render times
renders.push(Date.now() - renderStart); renders.push(Date.now() - renderStart);
} else { } else {
fps = 0; fps = 0;