stub in distributed lathe

This commit is contained in:
Stewart Allen 2023-01-16 18:27:38 -05:00
commit 77cdb57945
3 changed files with 88 additions and 25 deletions

View file

@ -62,15 +62,18 @@ class Topo4 {
this.resolution = resolution; this.resolution = resolution;
onupdate(0, "lathe"); onupdate(0, "lathe");
const slices = await this.slice(onupdate); const slices = await this.slice(onupdate);
for (let slice of slices) { for (let slice of slices) {
slice.output() slice.output()
.setLayer("lathe", { line: 0x888888 }) .setLayer("lathe", { line: 0x888888 })
.addPolys(slice.topPolys()); .addPolys(slice.topPolys());
} }
onupdate(1, "lathe");
ondone(slices); const lathe = await this.lathe(onupdate);
onupdate(1, "lathe");
ondone([...slices, ...lathe]);
} }
async slice(onupdate) { async slice(onupdate) {
@ -105,7 +108,6 @@ class Topo4 {
index++; index++;
} }
slices.push(slice); slices.push(slice);
// console.log({ shards, range, step, slices }); // console.log({ shards, range, step, slices });
if (kiri.minions.running > 1) { if (kiri.minions.running > 1) {
@ -117,6 +119,7 @@ class Topo4 {
async sliceWorker(onupdate) { async sliceWorker(onupdate) {
const { vertices, slices, resolution } = this; const { vertices, slices, resolution } = this;
const { codec } = kiri;
let output = []; let output = [];
let complete = 0; let complete = 0;
@ -133,6 +136,12 @@ class Topo4 {
} }
slice.index = rec.index; slice.index = rec.index;
slice.addTops(sliceConnect(rec.lines)); slice.addTops(sliceConnect(rec.lines));
const points = codec.encodePointArray(rec.lines.map(l => [ l.p1, l.p2 ]).flat());
const shared = new Float32Array(new SharedArrayBuffer(points.length * 4));
shared.set(points);
slice.shared = shared;
return slice; return slice;
}); });
output.appendAll(recs); output.appendAll(recs);
@ -154,7 +163,7 @@ class Topo4 {
let promises = slices.map(slice => { let promises = slices.map(slice => {
return new Promise(resolve => { return new Promise(resolve => {
minions.queue({ minions.queue({
cmd: "topo4_raster", cmd: "topo4_slice",
id: widget.id, id: widget.id,
resolution, resolution,
slice slice
@ -169,16 +178,62 @@ class Topo4 {
const output = codec.decode(await Promise.all(promises)) const output = codec.decode(await Promise.all(promises))
.map(rec => rec.recs) .map(rec => rec.recs)
.flat() .flat()
.map(rec => newSlice(rec.z).addTops(rec.polys)) .map(rec => newSlice(rec.z)
.addTops(rec.polys)
.setFields({ shared: rec.shared }))
.sort((a,b) => a.z - b.z); .sort((a,b) => a.z - b.z);
worker.clearCache({}, { done: data => { worker.clearCache({}, { done: data => { }});
// console.log({ clear_cache_done: data });
}});
return output; return output;
} }
async lathe(onupdate) {
if (kiri.minions.running > 1) {
return await this.latheMinions(onupdate);
} else {
return await this.latheWorker(onupdate);
}
}
async latheWorker(onupdate) {
return [];
}
async latheMinions(onupdate) {
const { worker, minions, codec } = kiri;
const { slices, resolution } = this;
worker.putCache({
key: "lathe",
data: slices.map(s => {
return { z: s.z, lines: s.shared }
})
}, { done: data => {
// console.log({ put_cache_done: data });
}});
let complete = 0;
let promises = slices.map(slice => {
return new Promise(resolve => {
minions.queue({
cmd: "topo4_lathe",
resolution
}, data => {
resolve(data);
onupdate(++complete / slices.length);
});
});
});
// merge boxes for all rasters for contouring clipping
const output = await Promise.all(promises);
worker.clearCache({}, { done: data => { }});
return [];
}
} }
CAM.Topo4 = async function(opt) { CAM.Topo4 = async function(opt) {
@ -189,7 +244,7 @@ moto.broker.subscribe("minion.started", msg => {
const { funcs, cache, reply, log } = msg; const { funcs, cache, reply, log } = msg;
const { codec } = kiri; const { codec } = kiri;
funcs.topo4_raster = (data, seq) => { funcs.topo4_slice = (data, seq) => {
const { id, slice, resolution } = data; const { id, slice, resolution } = data;
const vertices = cache[id]; const vertices = cache[id];
const recs = new kiri.topo_slicer(slice.index) const recs = new kiri.topo_slicer(slice.index)
@ -204,27 +259,30 @@ moto.broker.subscribe("minion.started", msg => {
if (!p2.swapped) { p2.swapXZ(); p2.swapped = true } if (!p2.swapped) { p2.swapXZ(); p2.swapped = true }
} }
return codec.encode({ z, index, polys: sliceConnect(lines) }); const points = codec.encodePointArray(lines.map(l => [ l.p1, l.p2 ]).flat());
const shared = new Float32Array(new SharedArrayBuffer(points.length * 4));
shared.set(points);
return {
z, index, shared,
polys: codec.encode(sliceConnect(lines)),
};
}); });
// only pass back bounds of rasters to be merged // only pass back bounds of rasters to be merged
reply({ seq, recs }); reply({ seq, recs });
}; };
funcs.trace4_init = data => { funcs.topo4_lathe = (data, seq) => {
const { cache } = self; console.log({ topo4_lathe: cache });
const { codec } = kiri;
cache.topo4 = data;
};
funcs.trace4_y = (data, seq) => { const { resolution } = data;
}; const slices = cache.lathe;
funcs.trace4_x = (data, seq) => { log({ slices, resolution });
};
reply({ seq, abc: 123 });
}
funcs.trace4_cleanup = () => {
delete cache.topo4;
};
}); });
}); });

View file

@ -145,16 +145,16 @@ const funcs = self.minion = {
const { key, data } = msg; const { key, data } = msg;
// log({ minion_putCache: key, data }); // log({ minion_putCache: key, data });
if (data) { if (data) {
// console.log({ minion_put_cache: key, data });
cache[key] = data; cache[key] = data;
} else { } else {
// console.log({ minion_del_cache: key });
delete cache[key]; delete cache[key];
} }
}, },
clearCache: msg => { clearCache: msg => {
cache = self.cache = {}; for (let key in cache) {
delete cache[key];
}
}, },
wasm: data => { wasm: data => {

View file

@ -184,6 +184,11 @@ class Slice {
return min; return min;
}; };
setFields(fields = {}) {
Object.assign(this, fields);
return this;
}
// xray(dash = 3) { // xray(dash = 3) {
// // console.log('xray', this); // // console.log('xray', this);
// this.output().setLayer(`xp`, 0x888800).addPolys(this.topPolys()); // this.output().setLayer(`xp`, 0x888800).addPolys(this.topPolys());