From a61cc7a5880fdbd6099c862899661adb437cf05a Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 28 Jan 2020 00:02:07 +0100 Subject: [PATCH] Show material preview in browser --- Sources/arm/Project.hx | 1 + Sources/arm/data/MaterialSlot.hx | 2 +- Sources/arm/io/ExportArm.hx | 1 + Sources/arm/io/ImportArm.hx | 18 +++++++++--------- Sources/arm/sys/Path.hx | 4 ++++ Sources/arm/ui/UIFiles.hx | 30 +++++++++++++++++++++++++++++- Sources/arm/util/RenderUtil.hx | 2 +- 7 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Sources/arm/Project.hx b/Sources/arm/Project.hx index 89e2d6e3..d49328ff 100644 --- a/Sources/arm/Project.hx +++ b/Sources/arm/Project.hx @@ -288,6 +288,7 @@ typedef TProjectFormat = { public var version: String; @:optional public var brush_nodes: Array; @:optional public var material_nodes: Array; + @:optional public var material_icons: Array; @:optional public var assets: Array; // texture_assets @:optional public var layer_datas: Array; @:optional public var mesh_datas: Array; diff --git a/Sources/arm/data/MaterialSlot.hx b/Sources/arm/data/MaterialSlot.hx index 2415b0fe..6a22622e 100644 --- a/Sources/arm/data/MaterialSlot.hx +++ b/Sources/arm/data/MaterialSlot.hx @@ -33,7 +33,7 @@ class MaterialSlot { data = m; var w = RenderUtil.matPreviewSize; - var wIcon = Std.int(w / 4); + var wIcon = 50; image = Image.createRenderTarget(w, w); imageIcon = Image.createRenderTarget(wIcon, wIcon); diff --git a/Sources/arm/io/ExportArm.hx b/Sources/arm/io/ExportArm.hx index 91476d72..da4f19f8 100644 --- a/Sources/arm/io/ExportArm.hx +++ b/Sources/arm/io/ExportArm.hx @@ -103,6 +103,7 @@ class ExportArm { var raw = { version: App.version, material_nodes: mnodes, + material_icons: [Lz4.encode(m.image.getPixels())], assets: texture_files }; diff --git a/Sources/arm/io/ImportArm.hx b/Sources/arm/io/ImportArm.hx index 0b339c92..df9daf44 100644 --- a/Sources/arm/io/ImportArm.hx +++ b/Sources/arm/io/ImportArm.hx @@ -94,15 +94,20 @@ class ImportArm { public static function runProject(path: String) { Data.getBlob(path, function(b: Blob) { + var project: TProjectFormat = ArmPack.decode(b.toBytes()); + path = path.replace("\\", "/"); + + // Import as material instead + if (project.version != null && project.layer_datas == null) { + runMaterialFromProject(project, path); + return; + } Context.layersPreviewDirty = true; - var resetLayers = false; - Project.projectNew(resetLayers); - path = path.replace("\\", "/"); Project.filepath = path; + Project.projectNew(false); UIFiles.filename = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")); Window.get(0).title = UIFiles.filename + " - ArmorPaint"; - var project: TProjectFormat = ArmPack.decode(b.toBytes()); // Import as mesh instead if (project.version == null) { @@ -110,11 +115,6 @@ class ImportArm { return; } - if (project.layer_datas == null) { - runMaterialFromProject(project, Project.filepath); - return; - } - Project.raw = project; var base = Path.baseDir(path); diff --git a/Sources/arm/sys/Path.hx b/Sources/arm/sys/Path.hx index 41a2ae05..c5e4d2cd 100644 --- a/Sources/arm/sys/Path.hx +++ b/Sources/arm/sys/Path.hx @@ -104,6 +104,10 @@ class Path { return p.endsWith(".json"); } + public static function isKnown(path: String): Bool { + return isMesh(path) || isTexture(path) || isFont(path) || isProject(path) || isPlugin(path); + } + static function checkExt(p: String, exts: Array): Bool { p = p.replace("-", "_"); for (ext in exts) if (p.endsWith("_" + ext)) return true; diff --git a/Sources/arm/ui/UIFiles.hx b/Sources/arm/ui/UIFiles.hx index 7ecf9949..10074d6a 100644 --- a/Sources/arm/ui/UIFiles.hx +++ b/Sources/arm/ui/UIFiles.hx @@ -1,9 +1,12 @@ package arm.ui; +import haxe.io.Bytes; import zui.Zui; import zui.Id; import iron.system.Input; import iron.system.Time; +import iron.system.ArmPack; +import arm.format.Lz4; import arm.sys.Path; import arm.sys.File; using StringTools; @@ -14,6 +17,7 @@ class UIFiles { public static var path = "/"; static var lastPath = ""; static var files: Array = null; + static var iconMap: Map = null; static var selected = -1; public static function show(filters: String, isSave: Bool, filesDone: String->Void) { @@ -85,6 +89,7 @@ class UIFiles { var filesAll = File.readDirectory(handle.text, foldersOnly); for (f in filesAll) { if (f == "" || f.charAt(0) == ".") continue; // Skip hidden + if (f.indexOf(".") > 0 && !Path.isKnown(f)) continue; // Skip unknown extensions files.push(f); } } @@ -120,7 +125,30 @@ class UIFiles { var uix = ui._x; var uiy = ui._y; - var state = ui.image(icons, col, rect.h, rect.x, rect.y, rect.w, rect.h); + var state = Idle; + var generic = true; + + if (f.endsWith(".arm")) { + if (iconMap == null) iconMap = []; + var icon = iconMap.get(handle.text + Path.sep + f); + if (icon == null) { + var bytes = Bytes.ofData(Krom.loadBlob(handle.text + Path.sep + f)); + var raw = ArmPack.decode(bytes); + if (raw.material_icons != null) { + var bytesIcon = raw.material_icons[0]; + icon = kha.Image.fromBytes(Lz4.decode(bytesIcon, 256 * 256 * 4), 256, 256); + iconMap.set(handle.text + Path.sep + f, icon); + } + } + if (icon != null) { + state = ui.image(icon, col, rect.h); + generic = false; + } + } + + if (generic) { + state = ui.image(icons, col, rect.h, rect.x, rect.y, rect.w, rect.h); + } if (state == Started) { diff --git a/Sources/arm/util/RenderUtil.hx b/Sources/arm/util/RenderUtil.hx index 281d34e2..ddd2538d 100644 --- a/Sources/arm/util/RenderUtil.hx +++ b/Sources/arm/util/RenderUtil.hx @@ -15,7 +15,7 @@ import arm.Tool; class RenderUtil { - public static inline var matPreviewSize = 200; + public static inline var matPreviewSize = 256; public static inline var decalPreviewSize = 512; public static function makeMaterialPreview() {