Split by material for obj importer

This commit is contained in:
luboslenco
2019-11-07 15:18:05 +01:00
parent a52e3cea36
commit 1c8109fdbd
6 changed files with 30 additions and 16 deletions
+1
View File
@@ -239,6 +239,7 @@ class Project {
Importer.importMesh(Project.meshAssets[0], false);
Log.showMessage("Mesh reimported.");
}
else importAsset();
}
public static function importAsset() {
+23 -4
View File
@@ -2,7 +2,7 @@ package arm.format;
class ObjParser {
public static var splitCode = "o".code; // Object split, "g" for groups
public static var splitCode = "o".code; // Object split, "g" for groups, "u"semtl for materials
public var posa:kha.arrays.Int16Array = null;
public var nora:kha.arrays.Int16Array = null;
public var texa:kha.arrays.Int16Array = null;
@@ -29,6 +29,9 @@ class ObjParser {
static var tindOff = 0;
static var nindOff = 0;
static var bytes:haxe.io.Bytes = null;
static var posFirst:Array<Float>;
static var uvFirst:Array<Float>;
static var norFirst:Array<Float>;
public function new(blob:kha.Blob, startPos = 0, udim = false) {
pos = startPos;
@@ -48,6 +51,12 @@ class ObjParser {
na = new kha.arrays.Uint32Array(60);
buf = new haxe.io.UInt8Array(64);
if (splitCode == "u".code && startPos > 0) {
posTemp = posFirst;
norTemp = norFirst;
uvTemp = uvFirst;
}
while (true) {
if (pos >= bytes.length) break;
@@ -124,6 +133,7 @@ class ObjParser {
}
}
else if (c0 == splitCode) {
if (splitCode == "u".code) pos += 5; // "u"semtl
pos++; // Space
if (!udim) readingObject = true;
name = readString();
@@ -132,12 +142,20 @@ class ObjParser {
}
if (startPos > 0) {
for (i in 0...posIndices.length) posIndices[i] -= vindOff;
for (i in 0...uvIndices.length) uvIndices[i] -= tindOff;
for (i in 0...norIndices.length) norIndices[i] -= nindOff;
if (splitCode != "u".code) {
for (i in 0...posIndices.length) posIndices[i] -= vindOff;
for (i in 0...uvIndices.length) uvIndices[i] -= tindOff;
for (i in 0...norIndices.length) norIndices[i] -= nindOff;
}
}
else {
vindOff = tindOff = nindOff = 0;
if (splitCode == "u".code) {
posFirst = posTemp;
norFirst = norTemp;
uvFirst = uvTemp;
}
}
vindOff += Std.int(posTemp.length / 3); // Assumes separate vertex data per object
tindOff += Std.int(uvTemp.length / 2);
@@ -269,6 +287,7 @@ class ObjParser {
}
}
bytes = null;
if (!hasNext) { posFirst = norFirst = uvFirst = null; }
}
function readFaceFast() {
+2 -1
View File
@@ -8,7 +8,8 @@ import arm.ui.UITrait;
class ImportObj {
public static function run(path:String) {
ObjParser.splitCode = UITrait.inst.splitBy == 0 ? "o".code : "g".code;
var i = UITrait.inst.splitBy;
ObjParser.splitCode = i == 0 ? "o".code : i == 1 ? "g".code : "u".code; // object, group, usemtl
Data.getBlob(path, function(b:Blob) {
if (UITrait.inst.isUdim) {
var obj = new ObjParser(b, 0, UITrait.inst.isUdim);
+1 -9
View File
@@ -14,7 +14,7 @@ class TabMeshes {
if (ui.button("Import")) Context.importMesh();
if (ui.isHovered) ui.tooltip("Import mesh file (" + Config.keymap.file_import_assets + ")");
UITrait.inst.splitBy = ui.combo(Id.handle({position: 0}), ["Object", "Group"], "Split By", true);
UITrait.inst.splitBy = ui.combo(Id.handle({position: 0}), ["Object", "Group", "Material"], "Split By", true);
if (ui.isHovered) ui.tooltip("Split .obj mesh into objects");
UITrait.inst.isUdim = ui.check(Id.handle({selected: UITrait.inst.isUdim}), "UDIM Import");
@@ -23,14 +23,6 @@ class TabMeshes {
UITrait.inst.parseTransform = ui.check(Id.handle({selected: UITrait.inst.parseTransform}), "Parse Transforms");
if (ui.isHovered) ui.tooltip("Load per-object transforms from .fbx");
if (ui.panel(Id.handle({selected: false}), "Scene", 0, true)) {
ui.indent();
for (o in Project.paintObjects) {
ui.text(o.name);
}
ui.unindent();
}
if (ui.panel(Id.handle({selected: false}), "Geometry")) {
ui.row([1/2,1/2]);
+2 -1
View File
@@ -15,7 +15,8 @@ class TabViewport {
public static function draw() {
var ui = UITrait.inst.ui;
if (ui.tab(UITrait.inst.htab2, "Viewport")) {
if (ui.button("Import Envmap")) {
ui.row([1/4]);
if (ui.button("Import")) {
UIFiles.show = true;
UIFiles.isSave = false;
UIFiles.filters = "hdr";
+1 -1
View File
@@ -67,8 +67,8 @@ class UIMenu {
if (ui.button("Save", Left, Config.keymap.file_save)) Project.projectSave();
if (ui.button("Save As...", Left, Config.keymap.file_save_as)) Project.projectSaveAs();
ui.fill(0, 0, sepw, 1, ui.t.ACCENT_SELECT_COL);
if (ui.button("Reimport Mesh", Left, Config.keymap.file_reimport_mesh)) Project.reimportMesh();
if (ui.button("Import Assets...", Left, Config.keymap.file_import_assets)) Project.importAsset();
if (ui.button("Reimport Mesh", Left, Config.keymap.file_reimport_mesh)) Project.reimportMesh();
ui.fill(0, 0, sepw, 1, ui.t.ACCENT_SELECT_COL);
if (ui.button("Export Textures...", Left, Config.keymap.file_export_textures_as)) BoxExport.showTextures();
if (ui.button("Export Mesh...", Left)) BoxExport.showMesh();