extract png loader from kiri worker so it can be shared with mesh
This commit is contained in:
parent
7e954f5e56
commit
87df96d23f
6 changed files with 280 additions and 245 deletions
|
|
@ -8,6 +8,7 @@
|
||||||
// dep: kiri.codec
|
// dep: kiri.codec
|
||||||
// dep: kiri.slice
|
// dep: kiri.slice
|
||||||
// dep: moto.license
|
// dep: moto.license
|
||||||
|
// use: load.png
|
||||||
// use: kiri.render
|
// use: kiri.render
|
||||||
// use: kiri-mode.cam.animate
|
// use: kiri-mode.cam.animate
|
||||||
// use: kiri-mode.cam.slice
|
// use: kiri-mode.cam.slice
|
||||||
|
|
@ -594,225 +595,17 @@ kiri.worker = {
|
||||||
},
|
},
|
||||||
|
|
||||||
image2mesh(info, send) {
|
image2mesh(info, send) {
|
||||||
let img = new png.PNG();
|
let { device } = info.settings;
|
||||||
img.parse(info.png, (err, output) => {
|
load.PNG.parse(info.png, {
|
||||||
let { width, height, data } = output;
|
outWidth: device.bedDepth,
|
||||||
let { bedDepth, bedWidth } = info.settings.device;
|
outHeight: device.bedWidth,
|
||||||
let imageAspect = height / width;
|
inv_image: info.inv_image,
|
||||||
let deviceAspect = bedDepth / bedWidth;
|
inv_alpha: info.inv_alpha,
|
||||||
let div = 1;
|
border: info.border,
|
||||||
if (imageAspect < deviceAspect) {
|
blur: info.blur,
|
||||||
div = width / bedWidth;
|
base: info.base,
|
||||||
} else {
|
progress(progress) { send.data({ progress }) },
|
||||||
div = height / bedDepth;
|
done(vertices) { send.done({ vertices }, [ vertices.buffer ])}
|
||||||
}
|
|
||||||
let points =
|
|
||||||
width * height + // grid
|
|
||||||
height * 2 + 0 + // left/right
|
|
||||||
width * 2 + 0; // top/bottom
|
|
||||||
let flats =
|
|
||||||
((height-1) * (width-1)) + // surface
|
|
||||||
((height-1) * 2) + // left/right
|
|
||||||
((width-1) * 2) + // top/bottom
|
|
||||||
1; // base
|
|
||||||
// convert png to grayscale
|
|
||||||
let gray = new Uint8Array(width * height);
|
|
||||||
let alpha = new Uint8Array(width * height);
|
|
||||||
let gi = 0;
|
|
||||||
let invi = info.inv_image ? true : false;
|
|
||||||
let inva = info.inv_alpha ? true : false;
|
|
||||||
let border = info.border || 0;
|
|
||||||
for (let y = 0; y < height; y++) {
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
let di = (x + width * y) * 4;
|
|
||||||
let r = data[di];
|
|
||||||
let g = data[di+1];
|
|
||||||
let b = data[di+2];
|
|
||||||
let a = data[di+3];
|
|
||||||
let v = ((r + g + b) / 3);
|
|
||||||
if (inva) a = 255 - a;
|
|
||||||
if (invi) v = 255 - v;
|
|
||||||
if (border) {
|
|
||||||
if (x < border || y < border || x > width-border-1 || y > height-border-1) {
|
|
||||||
v = 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
alpha[gi] = a;
|
|
||||||
gray[gi++] = v * (a / 255);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let blur = parseInt(info.blur || 0);
|
|
||||||
while (blur-- > 0) {
|
|
||||||
let blur = new Uint8Array(width * height);
|
|
||||||
for (let y = 0; y < height; y++) {
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
let xl = Math.max(x-1,0);
|
|
||||||
let xr = Math.min(x+1,width-1);
|
|
||||||
let yu = Math.max(y-1,0);
|
|
||||||
let yd = Math.min(y+1,height-1);
|
|
||||||
let id = x + width * y;
|
|
||||||
blur[id] = ((
|
|
||||||
gray[xl + (width * yu)] +
|
|
||||||
gray[x + (width * yu)] +
|
|
||||||
gray[xr + (width * yu)] +
|
|
||||||
gray[xl + (width * y)] +
|
|
||||||
gray[x + (width * y)] * 8 + // self
|
|
||||||
gray[xr + (width * y)] +
|
|
||||||
gray[xl + (width * yd)] +
|
|
||||||
gray[x + (width * yd)] +
|
|
||||||
gray[xr + (width * yd)]
|
|
||||||
) / 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gray = blur;
|
|
||||||
}
|
|
||||||
// create indexed mesh output
|
|
||||||
let base = parseInt(info.base || 0);
|
|
||||||
let verts = new Float32Array(points * 3);
|
|
||||||
let faces = new Uint32Array(flats * 6);
|
|
||||||
let w2 = width / 2;
|
|
||||||
let h2 = height / 2;
|
|
||||||
let vi = 0;
|
|
||||||
let ii = 0;
|
|
||||||
let VI = 0;
|
|
||||||
let VB = 0;
|
|
||||||
// create surface vertices & faces
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
for (let y = 0; y < height; y++) {
|
|
||||||
let id = x + width * y;
|
|
||||||
let v = gray[id];
|
|
||||||
// create vertex @ x,y
|
|
||||||
verts[vi++] = (-w2 + x) / div;
|
|
||||||
verts[vi++] = (h2 - y) / div;
|
|
||||||
verts[vi++] = (v / 50) + (base * alpha[id] / 255);
|
|
||||||
VI++;
|
|
||||||
// create two surface faces on the rect between x-1,y-1 and x,y
|
|
||||||
if (x > 0 && y > 0) {
|
|
||||||
let p1 = (x - 1) * height + (y - 0);
|
|
||||||
let p2 = (x - 0) * height + (y - 1);
|
|
||||||
let p3 = (x - 0) * height + (y - 0);
|
|
||||||
let p4 = (x - 1) * height + (y - 1);
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
send.data({progress: x / width});
|
|
||||||
}
|
|
||||||
// create top vertices & faces
|
|
||||||
VB = VI;
|
|
||||||
let TL = VI;
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
let y = 0;
|
|
||||||
verts[vi++] = (-w2 + x) / div;
|
|
||||||
verts[vi++] = (h2 - y) / div;
|
|
||||||
verts[vi++] = 0;
|
|
||||||
VI++;
|
|
||||||
// create two top faces on the rect x-1,0, x,z
|
|
||||||
if (x > 0) {
|
|
||||||
let p1 = VB + (x - 1);
|
|
||||||
let p2 = VB + (x - 0);
|
|
||||||
let p3 = (x * height);
|
|
||||||
let p4 = (x - 1) * height;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p4;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// create bottom vertices & faces
|
|
||||||
VB = VI;
|
|
||||||
let BL = VI;
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
let y = height - 1;
|
|
||||||
verts[vi++] = (-w2 + x) / div;
|
|
||||||
verts[vi++] = (h2 - y) / div;
|
|
||||||
verts[vi++] = 0;
|
|
||||||
VI++;
|
|
||||||
// create two top faces on the rect x-1,0, x,z
|
|
||||||
if (x > 0) {
|
|
||||||
let p1 = VB + (x - 1);
|
|
||||||
let p2 = VB + (x - 0);
|
|
||||||
let p3 = (x * height) + y;
|
|
||||||
let p4 = (x - 1) * height + y;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// create left vertices & faces
|
|
||||||
VB = VI;
|
|
||||||
for (let y=0; y < height; y++) {
|
|
||||||
let x = 0;
|
|
||||||
verts[vi++] = (-w2 + x) / div;
|
|
||||||
verts[vi++] = (h2 - y) / div;
|
|
||||||
verts[vi++] = 0;
|
|
||||||
VI++;
|
|
||||||
// create two left faces on the rect y-1,0, y,z
|
|
||||||
if (y > 0) {
|
|
||||||
let p1 = VB + (y + 0);
|
|
||||||
let p2 = VB + (y - 1);
|
|
||||||
let p3 = 0 + (y - 1);
|
|
||||||
let p4 = 0 + (y - 0);
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p4;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// create right vertices & faces
|
|
||||||
VB = VI;
|
|
||||||
let TR = VI;
|
|
||||||
for (let y=0; y < height; y++) {
|
|
||||||
let x = width - 1;
|
|
||||||
verts[vi++] = (-w2 + x) / div;
|
|
||||||
verts[vi++] = (h2 - y) / div;
|
|
||||||
verts[vi++] = 0;
|
|
||||||
VI++;
|
|
||||||
// create two right faces on the rect y-1,0, y,z
|
|
||||||
if (y > 0) {
|
|
||||||
let p1 = VB + (y + 0);
|
|
||||||
let p2 = VB + (y - 1);
|
|
||||||
let p3 = (x * height) + (y - 1);
|
|
||||||
let p4 = (x * height) + (y - 0);
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p2;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p1;
|
|
||||||
faces[ii++] = p3;
|
|
||||||
faces[ii++] = p4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let BR = VI-1;
|
|
||||||
// create base two faces
|
|
||||||
faces[ii++] = TL;
|
|
||||||
faces[ii++] = TR;
|
|
||||||
faces[ii++] = BR;
|
|
||||||
faces[ii++] = TL;
|
|
||||||
faces[ii++] = BR;
|
|
||||||
faces[ii++] = BL;
|
|
||||||
// flatten for now until we support indexed mesh
|
|
||||||
// throughout KM (widget, storage, decimation)
|
|
||||||
let bigv = new Float32Array(ii * 3);
|
|
||||||
let bgi = 0;
|
|
||||||
for (let i=0; i<ii; i++) {
|
|
||||||
let iv = faces[i] * 3;
|
|
||||||
bigv[bgi++] = verts[iv];
|
|
||||||
bigv[bgi++] = verts[iv+1];
|
|
||||||
bigv[bgi++] = verts[iv+2];
|
|
||||||
}
|
|
||||||
// send.done({done: {verts, faces, bigv, vi, ii}}, [ bigv.buffer ]);
|
|
||||||
send.done({done: {bigv}}, [ bigv.buffer ]);
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -301,8 +301,8 @@ const client = exports({
|
||||||
if (reply.progress) {
|
if (reply.progress) {
|
||||||
progress(reply.progress);
|
progress(reply.progress);
|
||||||
}
|
}
|
||||||
if (reply.done) {
|
if (reply.vertices) {
|
||||||
output(reply.done);
|
output(reply.vertices);
|
||||||
}
|
}
|
||||||
}, [ data.png ]);
|
}, [ data.png ]);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -483,13 +483,12 @@ gapp.register("kiri.main", [], (root, exports) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadImage(image, opt = {}) {
|
function loadImage(image, opt = {}) {
|
||||||
const info = Object.assign({settings, png:image}, opt);
|
const info = Object.assign({settings: settings.get(), png:image}, opt);
|
||||||
kiri.client.image2mesh(info, progress => {
|
kiri.client.image2mesh(info, progress => {
|
||||||
api.show.progress(progress, "converting");
|
api.show.progress(progress, "converting");
|
||||||
}, output => {
|
}, vertices => {
|
||||||
api.show.progress(0);
|
api.show.progress(0);
|
||||||
const { bigv, verts, index } = output;
|
const widget = newWidget().loadVertices(vertices);
|
||||||
const widget = newWidget().loadVertices(bigv)
|
|
||||||
widget.meta.file = opt.file;
|
widget.meta.file = opt.file;
|
||||||
platform.add(widget);
|
platform.add(widget);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -728,6 +728,7 @@ function platformLoadFiles(files, group) {
|
||||||
api.function.parse(e.target.result, 'gcode');
|
api.function.parse(e.target.result, 'gcode');
|
||||||
load_dec();
|
load_dec();
|
||||||
} else if (issvg) {
|
} else if (issvg) {
|
||||||
|
group = group || [];
|
||||||
let name = e.target.file.name;
|
let name = e.target.file.name;
|
||||||
let svg = load.SVG.parse(e.target.result);
|
let svg = load.SVG.parse(e.target.result);
|
||||||
let ind = 0;
|
let ind = 0;
|
||||||
|
|
|
||||||
256
src/load/png.js
Normal file
256
src/load/png.js
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||||
|
|
||||||
|
// use: ext.pngjs
|
||||||
|
gapp.register("load.png", (root, exports) => {
|
||||||
|
|
||||||
|
const { load } = root;
|
||||||
|
|
||||||
|
load.PNG = {
|
||||||
|
parseAsync,
|
||||||
|
parse
|
||||||
|
};
|
||||||
|
|
||||||
|
function parseAsync(bin, opt) {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
parse(bin, {
|
||||||
|
...opt,
|
||||||
|
done(vertices) { resolve(vertices) }
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* opt.outWidth = target output width in mm
|
||||||
|
* opt.outHeight = target output height in mm
|
||||||
|
* opt.inv_image = invert image data 255 - depth
|
||||||
|
* opt.inv_alpha = invert alpha interp 255 - alpha
|
||||||
|
* opt.border = border thickness in mm
|
||||||
|
* opt.blur = blur value in mm
|
||||||
|
* opt.base = base added thickness in mm
|
||||||
|
*/
|
||||||
|
function parse(bin, opt = {}) {
|
||||||
|
let img = new png.PNG();
|
||||||
|
let progress = opt.progress || noop;
|
||||||
|
let ondone = opt.done || noop;
|
||||||
|
img.parse(bin, (err, output) => {
|
||||||
|
let { width, height, data } = output;
|
||||||
|
let { outHeight, outWidth } = opt;
|
||||||
|
let imageAspect = height / width;
|
||||||
|
let deviceAspect = outHeight / outWidth;
|
||||||
|
let div = 1;
|
||||||
|
if (imageAspect < deviceAspect) {
|
||||||
|
div = width / outWidth;
|
||||||
|
} else {
|
||||||
|
div = height / outHeight;
|
||||||
|
}
|
||||||
|
let points =
|
||||||
|
width * height + // grid
|
||||||
|
height * 2 + 0 + // left/right
|
||||||
|
width * 2 + 0; // top/bottom
|
||||||
|
let flats =
|
||||||
|
((height-1) * (width-1)) + // surface
|
||||||
|
((height-1) * 2) + // left/right
|
||||||
|
((width-1) * 2) + // top/bottom
|
||||||
|
1; // base
|
||||||
|
// convert png to grayscale
|
||||||
|
let gray = new Uint8Array(width * height);
|
||||||
|
let alpha = new Uint8Array(width * height);
|
||||||
|
let gi = 0;
|
||||||
|
let invi = opt.inv_image ? true : false;
|
||||||
|
let inva = opt.inv_alpha ? true : false;
|
||||||
|
let border = opt.border || 0;
|
||||||
|
for (let y = 0; y < height; y++) {
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
let di = (x + width * y) * 4;
|
||||||
|
let r = data[di];
|
||||||
|
let g = data[di+1];
|
||||||
|
let b = data[di+2];
|
||||||
|
let a = data[di+3];
|
||||||
|
let v = ((r + g + b) / 3);
|
||||||
|
if (inva) a = 255 - a;
|
||||||
|
if (invi) v = 255 - v;
|
||||||
|
if (border) {
|
||||||
|
if (x < border || y < border || x > width-border-1 || y > height-border-1) {
|
||||||
|
v = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
alpha[gi] = a;
|
||||||
|
gray[gi++] = v * (a / 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let blur = parseInt(opt.blur || 0);
|
||||||
|
while (blur-- > 0) {
|
||||||
|
let blur = new Uint8Array(width * height);
|
||||||
|
for (let y = 0; y < height; y++) {
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
let xl = Math.max(x-1,0);
|
||||||
|
let xr = Math.min(x+1,width-1);
|
||||||
|
let yu = Math.max(y-1,0);
|
||||||
|
let yd = Math.min(y+1,height-1);
|
||||||
|
let id = x + width * y;
|
||||||
|
blur[id] = ((
|
||||||
|
gray[xl + (width * yu)] +
|
||||||
|
gray[x + (width * yu)] +
|
||||||
|
gray[xr + (width * yu)] +
|
||||||
|
gray[xl + (width * y)] +
|
||||||
|
gray[x + (width * y)] * 8 + // self
|
||||||
|
gray[xr + (width * y)] +
|
||||||
|
gray[xl + (width * yd)] +
|
||||||
|
gray[x + (width * yd)] +
|
||||||
|
gray[xr + (width * yd)]
|
||||||
|
) / 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gray = blur;
|
||||||
|
}
|
||||||
|
// create indexed mesh output
|
||||||
|
let base = parseInt(opt.base || 0);
|
||||||
|
let verts = new Float32Array(points * 3);
|
||||||
|
let faces = new Uint32Array(flats * 6);
|
||||||
|
let w2 = width / 2;
|
||||||
|
let h2 = height / 2;
|
||||||
|
let vi = 0;
|
||||||
|
let ii = 0;
|
||||||
|
let VI = 0;
|
||||||
|
let VB = 0;
|
||||||
|
// create surface vertices & faces
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
for (let y = 0; y < height; y++) {
|
||||||
|
let id = x + width * y;
|
||||||
|
let v = gray[id];
|
||||||
|
// create vertex @ x,y
|
||||||
|
verts[vi++] = (-w2 + x) / div;
|
||||||
|
verts[vi++] = (h2 - y) / div;
|
||||||
|
verts[vi++] = (v / 50) + (base * alpha[id] / 255);
|
||||||
|
VI++;
|
||||||
|
// create two surface faces on the rect between x-1,y-1 and x,y
|
||||||
|
if (x > 0 && y > 0) {
|
||||||
|
let p1 = (x - 1) * height + (y - 0);
|
||||||
|
let p2 = (x - 0) * height + (y - 1);
|
||||||
|
let p3 = (x - 0) * height + (y - 0);
|
||||||
|
let p4 = (x - 1) * height + (y - 1);
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
progress(x / width);
|
||||||
|
}
|
||||||
|
// create top vertices & faces
|
||||||
|
VB = VI;
|
||||||
|
let TL = VI;
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
let y = 0;
|
||||||
|
verts[vi++] = (-w2 + x) / div;
|
||||||
|
verts[vi++] = (h2 - y) / div;
|
||||||
|
verts[vi++] = 0;
|
||||||
|
VI++;
|
||||||
|
// create two top faces on the rect x-1,0, x,z
|
||||||
|
if (x > 0) {
|
||||||
|
let p1 = VB + (x - 1);
|
||||||
|
let p2 = VB + (x - 0);
|
||||||
|
let p3 = (x * height);
|
||||||
|
let p4 = (x - 1) * height;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p4;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// create bottom vertices & faces
|
||||||
|
VB = VI;
|
||||||
|
let BL = VI;
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
let y = height - 1;
|
||||||
|
verts[vi++] = (-w2 + x) / div;
|
||||||
|
verts[vi++] = (h2 - y) / div;
|
||||||
|
verts[vi++] = 0;
|
||||||
|
VI++;
|
||||||
|
// create two top faces on the rect x-1,0, x,z
|
||||||
|
if (x > 0) {
|
||||||
|
let p1 = VB + (x - 1);
|
||||||
|
let p2 = VB + (x - 0);
|
||||||
|
let p3 = (x * height) + y;
|
||||||
|
let p4 = (x - 1) * height + y;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// create left vertices & faces
|
||||||
|
VB = VI;
|
||||||
|
for (let y=0; y < height; y++) {
|
||||||
|
let x = 0;
|
||||||
|
verts[vi++] = (-w2 + x) / div;
|
||||||
|
verts[vi++] = (h2 - y) / div;
|
||||||
|
verts[vi++] = 0;
|
||||||
|
VI++;
|
||||||
|
// create two left faces on the rect y-1,0, y,z
|
||||||
|
if (y > 0) {
|
||||||
|
let p1 = VB + (y + 0);
|
||||||
|
let p2 = VB + (y - 1);
|
||||||
|
let p3 = 0 + (y - 1);
|
||||||
|
let p4 = 0 + (y - 0);
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p4;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// create right vertices & faces
|
||||||
|
VB = VI;
|
||||||
|
let TR = VI;
|
||||||
|
for (let y=0; y < height; y++) {
|
||||||
|
let x = width - 1;
|
||||||
|
verts[vi++] = (-w2 + x) / div;
|
||||||
|
verts[vi++] = (h2 - y) / div;
|
||||||
|
verts[vi++] = 0;
|
||||||
|
VI++;
|
||||||
|
// create two right faces on the rect y-1,0, y,z
|
||||||
|
if (y > 0) {
|
||||||
|
let p1 = VB + (y + 0);
|
||||||
|
let p2 = VB + (y - 1);
|
||||||
|
let p3 = (x * height) + (y - 1);
|
||||||
|
let p4 = (x * height) + (y - 0);
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p2;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p1;
|
||||||
|
faces[ii++] = p3;
|
||||||
|
faces[ii++] = p4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let BR = VI-1;
|
||||||
|
// create base two faces
|
||||||
|
faces[ii++] = TL;
|
||||||
|
faces[ii++] = TR;
|
||||||
|
faces[ii++] = BR;
|
||||||
|
faces[ii++] = TL;
|
||||||
|
faces[ii++] = BR;
|
||||||
|
faces[ii++] = BL;
|
||||||
|
// flatten for now until we support indexed mesh
|
||||||
|
// throughout KM (widget, storage, decimation)
|
||||||
|
let bigv = new Float32Array(ii * 3);
|
||||||
|
let bgi = 0;
|
||||||
|
for (let i=0; i<ii; i++) {
|
||||||
|
let iv = faces[i] * 3;
|
||||||
|
bigv[bgi++] = verts[iv];
|
||||||
|
bigv[bgi++] = verts[iv+1];
|
||||||
|
bigv[bgi++] = verts[iv+2];
|
||||||
|
}
|
||||||
|
// return ArrayBuffer
|
||||||
|
ondone(bigv);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -1,25 +1,15 @@
|
||||||
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||||
|
|
||||||
'use strict';
|
// use: add.three
|
||||||
|
gapp.register("load.svg", (root, exports) => {
|
||||||
|
|
||||||
(function() {
|
const { load } = root;
|
||||||
|
|
||||||
let load = self.load = self.load || {};
|
|
||||||
if (load.SVG) return;
|
|
||||||
|
|
||||||
// dep: add.three
|
|
||||||
gapp.register('load.svg', []);
|
|
||||||
|
|
||||||
load.SVG = {
|
load.SVG = {
|
||||||
parse,
|
parse,
|
||||||
parseAsync
|
parseAsync
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} text
|
|
||||||
* @returns {Array} vertex face array
|
|
||||||
*/
|
|
||||||
|
|
||||||
function parseAsync(text, opt) {
|
function parseAsync(text, opt) {
|
||||||
return new Promise((resolve,reject) => {
|
return new Promise((resolve,reject) => {
|
||||||
resolve(parse(text, opt));
|
resolve(parse(text, opt));
|
||||||
|
|
@ -27,10 +17,7 @@ function parseAsync(text, opt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function parse(text, opt = {}) {
|
function parse(text, opt = {}) {
|
||||||
|
let objs = [];
|
||||||
let faces = [ ];
|
|
||||||
let objs = [ faces ];
|
|
||||||
|
|
||||||
let data = new THREE.SVGLoader().parse(text);
|
let data = new THREE.SVGLoader().parse(text);
|
||||||
let paths = data.paths;
|
let paths = data.paths;
|
||||||
let xmlat = data.xml.attributes;
|
let xmlat = data.xml.attributes;
|
||||||
|
|
@ -51,11 +38,10 @@ function parse(text, opt = {}) {
|
||||||
for (let i=0; i<array.length; i+=3) {
|
for (let i=0; i<array.length; i+=3) {
|
||||||
array[i+1] = -array[i+1];
|
array[i+1] = -array[i+1];
|
||||||
}
|
}
|
||||||
// objs.push(geom.attributes.position.array);
|
objs.push([ ...array ]);
|
||||||
faces.appendAll(array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return objs;
|
return objs;
|
||||||
}
|
}
|
||||||
|
|
||||||
})();
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue