pre-compute de-rez'd top shadow in slicing pass which can be co-locataed with original slice data

This commit is contained in:
Stewart Allen 2021-06-23 23:34:12 -04:00
commit 210bf10ee0
2 changed files with 16 additions and 11 deletions

View file

@ -177,15 +177,18 @@
PRO.addTop = function(poly) {
if (poly.length) {
// standard legacy polygon
let top = new Top(poly);
this.tops.push(top);
return top;
} else {
// frop top object passed back by slicePost()
let top = new Top(poly.poly);
top.fill_lines = poly.fill_lines;
top.fill_off = poly.fill_off;
top.last = poly.last;
top.shells = poly.shells;
top.shadow = poly.shadow;
this.tops.push(top);
return top;
}

View file

@ -80,6 +80,7 @@
let fillOff = fillOffset * spaceMult;
let nutops = [];
// co-locate shell processing with top generation in slicer
for (let top of tops) {
nutops.push(FDM.share.doTopShells(z, top, count, offset/2, offset, fillOff, {
vase: vaseMode,
@ -87,6 +88,10 @@
danger: isDanger
}));
}
// add shadow (low rez poly) if needed
for (let top of nutops) {
top.shadow = top.poly.clean(true, undefined, CONF.clipper / 10);
}
data.tops = nutops;
} : undefined;
@ -211,17 +216,13 @@
return;
}
// create shadow for clipping supports
let shadow = null;
let allslices = widget.group.map(w => w.slices).flat();
let alltops = allslices.map(slice => slice.topPolys()).flat();
let alllen = alltops.map(p => p.deepLength).reduce((a,v)=>a+v);
// de-rez for really large #s
if (alllen > 100000) {
alltops = alltops.map(p => p.clean(true, undefined, CONF.clipper / 10));
}
shadow = doConcurrent ?
let alltops = widget.group
.map(w => w.slices).flat()
.map(s => s.tops).flat().map(t => t.shadow);
let shadow = doConcurrent ?
await KIRI.minions.union(alltops, 0.1) :
POLY.union(alltops, 0.1, true);
// expand shadow when requested (support clipping)
if (process.sliceSupportExtra) {
shadow = POLY.offset(shadow, process.sliceSupportExtra);
}
@ -1247,10 +1248,11 @@
down_traces = down ? POLY.flatten(down.topShells().clone(true)) : null;
if (experimental && down_tops) {
// de-rez complex polys because it's not that important for supports
let points = down_tops.map(p => p.deepLength).reduce((a,v)=>a+v);
if (points > 200) {
down_tops = down_tops.map(p => p.clean(true, undefined, CONF.clipper / 10));
// use de-rez'd top shadow instead
down_tops = down.tops.map(t => t.shadow);
// de-rez trace polys because it's not that important for supports
down_traces = down_traces.map(p => p.clean(true, undefined, CONF.clipper / 10));
}
}