From a0abbe80375dc8488bfc0c459b0d7a93ba1bf17d Mon Sep 17 00:00:00 2001 From: Razmoth <32140579+Razmoth@users.noreply.github.com> Date: Tue, 26 Sep 2023 11:53:47 +0400 Subject: [PATCH] - [Core] Exportable `Material`. - [Core] Added name to `PPtr` and `Object` when available. --- AssetStudio/Classes/Animator.cs | 2 + AssetStudio/Classes/GameObject.cs | 1 + AssetStudio/Classes/IndexObject.cs | 2 + AssetStudio/Classes/MonoBehaviour.cs | 1 + AssetStudio/Classes/MonoScript.cs | 2 + AssetStudio/Classes/NamedObject.cs | 2 + AssetStudio/Classes/Object.cs | 2 + AssetStudio/Classes/PPtr.cs | 2 + AssetStudio/Classes/Shader.cs | 2 + AssetStudioCLI/Components/AssetItem.cs | 2 +- AssetStudioCLI/Exporter.cs | 2 + AssetStudioCLI/Studio.cs | 50 +++++--------------- AssetStudioGUI/Components/AssetItem.cs | 1 + AssetStudioGUI/Exporter.cs | 2 + AssetStudioGUI/Studio.cs | 64 +++++++------------------- 15 files changed, 49 insertions(+), 88 deletions(-) diff --git a/AssetStudio/Classes/Animator.cs b/AssetStudio/Classes/Animator.cs index c565493..13e3cab 100644 --- a/AssetStudio/Classes/Animator.cs +++ b/AssetStudio/Classes/Animator.cs @@ -11,6 +11,8 @@ public sealed class Animator : Behaviour public PPtr m_Controller; public bool m_HasTransformHierarchy = true; + public override string Name => m_GameObject.Name; + public Animator(ObjectReader reader) : base(reader) { m_Avatar = new PPtr(reader); diff --git a/AssetStudio/Classes/GameObject.cs b/AssetStudio/Classes/GameObject.cs index 48bef0b..6dc9f13 100644 --- a/AssetStudio/Classes/GameObject.cs +++ b/AssetStudio/Classes/GameObject.cs @@ -19,6 +19,7 @@ public sealed class GameObject : EditorExtension public Animator m_Animator; public Animation m_Animation; + public override string Name => m_Name; public GameObject(ObjectReader reader) : base(reader) { int m_Component_size = reader.ReadInt32(); diff --git a/AssetStudio/Classes/IndexObject.cs b/AssetStudio/Classes/IndexObject.cs index b5adb56..cfb5b71 100644 --- a/AssetStudio/Classes/IndexObject.cs +++ b/AssetStudio/Classes/IndexObject.cs @@ -19,6 +19,8 @@ public sealed class IndexObject : NamedObject public int Count; public KeyValuePair[] AssetMap; + public override string Name => "IndexObject"; + public IndexObject(ObjectReader reader) : base(reader) { Count = reader.ReadInt32(); diff --git a/AssetStudio/Classes/MonoBehaviour.cs b/AssetStudio/Classes/MonoBehaviour.cs index 7657919..eb79bb6 100644 --- a/AssetStudio/Classes/MonoBehaviour.cs +++ b/AssetStudio/Classes/MonoBehaviour.cs @@ -10,6 +10,7 @@ public sealed class MonoBehaviour : Behaviour public PPtr m_Script; public string m_Name; + public override string Name => string.IsNullOrEmpty(m_Name) ? m_Script.Name : m_Name; public MonoBehaviour(ObjectReader reader) : base(reader) { m_Script = new PPtr(reader); diff --git a/AssetStudio/Classes/MonoScript.cs b/AssetStudio/Classes/MonoScript.cs index cea9e89..869bb8c 100644 --- a/AssetStudio/Classes/MonoScript.cs +++ b/AssetStudio/Classes/MonoScript.cs @@ -11,6 +11,8 @@ public sealed class MonoScript : NamedObject public string m_Namespace; public string m_AssemblyName; + public override string Name => string.IsNullOrEmpty(m_Name) ? m_ClassName : m_Name; + public MonoScript(ObjectReader reader) : base(reader) { if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up diff --git a/AssetStudio/Classes/NamedObject.cs b/AssetStudio/Classes/NamedObject.cs index d43db4e..11d7edd 100644 --- a/AssetStudio/Classes/NamedObject.cs +++ b/AssetStudio/Classes/NamedObject.cs @@ -9,6 +9,8 @@ public class NamedObject : EditorExtension { public string m_Name; + public override string Name => m_Name; + protected NamedObject(ObjectReader reader) : base(reader) { m_Name = reader.ReadAlignedString(); diff --git a/AssetStudio/Classes/Object.cs b/AssetStudio/Classes/Object.cs index d857963..168b6d7 100644 --- a/AssetStudio/Classes/Object.cs +++ b/AssetStudio/Classes/Object.cs @@ -24,6 +24,8 @@ public class Object [JsonIgnore] public uint byteSize; + public virtual string Name => string.Empty; + public Object(ObjectReader reader) { this.reader = reader; diff --git a/AssetStudio/Classes/PPtr.cs b/AssetStudio/Classes/PPtr.cs index d69b081..0cf4d51 100644 --- a/AssetStudio/Classes/PPtr.cs +++ b/AssetStudio/Classes/PPtr.cs @@ -11,6 +11,8 @@ public sealed class PPtr : IYAMLExportable where T : Object private SerializedFile assetsFile; private int index = -2; //-2 - Prepare, -1 - Missing + + public string Name => TryGet(out var obj) ? obj.Name : string.Empty; public PPtr(int m_FileID, long m_PathID, SerializedFile assetsFile) { diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 75a2569..4dc45eb 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -1002,6 +1002,8 @@ public class Shader : NamedObject public uint[][] decompressedLengths; public byte[] compressedBlob; + public override string Name => m_ParsedForm?.m_Name ?? m_Name; + public Shader(ObjectReader reader) : base(reader) { if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up diff --git a/AssetStudioCLI/Components/AssetItem.cs b/AssetStudioCLI/Components/AssetItem.cs index 2e899ef..60e9ce9 100644 --- a/AssetStudioCLI/Components/AssetItem.cs +++ b/AssetStudioCLI/Components/AssetItem.cs @@ -17,8 +17,8 @@ public class AssetItem public AssetItem(Object asset) { - Text = ""; Asset = asset; + Text = asset.Name; SourceFile = asset.assetsFile; Type = asset.type; TypeString = Type.ToString(); diff --git a/AssetStudioCLI/Exporter.cs b/AssetStudioCLI/Exporter.cs index e92e95b..32694a5 100644 --- a/AssetStudioCLI/Exporter.cs +++ b/AssetStudioCLI/Exporter.cs @@ -430,6 +430,8 @@ public static bool ExportConvertFile(AssetItem item, string exportPath) return ExportAnimationClip(item, exportPath); case ClassIDType.MiHoYoBinData: return ExportMiHoYoBinData(item, exportPath); + case ClassIDType.Material: + return ExportJSONFile(item, exportPath); default: return ExportRawFile(item, exportPath); } diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index 9c738ee..241cc22 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -297,56 +297,24 @@ public static void ProcessAssetData(Object asset, ClassIDType[] typeFilters, Reg switch (asset) { case GameObject m_GameObject: - assetItem.Text = m_GameObject.m_Name; exportable = ModelOnly && m_GameObject.HasModel(); break; case Texture2D m_Texture2D: if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path)) assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size; - assetItem.Text = m_Texture2D.m_Name; exportable = !ModelOnly; break; case AudioClip m_AudioClip: if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size; - assetItem.Text = m_AudioClip.m_Name; exportable = !ModelOnly; break; case VideoClip m_VideoClip: if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size; - assetItem.Text = m_VideoClip.m_Name; - exportable = !ModelOnly; - break; - case Shader m_Shader when Shader.Parsable: - assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name; - exportable = !ModelOnly; - break; - case Mesh _: - case TextAsset _: - case AnimationClip _ when AnimationClip.Parsable: - case Font _: - case Sprite _: - case Material _: - assetItem.Text = ((NamedObject)asset).m_Name; - exportable = !ModelOnly; - break; - case Animator m_Animator: - if (m_Animator.m_GameObject.TryGet(out var gameObject)) - { - assetItem.Text = gameObject.m_Name; - } exportable = !ModelOnly; break; case MonoBehaviour m_MonoBehaviour: - if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGet(out var m_Script)) - { - assetItem.Text = m_Script.m_ClassName; - } - else - { - assetItem.Text = m_MonoBehaviour.m_Name; - } exportable = !ModelOnly && assemblyLoader.Loaded; break; case AssetBundle m_AssetBundle: @@ -360,17 +328,12 @@ public static void ProcessAssetData(Object asset, ClassIDType[] typeFilters, Reg containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key)); } } - assetItem.Text = m_AssetBundle.m_Name; break; case IndexObject m_IndexObject: foreach (var index in m_IndexObject.AssetMap) { mihoyoBinDataNames.Add((index.Value.Object, index.Key)); } - assetItem.Text = "IndexObject"; - break; - case MiHoYoBinData m_MiHoYoBinData: - exportable = !ModelOnly; break; case ResourceManager m_ResourceManager: foreach (var m_Container in m_ResourceManager.m_Container) @@ -378,8 +341,17 @@ public static void ProcessAssetData(Object asset, ClassIDType[] typeFilters, Reg containers.Add((m_Container.Value, m_Container.Key)); } break; - case NamedObject m_NamedObject: - assetItem.Text = m_NamedObject.m_Name; + case Mesh _: + case TextAsset _: + case AnimationClip _ when AnimationClip.Parsable: + case Font _: + case MovieTexture _: + case Sprite _: + case Material _: + case MiHoYoBinData _: + case Shader _ when Shader.Parsable: + case Animator _: + exportable = !ModelOnly; break; } if (assetItem.Text == "") diff --git a/AssetStudioGUI/Components/AssetItem.cs b/AssetStudioGUI/Components/AssetItem.cs index ca1a7be..af483ad 100644 --- a/AssetStudioGUI/Components/AssetItem.cs +++ b/AssetStudioGUI/Components/AssetItem.cs @@ -19,6 +19,7 @@ public class AssetItem : ListViewItem public AssetItem(Object asset) { Asset = asset; + Text = asset.Name; SourceFile = asset.assetsFile; Type = asset.type; TypeString = Type.ToString(); diff --git a/AssetStudioGUI/Exporter.cs b/AssetStudioGUI/Exporter.cs index 462efb5..6aa9095 100644 --- a/AssetStudioGUI/Exporter.cs +++ b/AssetStudioGUI/Exporter.cs @@ -441,6 +441,8 @@ public static bool ExportConvertFile(AssetItem item, string exportPath) return ExportAnimationClip(item, exportPath); case ClassIDType.MiHoYoBinData: return ExportMiHoYoBinData(item, exportPath); + case ClassIDType.Material: + return ExportJSONFile(item, exportPath); default: return ExportRawFile(item, exportPath); } diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index fc6426e..377867c 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -265,56 +265,19 @@ public static (string, List) BuildAssetData() var exportable = false; switch (asset) { - case GameObject m_GameObject: - assetItem.Text = m_GameObject.m_Name; - break; case Texture2D m_Texture2D: if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path)) assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size; - assetItem.Text = m_Texture2D.m_Name; exportable = true; break; case AudioClip m_AudioClip: if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size; - assetItem.Text = m_AudioClip.m_Name; exportable = true; break; case VideoClip m_VideoClip: if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size; - assetItem.Text = m_VideoClip.m_Name; - exportable = true; - break; - case Shader m_Shader: - assetItem.Text = m_Shader.m_ParsedForm?.m_Name ?? m_Shader.m_Name; - exportable = true; - break; - case Mesh _: - case TextAsset _: - case AnimationClip _: - case Font _: - case MovieTexture _: - case Sprite _: - assetItem.Text = ((NamedObject)asset).m_Name; - exportable = true; - break; - case Animator m_Animator: - if (m_Animator.m_GameObject.TryGet(out var gameObject)) - { - assetItem.Text = gameObject.m_Name; - } - exportable = true; - break; - case MonoBehaviour m_MonoBehaviour: - if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGet(out var m_Script)) - { - assetItem.Text = m_Script.m_ClassName; - } - else - { - assetItem.Text = m_MonoBehaviour.m_Name; - } exportable = true; break; case PlayerSettings m_PlayerSettings: @@ -334,26 +297,31 @@ public static (string, List) BuildAssetData() } } } - assetItem.Text = m_AssetBundle.m_Name; break; case IndexObject m_IndexObject: foreach(var index in m_IndexObject.AssetMap) { mihoyoBinDataNames.Add((index.Value.Object, index.Key)); } - assetItem.Text = "IndexObject"; - break; - case MiHoYoBinData m_MiHoYoBinData: - exportable = true; break; case ResourceManager m_ResourceManager: - foreach (var m_Container in m_ResourceManager.m_Container) - { - containers.Add((m_Container.Value, m_Container.Key)); - } + foreach (var m_Container in m_ResourceManager.m_Container) + { + containers.Add((m_Container.Value, m_Container.Key)); + } break; - case NamedObject m_NamedObject: - assetItem.Text = m_NamedObject.m_Name; + case Mesh _: + case TextAsset _: + case AnimationClip _ when AnimationClip.Parsable: + case Font _: + case MovieTexture _: + case Sprite _: + case Material _: + case MiHoYoBinData _: + case Shader _ when Shader.Parsable: + case Animator _: + case MonoBehaviour _: + exportable = true; break; } if (assetItem.Text == "")