serialize widget slicing for threading so supports resolve properly
This commit is contained in:
parent
5ef402b72d
commit
5947dda899
2 changed files with 101 additions and 73 deletions
119
src/kiri/main.js
119
src/kiri/main.js
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue