add new assembly preference for enabling wasm testing
This commit is contained in:
parent
8d8d80aa77
commit
841df7b5a9
16 changed files with 178 additions and 100 deletions
|
|
@ -102,9 +102,9 @@
|
|||
* @param {Point} p3
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isCollinear(p1, p2, p3) {
|
||||
return inCloseRange(area2(p1, p2, p3), -0.00001, 0.00001);
|
||||
}
|
||||
// function isCollinear(p1, p2, p3) {
|
||||
// return inCloseRange(area2(p1, p2, p3), -0.00001, 0.00001);
|
||||
// }
|
||||
|
||||
function pac(p1, p2) {
|
||||
return (p2.x - p1.x) * (p2.y + p1.y);
|
||||
|
|
@ -521,7 +521,7 @@
|
|||
inRange,
|
||||
isCloseTo,
|
||||
inCloseRange,
|
||||
isCollinear,
|
||||
// isCollinear,
|
||||
isClockwise,
|
||||
isCounterClockwise,
|
||||
doCombinations,
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
};
|
||||
|
||||
/**
|
||||
* faulty when line doubles back at 180?
|
||||
* @param {Line} line
|
||||
* @returns {boolean}
|
||||
*/
|
||||
|
|
@ -85,7 +86,7 @@
|
|||
d2x = (p4.x - p3.x),
|
||||
d2y = (p4.y - p3.y);
|
||||
|
||||
return Math.abs( (d2y * d1x) - (d2x * d1y) ) < 0.000001;
|
||||
return Math.abs( (d2y * d1x) - (d2x * d1y) ) < 0.0001;
|
||||
};
|
||||
|
||||
/** ******************************************************************
|
||||
|
|
|
|||
|
|
@ -1503,9 +1503,6 @@
|
|||
* @returns {?Polygon[]} returns output array provided as input or new array if not provided
|
||||
*/
|
||||
PRO.offset = function(offset, output) {
|
||||
// let offs = geo.poly.offset([this], -offset, this.getZ());
|
||||
// if (output) output.appendAll(offs);
|
||||
// return output || offs;
|
||||
return POLY().expand([this], -offset, this.getZ(), output);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
newPoint = BASE.newPoint,
|
||||
numOrDefault = UTIL.numOrDefault;
|
||||
|
||||
BASE.polygons = {
|
||||
const POLYS = BASE.polygons = {
|
||||
rayIntersect,
|
||||
alignWindings,
|
||||
setWinding,
|
||||
|
|
@ -527,18 +527,23 @@
|
|||
mina = numOrDefault(opts.minArea, 0.1),
|
||||
zed = opts.z || 0;
|
||||
|
||||
// setup offset
|
||||
for (let poly of polys) {
|
||||
// convert to clipper format
|
||||
poly = poly.toClipper();
|
||||
if (clean) poly = ClipperLib.Clipper.CleanPolygons(poly, CONF.clipperClean);
|
||||
if (simple) poly = ClipperLib.Clipper.SimplifyPolygons(poly, fill);
|
||||
coff.AddPaths(poly, join, type);
|
||||
if (opts.wasm && geo.wasm) {
|
||||
polys = geo.wasm.js.offset(polys, offs, zed);
|
||||
} else {
|
||||
// setup offset
|
||||
for (let poly of polys) {
|
||||
// convert to clipper format
|
||||
poly = poly.toClipper();
|
||||
if (clean) poly = ClipperLib.Clipper.CleanPolygons(poly, CONF.clipperClean);
|
||||
if (simple) poly = ClipperLib.Clipper.SimplifyPolygons(poly, fill);
|
||||
coff.AddPaths(poly, join, type);
|
||||
}
|
||||
// perform offset
|
||||
coff.Execute(ctre, offs * CONF.clipper);
|
||||
// convert back from clipper output format
|
||||
polys = fromClipperTree(ctre, zed, null, null, mina);
|
||||
}
|
||||
// perform offset
|
||||
coff.Execute(ctre, offs * CONF.clipper);
|
||||
// convert back from clipper output format
|
||||
polys = fromClipperTree(ctre, zed, null, null, mina);
|
||||
|
||||
|
||||
// if specified, perform offset gap analysis
|
||||
if (opts.gaps && polys.length) {
|
||||
|
|
@ -583,15 +588,15 @@
|
|||
* as performing subtractive analysis between initial layer shell (ref)
|
||||
* and last offset (cmp) to produce gap candidates (for thinfill)
|
||||
*/
|
||||
function inset(polys, dist, count, z) {
|
||||
function inset(polys, dist, count, z, wasm) {
|
||||
let total = count;
|
||||
let layers = [];
|
||||
let ref = polys;
|
||||
let depth = 0;
|
||||
while (count-- > 0 && ref && ref.length) {
|
||||
let off = offset(ref, -dist, {z});
|
||||
let mid = offset(off, dist / 2, {z});
|
||||
let cmp = offset(off, dist, {z});
|
||||
let off = offset(ref, -dist, {z, wasm});
|
||||
let mid = offset(off, dist / 2, {z, wasm});
|
||||
let cmp = offset(off, dist, {z, wasm});
|
||||
let gap = [];
|
||||
let aref = ref.map(p => p.areaDeep()).reduce((a,p) => a +p);
|
||||
let cref = cmp.length ? cmp.map(p => p.areaDeep()).reduce((a,p) => a + p) : 0;
|
||||
|
|
|
|||
116
src/geo/wasm.js
116
src/geo/wasm.js
|
|
@ -5,7 +5,15 @@
|
|||
// only active in workers
|
||||
if (!self.window) (function() {
|
||||
|
||||
if (!self.geo) self.geo = {};
|
||||
if (!self.geo) self.geo = {
|
||||
enable,
|
||||
disable,
|
||||
count: {
|
||||
offset: 0,
|
||||
union: 0,
|
||||
diff: 0
|
||||
}
|
||||
};
|
||||
|
||||
const factor = self.base.config.clipper;
|
||||
const geo = self.geo;
|
||||
|
|
@ -69,6 +77,7 @@ if (!self.window) (function() {
|
|||
}
|
||||
|
||||
function polyOffset(polys, offset, z) {
|
||||
geo.count.offset++;
|
||||
let wasm = geo.wasm,
|
||||
buffer = geo.wasm.shared,
|
||||
pcount = writePolys(new DataWriter(wasm.heap, buffer), polys),
|
||||
|
|
@ -78,6 +87,7 @@ if (!self.window) (function() {
|
|||
}
|
||||
|
||||
function polyUnion(polys, z) {
|
||||
geo.count.union++;
|
||||
let wasm = geo.wasm,
|
||||
buffer = geo.wasm.shared,
|
||||
pcount = writePolys(new DataWriter(wasm.heap, buffer), polys),
|
||||
|
|
@ -87,6 +97,7 @@ if (!self.window) (function() {
|
|||
}
|
||||
|
||||
function polyDiff(polysA, polysB, z, AB, BA) {
|
||||
geo.count.diff++;
|
||||
let wasm = geo.wasm,
|
||||
buffer = geo.wasm.shared,
|
||||
writer = new DataWriter(wasm.heap, buffer),
|
||||
|
|
@ -143,52 +154,65 @@ if (!self.window) (function() {
|
|||
console.log('offs',{o1:o1[0].points});
|
||||
}
|
||||
|
||||
fetch('/wasm/kiri-geo.wasm')
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(bytes => WebAssembly.instantiate(bytes, {
|
||||
env: {
|
||||
polygon: (a,b) => { console.log('polygon',a,b) },
|
||||
point: (a,b) => { console.log('point',a,b) },
|
||||
abc: (a,b,c) => { console.log('abc',a,b,c) }
|
||||
},
|
||||
wasi_snapshot_preview1: {
|
||||
args_get: (count,bufsize) => { return 0 },
|
||||
args_sizes_get: (count,bufsize) => { },
|
||||
environ_get: (count,bufsize) => { return 0 },
|
||||
environ_sizes_get: (count,bufsize) => { },
|
||||
proc_exit: (code) => { return code }
|
||||
}
|
||||
}))
|
||||
.then(results => {
|
||||
let { module, instance } = results;
|
||||
let { exports } = instance;
|
||||
let heap = new DataView(exports.memory.buffer);
|
||||
let wasm = geo.wasm = {
|
||||
heap,
|
||||
exports,
|
||||
memory: exports.memory,
|
||||
memmax: exports.memory.buffer.byteLength,
|
||||
malloc: exports.mem_get,
|
||||
free: exports.mem_clr,
|
||||
set_debug: exports.set_debug
|
||||
};
|
||||
wasm.shared = wasm.malloc(1024 * 1024 * 10),
|
||||
wasm.fn = {
|
||||
diff: exports.poly_diff,
|
||||
union: exports.poly_union,
|
||||
offset: exports.poly_offset
|
||||
};
|
||||
wasm.js = {
|
||||
diff: polyDiff,
|
||||
union: polyUnion,
|
||||
offset: polyOffset
|
||||
};
|
||||
if (debug) {
|
||||
wasm.set_debug(1);
|
||||
for (let i=0; i<100; i++) {
|
||||
function enable() {
|
||||
if (geo.wasm || geo._wasm) {
|
||||
return;
|
||||
}
|
||||
geo._wasm = 'loading';
|
||||
fetch('/wasm/kiri-geo.wasm')
|
||||
.then(response => response.arrayBuffer())
|
||||
.then(bytes => WebAssembly.instantiate(bytes, {
|
||||
env: {
|
||||
polygon: (a,b) => { console.log('polygon',a,b) },
|
||||
point: (a,b) => { console.log('point',a,b) },
|
||||
abc: (a,b,c) => { console.log('abc',a,b,c) }
|
||||
},
|
||||
wasi_snapshot_preview1: {
|
||||
args_get: (count,bufsize) => { return 0 },
|
||||
args_sizes_get: (count,bufsize) => { },
|
||||
environ_get: (count,bufsize) => { return 0 },
|
||||
environ_sizes_get: (count,bufsize) => { },
|
||||
proc_exit: (code) => { return code }
|
||||
}
|
||||
}))
|
||||
.then(results => {
|
||||
// console.log({enabled: geo.wasm});
|
||||
delete geo._wasm;
|
||||
let { module, instance } = results;
|
||||
let { exports } = instance;
|
||||
let heap = new DataView(exports.memory.buffer);
|
||||
let wasm = geo.wasm = {
|
||||
heap,
|
||||
exports,
|
||||
memory: exports.memory,
|
||||
memmax: exports.memory.buffer.byteLength,
|
||||
malloc: exports.mem_get,
|
||||
free: exports.mem_clr,
|
||||
set_debug: exports.set_debug
|
||||
};
|
||||
wasm.shared = wasm.malloc(1024 * 1024 * 32),
|
||||
wasm.fn = {
|
||||
diff: exports.poly_diff,
|
||||
union: exports.poly_union,
|
||||
offset: exports.poly_offset
|
||||
};
|
||||
wasm.js = {
|
||||
diff: polyDiff,
|
||||
union: polyUnion,
|
||||
offset: polyOffset
|
||||
};
|
||||
if (debug) {
|
||||
wasm.set_debug(1);
|
||||
runTests();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function disable() {
|
||||
if (geo.wasm) {
|
||||
delete geo.wasm;
|
||||
// console.log({disabled: geo});
|
||||
}
|
||||
}
|
||||
|
||||
})();
|
||||
|
|
|
|||
Loading…
Reference in a new issue