Split by material for obj importer
This commit is contained in:
@@ -239,6 +239,7 @@ class Project {
|
||||
Importer.importMesh(Project.meshAssets[0], false);
|
||||
Log.showMessage("Mesh reimported.");
|
||||
}
|
||||
else importAsset();
|
||||
}
|
||||
|
||||
public static function importAsset() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user