fix shadow for manual supports
This commit is contained in:
parent
3ba5601cfd
commit
56c8f8e588
1 changed files with 57 additions and 38 deletions
|
|
@ -146,6 +146,36 @@
|
|||
onSliceDoneAsync(slices).then(ondone);
|
||||
}
|
||||
|
||||
async function doShadow(slices) {
|
||||
if (widget.shadow) {
|
||||
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) {
|
||||
// console.log({alllen});
|
||||
alltops = alltops.map(p => p.clean(true, undefined, 5000));
|
||||
// console.log({reduced: alltops.map(p => p.deepLength).reduce((a,v)=>a+v)});
|
||||
}
|
||||
let mark = Date.now();
|
||||
// shadow = POLY.union(alltops, 0.1, true);
|
||||
shadow = doConcurrent ?
|
||||
await KIRI.minions.union(alltops, 0.1) :
|
||||
POLY.union(alltops, 0.1, true);
|
||||
// console.log({unioned_in: Date.now() - mark});
|
||||
if (spro.sliceSupportExtra) {
|
||||
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
||||
}
|
||||
widget.shadow = shadow;
|
||||
// slices[0].output()
|
||||
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
||||
// .addPolys(shadow);
|
||||
}
|
||||
|
||||
async function onSliceDoneAsync(slices) {
|
||||
// remove all empty slices above part but leave below
|
||||
// for multi-part (multi-extruder) setups where the void is ok
|
||||
|
|
@ -165,6 +195,11 @@
|
|||
return;
|
||||
}
|
||||
|
||||
// create shadow for non-belt supports
|
||||
if (!isBelt && (isSynth || (!isSynth && supportDensity && spro.sliceSupportEnable))) {
|
||||
await doShadow(slices);
|
||||
}
|
||||
|
||||
// for synth support widgets, merge tops
|
||||
if (isSynth) {
|
||||
for (let slice of slices) {
|
||||
|
|
@ -200,17 +235,17 @@
|
|||
}
|
||||
// trim to group's shadow if not in belt mode
|
||||
if (!isBelt) {
|
||||
let group = widget.group[0];
|
||||
if (!group.shadow) {
|
||||
let gs = [];
|
||||
for (let w of group) {
|
||||
if (w.shadow) {
|
||||
gs = POLY.union([w.shadow,...gs],null,0.1);
|
||||
}
|
||||
}
|
||||
group.shadow = gs;
|
||||
}
|
||||
tops = POLY.setZ(POLY.trimTo(tops, group.shadow), slice.z);
|
||||
// let group = widget.group[0];
|
||||
// if (!group.shadow) {
|
||||
// let gs = [];
|
||||
// for (let w of group) {
|
||||
// if (w.shadow) {
|
||||
// gs = POLY.union([w.shadow,...gs],null,0.1);
|
||||
// }
|
||||
// }
|
||||
// group.shadow = gs;
|
||||
// }
|
||||
tops = POLY.setZ(POLY.trimTo(tops, widget.shadow), slice.z);
|
||||
}
|
||||
}
|
||||
slice.tops = [];
|
||||
|
|
@ -464,54 +499,38 @@
|
|||
});
|
||||
}
|
||||
} else if (isSynth) {
|
||||
forSlices(0.5, 0.7, slice => {
|
||||
let promises = doConcurrent ? [] : undefined;
|
||||
forSlices(0.5, promises ? 0.6 : 0.7, slice => {
|
||||
let params = slice.params || spro;
|
||||
let density = params.sliceSupportDensity;
|
||||
if (density)
|
||||
for (let top of slice.tops) {
|
||||
let offset = [];
|
||||
POLY.expand(top.shells, -nozzleSize/4, slice.z, offset);
|
||||
fillSupportPolys(offset, lineWidth, density, slice.z);
|
||||
fillSupportPolys(promises, offset, lineWidth, density, slice.z);
|
||||
top.fill_lines = offset.map(o => o.fill).flat().filter(v => v);
|
||||
}
|
||||
}, "infill");
|
||||
if (promises) {
|
||||
await tracker(promises, (i, t) => {
|
||||
trackupdate(i / t, 0.6, 0.7);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// auto support generation
|
||||
if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) {
|
||||
// create shadow for clipping supports
|
||||
let shadow = null;
|
||||
let alltops = slices.map(slice => slice.topPolys()).flat();
|
||||
let alllen = alltops.map(p => p.deepLength).reduce((a,v)=>a+v);
|
||||
if (alllen > 100000) {
|
||||
// console.log({alllen});
|
||||
alltops = alltops.map(p => p.clean(true, undefined, 5000));
|
||||
// console.log({reduced: alltops.map(p => p.deepLength).reduce((a,v)=>a+v)});
|
||||
}
|
||||
let mark = Date.now();
|
||||
// shadow = POLY.union(alltops, 0.1, true);
|
||||
shadow = doConcurrent ?
|
||||
await KIRI.minions.union(alltops, 0.1) :
|
||||
POLY.union(alltops, 0.1, true);
|
||||
// console.log({unioned_in: Date.now() - mark});
|
||||
if (spro.sliceSupportExtra) {
|
||||
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
||||
}
|
||||
widget.shadow = shadow;
|
||||
// slices[0].output()
|
||||
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
||||
// .addPolys(shadow);
|
||||
doShadow(slices);
|
||||
// console.log('start'); await BASE.util.ptimer(1000);
|
||||
forSlices(0.7, 0.8, slice => {
|
||||
doSupport(slice, spro, shadow);
|
||||
doSupport(slice, spro, widget.shadow);
|
||||
}, "support");
|
||||
// console.log('stop'); await BASE.util.ptimer(1000);
|
||||
let promises = doConcurrent ? [] : undefined;
|
||||
forSlices(0.8, promises ? 0.88 : 0.9, slice => {
|
||||
doSupportFill(promises, slice, lineWidth, supportDensity, spro.sliceSupportArea);
|
||||
}, "support.fill");
|
||||
}, "support");
|
||||
if (promises) {
|
||||
console.log({promises});
|
||||
await tracker(promises, (i, t) => {
|
||||
trackupdate(i / t, 0.88, 0.9);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue