From 5a49c2815ceefd3dae596278e86353b2485ea63e Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 14 Jan 2021 16:29:22 +0100 Subject: [PATCH] Improve merged object handling --- Sources/arm/Context.hx | 1 + Sources/arm/ui/TabLayers.hx | 2 ++ Sources/arm/ui/TabMeshes.hx | 8 +++++++- Sources/arm/util/MeshUtil.hx | 9 ++++++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Sources/arm/Context.hx b/Sources/arm/Context.hx index 154acc1d..2a2e9e1f 100644 --- a/Sources/arm/Context.hx +++ b/Sources/arm/Context.hx @@ -39,6 +39,7 @@ class Context { public static var texture: TAsset = null; public static var paintObject: MeshObject; public static var mergedObject: MeshObject = null; // For object mask + public static var mergedObjectIsAtlas = false; // Only objects referenced by atlas are merged public static var tool = 0; public static var ddirty = 0; // depth diff --git a/Sources/arm/ui/TabLayers.hx b/Sources/arm/ui/TabLayers.hx index 3b6226b2..21dbb18b 100644 --- a/Sources/arm/ui/TabLayers.hx +++ b/Sources/arm/ui/TabLayers.hx @@ -8,6 +8,7 @@ import iron.system.Input; import arm.data.LayerSlot; import arm.node.MakeMaterial; import arm.util.UVUtil; +import arm.util.MeshUtil; import arm.sys.Path; import arm.Enums; @@ -51,6 +52,7 @@ class TabLayers { Context.layerFilter = ui.combo(filterHandle, ar, tr("Filter"), false, Left, 16); if (filterHandle.changed) { for (p in Project.paintObjects) p.visible = Context.layerFilter == 0 || p.name == ar[Context.layerFilter]; + if (Context.layerFilter == 0 && Context.mergedObjectIsAtlas) MeshUtil.mergeMesh(); Layers.setObjectMask(); UVUtil.uvmapCached = false; Context.ddirty = 2; diff --git a/Sources/arm/ui/TabMeshes.hx b/Sources/arm/ui/TabMeshes.hx index 5bd08707..77fad4b9 100644 --- a/Sources/arm/ui/TabMeshes.hx +++ b/Sources/arm/ui/TabMeshes.hx @@ -2,6 +2,7 @@ package arm.ui; import zui.Zui; import zui.Id; +import iron.object.MeshObject; import arm.util.MeshUtil; class TabMeshes { @@ -59,7 +60,12 @@ class TabMeshes { var h = Id.handle(); h.selected = o.visible; o.visible = ui.check(h, o.name); - if (h.changed) Context.ddirty = 2; + if (h.changed) { + var visibles: Array = []; + for (p in Project.paintObjects) if (p.visible) visibles.push(p); + MeshUtil.mergeMesh(visibles); + Context.ddirty = 2; + } } } } diff --git a/Sources/arm/util/MeshUtil.hx b/Sources/arm/util/MeshUtil.hx index 035c3266..17efd53d 100644 --- a/Sources/arm/util/MeshUtil.hx +++ b/Sources/arm/util/MeshUtil.hx @@ -12,8 +12,10 @@ import arm.Enums; class MeshUtil { - public static function mergeMesh() { - var paintObjects = Project.paintObjects; + public static function mergeMesh(paintObjects: Array = null) { + if (paintObjects == null) paintObjects = Project.paintObjects; + if (paintObjects.length == 0) return; + Context.mergedObjectIsAtlas = paintObjects.length < Project.paintObjects.length; var vlen = 0; var ilen = 0; var maxScale = 0.0; @@ -67,12 +69,13 @@ class MeshUtil { if (va3 != null) raw.vertex_arrays.push({ values: va3, attrib: "col", data: "short4norm", padding: 1 }); if (Context.mergedObject != null) { + Context.mergedObject.remove(); Data.deleteMesh(Context.mergedObject.data.handle); } new MeshData(raw, function(md: MeshData) { Context.mergedObject = new MeshObject(md, Context.paintObject.materials); - Context.mergedObject.name = Context.paintObject.name; + Context.mergedObject.name = Context.paintObject.name + "_merged"; Context.mergedObject.force_context = "paint"; Context.mainObject().addChild(Context.mergedObject); });