From e94a8d4d1fa3d4112b87303eada0bb0b19e2cdac Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 19 Jun 2021 15:17:36 -0400 Subject: [PATCH] defer shadow creation. de-rez polys for massive shadow unions in some cases --- src/geo/polygon.js | 16 +++++++++++++--- src/mode/fdm/slice.js | 32 ++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index c12239cf..69419673 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -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; diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 9a4ac88b..fe54f5eb 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -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");