mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-25 05:40:21 -04:00
improve
This commit is contained in:
parent
8ea998b81f
commit
8c749e21e1
@ -527,14 +527,13 @@ namespace AssetStudio
|
|||||||
public List<StreamedFrame> ReadData()
|
public List<StreamedFrame> ReadData()
|
||||||
{
|
{
|
||||||
var frameList = new List<StreamedFrame>();
|
var frameList = new List<StreamedFrame>();
|
||||||
using (Stream stream = new MemoryStream())
|
var buffer = new byte[data.Length * 4];
|
||||||
|
Buffer.BlockCopy(data, 0, buffer, 0, buffer.Length);
|
||||||
|
using (var reader = new BinaryReader(new MemoryStream(buffer)))
|
||||||
{
|
{
|
||||||
BinaryWriter writer = new BinaryWriter(stream);
|
while (reader.BaseStream.Position < reader.BaseStream.Length)
|
||||||
writer.Write(data);
|
|
||||||
stream.Position = 0;
|
|
||||||
while (stream.Position < stream.Length)
|
|
||||||
{
|
{
|
||||||
frameList.Add(new StreamedFrame(new BinaryReader(stream)));
|
frameList.Add(new StreamedFrame(reader));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,22 +5,32 @@ using System.Text;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class AnimationClipOverride
|
||||||
|
{
|
||||||
|
public PPtr m_OriginalClip;
|
||||||
|
public PPtr m_OverrideClip;
|
||||||
|
|
||||||
|
public AnimationClipOverride(ObjectReader reader)
|
||||||
|
{
|
||||||
|
m_OriginalClip = reader.ReadPPtr();
|
||||||
|
m_OverrideClip = reader.ReadPPtr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class AnimatorOverrideController : NamedObject
|
public class AnimatorOverrideController : NamedObject
|
||||||
{
|
{
|
||||||
public PPtr m_Controller;
|
public PPtr m_Controller;
|
||||||
public PPtr[][] m_Clips;
|
public List<AnimationClipOverride> m_Clips;
|
||||||
|
|
||||||
public AnimatorOverrideController(ObjectReader reader) : base(reader)
|
public AnimatorOverrideController(ObjectReader reader) : base(reader)
|
||||||
{
|
{
|
||||||
m_Controller = reader.ReadPPtr();
|
m_Controller = reader.ReadPPtr();
|
||||||
|
|
||||||
int numOverrides = reader.ReadInt32();
|
int numOverrides = reader.ReadInt32();
|
||||||
m_Clips = new PPtr[numOverrides][];
|
m_Clips = new List<AnimationClipOverride>(numOverrides);
|
||||||
for (int i = 0; i < numOverrides; i++)
|
for (int i = 0; i < numOverrides; i++)
|
||||||
{
|
{
|
||||||
m_Clips[i] = new PPtr[2];
|
m_Clips.Add(new AnimationClipOverride(reader));
|
||||||
m_Clips[i][0] = reader.ReadPPtr();
|
|
||||||
m_Clips[i][1] = reader.ReadPPtr();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,41 +5,39 @@ using System.Text;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class AssetInfo
|
||||||
|
{
|
||||||
|
public int preloadIndex;
|
||||||
|
public int preloadSize;
|
||||||
|
public PPtr asset;
|
||||||
|
|
||||||
|
public AssetInfo(ObjectReader reader)
|
||||||
|
{
|
||||||
|
preloadIndex = reader.ReadInt32();
|
||||||
|
preloadSize = reader.ReadInt32();
|
||||||
|
asset = reader.ReadPPtr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public sealed class AssetBundle : NamedObject
|
public sealed class AssetBundle : NamedObject
|
||||||
{
|
{
|
||||||
public class AssetInfo
|
public List<PPtr> m_PreloadTable;
|
||||||
{
|
public List<KeyValuePair<string, AssetInfo>> m_Container;
|
||||||
public int preloadIndex;
|
|
||||||
public int preloadSize;
|
|
||||||
public PPtr asset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ContainerData
|
|
||||||
{
|
|
||||||
public string first;
|
|
||||||
public AssetInfo second;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ContainerData> m_Container = new List<ContainerData>();
|
|
||||||
|
|
||||||
public AssetBundle(ObjectReader reader) : base(reader)
|
public AssetBundle(ObjectReader reader) : base(reader)
|
||||||
{
|
{
|
||||||
var size = reader.ReadInt32();
|
var m_PreloadTableSize = reader.ReadInt32();
|
||||||
for (int i = 0; i < size; i++)
|
m_PreloadTable = new List<PPtr>(m_PreloadTableSize);
|
||||||
|
for (int i = 0; i < m_PreloadTableSize; i++)
|
||||||
{
|
{
|
||||||
reader.ReadPPtr();
|
m_PreloadTable.Add(reader.ReadPPtr());
|
||||||
}
|
}
|
||||||
size = reader.ReadInt32();
|
|
||||||
for (int i = 0; i < size; i++)
|
var m_ContainerSize = reader.ReadInt32();
|
||||||
|
m_Container = new List<KeyValuePair<string, AssetInfo>>(m_ContainerSize);
|
||||||
|
for (int i = 0; i < m_ContainerSize; i++)
|
||||||
{
|
{
|
||||||
var temp = new ContainerData();
|
m_Container.Add(new KeyValuePair<string, AssetInfo>(reader.ReadAlignedString(), new AssetInfo(reader)));
|
||||||
temp.first = reader.ReadAlignedString();
|
|
||||||
temp.second = new AssetInfo();
|
|
||||||
temp.second.preloadIndex = reader.ReadInt32();
|
|
||||||
temp.second.preloadSize = reader.ReadInt32();
|
|
||||||
temp.second.asset = reader.ReadPPtr();
|
|
||||||
m_Container.Add(temp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ namespace AssetStudio
|
|||||||
{1057, "int2_storage"},
|
{1057, "int2_storage"},
|
||||||
{1070, "int3_storage"},
|
{1070, "int3_storage"},
|
||||||
{1083, "BoundsInt"},
|
{1083, "BoundsInt"},
|
||||||
{1092, "m_CorrespondingSourceObject"}
|
{1093, "m_CorrespondingSourceObject"}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,11 +14,6 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Write(this BinaryWriter writer, uint[] array)
|
|
||||||
{
|
|
||||||
WriteArray(writer.Write, array);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AlignStream(this BinaryWriter writer, int alignment)
|
public static void AlignStream(this BinaryWriter writer, int alignment)
|
||||||
{
|
{
|
||||||
var pos = writer.BaseStream.Position;
|
var pos = writer.BaseStream.Position;
|
||||||
|
@ -66,7 +66,7 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
//tree search
|
//tree search
|
||||||
private int nextGObject;
|
private int nextGObject;
|
||||||
private List<GameObjectTreeNode> treeSrcResults = new List<GameObjectTreeNode>();
|
private List<TreeNode> treeSrcResults = new List<TreeNode>();
|
||||||
|
|
||||||
[DllImport("gdi32.dll")]
|
[DllImport("gdi32.dll")]
|
||||||
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
|
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
|
||||||
@ -481,12 +481,9 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
if (treeSrcResults.Count == 0)
|
if (treeSrcResults.Count == 0)
|
||||||
{
|
{
|
||||||
foreach (var node in treeNodeDictionary.Values)
|
foreach (TreeNode node in sceneTreeView.Nodes)
|
||||||
{
|
{
|
||||||
if (node.Text.IndexOf(treeSearch.Text, StringComparison.CurrentCultureIgnoreCase) >= 0)
|
TreeNodeSearch(node);
|
||||||
{
|
|
||||||
treeSrcResults.Add(node);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (treeSrcResults.Count > 0)
|
if (treeSrcResults.Count > 0)
|
||||||
@ -502,6 +499,19 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void TreeNodeSearch(TreeNode treeNode)
|
||||||
|
{
|
||||||
|
if (treeNode.Text.IndexOf(treeSearch.Text, StringComparison.CurrentCultureIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
treeSrcResults.Add(treeNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (TreeNode node in treeNode.Nodes)
|
||||||
|
{
|
||||||
|
TreeNodeSearch(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sceneTreeView_AfterCheck(object sender, TreeViewEventArgs e)
|
private void sceneTreeView_AfterCheck(object sender, TreeViewEventArgs e)
|
||||||
{
|
{
|
||||||
foreach (TreeNode childNode in e.Node.Nodes)
|
foreach (TreeNode childNode in e.Node.Nodes)
|
||||||
@ -1701,8 +1711,6 @@ namespace AssetStudioGUI
|
|||||||
pair.Value.Dispose();
|
pair.Value.Dispose();
|
||||||
}
|
}
|
||||||
LoadedModuleDic.Clear();
|
LoadedModuleDic.Clear();
|
||||||
|
|
||||||
treeNodeDictionary.Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assetListView_MouseClick(object sender, MouseEventArgs e)
|
private void assetListView_MouseClick(object sender, MouseEventArgs e)
|
||||||
@ -1820,9 +1828,9 @@ namespace AssetStudioGUI
|
|||||||
private void jumpToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e)
|
private void jumpToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]];
|
var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]];
|
||||||
if (selectasset.gameObject != null)
|
if (selectasset.TreeNode != null)
|
||||||
{
|
{
|
||||||
sceneTreeView.SelectedNode = treeNodeDictionary[selectasset.gameObject];
|
sceneTreeView.SelectedNode = selectasset.TreeNode;
|
||||||
tabControl1.SelectedTab = tabPage1;
|
tabControl1.SelectedTab = tabPage1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ namespace AssetStudioGUI
|
|||||||
public string TypeString;
|
public string TypeString;
|
||||||
public string InfoText;
|
public string InfoText;
|
||||||
public string UniqueID;
|
public string UniqueID;
|
||||||
public GameObject gameObject;
|
public GameObjectTreeNode TreeNode;
|
||||||
|
|
||||||
public AssetItem(ObjectReader reader)
|
public AssetItem(ObjectReader reader)
|
||||||
{
|
{
|
||||||
|
@ -15,11 +15,9 @@ namespace AssetStudioGUI
|
|||||||
internal static class Studio
|
internal static class Studio
|
||||||
{
|
{
|
||||||
public static AssetsManager assetsManager = new AssetsManager();
|
public static AssetsManager assetsManager = new AssetsManager();
|
||||||
private static HashSet<string> assetsNameHash = new HashSet<string>();
|
|
||||||
public static List<AssetItem> exportableAssets = new List<AssetItem>();
|
public static List<AssetItem> exportableAssets = new List<AssetItem>();
|
||||||
public static List<AssetItem> visibleAssets = new List<AssetItem>();
|
public static List<AssetItem> visibleAssets = new List<AssetItem>();
|
||||||
public static Dictionary<string, SortedDictionary<int, TypeTreeItem>> AllTypeMap = new Dictionary<string, SortedDictionary<int, TypeTreeItem>>();
|
public static Dictionary<string, SortedDictionary<int, TypeTreeItem>> AllTypeMap = new Dictionary<string, SortedDictionary<int, TypeTreeItem>>(); //TODO Delete it
|
||||||
public static Dictionary<GameObject, GameObjectTreeNode> treeNodeDictionary = new Dictionary<GameObject, GameObjectTreeNode>();
|
|
||||||
public static bool ModuleLoaded;
|
public static bool ModuleLoaded;
|
||||||
public static Dictionary<string, ModuleDef> LoadedModuleDic = new Dictionary<string, ModuleDef>();
|
public static Dictionary<string, ModuleDef> LoadedModuleDic = new Dictionary<string, ModuleDef>();
|
||||||
|
|
||||||
@ -96,9 +94,10 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
public static void BuildAssetList(Dictionary<ObjectReader, AssetItem> tempDic, bool displayAll, bool displayOriginalName, out string productName)
|
public static void BuildAssetList(Dictionary<ObjectReader, AssetItem> tempDic, bool displayAll, bool displayOriginalName, out string productName)
|
||||||
{
|
{
|
||||||
productName = string.Empty;
|
|
||||||
Logger.Info("Building asset list...");
|
Logger.Info("Building asset list...");
|
||||||
|
|
||||||
|
productName = string.Empty;
|
||||||
|
var assetsNameHash = new HashSet<string>();
|
||||||
var progressCount = assetsManager.assetsFileList.Sum(x => x.ObjectReaders.Count);
|
var progressCount = assetsManager.assetsFileList.Sum(x => x.ObjectReaders.Count);
|
||||||
int j = 0;
|
int j = 0;
|
||||||
Progress.Reset();
|
Progress.Reset();
|
||||||
@ -248,17 +247,18 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
if (displayOriginalName && ab != null)
|
if (displayOriginalName && ab != null)
|
||||||
{
|
{
|
||||||
foreach (var x in tempExportableAssets)
|
foreach (var asset in tempExportableAssets)
|
||||||
{
|
{
|
||||||
var replacename = ab.m_Container.Find(y => y.second.asset.m_PathID == x.reader.m_PathID)?.first;
|
var originalPath = ab.m_Container.Find(y => y.Value.asset.m_PathID == asset.reader.m_PathID).Key;
|
||||||
if (!string.IsNullOrEmpty(replacename))
|
if (!string.IsNullOrEmpty(originalPath))
|
||||||
{
|
{
|
||||||
var ex = Path.GetExtension(replacename);
|
var extension = Path.GetExtension(originalPath);
|
||||||
x.Text = !string.IsNullOrEmpty(ex) ? replacename.Replace(ex, "") : replacename;
|
if (!string.IsNullOrEmpty(extension) && asset.Type == ClassIDType.TextAsset)
|
||||||
if (!assetsNameHash.Add((x.TypeString + x.Text).ToUpper()))
|
|
||||||
{
|
{
|
||||||
x.Text = Path.GetDirectoryName(replacename) + "\\" + Path.GetFileNameWithoutExtension(replacename) + x.UniqueID;
|
//asset.Extension = extension; //TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asset.Text = Path.GetDirectoryName(originalPath) + "\\" + asset.Text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -277,6 +277,7 @@ namespace AssetStudioGUI
|
|||||||
if (gameObjectCount > 0)
|
if (gameObjectCount > 0)
|
||||||
{
|
{
|
||||||
Logger.Info("Building tree structure...");
|
Logger.Info("Building tree structure...");
|
||||||
|
var treeNodeDictionary = new Dictionary<GameObject, GameObjectTreeNode>();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
Progress.Reset();
|
Progress.Reset();
|
||||||
foreach (var assetsFile in assetsManager.assetsFileList)
|
foreach (var assetsFile in assetsManager.assetsFileList)
|
||||||
@ -285,6 +286,12 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
foreach (var m_GameObject in assetsFile.GameObjects.Values)
|
foreach (var m_GameObject in assetsFile.GameObjects.Values)
|
||||||
{
|
{
|
||||||
|
if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
|
||||||
|
{
|
||||||
|
currentNode = new GameObjectTreeNode(m_GameObject);
|
||||||
|
treeNodeDictionary.Add(m_GameObject, currentNode);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var m_Component in m_GameObject.m_Components)
|
foreach (var m_Component in m_GameObject.m_Components)
|
||||||
{
|
{
|
||||||
if (m_Component.TryGet(out var asset))
|
if (m_Component.TryGet(out var asset))
|
||||||
@ -310,7 +317,7 @@ namespace AssetStudioGUI
|
|||||||
if (m_MeshFilter.m_Mesh.TryGet(out objectReader))
|
if (m_MeshFilter.m_Mesh.TryGet(out objectReader))
|
||||||
{
|
{
|
||||||
var item = tempDic[objectReader];
|
var item = tempDic[objectReader];
|
||||||
item.gameObject = m_GameObject;
|
item.TreeNode = currentNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -324,7 +331,7 @@ namespace AssetStudioGUI
|
|||||||
if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out objectReader))
|
if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out objectReader))
|
||||||
{
|
{
|
||||||
var item = tempDic[objectReader];
|
var item = tempDic[objectReader];
|
||||||
item.gameObject = m_GameObject;
|
item.TreeNode = currentNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -357,11 +364,6 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!treeNodeDictionary.TryGetValue(m_GameObject, out var currentNode))
|
|
||||||
{
|
|
||||||
currentNode = new GameObjectTreeNode(m_GameObject);
|
|
||||||
treeNodeDictionary.Add(m_GameObject, currentNode);
|
|
||||||
}
|
|
||||||
parentNode.Nodes.Add(currentNode);
|
parentNode.Nodes.Add(currentNode);
|
||||||
|
|
||||||
Progress.Report(++i, gameObjectCount);
|
Progress.Report(++i, gameObjectCount);
|
||||||
@ -372,6 +374,8 @@ namespace AssetStudioGUI
|
|||||||
treeNodeCollection.Add(fileNode);
|
treeNodeCollection.Add(fileNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
treeNodeDictionary.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
return treeNodeCollection;
|
return treeNodeCollection;
|
||||||
|
Loading…
Reference in New Issue
Block a user