Files
armorpaint/Sources/arm/io/ImportObj.hx
T

85 lines
2.7 KiB
Haxe
Raw Normal View History

2019-06-19 18:45:36 +02:00
package arm.io;
2019-06-20 11:23:01 +02:00
import kha.Blob;
import iron.data.Data;
2019-07-17 12:40:24 +02:00
import arm.format.ObjParser;
2020-03-18 20:26:28 +01:00
import arm.ui.UISidebar;
2019-06-19 18:45:36 +02:00
class ImportObj {
2019-12-09 00:28:10 +01:00
public static function run(path: String) {
2020-03-26 15:22:22 +01:00
var i = Context.splitBy;
2019-12-08 16:59:08 +01:00
var isUdim = i == SplitUdim;
ObjParser.splitCode =
(i == SplitObject || isUdim) ? "o".code :
i == SplitGroup ? "g".code :
"u".code; // usemtl
2019-12-09 00:28:10 +01:00
Data.getBlob(path, function(b: Blob) {
2019-11-20 21:12:25 +01:00
if (isUdim) {
var obj = new ObjParser(b, 0, isUdim);
2019-06-19 18:45:36 +02:00
var name = obj.name;
for (i in 0...obj.udims.length) {
var u = i % obj.udimsU;
var v = Std.int(i / obj.udimsU);
obj.name = name + "." + (1000 + v * 10 + u + 1);
obj.inda = obj.udims[i];
2019-11-11 22:14:32 +01:00
i == 0 ? ImportMesh.makeMesh(obj, path) : ImportMesh.addMesh(obj);
2019-06-19 18:45:36 +02:00
}
}
else {
2020-05-19 22:24:24 +02:00
var parts: Array<ObjParser> = [];
2019-06-20 11:23:01 +02:00
var obj = new ObjParser(b);
2020-05-19 22:24:24 +02:00
parts.push(obj);
2019-06-19 18:45:36 +02:00
while (obj.hasNext) {
2019-06-20 11:23:01 +02:00
obj = new ObjParser(b, obj.pos);
2020-05-19 22:24:24 +02:00
parts.push(obj);
}
if (Context.splitBy == SplitMaterial) {
// Merge to single object per material
for (i in 0...parts.length) {
var j = i + 1;
while (j < parts.length) {
if (parts[i].name == parts[j].name) {
var posa0 = parts[i].posa;
var posa1 = parts[j].posa;
var nora0 = parts[i].nora;
var nora1 = parts[j].nora;
var texa0 = parts[i].texa != null ? parts[i].texa : null;
var texa1 = parts[j].texa != null ? parts[j].texa : null;
var inda0 = parts[i].inda;
var inda1 = parts[j].inda;
var posa = new kha.arrays.Int16Array(posa0.length + posa1.length);
var nora = new kha.arrays.Int16Array(nora0.length + nora1.length);
var texa = (texa0 != null && texa1 != null) ? new kha.arrays.Int16Array(texa0.length + texa1.length) : null;
var inda = new kha.arrays.Uint32Array(inda0.length + inda1.length);
var voff = Std.int(posa0.length / 4);
untyped __js__("posa.set(posa0)");
untyped __js__("posa.set(posa1, posa0.length)");
untyped __js__("nora.set(nora0)");
untyped __js__("nora.set(nora1, nora0.length)");
if (texa != null) {
untyped __js__("texa.set(texa0)");
untyped __js__("texa.set(texa1, texa0.length)");
}
untyped __js__("inda.set(inda0)");
for (k in 0...inda1.length) inda[k + inda0.length] = inda1[k] + voff;
parts[i].posa = posa;
parts[i].nora = nora;
parts[i].texa = texa;
parts[i].inda = inda;
parts.splice(j, 1);
}
else j++;
}
}
}
ImportMesh.makeMesh(parts[0], path);
for (i in 1...parts.length) {
ImportMesh.addMesh(parts[i]);
2019-06-19 18:45:36 +02:00
}
}
2019-06-20 11:23:01 +02:00
Data.deleteBlob(path);
2019-06-19 18:45:36 +02:00
});
}
}