[GUI] Add tree view for dump

This commit is contained in:
VaDiM 2025-01-12 23:10:16 +03:00
parent b7d21e5bd8
commit 58917ab7dc
9 changed files with 417 additions and 92 deletions

View File

@ -25,7 +25,7 @@ namespace AssetStudio
public uint byteSize; public uint byteSize;
[JsonIgnore] [JsonIgnore]
public string Name; public string Name;
private static JsonSerializerOptions jsonOptions; private static readonly JsonSerializerOptions jsonOptions;
static Object() static Object()
{ {
@ -95,6 +95,24 @@ namespace AssetStudio
return TypeTreeHelper.ReadType(m_Type, reader); return TypeTreeHelper.ReadType(m_Type, reader);
} }
public JsonDocument ToJsonDoc(TypeTree m_Type = null)
{
var typeDict = ToType(m_Type);
try
{
if (typeDict != null)
{
return JsonSerializer.SerializeToDocument(typeDict);
}
return JsonSerializer.SerializeToDocument(this, GetType(), jsonOptions);
}
catch
{
//ignore
}
return null;
}
public byte[] GetRawData() public byte[] GetRawData()
{ {
reader.Reset(); reader.Reset();

View File

@ -198,13 +198,21 @@ namespace AssetStudio
reader.Reset(); reader.Reset();
var obj = new OrderedDictionary(); var obj = new OrderedDictionary();
var m_Nodes = m_Types.m_Nodes; var m_Nodes = m_Types.m_Nodes;
for (int i = 1; i < m_Nodes.Count; i++) var readed = 0L;
try
{ {
var m_Node = m_Nodes[i]; for (int i = 1; i < m_Nodes.Count; i++)
var varNameStr = m_Node.m_Name; {
obj[varNameStr] = ReadValue(m_Nodes, reader, ref i); var m_Node = m_Nodes[i];
var varNameStr = m_Node.m_Name;
obj[varNameStr] = ReadValue(m_Nodes, reader, ref i);
}
readed = reader.Position - reader.byteStart;
}
catch (Exception)
{
//Ignore
} }
var readed = reader.Position - reader.byteStart;
if (readed != reader.byteSize) if (readed != reader.byteSize)
{ {
Logger.Info($"Failed to read type, read {readed} bytes but expected {reader.byteSize} bytes"); Logger.Info($"Failed to read type, read {readed} bytes but expected {reader.byteSize} bytes");

View File

@ -43,6 +43,7 @@
this.assetLoadingToolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); this.assetLoadingToolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
this.enablePreview = new System.Windows.Forms.ToolStripMenuItem(); this.enablePreview = new System.Windows.Forms.ToolStripMenuItem();
this.displayInfo = new System.Windows.Forms.ToolStripMenuItem(); this.displayInfo = new System.Windows.Forms.ToolStripMenuItem();
this.useDumpTreeViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.buildTreeStructureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.buildTreeStructureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.customCompressionTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.customCompressionTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.customCompressionZstdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.customCompressionZstdToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@ -138,17 +139,18 @@
this.textPreviewBox = new System.Windows.Forms.TextBox(); this.textPreviewBox = new System.Windows.Forms.TextBox();
this.classTextBox = new System.Windows.Forms.TextBox(); this.classTextBox = new System.Windows.Forms.TextBox();
this.tabPage5 = new System.Windows.Forms.TabPage(); this.tabPage5 = new System.Windows.Forms.TabPage();
this.dumpTreeView = new System.Windows.Forms.TreeView();
this.dumpTextBox = new System.Windows.Forms.TextBox(); this.dumpTextBox = new System.Windows.Forms.TextBox();
this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components); this.sceneContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.showRelatedAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.shShowRelatedAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.shToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.shSelectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.clearSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.shSlearSelectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.shToolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.shExpandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.shCollapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.timer = new System.Windows.Forms.Timer(this.components); this.timer = new System.Windows.Forms.Timer(this.components);
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
@ -162,6 +164,11 @@
this.exportL2DWithClipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exportL2DWithClipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.dumpTreeViewContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.tvCopyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tvToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.tvExpandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.tvCollapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout();
@ -182,8 +189,9 @@
((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).BeginInit();
this.tabPage5.SuspendLayout(); this.tabPage5.SuspendLayout();
this.statusStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout();
this.contextMenuStrip2.SuspendLayout(); this.sceneContextMenuStrip.SuspendLayout();
this.contextMenuStrip1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout();
this.dumpTreeViewContextMenuStrip.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// menuStrip1 // menuStrip1
@ -257,6 +265,7 @@
this.assetLoadingToolStripSeparator, this.assetLoadingToolStripSeparator,
this.enablePreview, this.enablePreview,
this.displayInfo, this.displayInfo,
this.useDumpTreeViewToolStripMenuItem,
this.buildTreeStructureToolStripMenuItem, this.buildTreeStructureToolStripMenuItem,
this.customCompressionTypeToolStripMenuItem, this.customCompressionTypeToolStripMenuItem,
this.toolStripMenuItem14, this.toolStripMenuItem14,
@ -316,6 +325,14 @@
"t, audio bitrate, etc."; "t, audio bitrate, etc.";
this.displayInfo.CheckedChanged += new System.EventHandler(this.displayAssetInfo_Check); this.displayInfo.CheckedChanged += new System.EventHandler(this.displayAssetInfo_Check);
// //
// useDumpTreeViewToolStripMenuItem
//
this.useDumpTreeViewToolStripMenuItem.CheckOnClick = true;
this.useDumpTreeViewToolStripMenuItem.Name = "useDumpTreeViewToolStripMenuItem";
this.useDumpTreeViewToolStripMenuItem.Size = new System.Drawing.Size(241, 22);
this.useDumpTreeViewToolStripMenuItem.Text = "Use tree view to display dump";
this.useDumpTreeViewToolStripMenuItem.CheckedChanged += new System.EventHandler(this.useDumpTreeViewToolStripMenuItem_CheckedChanged);
//
// buildTreeStructureToolStripMenuItem // buildTreeStructureToolStripMenuItem
// //
this.buildTreeStructureToolStripMenuItem.Checked = true; this.buildTreeStructureToolStripMenuItem.Checked = true;
@ -1271,6 +1288,7 @@
// //
// tabPage5 // tabPage5
// //
this.tabPage5.Controls.Add(this.dumpTreeView);
this.tabPage5.Controls.Add(this.dumpTextBox); this.tabPage5.Controls.Add(this.dumpTextBox);
this.tabPage5.Location = new System.Drawing.Point(4, 22); this.tabPage5.Location = new System.Drawing.Point(4, 22);
this.tabPage5.Name = "tabPage5"; this.tabPage5.Name = "tabPage5";
@ -1279,6 +1297,16 @@
this.tabPage5.Text = "Dump"; this.tabPage5.Text = "Dump";
this.tabPage5.UseVisualStyleBackColor = true; this.tabPage5.UseVisualStyleBackColor = true;
// //
// dumpTreeView
//
this.dumpTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
this.dumpTreeView.Location = new System.Drawing.Point(0, 0);
this.dumpTreeView.Name = "dumpTreeView";
this.dumpTreeView.Size = new System.Drawing.Size(768, 607);
this.dumpTreeView.TabIndex = 1;
this.dumpTreeView.Visible = false;
this.dumpTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.DumpTreeView_NodeMouseClick);
//
// dumpTextBox // dumpTextBox
// //
this.dumpTextBox.BackColor = System.Drawing.SystemColors.Window; this.dumpTextBox.BackColor = System.Drawing.SystemColors.Window;
@ -1313,64 +1341,64 @@
this.toolStripStatusLabel1.Text = "Ready to go"; this.toolStripStatusLabel1.Text = "Ready to go";
this.toolStripStatusLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.toolStripStatusLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
// //
// contextMenuStrip2 // sceneContextMenuStrip
// //
this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.sceneContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.showRelatedAssetsToolStripMenuItem, this.shShowRelatedAssetsToolStripMenuItem,
this.toolStripSeparator7, this.shToolStripSeparator1,
this.selectAllToolStripMenuItem, this.shSelectAllToolStripMenuItem,
this.clearSelectionToolStripMenuItem, this.shSlearSelectionToolStripMenuItem,
this.toolStripSeparator5, this.shToolStripSeparator2,
this.expandAllToolStripMenuItem, this.shExpandAllToolStripMenuItem,
this.collapseAllToolStripMenuItem}); this.shCollapseAllToolStripMenuItem});
this.contextMenuStrip2.Name = "contextMenuStrip2"; this.sceneContextMenuStrip.Name = "contextMenuStrip2";
this.contextMenuStrip2.Size = new System.Drawing.Size(152, 126); this.sceneContextMenuStrip.Size = new System.Drawing.Size(152, 126);
this.contextMenuStrip2.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip2_Opening); this.sceneContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip2_Opening);
// //
// showRelatedAssetsToolStripMenuItem // shShowRelatedAssetsToolStripMenuItem
// //
this.showRelatedAssetsToolStripMenuItem.Name = "showRelatedAssetsToolStripMenuItem"; this.shShowRelatedAssetsToolStripMenuItem.Name = "shShowRelatedAssetsToolStripMenuItem";
this.showRelatedAssetsToolStripMenuItem.Size = new System.Drawing.Size(151, 22); this.shShowRelatedAssetsToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.showRelatedAssetsToolStripMenuItem.Text = "Related assets"; this.shShowRelatedAssetsToolStripMenuItem.Text = "Related assets";
this.showRelatedAssetsToolStripMenuItem.Click += new System.EventHandler(this.showRelatedAssetsToolStripMenuItem_Click); this.shShowRelatedAssetsToolStripMenuItem.Click += new System.EventHandler(this.showRelatedAssetsToolStripMenuItem_Click);
// //
// toolStripSeparator7 // shToolStripSeparator1
// //
this.toolStripSeparator7.Name = "toolStripSeparator7"; this.shToolStripSeparator1.Name = "shToolStripSeparator1";
this.toolStripSeparator7.Size = new System.Drawing.Size(148, 6); this.shToolStripSeparator1.Size = new System.Drawing.Size(148, 6);
// //
// selectAllToolStripMenuItem // shSelectAllToolStripMenuItem
// //
this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; this.shSelectAllToolStripMenuItem.Name = "shSelectAllToolStripMenuItem";
this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22); this.shSelectAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.selectAllToolStripMenuItem.Text = "Select all"; this.shSelectAllToolStripMenuItem.Text = "Select all";
this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); this.shSelectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click);
// //
// clearSelectionToolStripMenuItem // shSlearSelectionToolStripMenuItem
// //
this.clearSelectionToolStripMenuItem.Name = "clearSelectionToolStripMenuItem"; this.shSlearSelectionToolStripMenuItem.Name = "shSlearSelectionToolStripMenuItem";
this.clearSelectionToolStripMenuItem.Size = new System.Drawing.Size(151, 22); this.shSlearSelectionToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.clearSelectionToolStripMenuItem.Text = "Clear selection"; this.shSlearSelectionToolStripMenuItem.Text = "Clear selection";
this.clearSelectionToolStripMenuItem.Click += new System.EventHandler(this.clearSelectionToolStripMenuItem_Click); this.shSlearSelectionToolStripMenuItem.Click += new System.EventHandler(this.clearSelectionToolStripMenuItem_Click);
// //
// toolStripSeparator5 // shToolStripSeparator2
// //
this.toolStripSeparator5.Name = "toolStripSeparator5"; this.shToolStripSeparator2.Name = "shToolStripSeparator2";
this.toolStripSeparator5.Size = new System.Drawing.Size(148, 6); this.shToolStripSeparator2.Size = new System.Drawing.Size(148, 6);
// //
// expandAllToolStripMenuItem // shExpandAllToolStripMenuItem
// //
this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem"; this.shExpandAllToolStripMenuItem.Name = "shExpandAllToolStripMenuItem";
this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22); this.shExpandAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.expandAllToolStripMenuItem.Text = "Expand all"; this.shExpandAllToolStripMenuItem.Text = "Expand all";
this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); this.shExpandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click);
// //
// collapseAllToolStripMenuItem // shCollapseAllToolStripMenuItem
// //
this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem"; this.shCollapseAllToolStripMenuItem.Name = "shCollapseAllToolStripMenuItem";
this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22); this.shCollapseAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
this.collapseAllToolStripMenuItem.Text = "Collapse all"; this.shCollapseAllToolStripMenuItem.Text = "Collapse all";
this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); this.shCollapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click);
// //
// timer // timer
// //
@ -1478,6 +1506,42 @@
this.showOriginalFileToolStripMenuItem.Visible = false; this.showOriginalFileToolStripMenuItem.Visible = false;
this.showOriginalFileToolStripMenuItem.Click += new System.EventHandler(this.showOriginalFileToolStripMenuItem_Click); this.showOriginalFileToolStripMenuItem.Click += new System.EventHandler(this.showOriginalFileToolStripMenuItem_Click);
// //
// dumpTreeViewContextMenuStrip
//
this.dumpTreeViewContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tvCopyToolStripMenuItem,
this.tvToolStripSeparator1,
this.tvExpandAllToolStripMenuItem,
this.tvCollapseAllToolStripMenuItem});
this.dumpTreeViewContextMenuStrip.Name = "contextMenuStrip3";
this.dumpTreeViewContextMenuStrip.Size = new System.Drawing.Size(135, 76);
//
// tvCopyToolStripMenuItem
//
this.tvCopyToolStripMenuItem.Name = "tvCopyToolStripMenuItem";
this.tvCopyToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
this.tvCopyToolStripMenuItem.Text = "Copy";
this.tvCopyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem1_Click);
//
// tvToolStripSeparator1
//
this.tvToolStripSeparator1.Name = "tvToolStripSeparator1";
this.tvToolStripSeparator1.Size = new System.Drawing.Size(131, 6);
//
// tvExpandAllToolStripMenuItem
//
this.tvExpandAllToolStripMenuItem.Name = "tvExpandAllToolStripMenuItem";
this.tvExpandAllToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
this.tvExpandAllToolStripMenuItem.Text = "Expand all";
this.tvExpandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem1_Click);
//
// tvCollapseAllToolStripMenuItem
//
this.tvCollapseAllToolStripMenuItem.Name = "tvCollapseAllToolStripMenuItem";
this.tvCollapseAllToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
this.tvCollapseAllToolStripMenuItem.Text = "Collapse all";
this.tvCollapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem1_Click);
//
// AssetStudioGUIForm // AssetStudioGUIForm
// //
this.AllowDrop = true; this.AllowDrop = true;
@ -1522,8 +1586,9 @@
this.tabPage5.PerformLayout(); this.tabPage5.PerformLayout();
this.statusStrip1.ResumeLayout(false); this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout(); this.statusStrip1.PerformLayout();
this.contextMenuStrip2.ResumeLayout(false); this.sceneContextMenuStrip.ResumeLayout(false);
this.contextMenuStrip1.ResumeLayout(false); this.contextMenuStrip1.ResumeLayout(false);
this.dumpTreeViewContextMenuStrip.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -1626,20 +1691,20 @@
private System.Windows.Forms.ToolStripTextBox specifyUnityVersion; private System.Windows.Forms.ToolStripTextBox specifyUnityVersion;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15;
private System.Windows.Forms.ToolStripMenuItem dumpSelectedAssetsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem dumpSelectedAssetsToolStripMenuItem;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip2; private System.Windows.Forms.ContextMenuStrip sceneContextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem shSelectAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem clearSelectionToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem shSlearSelectionToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; private System.Windows.Forms.ToolStripSeparator shToolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem shCollapseAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem shExpandAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.ComboBox listSearchFilterMode; private System.Windows.Forms.ComboBox listSearchFilterMode;
private System.Windows.Forms.ComboBox listSearchHistory; private System.Windows.Forms.ComboBox listSearchHistory;
private System.Windows.Forms.RichTextBox listSearch; private System.Windows.Forms.RichTextBox listSearch;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
private System.Windows.Forms.ToolStripMenuItem showRelatedAssetsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem shShowRelatedAssetsToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; private System.Windows.Forms.ToolStripSeparator shToolStripSeparator1;
private System.Windows.Forms.ListView assetListView; private System.Windows.Forms.ListView assetListView;
private System.Windows.Forms.ToolStripMenuItem showConsoleToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem showConsoleToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem writeLogToFileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem writeLogToFileToolStripMenuItem;
@ -1659,6 +1724,13 @@
private System.Windows.Forms.ToolStripMenuItem customCompressionLZ4ToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem customCompressionLZ4ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem useAssetLoadingViaTypetreeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem useAssetLoadingViaTypetreeToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator assetLoadingToolStripSeparator; private System.Windows.Forms.ToolStripSeparator assetLoadingToolStripSeparator;
private System.Windows.Forms.TreeView dumpTreeView;
private System.Windows.Forms.ContextMenuStrip dumpTreeViewContextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem tvCopyToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator tvToolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem tvExpandAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem tvCollapseAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem useDumpTreeViewToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem colorThemeToolStripMenu; private System.Windows.Forms.ToolStripMenuItem colorThemeToolStripMenu;
private System.Windows.Forms.ToolStripMenuItem colorThemeAutoToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem colorThemeAutoToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem colorThemeLightToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem colorThemeLightToolStripMenuItem;

View File

@ -34,6 +34,7 @@ namespace AssetStudioGUI
partial class AssetStudioGUIForm : Form partial class AssetStudioGUIForm : Form
{ {
private AssetItem lastSelectedItem; private AssetItem lastSelectedItem;
private AssetItem lastPreviewItem;
private DirectBitmap imageTexture; private DirectBitmap imageTexture;
private string tempClipboard; private string tempClipboard;
@ -140,6 +141,7 @@ namespace AssetStudioGUI
showConsoleToolStripMenuItem.Checked = Properties.Settings.Default.showConsole; showConsoleToolStripMenuItem.Checked = Properties.Settings.Default.showConsole;
buildTreeStructureToolStripMenuItem.Checked = Properties.Settings.Default.buildTreeStructure; buildTreeStructureToolStripMenuItem.Checked = Properties.Settings.Default.buildTreeStructure;
useAssetLoadingViaTypetreeToolStripMenuItem.Checked = Properties.Settings.Default.useTypetreeLoading; useAssetLoadingViaTypetreeToolStripMenuItem.Checked = Properties.Settings.Default.useTypetreeLoading;
useDumpTreeViewToolStripMenuItem.Checked = Properties.Settings.Default.useDumpTreeView;
FMODinit(); FMODinit();
listSearchFilterMode.SelectedIndex = 0; listSearchFilterMode.SelectedIndex = 0;
@ -776,7 +778,7 @@ namespace AssetStudioGUI
var at = a.SubItems[sortColumn].Text.AsSpan(); var at = a.SubItems[sortColumn].Text.AsSpan();
var bt = b.SubItems[sortColumn].Text.AsSpan(); var bt = b.SubItems[sortColumn].Text.AsSpan();
return reverseSort ? MemoryExtensions.CompareTo(bt, at, StringComparison.OrdinalIgnoreCase) : MemoryExtensions.CompareTo(at, bt, StringComparison.OrdinalIgnoreCase); return reverseSort ? bt.CompareTo(at, StringComparison.OrdinalIgnoreCase) : at.CompareTo(bt, StringComparison.OrdinalIgnoreCase);
}); });
} }
assetListView.EndUpdate(); assetListView.EndUpdate();
@ -799,22 +801,44 @@ namespace AssetStudioGUI
lastSelectedItem = (AssetItem)e.Item; lastSelectedItem = (AssetItem)e.Item;
if (e.IsSelected) if (!e.IsSelected)
return;
switch (tabControl2.SelectedIndex)
{ {
if (tabControl2.SelectedIndex == 1) case 0: //Preview
{ if (enablePreview.Checked)
dumpTextBox.Text = DumpAsset(lastSelectedItem.Asset);
}
if (enablePreview.Checked)
{
PreviewAsset(lastSelectedItem);
if (displayInfo.Checked && lastSelectedItem.InfoText != null)
{ {
assetInfoLabel.Text = lastSelectedItem.InfoText; PreviewAsset(lastSelectedItem);
assetInfoLabel.Visible = true; if (displayInfo.Checked && lastSelectedItem.InfoText != null)
{
assetInfoLabel.Text = lastSelectedItem.InfoText;
assetInfoLabel.Visible = true;
}
} }
break;
case 1: //Dump
DumpAsset(lastSelectedItem);
break;
}
}
private void DumpAsset(AssetItem assetItem)
{
if (assetItem == null)
return;
if (useDumpTreeViewToolStripMenuItem.Checked)
{
using (var jsonDoc = DumpAssetToJsonDoc(assetItem.Asset))
{
dumpTreeView.LoadFromJson(jsonDoc, assetItem.Text);
} }
} }
else
{
dumpTextBox.Text = Studio.DumpAsset(assetItem.Asset);
}
} }
private void classesListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) private void classesListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
@ -830,6 +854,7 @@ namespace AssetStudioGUI
if (e.IsSelected) if (e.IsSelected)
{ {
classTextBox.Text = ((TypeTreeItem)classesListView.SelectedItems[0]).ToString(); classTextBox.Text = ((TypeTreeItem)classesListView.SelectedItems[0]).ToString();
lastSelectedItem = null;
} }
} }
@ -844,6 +869,7 @@ namespace AssetStudioGUI
private void PreviewAsset(AssetItem assetItem) private void PreviewAsset(AssetItem assetItem)
{ {
lastPreviewItem = assetItem;
if (assetItem == null) if (assetItem == null)
return; return;
try try
@ -1527,9 +1553,22 @@ namespace AssetStudioGUI
private void tabControl2_SelectedIndexChanged(object sender, EventArgs e) private void tabControl2_SelectedIndexChanged(object sender, EventArgs e)
{ {
if (tabControl2.SelectedIndex == 1 && lastSelectedItem != null) switch (tabControl2.SelectedIndex)
{ {
dumpTextBox.Text = DumpAsset(lastSelectedItem.Asset); case 0: //Preview
if (lastPreviewItem != lastSelectedItem)
{
PreviewAsset(lastSelectedItem);
if (displayInfo.Checked && lastSelectedItem?.InfoText != null)
{
assetInfoLabel.Text = lastSelectedItem.InfoText;
assetInfoLabel.Visible = true;
}
}
break;
case 1: //Dump
DumpAsset(lastSelectedItem);
break;
} }
} }
@ -2047,7 +2086,7 @@ namespace AssetStudioGUI
if (e.Button == MouseButtons.Right) if (e.Button == MouseButtons.Right)
{ {
sceneTreeView.SelectedNode = e.Node; sceneTreeView.SelectedNode = e.Node;
contextMenuStrip2.Show(sceneTreeView, e.Location.X, e.Location.Y); sceneContextMenuStrip.Show(sceneTreeView, e.Location.X, e.Location.Y);
} }
} }
@ -2162,7 +2201,7 @@ namespace AssetStudioGUI
{ {
var selectedNode = sceneTreeView.SelectedNode; var selectedNode = sceneTreeView.SelectedNode;
var relatedAssets = visibleAssets.FindAll(x => x.TreeNode == selectedNode); var relatedAssets = visibleAssets.FindAll(x => x.TreeNode == selectedNode);
showRelatedAssetsToolStripMenuItem.DropDownItems.Clear(); shShowRelatedAssetsToolStripMenuItem.DropDownItems.Clear();
if (relatedAssets.Count > 1) if (relatedAssets.Count > 1)
{ {
var assetItem = new ToolStripMenuItem var assetItem = new ToolStripMenuItem
@ -2173,7 +2212,7 @@ namespace AssetStudioGUI
Text = "Select all" Text = "Select all"
}; };
assetItem.Click += selectAllRelatedAssets; assetItem.Click += selectAllRelatedAssets;
showRelatedAssetsToolStripMenuItem.DropDownItems.Add(assetItem); shShowRelatedAssetsToolStripMenuItem.DropDownItems.Add(assetItem);
} }
foreach (var asset in relatedAssets) foreach (var asset in relatedAssets)
{ {
@ -2186,7 +2225,7 @@ namespace AssetStudioGUI
Text = $"({asset.TypeString}) {asset.Text}" Text = $"({asset.TypeString}) {asset.Text}"
}; };
assetItem.Click += selectRelatedAsset; assetItem.Click += selectRelatedAsset;
showRelatedAssetsToolStripMenuItem.DropDownItems.Add(assetItem); shShowRelatedAssetsToolStripMenuItem.DropDownItems.Add(assetItem);
} }
} }
@ -2462,6 +2501,55 @@ namespace AssetStudioGUI
MessageBox.Show(msg, "Info", MessageBoxButtons.OK); MessageBox.Show(msg, "Info", MessageBoxButtons.OK);
} }
private void DumpTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
dumpTreeView.SelectedNode = e.Node;
tempClipboard = string.IsNullOrEmpty((string)e.Node.Tag)
? e.Node.Text
: $"{e.Node.Name}: {e.Node.Tag}";
dumpTreeViewContextMenuStrip.Show(dumpTreeView, e.Location.X, e.Location.Y);
}
}
private void copyToolStripMenuItem1_Click(object sender, EventArgs e)
{
Clipboard.SetDataObject(tempClipboard);
}
private void expandAllToolStripMenuItem1_Click(object sender, EventArgs e)
{
dumpTreeView.BeginUpdate();
foreach (TreeNode node in dumpTreeView.Nodes)
{
node.ExpandAll();
}
dumpTreeView.EndUpdate();
}
private void collapseAllToolStripMenuItem1_Click(object sender, EventArgs e)
{
dumpTreeView.BeginUpdate();
foreach (TreeNode node in dumpTreeView.Nodes)
{
node.Collapse(ignoreChildren: false);
}
dumpTreeView.EndUpdate();
}
private void useDumpTreeViewToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
{
var isTreeViewEnabled = useDumpTreeViewToolStripMenuItem.Checked;
dumpTreeView.Visible = isTreeViewEnabled;
Properties.Settings.Default.useDumpTreeView = isTreeViewEnabled;
Properties.Settings.Default.Save();
if (tabControl2.SelectedIndex == 1)
{
DumpAsset(lastSelectedItem);
}
}
#region FMOD #region FMOD
private void FMODinit() private void FMODinit()
{ {

View File

@ -141,7 +141,7 @@ The quick brown fox jumps over the lazy dog. 1234567890</value>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>432, 17</value> <value>432, 17</value>
</metadata> </metadata>
<metadata name="contextMenuStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="sceneContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>775, 21</value> <value>775, 21</value>
</metadata> </metadata>
<metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -153,7 +153,7 @@ The quick brown fox jumps over the lazy dog. 1234567890</value>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>147, 17</value> <value>147, 17</value>
</metadata> </metadata>
<metadata name="contextMenuStrip3.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="dumpTreeViewContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>930, 21</value> <value>930, 21</value>
</metadata> </metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

View File

@ -0,0 +1,105 @@
using System.Text.Json;
using System.Windows.Forms;
using AssetStudio;
namespace AssetStudioGUI
{
public static class JsonTreeView
{
public static void LoadFromJson(this TreeView treeView, JsonDocument jsonDoc, string rootName)
{
if (jsonDoc == null)
{
Logger.Info("Unable to build tree view of current object");
return;
}
try
{
treeView.BeginUpdate();
treeView.Nodes.Clear();
var rootNode = treeView.Nodes[treeView.Nodes.Add(new TreeNode(rootName))];
foreach (var property in jsonDoc.RootElement.EnumerateObject())
{
var childNode = rootNode.Nodes[rootNode.Nodes.Add(new TreeNode(property.Name))];
AddNodes(property.Value, childNode);
}
rootNode.Expand();
rootNode.EnsureVisible();
}
finally
{
treeView.EndUpdate();
}
}
private static void AddNodes(JsonElement jsonElement, TreeNode treeNode)
{
switch (jsonElement.ValueKind)
{
case JsonValueKind.Object:
foreach (var property in jsonElement.EnumerateObject())
{
var childNode = treeNode.Nodes[treeNode.Nodes.Add(new TreeNode(property.Name))];
AddNodes(property.Value, childNode);
}
break;
case JsonValueKind.Array:
const int arrayLenLimit = 500;
var arrayLen = jsonElement.GetArrayLength();
if (arrayLen == 0)
{
SetValue(jsonElement, treeNode);
}
else
{
var i = 0;
foreach (var jsonArrayElem in jsonElement.EnumerateArray())
{
if (jsonArrayElem.ValueKind == JsonValueKind.Number) //number array
{
SetValue(jsonElement, treeNode);
break;
}
if (i > arrayLenLimit)
{
treeNode.Nodes.Add(new TreeNode($"[{i++}-{arrayLen - 1}] Skipped. Too many elements to display"));
break;
}
var childNode = treeNode.Nodes[treeNode.Nodes.Add(new TreeNode($"[{i++}]"))];
AddNodes(jsonArrayElem, childNode);
}
}
break;
default:
SetValue(jsonElement, treeNode);
break;
}
}
private static void SetValue(JsonElement jsonElem, TreeNode node)
{
const int maxStrLen = 128;
var endStr = "...";
var strValue = jsonElem.ToString();
if (jsonElem.ValueKind == JsonValueKind.Array)
{
strValue = strValue.Replace("\r", "").Replace("\n", "").Replace(" ", "").Replace(",", ", ");
endStr += "]";
}
if (jsonElem.ValueKind == JsonValueKind.Null)
{
strValue = jsonElem.GetRawText();
}
node.Name = node.Text;
node.Text += strValue?.Length > maxStrLen
? $": {strValue.Substring(0, maxStrLen)}{endStr}"
: $": {strValue}";
node.Tag = strValue;
}
}
}

View File

@ -430,5 +430,17 @@ namespace AssetStudioGUI.Properties {
this["l2dAssetSearchByFilename"] = value; this["l2dAssetSearchByFilename"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool useDumpTreeView {
get {
return ((bool)(this["useDumpTreeView"]));
}
set {
this["useDumpTreeView"] = value;
}
}
} }
} }

View File

@ -104,5 +104,8 @@
<Setting Name="l2dAssetSearchByFilename" Type="System.Boolean" Scope="User"> <Setting Name="l2dAssetSearchByFilename" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value> <Value Profile="(Default)">False</Value>
</Setting> </Setting>
<Setting Name="useDumpTreeView" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

@ -8,6 +8,7 @@ using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
@ -304,12 +305,15 @@ namespace AssetStudioGUI
{ {
preloadTable = m_AssetBundle.m_PreloadTable; preloadTable = m_AssetBundle.m_PreloadTable;
} }
assetItem.Text = string.IsNullOrEmpty(m_AssetBundle.m_AssetBundleName) ? m_AssetBundle.m_Name : m_AssetBundle.m_AssetBundleName; assetItem.Text = string.IsNullOrEmpty(m_AssetBundle.m_AssetBundleName)
? m_AssetBundle.m_Name
: m_AssetBundle.m_AssetBundleName;
foreach (var m_Container in m_AssetBundle.m_Container) foreach (var m_Container in m_AssetBundle.m_Container)
{ {
var preloadIndex = m_Container.Value.preloadIndex; var preloadIndex = m_Container.Value.preloadIndex;
var preloadSize = isStreamedSceneAssetBundle ? preloadTable.Length : m_Container.Value.preloadSize; var preloadSize = isStreamedSceneAssetBundle
? preloadTable.Length
: m_Container.Value.preloadSize;
var preloadEnd = preloadIndex + preloadSize; var preloadEnd = preloadIndex + preloadSize;
for (var k = preloadIndex; k < preloadEnd; k++) for (var k = preloadIndex; k < preloadEnd; k++)
{ {
@ -689,7 +693,9 @@ namespace AssetStudioGUI
Logger.Error(ex.Value); Logger.Error(ex.Value);
} }
var statusText = exportedCount == 0 ? "Nothing exported." : $"Finished {mode.ToLower()}ing [{exportedCount}/{toExportCount}] assets."; var statusText = exportedCount == 0
? "Nothing exported."
: $"Finished {mode.ToLower()}ing [{exportedCount}/{toExportCount}] assets.";
if (toExportCount > exportedCount) if (toExportCount > exportedCount)
{ {
statusText += exceptionMsgs.IsEmpty statusText += exceptionMsgs.IsEmpty
@ -779,7 +785,7 @@ namespace AssetStudioGUI
//每个文件存放在单独的文件夹 //每个文件存放在单独的文件夹
var targetPath = $"{savePath}{filename}{Path.DirectorySeparatorChar}"; var targetPath = $"{savePath}{filename}{Path.DirectorySeparatorChar}";
//重名文件处理 //重名文件处理
for (int i = 1; ; i++) for (int i = 1;; i++)
{ {
if (Directory.Exists(targetPath)) if (Directory.Exists(targetPath))
{ {
@ -965,6 +971,19 @@ namespace AssetStudioGUI
return str; return str;
} }
public static JsonDocument DumpAssetToJsonDoc(Object obj)
{
if (obj == null)
return null;
if (obj is MonoBehaviour m_MonoBehaviour)
{
var type = obj.serializedType?.m_Type ?? MonoBehaviourToTypeTree(m_MonoBehaviour);
return m_MonoBehaviour.ToJsonDoc(type);
}
return obj.ToJsonDoc();
}
public static void OpenFolderInExplorer(string path) public static void OpenFolderInExplorer(string path)
{ {
if (!path.EndsWith($"{Path.DirectorySeparatorChar}")) if (!path.EndsWith($"{Path.DirectorySeparatorChar}"))