grid-apps-cmms/src/mode/sla/export.js

132 lines
4 KiB
JavaScript
Raw Normal View History

2020-11-05 18:29:04 -05:00
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
"use strict";
(function() {
let KIRI = self.kiri,
BASE = self.base,
UTIL = BASE.util,
SLA = KIRI.driver.SLA;
/**
* DRIVER PRINT CONTRACT - runs in worker
* @param {Object} print state object
* @param {Function} online streaming reply
* @param {Function} ondone last reply
*/
2020-11-08 19:38:02 -05:00
SLA.export = function(print, online, ondone) {
2020-11-05 18:29:04 -05:00
let widgets = print.widgets,
settings = print.settings,
device = settings.device,
process = settings.process,
width = device.resolutionX,
height = device.resolutionY,
2020-11-05 18:29:04 -05:00
scaleX = width / device.bedWidth,
scaleY = height / device.bedDepth,
2021-07-24 23:30:45 -04:00
alias = process.slaAntiAlias || 1,
2020-11-05 18:29:04 -05:00
mark = Date.now(),
2021-07-24 23:30:45 -04:00
layermax = 0;
2020-11-05 18:29:04 -05:00
// find max layer count
widgets.forEach(widget => {
layermax = Math.max(widget.slices.length);
});
2021-07-24 23:30:45 -04:00
let isPhoton = false;
2020-11-05 18:29:04 -05:00
switch (device.deviceName) {
case 'Anycubic.Photon':
case 'Anycubic.Photon.S':
2021-07-24 23:30:45 -04:00
isPhoton = true;
break;
2020-11-05 18:29:04 -05:00
}
2021-07-24 23:30:45 -04:00
if (isPhoton) {
let legacyMode = SLA.legacy || alias > 1,
part1 = legacyMode ? 0.25 : 0.85,
part2 = (1 - part1),
images = [],
slices = [];
2020-11-05 18:29:04 -05:00
2021-07-24 23:30:45 -04:00
// generate layer bitmaps
// in wasm mode, rle layers generated here, too
let d = 8 / alias;
let masks = [];
for (let i=0; i<alias; i++) {
2020-11-05 18:29:04 -05:00
masks.push((1 << (8 - i * d)) - 1);
}
2021-07-24 23:30:45 -04:00
let render = legacyMode ? photon.renderLayer : photon.renderLayerWasm;
for (let index=0; index < layermax; index++) {
let param = { index, width, height, widgets, scaleX, scaleY, masks };
let {image, layers, end} = render(param);
images.push(image);
slices.push(layers);
online({
progress: (index / layermax) * part1,
message: "image_gen",
});
2021-07-24 23:30:45 -04:00
if (end) break;
2020-11-05 18:29:04 -05:00
}
2021-07-24 23:30:45 -04:00
let exp_func = {
'Anycubic.Photon': photon.generatePhoton,
'Anycubic.Photon.S': photon.generatePhotons,
}[device.deviceName] || photon.generatePhoton;
let file = exp_func(print, {
width: width,
height: height,
small: SLA.previewSmall.data,
large: SLA.previewLarge.data,
lines: images,
slices: slices
}, (progress, message) => {
online({progress: progress * part2 + part1, message});
2020-11-05 18:29:04 -05:00
});
ondone({ width, height, file, layers: images.length }, [file]);
2020-11-05 18:29:04 -05:00
} else {
let part1 = 0.95;
2021-07-24 23:30:45 -04:00
let part2 = 1 - part1;
let slices = [];
for (let index=0; index < layermax; index++) {
let param = { index, width, height, widgets, scaleX, scaleY };
let {lines} = CXDLP.render(param);
2021-07-24 23:30:45 -04:00
slices.push(lines);
online({
progress: (index / layermax) * part1,
message: "image_gen"
});
2021-07-24 23:30:45 -04:00
// bail on an empty layer
if (lines.length === 0) {
break;
2020-11-05 18:29:04 -05:00
}
}
// generate thumb, preview1, preview2
let file = CXDLP.export({
settings,
width,
height,
slices
});
2021-07-24 23:30:45 -04:00
ondone({
width: width,
height: height,
file: file,
layers: slices.length
2021-07-24 23:30:45 -04:00
}, [file]);
2020-11-05 18:29:04 -05:00
}
2021-07-24 23:30:45 -04:00
console.log('print.export', Date.now() - mark);
};
2020-11-05 18:29:04 -05:00
2021-07-24 23:30:45 -04:00
function generateCXDLP(print, conf, progress) {
console.log({generateCXDLP: print, conf, progress});
2020-11-05 18:29:04 -05:00
}
})();