From 1c8109fdbd914b174c5ca7b1bcca47bd8b21e8fa Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 7 Nov 2019 15:18:05 +0100 Subject: [PATCH] Split by material for obj importer --- Sources/arm/Project.hx | 1 + Sources/arm/format/ObjParser.hx | 27 +++++++++++++++++++++++---- Sources/arm/io/ImportObj.hx | 3 ++- Sources/arm/ui/TabMeshes.hx | 10 +--------- Sources/arm/ui/TabViewport.hx | 3 ++- Sources/arm/ui/UIMenu.hx | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Sources/arm/Project.hx b/Sources/arm/Project.hx index a668274d..fb4ffe29 100644 --- a/Sources/arm/Project.hx +++ b/Sources/arm/Project.hx @@ -239,6 +239,7 @@ class Project { Importer.importMesh(Project.meshAssets[0], false); Log.showMessage("Mesh reimported."); } + else importAsset(); } public static function importAsset() { diff --git a/Sources/arm/format/ObjParser.hx b/Sources/arm/format/ObjParser.hx index bf47ba95..3207392c 100644 --- a/Sources/arm/format/ObjParser.hx +++ b/Sources/arm/format/ObjParser.hx @@ -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; + static var uvFirst:Array; + static var norFirst:Array; 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() { diff --git a/Sources/arm/io/ImportObj.hx b/Sources/arm/io/ImportObj.hx index cce05329..dca06b5b 100644 --- a/Sources/arm/io/ImportObj.hx +++ b/Sources/arm/io/ImportObj.hx @@ -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); diff --git a/Sources/arm/ui/TabMeshes.hx b/Sources/arm/ui/TabMeshes.hx index 9bfaf423..daac27fe 100644 --- a/Sources/arm/ui/TabMeshes.hx +++ b/Sources/arm/ui/TabMeshes.hx @@ -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]); diff --git a/Sources/arm/ui/TabViewport.hx b/Sources/arm/ui/TabViewport.hx index f299efa3..580ee623 100644 --- a/Sources/arm/ui/TabViewport.hx +++ b/Sources/arm/ui/TabViewport.hx @@ -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"; diff --git a/Sources/arm/ui/UIMenu.hx b/Sources/arm/ui/UIMenu.hx index 3eb7fc5f..47662246 100644 --- a/Sources/arm/ui/UIMenu.hx +++ b/Sources/arm/ui/UIMenu.hx @@ -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();