defer shadow creation. de-rez polys for massive shadow unions in some cases
This commit is contained in:
parent
eb35c9a434
commit
e94a8d4d1f
2 changed files with 31 additions and 17 deletions
|
|
@ -41,6 +41,16 @@
|
|||
return this.points.length;
|
||||
}
|
||||
|
||||
get deepLength() {
|
||||
let len = this.length;
|
||||
if (this.inner) {
|
||||
for (let inner of this.inner) {
|
||||
len += inner.length;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
get bounds() {
|
||||
if (this._bounds) {
|
||||
return this._bounds;
|
||||
|
|
@ -1420,14 +1430,14 @@
|
|||
* simplify and merge collinear. only works for single
|
||||
* non-nested polygons. used primarily in slicer/connectLines.
|
||||
*/
|
||||
PRO.clean = function(deep, parent) {
|
||||
PRO.clean = function(deep, parent, merge = CONF.clipperClean) {
|
||||
let clib = self.ClipperLib,
|
||||
clip = clib.Clipper,
|
||||
clean = clip.CleanPolygon(this.toClipper()[0], CONF.clipperClean),
|
||||
clean = clip.CleanPolygon(this.toClipper()[0], merge),
|
||||
poly = fromClipperPath(clean, this.getZ());
|
||||
if (poly.length === 0) return this;
|
||||
if (deep && this.inner) {
|
||||
poly.inner = this.inner.map(inr => inr.clean(false, poly));
|
||||
poly.inner = this.inner.map(inr => inr.clean(false, poly, merge));
|
||||
}
|
||||
poly.parent = parent || this.parent;
|
||||
poly.area2 = this.area2;
|
||||
|
|
|
|||
|
|
@ -259,20 +259,6 @@
|
|||
slice.solids = [];
|
||||
});
|
||||
|
||||
// create shadow for clipping supports
|
||||
let shadow = null;
|
||||
if (!isBelt || spro.sliceSupportEnable) {
|
||||
let alltops = slices.map(slice => slice.topPolys()).flat();
|
||||
shadow = POLY.union(alltops,null,0.1);
|
||||
if (spro.sliceSupportExtra) {
|
||||
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
||||
}
|
||||
widget.shadow = shadow;
|
||||
// slices[0].output()
|
||||
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
||||
// .addPolys(shadow);
|
||||
}
|
||||
|
||||
// create shells and diff inner fillable areas
|
||||
forSlices(0.0, 0.2, slice => {
|
||||
let params = getRangeParameters(settings, slice.index);
|
||||
|
|
@ -474,6 +460,24 @@
|
|||
|
||||
// auto support generation
|
||||
if (!isBelt && !isSynth && supportDensity && spro.sliceSupportEnable) {
|
||||
// create shadow for clipping supports
|
||||
let mark = Date.now();
|
||||
let shadow = null;
|
||||
let alltops = slices.map(slice => slice.topPolys()).flat();
|
||||
let alllen = alltops.map(p => p.deepLength).reduce((a,v)=>a+v);
|
||||
// console.log({alllen});
|
||||
if (alllen > 100000) {
|
||||
alltops = alltops.map(p => p.clean(true, undefined, 10000));
|
||||
// console.log({reduced: alltops.map(p => p.deepLength).reduce((a,v)=>a+v)});
|
||||
}
|
||||
shadow = POLY.union(alltops,0.1,true);
|
||||
if (spro.sliceSupportExtra) {
|
||||
shadow = POLY.offset(shadow, spro.sliceSupportExtra);
|
||||
}
|
||||
widget.shadow = shadow;
|
||||
// slices[0].output()
|
||||
// .setLayer('shadow', { line: 0xff0000, check: 0xff0000 })
|
||||
// .addPolys(shadow);
|
||||
forSlices(0.7, 0.8, slice => {
|
||||
doSupport(slice, spro, shadow);
|
||||
}, "support");
|
||||
|
|
|
|||
Loading…
Reference in a new issue