From 2f2cfbc16576165d554f2e56cf5137f29bae0685 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sat, 10 Jul 2021 22:20:07 -0400 Subject: [PATCH] add clean and simplify to wasm offset --- src/geo/polygons.js | 2 +- src/geo/wasm.js | 4 ++-- wasm/kiri-geo.cpp | 18 ++++++++++++------ wasm/kiri-geo.wasm | Bin 66303 -> 66856 bytes 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 59b82f91..4dd6107f 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -526,7 +526,7 @@ zed = opts.z || 0; if (opts.wasm && geo.wasm) { - polys = geo.wasm.js.offset(polys, offs, zed); + polys = geo.wasm.js.offset(polys, offs, zed, clean ? CONF.clipperClean : 0, simple ? 1 : 0); } else { let coff = new ClipperLib.ClipperOffset(opts.miter, opts.arc), ctre = new ClipperLib.PolyTree(); diff --git a/src/geo/wasm.js b/src/geo/wasm.js index 9e33106f..9ff2c98d 100644 --- a/src/geo/wasm.js +++ b/src/geo/wasm.js @@ -76,12 +76,12 @@ if (!self.window) (function() { return out; } - function polyOffset(polys, offset, z) { + function polyOffset(polys, offset, z, clean, simple) { geo.count.offset++; let wasm = geo.wasm, buffer = geo.wasm.shared, pcount = writePolys(new DataWriter(wasm.heap, buffer), polys), - resat = wasm.fn.offset(buffer, pcount, offset * factor), + resat = wasm.fn.offset(buffer, pcount, offset * factor, clean, simple), out = readPolys(new DataReader(wasm.heap, resat), z); return polyNest(out); } diff --git a/wasm/kiri-geo.cpp b/wasm/kiri-geo.cpp index 5e9ea426..259c9e71 100644 --- a/wasm/kiri-geo.cpp +++ b/wasm/kiri-geo.cpp @@ -85,7 +85,7 @@ Uint32 writePolys(Paths &outs, Uint32 pos) { } __attribute__ ((export_name("poly_offset"))) -Uint32 poly_offset(Uint32 memat, Uint32 polys, float offset) { +Uint32 poly_offset(Uint32 memat, Uint32 polys, float offset, float clean, Uint8 simple) { Paths ins(polys); Paths outs; @@ -94,11 +94,17 @@ Uint32 poly_offset(Uint32 memat, Uint32 polys, float offset) { pos = readPolys(ins, pos, polys); - // clean and simplify polygons - // Paths cleans, simples; - // CleanPolygons(ins, cleans, 250); - // SimplifyPolygons(cleans, simples, pftNonZero); - // ins = simples; + if (clean > 0) { + Paths cleans; + CleanPolygons(ins, cleans, clean); + ins = cleans; + } + + if (simple > 0) { + Paths simples; + SimplifyPolygons(ins, simples); + ins = simples; + } ClipperOffset co; co.AddPaths(ins, jtMiter, etClosedPolygon); diff --git a/wasm/kiri-geo.wasm b/wasm/kiri-geo.wasm index 83487c7553fe87d253cad3e4d3f294e93a804898..db0d7bd7bfa0db05f424490d639dcd524b0ec1e3 100755 GIT binary patch delta 11117 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 delta 10597 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