75 lines
2.1 KiB
JavaScript
75 lines
2.1 KiB
JavaScript
|
|
let import_stl = function(path, done) {
|
|
iron.Data.getBlob(path, function(b) {
|
|
let input = new core.BytesInput(b.bytes);
|
|
let header = input.read(80);
|
|
if (header.getString(0, 5) == "solid") {
|
|
return; // ascii not supported
|
|
}
|
|
let faces = input.readInt32();
|
|
let posTemp = new Float32Array(faces * 9);
|
|
let norTemp = new Float32Array(faces * 3);
|
|
for (let i = 0; i < faces; ++i) {
|
|
let i3 = i * 3;
|
|
norTemp[i3 ] = input.readFloat();
|
|
norTemp[i3 + 1] = input.readFloat();
|
|
norTemp[i3 + 2] = input.readFloat();
|
|
let i9 = i * 9;
|
|
posTemp[i9 ] = input.readFloat();
|
|
posTemp[i9 + 1] = input.readFloat();
|
|
posTemp[i9 + 2] = input.readFloat();
|
|
posTemp[i9 + 3] = input.readFloat();
|
|
posTemp[i9 + 4] = input.readFloat();
|
|
posTemp[i9 + 5] = input.readFloat();
|
|
posTemp[i9 + 6] = input.readFloat();
|
|
posTemp[i9 + 7] = input.readFloat();
|
|
posTemp[i9 + 8] = input.readFloat();
|
|
input.readInt16(); // attribute
|
|
}
|
|
|
|
let scalePos = 0.0;
|
|
for (let i = 0; i < posTemp.length; ++i) {
|
|
let f = Math.abs(posTemp[i]);
|
|
if (scalePos < f) scalePos = f;
|
|
}
|
|
let inv = 32767 * (1 / scalePos);
|
|
|
|
let verts = posTemp.length / 3;
|
|
let posa = new Int16Array(verts * 4);
|
|
let nora = new Int16Array(verts * 2);
|
|
let inda = new Uint32Array(verts);
|
|
for (let i = 0; i < verts; ++i) {
|
|
posa[i * 4 ] = posTemp[i * 3 ] * inv;
|
|
posa[i * 4 + 1] = -posTemp[i * 3 + 2] * inv;
|
|
posa[i * 4 + 2] = posTemp[i * 3 + 1] * inv;
|
|
nora[i * 2 ] = norTemp[i ] * 32767;
|
|
nora[i * 2 + 1] = -norTemp[i + 2] * 32767;
|
|
posa[i * 4 + 3] = norTemp[i + 1] * 32767;
|
|
inda[i] = i;
|
|
}
|
|
|
|
let name = path.split("\\").pop().split("/").pop().split(".").shift();
|
|
done({
|
|
name: name,
|
|
posa: posa,
|
|
nora: nora,
|
|
inda: inda,
|
|
scale_pos: scalePos,
|
|
scale_tex: 1.0
|
|
});
|
|
|
|
iron.Data.deleteBlob(path);
|
|
});
|
|
}
|
|
|
|
let plugin = new arm.Plugin();
|
|
let formats = arm.Path.meshFormats;
|
|
let importers = arm.Path.meshImporters;
|
|
formats.push("stl");
|
|
importers.h["stl"] = import_stl;
|
|
|
|
plugin.delete = function() {
|
|
formats.splice(formats.indexOf("stl"), 1);
|
|
importers.h["stl"] = null;
|
|
};
|