- [Core] Exportable Material.

- [Core] Added name to `PPtr` and `Object` when available.
This commit is contained in:
Razmoth
2023-09-26 11:53:47 +04:00
parent f1ea41a2c7
commit a0abbe8037
15 changed files with 49 additions and 88 deletions

View File

@@ -11,6 +11,8 @@ namespace AssetStudio
public PPtr<RuntimeAnimatorController> m_Controller; public PPtr<RuntimeAnimatorController> m_Controller;
public bool m_HasTransformHierarchy = true; public bool m_HasTransformHierarchy = true;
public override string Name => m_GameObject.Name;
public Animator(ObjectReader reader) : base(reader) public Animator(ObjectReader reader) : base(reader)
{ {
m_Avatar = new PPtr<Avatar>(reader); m_Avatar = new PPtr<Avatar>(reader);

View File

@@ -19,6 +19,7 @@ namespace AssetStudio
public Animator m_Animator; public Animator m_Animator;
public Animation m_Animation; public Animation m_Animation;
public override string Name => m_Name;
public GameObject(ObjectReader reader) : base(reader) public GameObject(ObjectReader reader) : base(reader)
{ {
int m_Component_size = reader.ReadInt32(); int m_Component_size = reader.ReadInt32();

View File

@@ -19,6 +19,8 @@ namespace AssetStudio
public int Count; public int Count;
public KeyValuePair<string, Index>[] AssetMap; public KeyValuePair<string, Index>[] AssetMap;
public override string Name => "IndexObject";
public IndexObject(ObjectReader reader) : base(reader) public IndexObject(ObjectReader reader) : base(reader)
{ {
Count = reader.ReadInt32(); Count = reader.ReadInt32();

View File

@@ -10,6 +10,7 @@ namespace AssetStudio
public PPtr<MonoScript> m_Script; public PPtr<MonoScript> m_Script;
public string m_Name; public string m_Name;
public override string Name => string.IsNullOrEmpty(m_Name) ? m_Script.Name : m_Name;
public MonoBehaviour(ObjectReader reader) : base(reader) public MonoBehaviour(ObjectReader reader) : base(reader)
{ {
m_Script = new PPtr<MonoScript>(reader); m_Script = new PPtr<MonoScript>(reader);

View File

@@ -11,6 +11,8 @@ namespace AssetStudio
public string m_Namespace; public string m_Namespace;
public string m_AssemblyName; public string m_AssemblyName;
public override string Name => string.IsNullOrEmpty(m_Name) ? m_ClassName : m_Name;
public MonoScript(ObjectReader reader) : base(reader) public MonoScript(ObjectReader reader) : base(reader)
{ {
if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up

View File

@@ -9,6 +9,8 @@ namespace AssetStudio
{ {
public string m_Name; public string m_Name;
public override string Name => m_Name;
protected NamedObject(ObjectReader reader) : base(reader) protected NamedObject(ObjectReader reader) : base(reader)
{ {
m_Name = reader.ReadAlignedString(); m_Name = reader.ReadAlignedString();

View File

@@ -24,6 +24,8 @@ namespace AssetStudio
[JsonIgnore] [JsonIgnore]
public uint byteSize; public uint byteSize;
public virtual string Name => string.Empty;
public Object(ObjectReader reader) public Object(ObjectReader reader)
{ {
this.reader = reader; this.reader = reader;

View File

@@ -12,6 +12,8 @@ namespace AssetStudio
private SerializedFile assetsFile; private SerializedFile assetsFile;
private int index = -2; //-2 - Prepare, -1 - Missing 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) public PPtr(int m_FileID, long m_PathID, SerializedFile assetsFile)
{ {
this.m_FileID = m_FileID; this.m_FileID = m_FileID;

View File

@@ -1002,6 +1002,8 @@ namespace AssetStudio
public uint[][] decompressedLengths; public uint[][] decompressedLengths;
public byte[] compressedBlob; public byte[] compressedBlob;
public override string Name => m_ParsedForm?.m_Name ?? m_Name;
public Shader(ObjectReader reader) : base(reader) public Shader(ObjectReader reader) : base(reader)
{ {
if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up

View File

@@ -17,8 +17,8 @@ namespace AssetStudioCLI
public AssetItem(Object asset) public AssetItem(Object asset)
{ {
Text = "";
Asset = asset; Asset = asset;
Text = asset.Name;
SourceFile = asset.assetsFile; SourceFile = asset.assetsFile;
Type = asset.type; Type = asset.type;
TypeString = Type.ToString(); TypeString = Type.ToString();

View File

@@ -430,6 +430,8 @@ namespace AssetStudioCLI
return ExportAnimationClip(item, exportPath); return ExportAnimationClip(item, exportPath);
case ClassIDType.MiHoYoBinData: case ClassIDType.MiHoYoBinData:
return ExportMiHoYoBinData(item, exportPath); return ExportMiHoYoBinData(item, exportPath);
case ClassIDType.Material:
return ExportJSONFile(item, exportPath);
default: default:
return ExportRawFile(item, exportPath); return ExportRawFile(item, exportPath);
} }

View File

@@ -297,56 +297,24 @@ namespace AssetStudioCLI
switch (asset) switch (asset)
{ {
case GameObject m_GameObject: case GameObject m_GameObject:
assetItem.Text = m_GameObject.m_Name;
exportable = ModelOnly && m_GameObject.HasModel(); exportable = ModelOnly && m_GameObject.HasModel();
break; break;
case Texture2D m_Texture2D: case Texture2D m_Texture2D:
if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path)) if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path))
assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size; assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size;
assetItem.Text = m_Texture2D.m_Name;
exportable = !ModelOnly; exportable = !ModelOnly;
break; break;
case AudioClip m_AudioClip: case AudioClip m_AudioClip:
if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) if (!string.IsNullOrEmpty(m_AudioClip.m_Source))
assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size; assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size;
assetItem.Text = m_AudioClip.m_Name;
exportable = !ModelOnly; exportable = !ModelOnly;
break; break;
case VideoClip m_VideoClip: case VideoClip m_VideoClip:
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size; 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; exportable = !ModelOnly;
break; break;
case MonoBehaviour m_MonoBehaviour: 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; exportable = !ModelOnly && assemblyLoader.Loaded;
break; break;
case AssetBundle m_AssetBundle: case AssetBundle m_AssetBundle:
@@ -360,17 +328,12 @@ namespace AssetStudioCLI
containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key)); containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key));
} }
} }
assetItem.Text = m_AssetBundle.m_Name;
break; break;
case IndexObject m_IndexObject: case IndexObject m_IndexObject:
foreach (var index in m_IndexObject.AssetMap) foreach (var index in m_IndexObject.AssetMap)
{ {
mihoyoBinDataNames.Add((index.Value.Object, index.Key)); mihoyoBinDataNames.Add((index.Value.Object, index.Key));
} }
assetItem.Text = "IndexObject";
break;
case MiHoYoBinData m_MiHoYoBinData:
exportable = !ModelOnly;
break; break;
case ResourceManager m_ResourceManager: case ResourceManager m_ResourceManager:
foreach (var m_Container in m_ResourceManager.m_Container) foreach (var m_Container in m_ResourceManager.m_Container)
@@ -378,8 +341,17 @@ namespace AssetStudioCLI
containers.Add((m_Container.Value, m_Container.Key)); containers.Add((m_Container.Value, m_Container.Key));
} }
break; break;
case NamedObject m_NamedObject: case Mesh _:
assetItem.Text = m_NamedObject.m_Name; 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; break;
} }
if (assetItem.Text == "") if (assetItem.Text == "")

View File

@@ -19,6 +19,7 @@ namespace AssetStudioGUI
public AssetItem(Object asset) public AssetItem(Object asset)
{ {
Asset = asset; Asset = asset;
Text = asset.Name;
SourceFile = asset.assetsFile; SourceFile = asset.assetsFile;
Type = asset.type; Type = asset.type;
TypeString = Type.ToString(); TypeString = Type.ToString();

View File

@@ -441,6 +441,8 @@ namespace AssetStudioGUI
return ExportAnimationClip(item, exportPath); return ExportAnimationClip(item, exportPath);
case ClassIDType.MiHoYoBinData: case ClassIDType.MiHoYoBinData:
return ExportMiHoYoBinData(item, exportPath); return ExportMiHoYoBinData(item, exportPath);
case ClassIDType.Material:
return ExportJSONFile(item, exportPath);
default: default:
return ExportRawFile(item, exportPath); return ExportRawFile(item, exportPath);
} }

View File

@@ -265,56 +265,19 @@ namespace AssetStudioGUI
var exportable = false; var exportable = false;
switch (asset) switch (asset)
{ {
case GameObject m_GameObject:
assetItem.Text = m_GameObject.m_Name;
break;
case Texture2D m_Texture2D: case Texture2D m_Texture2D:
if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path)) if (!string.IsNullOrEmpty(m_Texture2D.m_StreamData?.path))
assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size; assetItem.FullSize = asset.byteSize + m_Texture2D.m_StreamData.size;
assetItem.Text = m_Texture2D.m_Name;
exportable = true; exportable = true;
break; break;
case AudioClip m_AudioClip: case AudioClip m_AudioClip:
if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) if (!string.IsNullOrEmpty(m_AudioClip.m_Source))
assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size; assetItem.FullSize = asset.byteSize + m_AudioClip.m_Size;
assetItem.Text = m_AudioClip.m_Name;
exportable = true; exportable = true;
break; break;
case VideoClip m_VideoClip: case VideoClip m_VideoClip:
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size; 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; exportable = true;
break; break;
case PlayerSettings m_PlayerSettings: case PlayerSettings m_PlayerSettings:
@@ -334,26 +297,31 @@ namespace AssetStudioGUI
} }
} }
} }
assetItem.Text = m_AssetBundle.m_Name;
break; break;
case IndexObject m_IndexObject: case IndexObject m_IndexObject:
foreach(var index in m_IndexObject.AssetMap) foreach(var index in m_IndexObject.AssetMap)
{ {
mihoyoBinDataNames.Add((index.Value.Object, index.Key)); mihoyoBinDataNames.Add((index.Value.Object, index.Key));
} }
assetItem.Text = "IndexObject";
break;
case MiHoYoBinData m_MiHoYoBinData:
exportable = true;
break; break;
case ResourceManager m_ResourceManager: case ResourceManager m_ResourceManager:
foreach (var m_Container in m_ResourceManager.m_Container) foreach (var m_Container in m_ResourceManager.m_Container)
{ {
containers.Add((m_Container.Value, m_Container.Key)); containers.Add((m_Container.Value, m_Container.Key));
} }
break; break;
case NamedObject m_NamedObject: case Mesh _:
assetItem.Text = m_NamedObject.m_Name; 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; break;
} }
if (assetItem.Text == "") if (assetItem.Text == "")