serialize widget slicing for threading so supports resolve properly

This commit is contained in:
Stewart Allen 2021-06-25 14:10:00 -04:00
commit 5947dda899
2 changed files with 101 additions and 73 deletions

View file

@ -1002,7 +1002,6 @@
API.event.emit('slice.begin', getMode());
let slicing = WIDGETS.slice().filter(w => !w.track.ignore),
countdown = slicing.length,
totalProgress,
track = {},
mode = settings.mode,
@ -1029,16 +1028,29 @@
segNumber = 0,
errored = false,
startTime = Date.now(),
toSlice = slicing.slice(),
camOrLaser = mode === 'CAM' || mode === 'LASER',
lastMsg;
// for each widget, slice
for (let widget of slicing) {
let camOrLaser = mode === 'CAM' || mode === 'LASER',
stack = widget.stack = STACKS.create(widget.id, widget.mesh),
factor = (widget.getVertices().count / defvert);
for (let widget of toSlice) {
widget.stats.progress = 0;
widget.setColor(color.slicing);
}
sliceNext();
function sliceNext() {
if (toSlice.length) {
sliceWidget(toSlice.shift())
} else {
sliceDone();
}
}
function sliceWidget(widget) {
let stack = widget.stack = STACKS.create(widget.id, widget.mesh),
factor = (widget.getVertices().count / defvert);
widget.slice(settings, function(sliced, error) {
widget.rotinfo = null;
let mark = Date.now();
@ -1059,52 +1071,12 @@
KIRI.client.restart();
API.event.emit('slice.error', error);
}
// discard remaining errors
if (errored) {
return;
}
let alert = null;
// on the last exit, update ui and call the callback
if (--countdown === 0) {
if (scale === 1 && feature.work_alerts) {
alert = API.show.alert("Rendering");
};
KIRI.client.unrotate(settings, () => {
for (let widget of slicing) {
// on done
segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack);
// rotate stack for belt beds
if (widget.rotinfo) {
widget.stack.obj.rotate(widget.rotinfo);
}
if (scale === 1) {
// clear wireframe
widget.setWireframe(false, color.wireframe, color.wireframe_opacity);
widget.setOpacity(camOrLaser ? color.cam_sliced_opacity : color.sliced_opacity);
widget.setColor(color.deselected);
API.hide.alert(alert);
}
}
updateSliderMax(true);
setVisibleLayer(-1, 0);
if (scale === 1) {
updateStackLabelState();
}
});
if (scale === 1) {
API.show.progress(0);
}
// cause visuals to update
SPACE.scene.active();
// mark slicing complete for prep/preview
complete.slice = true;
API.event.emit('slice.end', getMode());
// print stats
segtimes.total = Date.now() - now;
DBUG.log(segtimes);
if (callback && typeof callback === 'function') {
callback();
}
// terminate slicing
sliceDone();
} else {
// start next widget slice
sliceNext();
}
}, function(update, msg) {
if (msg && msg !== lastMsg) {
@ -1124,6 +1096,49 @@
API.show.progress(offset + (totalProgress / WIDGETS.length) * scale, msg);
});
}
function sliceDone() {
let alert = null;
if (scale === 1 && feature.work_alerts) {
alert = API.show.alert("Rendering");
};
KIRI.client.unrotate(settings, () => {
for (let widget of slicing) {
// on done
segtimes[`${widget.id}_${segNumber++}_draw`] = widget.render(widget.stack);
// rotate stack for belt beds
if (widget.rotinfo) {
widget.stack.obj.rotate(widget.rotinfo);
}
if (scale === 1) {
// clear wireframe
widget.setWireframe(false, color.wireframe, color.wireframe_opacity);
widget.setOpacity(camOrLaser ? color.cam_sliced_opacity : color.sliced_opacity);
widget.setColor(color.deselected);
API.hide.alert(alert);
}
}
updateSliderMax(true);
setVisibleLayer(-1, 0);
if (scale === 1) {
updateStackLabelState();
}
});
if (scale === 1) {
API.show.progress(0);
}
// cause visuals to update
SPACE.scene.active();
// mark slicing complete for prep/preview
complete.slice = true;
API.event.emit('slice.end', getMode());
// print stats
segtimes.total = Date.now() - now;
DBUG.log(segtimes);
if (callback && typeof callback === 'function') {
callback();
}
}
}
function preparePreview(callback, scale = 1, offset = 0) {