improve performance of threaded infill clipper with better encoding and zerocopy
This commit is contained in:
parent
3f6f172108
commit
96047dc958
4 changed files with 63 additions and 13 deletions
|
|
@ -91,20 +91,29 @@ const funcs = {
|
|||
},
|
||||
|
||||
clip: (data, seq) => {
|
||||
let clip = new clib.Clipper();
|
||||
let ctre = new clib.PolyTree();
|
||||
let clips = [];
|
||||
const clip = new clib.Clipper();
|
||||
const ctre = new clib.PolyTree();
|
||||
const clips = [];
|
||||
const M = base.config.clipper;
|
||||
|
||||
clip.AddPaths(data.lines, ptyp.ptSubject, false);
|
||||
clip.AddPaths(data.polys, ptyp.ptClip, true);
|
||||
let lines = data.lines.map(array => {
|
||||
return codec.decodePointArray2D(array, data.z, (X, Y) => { return {X: X*M, Y: Y*M} })
|
||||
});
|
||||
let polys = data.polys.map(array => {
|
||||
return codec.decodePointArray2D(array, data.z, (X, Y) => { return {X: X*M, Y: Y*M} })
|
||||
});
|
||||
|
||||
clip.AddPaths(lines, ptyp.ptSubject, false);
|
||||
clip.AddPaths(polys, ptyp.ptClip, true);
|
||||
|
||||
const state = { zeros: [] };
|
||||
if (clip.Execute(ctyp.ctIntersection, ctre, cfil.pftNonZero, cfil.pftEvenOdd)) {
|
||||
for (let node of ctre.m_AllPolys) {
|
||||
clips.push(codec.encode(POLY.fromClipperNode(node, data.z)));
|
||||
clips.push(codec.encode(POLY.fromClipperNode(node, data.z), state.zeros));
|
||||
}
|
||||
}
|
||||
|
||||
reply({ seq, clips });
|
||||
reply({ seq, clips }, state.zeros);
|
||||
},
|
||||
|
||||
sliceZ: (data, seq) => {
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ kiri.minions = {
|
|||
minwork.queue({
|
||||
cmd: "union",
|
||||
minarea,
|
||||
polys: codec.encode(polys.slice(i, i + polyper))
|
||||
polys: codec.encode(polys.slice(i, i + polyper), state)
|
||||
}, receiver, state.zeros);
|
||||
}
|
||||
});
|
||||
|
|
@ -149,10 +149,12 @@ kiri.minions = {
|
|||
if (concurrent < 2) {
|
||||
reject("concurrent clip unavailable");
|
||||
}
|
||||
const state = { zeros: [] };
|
||||
|
||||
minwork.queue({
|
||||
cmd: "clip",
|
||||
polys: POLY.toClipper(polys),
|
||||
lines: lines.map(a => a.map(p => p.toClipper())),
|
||||
polys: codec.encode(polys.map(poly => codec.encodePointArray2D(poly.points, state)), state),
|
||||
lines: codec.encode(lines.map(array => codec.encodePointArray2D(array, state)), state),
|
||||
z: slice.z
|
||||
}, data => {
|
||||
let polys = codec.decode(data.clips);
|
||||
|
|
@ -164,7 +166,7 @@ kiri.minions = {
|
|||
}
|
||||
}
|
||||
resolve(polys);
|
||||
});
|
||||
}, state.zeros);
|
||||
});
|
||||
},
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue