From 0a2f467c9fcc4ce956060fdcfa7e0935d9eff64c Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Wed, 23 Jun 2021 00:05:40 -0400 Subject: [PATCH] resolve function calling in wasm --- src/geo/polygons.js | 4 +- wasm/kiri-geo.cpp | 149 +++++++++++--------------------------------- wasm/kiri-geo.wasm | Bin 65743 -> 64929 bytes 3 files changed, 38 insertions(+), 115 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 80793522..9cc5efaa 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -326,7 +326,7 @@ } else { let woutA = filter(geo.poly.diff(setA, setB, z)); outA.appendAll(woutA); - console.log({outA, woutA}); + // console.log({outA, woutA}); } } @@ -347,7 +347,7 @@ } else { let woutB = filter(geo.poly.diff(setB, setA, z)); outB.appendAll(woutB); - console.log({outB, woutB}); + // console.log({outB, woutB}); } } diff --git a/wasm/kiri-geo.cpp b/wasm/kiri-geo.cpp index 5b6a9812..9c82fd06 100644 --- a/wasm/kiri-geo.cpp +++ b/wasm/kiri-geo.cpp @@ -38,33 +38,48 @@ void mem_clr(Uint32 loc) { free((void *)loc); } -Uint32 readPoly(Path path, Uint32 pos) { +Uint32 readPoly(Path &path, Uint32 pos) { struct length16 *ls = (struct length16 *)(mem + pos); Uint16 points = ls->length; - if (debug) polygon(points, 0); + // if (debug) polygon(points, 0); pos += 2; while (points-- > 0) { struct point32 *ip = (struct point32 *)(mem + pos); pos += 8; path << IntPoint(ip->x, ip->y); - if (debug) point(ip->x, ip->y); + // if (debug) point(ip->x, ip->y); } return pos; } -Uint32 readPolys(Paths paths, Uint32 pos, Uint32 count) { +Uint32 readPolys(Paths &paths, Uint32 pos, Uint32 count) { Uint32 poly = 0; - if (debug) abc(poly, count, pos); + // if (debug) abc(poly, count, pos); while (count-- > 0) { pos = readPoly(paths[poly++], pos); } - if (debug) abc(poly, count, pos); + // if (debug) abc(poly, count, pos); return pos; } -__attribute__ ((export_name("set_debug"))) -void set_debug(Uint8 value) { - debug = value; +Uint32 writePolys(Paths &outs, Uint32 pos) { + for (Path po : outs) { + // if (debug) polygon(po.size(), 1); + struct length16 *ls = (struct length16 *)(mem + pos); + ls->length = po.size(); + pos += 2; + for (IntPoint pt : po) { + // if (debug) point(pt.X, pt.Y); + struct point32 *ip = (struct point32 *)(mem + pos); + ip->x = (int)pt.X; + ip->y = (int)pt.Y; + pos += 8; + } + } + // null terminate + struct length16 *ls = (struct length16 *)(mem + pos); + ls->length = 0; + return pos + 2; } __attribute__ ((export_name("poly_offset"))) @@ -75,27 +90,7 @@ Uint32 poly_offset(Uint32 memat, Uint32 polys, float offset) { Uint32 pos = memat; Uint16 poly = 0; - // pos = readPolys(ins, pos, polys); - - // while (polys-- > 0) { - // pos = readPoly(ins[poly++], pos); - // } - - while (poly < polys) { - struct length16 *ls = (struct length16 *)(mem + pos); - Uint16 points = ls->length; - if (debug) polygon(points, 0); - pos += 2; - while (points-- > 0) { - struct point32 *ip = (struct point32 *)(mem + pos); - pos += 8; - ins[poly] << IntPoint(ip->x, ip->y); - if (debug) point(ip->x, ip->y); - } - poly++; - } - - if (debug) abc(memat, pos, pos - memat); + pos = readPolys(ins, pos, polys); // clean and simplify polygons // Paths cleans, simples; @@ -109,23 +104,7 @@ Uint32 poly_offset(Uint32 memat, Uint32 polys, float offset) { Uint32 resat = pos; - for (Path po : outs) { - if (debug) polygon(po.size(), 1); - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = po.size(); - pos += 2; - for (IntPoint pt : po) { - if (debug) point(pt.X, pt.Y); - struct point32 *ip = (struct point32 *)(mem + pos); - ip->x = (int)pt.X; - ip->y = (int)pt.Y; - pos += 8; - } - } - - // null terminate - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = 0; + pos = writePolys(outs, pos); co.Clear(); @@ -140,17 +119,7 @@ Uint32 poly_union(Uint32 memat, Uint32 polys, float offset) { Uint32 pos = memat; Uint16 poly = 0; - while (poly < polys) { - struct length16 *ls = (struct length16 *)(mem + pos); - Uint16 points = ls->length; - pos += 2; - while (points-- > 0) { - struct point32 *ip = (struct point32 *)(mem + pos); - pos += 8; - ins[poly] << IntPoint(ip->x, ip->y); - } - poly++; - } + pos = readPolys(ins, pos, polys); Clipper clip; clip.AddPaths(ins, ptSubject, true); @@ -158,29 +127,13 @@ Uint32 poly_union(Uint32 memat, Uint32 polys, float offset) { Uint32 resat = pos; - for (Path po : outs) { - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = po.size(); - pos += 2; - for (IntPoint pt : po) { - struct point32 *ip = (struct point32 *)(mem + pos); - ip->x = (int)pt.X; - ip->y = (int)pt.Y; - pos += 8; - } - } - - // null terminate - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = 0; + pos = writePolys(outs, pos); clip.Clear(); return resat; } - - __attribute__ ((export_name("poly_diff"))) Uint32 poly_diff(Uint32 memat, Uint32 polysA, Uint32 polysB, float offset) { @@ -189,29 +142,8 @@ Uint32 poly_diff(Uint32 memat, Uint32 polysA, Uint32 polysB, float offset) { Paths outs; Uint32 pos = memat; - for (Uint32 poly = 0; poly < polysA; poly++ ) { - struct length16 *ls = (struct length16 *)(mem + pos); - Uint16 points = ls->length; - pos += 2; - while (points-- > 0) { - struct point32 *ip = (struct point32 *)(mem + pos); - pos += 8; - inA[poly] << IntPoint(ip->x, ip->y); - } - poly++; - } - - for (Uint32 poly = 0; poly < polysB; poly++ ) { - struct length16 *ls = (struct length16 *)(mem + pos); - Uint16 points = ls->length; - pos += 2; - while (points-- > 0) { - struct point32 *ip = (struct point32 *)(mem + pos); - pos += 8; - inB[poly] << IntPoint(ip->x, ip->y); - } - poly++; - } + pos = readPolys(inA, pos, polysA); + pos = readPolys(inB, pos, polysB); Clipper clip; clip.AddPaths(inA, ptSubject, true); @@ -220,23 +152,14 @@ Uint32 poly_diff(Uint32 memat, Uint32 polysA, Uint32 polysB, float offset) { Uint32 resat = pos; - for (Path po : outs) { - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = po.size(); - pos += 2; - for (IntPoint pt : po) { - struct point32 *ip = (struct point32 *)(mem + pos); - ip->x = (int)pt.X; - ip->y = (int)pt.Y; - pos += 8; - } - } - - // null terminate - struct length16 *ls = (struct length16 *)(mem + pos); - ls->length = 0; + pos = writePolys(outs, pos); clip.Clear(); return resat; } + +__attribute__ ((export_name("set_debug"))) +void set_debug(Uint8 value) { + debug = value; +} diff --git a/wasm/kiri-geo.wasm b/wasm/kiri-geo.wasm index 93ae59f1185d3c022dcdaf969442d41cb871d5d9..2a614abe8290926d2519d9273ea399d4bd3f83c7 100755 GIT binary patch delta 19042 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 L#+Nz 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 WlZE+~<;E;Ymh$J&(m!tM@qYmhpsw}+ delta 20089 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 TYLae&r3KBOy~F-