From d717b223b79248d7e6f97daa3bb67f99f3ed65fc Mon Sep 17 00:00:00 2001 From: Perfare Date: Fri, 27 Mar 2020 01:06:22 +0800 Subject: [PATCH] delete some useless features --- AssetStudioGUI/AssetStudioGUIForm.Designer.cs | 78 +- AssetStudioGUI/AssetStudioGUIForm.cs | 854 +++++++++--------- AssetStudioGUI/Studio.cs | 63 +- 3 files changed, 462 insertions(+), 533 deletions(-) diff --git a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs index 7dd5083..11bce8e 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs @@ -67,10 +67,6 @@ this.filterTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.allToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.debugMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buildClassStructuresMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dontBuildAssetListMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dontBuildHierarchyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.exportClassStructuresMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.tabControl1 = new System.Windows.Forms.TabControl(); @@ -87,8 +83,8 @@ this.listSearch = new System.Windows.Forms.TextBox(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.classesListView = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.progressbarPanel = new System.Windows.Forms.Panel(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.previewPanel = new System.Windows.Forms.Panel(); @@ -117,7 +113,7 @@ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.exportSelectedAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.jumpToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); @@ -439,46 +435,15 @@ // debugMenuItem // this.debugMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.buildClassStructuresMenuItem, - this.dontBuildAssetListMenuItem, - this.dontBuildHierarchyMenuItem, - this.toolStripSeparator2, this.exportClassStructuresMenuItem}); this.debugMenuItem.Name = "debugMenuItem"; this.debugMenuItem.Size = new System.Drawing.Size(59, 21); this.debugMenuItem.Text = "Debug"; // - // buildClassStructuresMenuItem - // - this.buildClassStructuresMenuItem.CheckOnClick = true; - this.buildClassStructuresMenuItem.Name = "buildClassStructuresMenuItem"; - this.buildClassStructuresMenuItem.Size = new System.Drawing.Size(224, 22); - this.buildClassStructuresMenuItem.Text = "Build class structures"; - // - // dontBuildAssetListMenuItem - // - this.dontBuildAssetListMenuItem.CheckOnClick = true; - this.dontBuildAssetListMenuItem.Name = "dontBuildAssetListMenuItem"; - this.dontBuildAssetListMenuItem.Size = new System.Drawing.Size(224, 22); - this.dontBuildAssetListMenuItem.Text = "Don\'t build asset list"; - this.dontBuildAssetListMenuItem.CheckedChanged += new System.EventHandler(this.dontBuildAssetListMenuItem_CheckedChanged); - // - // dontBuildHierarchyMenuItem - // - this.dontBuildHierarchyMenuItem.CheckOnClick = true; - this.dontBuildHierarchyMenuItem.Name = "dontBuildHierarchyMenuItem"; - this.dontBuildHierarchyMenuItem.Size = new System.Drawing.Size(224, 22); - this.dontBuildHierarchyMenuItem.Text = "Don\'t build hierarchy tree"; - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(221, 6); - // // exportClassStructuresMenuItem // this.exportClassStructuresMenuItem.Name = "exportClassStructuresMenuItem"; - this.exportClassStructuresMenuItem.Size = new System.Drawing.Size(224, 22); + this.exportClassStructuresMenuItem.Size = new System.Drawing.Size(207, 22); this.exportClassStructuresMenuItem.Text = "Export class structures"; this.exportClassStructuresMenuItem.Click += new System.EventHandler(this.exportClassStructuresMenuItem_Click); // @@ -657,16 +622,15 @@ this.classesListView.View = System.Windows.Forms.View.Details; this.classesListView.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.classesListView_ItemSelectionChanged); // - // columnHeader1 - // - this.columnHeader1.DisplayIndex = 1; - this.columnHeader1.Text = "Name"; - this.columnHeader1.Width = 328; - // // columnHeader2 // - this.columnHeader2.DisplayIndex = 0; - this.columnHeader2.Text = "ID"; + this.columnHeader2.Text = "Name"; + this.columnHeader2.Width = 300; + // + // columnHeader1 + // + this.columnHeader1.Text = "ID"; + this.columnHeader1.Width = 70; // // progressbarPanel // @@ -946,7 +910,7 @@ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.exportSelectedAssetsToolStripMenuItem, this.exportAnimatorwithselectedAnimationClipMenuItem, - this.jumpToSceneHierarchyToolStripMenuItem, + this.goToSceneHierarchyToolStripMenuItem, this.showOriginalFileToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.Size = new System.Drawing.Size(327, 92); @@ -966,13 +930,13 @@ this.exportAnimatorwithselectedAnimationClipMenuItem.Visible = false; this.exportAnimatorwithselectedAnimationClipMenuItem.Click += new System.EventHandler(this.exportAnimatorwithAnimationClipMenuItem_Click); // - // jumpToSceneHierarchyToolStripMenuItem + // goToSceneHierarchyToolStripMenuItem // - this.jumpToSceneHierarchyToolStripMenuItem.Name = "jumpToSceneHierarchyToolStripMenuItem"; - this.jumpToSceneHierarchyToolStripMenuItem.Size = new System.Drawing.Size(326, 22); - this.jumpToSceneHierarchyToolStripMenuItem.Text = "Jump to scene hierarchy"; - this.jumpToSceneHierarchyToolStripMenuItem.Visible = false; - this.jumpToSceneHierarchyToolStripMenuItem.Click += new System.EventHandler(this.jumpToSceneHierarchyToolStripMenuItem_Click); + this.goToSceneHierarchyToolStripMenuItem.Name = "goToSceneHierarchyToolStripMenuItem"; + this.goToSceneHierarchyToolStripMenuItem.Size = new System.Drawing.Size(326, 22); + this.goToSceneHierarchyToolStripMenuItem.Text = "Go to scene hierarchy"; + this.goToSceneHierarchyToolStripMenuItem.Visible = false; + this.goToSceneHierarchyToolStripMenuItem.Click += new System.EventHandler(this.goToSceneHierarchyToolStripMenuItem_Click); // // showOriginalFileToolStripMenuItem // @@ -1079,16 +1043,12 @@ private System.Windows.Forms.ToolStripMenuItem showExpOpt; private GOHierarchy sceneTreeView; private System.Windows.Forms.ToolStripMenuItem debugMenuItem; - private System.Windows.Forms.ToolStripMenuItem buildClassStructuresMenuItem; - private System.Windows.Forms.ToolStripMenuItem dontBuildAssetListMenuItem; - private System.Windows.Forms.ToolStripMenuItem dontBuildHierarchyMenuItem; private System.Windows.Forms.TabPage tabPage3; private System.Windows.Forms.ListView classesListView; - private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.Panel classPreviewPanel; private System.Windows.Forms.TextBox classTextBox; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem; private System.Windows.Forms.Label FMODcopyright; private OpenTK.GLControl glControl1; @@ -1103,7 +1063,7 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripMenuItem exportAnimatorWithSelectedAnimationClipToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exportAllObjectssplitToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem jumpToSceneHierarchyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem goToSceneHierarchyToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exportSelectedObjectsmergeToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 603cebd..72b9f86 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -28,6 +28,7 @@ namespace AssetStudioGUI { private AssetItem lastSelectedItem; private AssetItem lastLoadedAsset; + private Bitmap imageTexture; private FMOD.System system; private FMOD.Sound sound; @@ -37,8 +38,6 @@ namespace AssetStudioGUI private uint FMODlenms; private float FMODVolume = 0.8f; - private Bitmap imageTexture; - #region TexControl private static char[] textureChannelNames = new char[4] { 'R', 'G', 'B', 'A' }; private bool[] textureChannels = new bool[4] { true, true, true, true }; @@ -146,25 +145,10 @@ namespace AssetStudioGUI return; } - var productName = string.Empty; - var tempDic = new Dictionary(); - if (!dontBuildAssetListMenuItem.Checked) - { - BuildAssetList(tempDic, out productName); - } - - List treeNodeCollection = null; - if (!dontBuildHierarchyMenuItem.Checked) - { - treeNodeCollection = BuildTreeStructure(tempDic); - } - tempDic.Clear(); - - Dictionary> typeMap = null; - if (buildClassStructuresMenuItem.Checked) - { - typeMap = BuildClassStructure(); - } + var data = BuildAssetData(); + var productName = data.Item1; + var treeNodeCollection = data.Item2; + var typeMap = BuildClassStructure(); BeginInvoke(new Action(() => { @@ -176,38 +160,32 @@ namespace AssetStudioGUI { Text = $"AssetStudioGUI - no productName - {assetsManager.assetsFileList[0].unityVersion} - {assetsManager.assetsFileList[0].m_TargetPlatform}"; } - if (!dontBuildAssetListMenuItem.Checked) - { - assetListView.VirtualListSize = visibleAssets.Count; - } - if (!dontBuildHierarchyMenuItem.Checked) - { - sceneTreeView.BeginUpdate(); - sceneTreeView.Nodes.AddRange(treeNodeCollection.ToArray()); - treeNodeCollection.Clear(); - foreach (TreeNode node in sceneTreeView.Nodes) - { - node.HideCheckBox(); - } - sceneTreeView.EndUpdate(); - } - if (buildClassStructuresMenuItem.Checked) - { - classesListView.BeginUpdate(); - foreach (var version in typeMap) - { - var versionGroup = new ListViewGroup(version.Key); - classesListView.Groups.Add(versionGroup); - foreach (var uclass in version.Value) - { - uclass.Value.Group = versionGroup; - classesListView.Items.Add(uclass.Value); - } - } - typeMap.Clear(); - classesListView.EndUpdate(); + assetListView.VirtualListSize = visibleAssets.Count; + + sceneTreeView.BeginUpdate(); + sceneTreeView.Nodes.AddRange(treeNodeCollection.ToArray()); + foreach (TreeNode node in sceneTreeView.Nodes) + { + node.HideCheckBox(); } + sceneTreeView.EndUpdate(); + treeNodeCollection.Clear(); + + classesListView.BeginUpdate(); + foreach (var version in typeMap) + { + var versionGroup = new ListViewGroup(version.Key); + classesListView.Groups.Add(versionGroup); + + foreach (var uclass in version.Value) + { + uclass.Value.Group = versionGroup; + classesListView.Items.Add(uclass.Value); + } + } + typeMap.Clear(); + classesListView.EndUpdate(); var types = exportableAssets.Select(x => x.Type).Distinct().OrderBy(x => x.ToString()).ToArray(); foreach (var type in types) @@ -316,19 +294,6 @@ namespace AssetStudioGUI } } - private void dontBuildAssetListMenuItem_CheckedChanged(object sender, EventArgs e) - { - if (dontBuildAssetListMenuItem.Checked) - { - dontBuildHierarchyMenuItem.Checked = true; - dontBuildHierarchyMenuItem.Enabled = false; - } - else - { - dontBuildHierarchyMenuItem.Enabled = true; - } - } - private void exportClassStructuresMenuItem_Click(object sender, EventArgs e) { if (classesListView.Items.Count > 0) @@ -441,7 +406,7 @@ namespace AssetStudioGUI private void showExpOpt_Click(object sender, EventArgs e) { - ExportOptions exportOpt = new ExportOptions(); + var exportOpt = new ExportOptions(); exportOpt.ShowDialog(); } @@ -654,6 +619,15 @@ namespace AssetStudioGUI } } + private void preview_Resize(object sender, EventArgs e) + { + if (glControlLoaded && glControl1.Visible) + { + ChangeGLSize(glControl1.Size); + glControl1.Invalidate(); + } + } + private void PreviewAsset(AssetItem assetItem) { if (assetItem == null) @@ -896,7 +870,7 @@ namespace AssetStudioGUI var m_AudioData = m_AudioClip.m_AudioData.Value; if (m_AudioData == null || m_AudioData.Length == 0) return; - FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO(); + var exinfo = new FMOD.CREATESOUNDEXINFO(); exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.length = (uint)m_AudioClip.m_Size; @@ -1173,6 +1147,375 @@ namespace AssetStudioGUI textPreviewBox.Visible = true; } + private void SetProgressBarValue(int value) + { + if (InvokeRequired) + { + BeginInvoke(new Action(() => { progressBar1.Value = value; })); + } + else + { + progressBar1.Value = value; + } + } + + private void StatusStripUpdate(string statusText) + { + if (InvokeRequired) + { + BeginInvoke(new Action(() => { toolStripStatusLabel1.Text = statusText; })); + } + else + { + toolStripStatusLabel1.Text = statusText; + } + } + + public AssetStudioGUIForm() + { + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + InitializeComponent(); + delayTimer = new System.Timers.Timer(800); + delayTimer.Elapsed += new ElapsedEventHandler(delayTimer_Elapsed); + displayAll.Checked = Properties.Settings.Default.displayAll; + displayInfo.Checked = Properties.Settings.Default.displayInfo; + enablePreview.Checked = Properties.Settings.Default.enablePreview; + FMODinit(); + + Logger.Default = new GUILogger(StatusStripUpdate); + Progress.Default = new GUIProgress(SetProgressBarValue); + Studio.StatusStripUpdate = StatusStripUpdate; + } + + + private void ResetForm() + { + Text = "AssetStudioGUI"; + assetsManager.Clear(); + exportableAssets.Clear(); + visibleAssets.Clear(); + sceneTreeView.Nodes.Clear(); + assetListView.VirtualListSize = 0; + assetListView.Items.Clear(); + classesListView.Items.Clear(); + classesListView.Groups.Clear(); + previewPanel.BackgroundImage = Properties.Resources.preview; + imageTexture?.Dispose(); + previewPanel.BackgroundImageLayout = ImageLayout.Center; + assetInfoLabel.Visible = false; + assetInfoLabel.Text = null; + textPreviewBox.Visible = false; + fontPreviewBox.Visible = false; + glControl1.Visible = false; + lastSelectedItem = null; + lastLoadedAsset = null; + sortColumn = -1; + reverseSort = false; + enableFiltering = false; + listSearch.Text = " Filter "; + + var count = filterTypeToolStripMenuItem.DropDownItems.Count; + for (var i = 1; i < count; i++) + { + filterTypeToolStripMenuItem.DropDownItems.RemoveAt(1); + } + + FMODreset(); + + if (scriptDumper != null) + { + scriptDumper.Dispose(); + scriptDumper = null; + } + } + + private void assetListView_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right && assetListView.SelectedIndices.Count > 0) + { + goToSceneHierarchyToolStripMenuItem.Visible = false; + showOriginalFileToolStripMenuItem.Visible = false; + exportAnimatorwithselectedAnimationClipMenuItem.Visible = false; + + if (assetListView.SelectedIndices.Count == 1) + { + goToSceneHierarchyToolStripMenuItem.Visible = true; + showOriginalFileToolStripMenuItem.Visible = true; + } + if (assetListView.SelectedIndices.Count >= 1) + { + var selectedAssets = GetSelectedAssets(); + if (selectedAssets.Any(x => x.Type == ClassIDType.Animator) && selectedAssets.Any(x => x.Type == ClassIDType.AnimationClip)) + { + exportAnimatorwithselectedAnimationClipMenuItem.Visible = true; + } + } + + contextMenuStrip1.Show(assetListView, e.X, e.Y); + } + } + + private void exportSelectedAssetsToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportAssets(2, ExportType.Convert); + } + + private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e) + { + var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; + var args = $"/select, \"{selectasset.SourceFile.originalPath ?? selectasset.SourceFile.fullName}\""; + var pfi = new ProcessStartInfo("explorer.exe", args); + Process.Start(pfi); + } + + private void exportAnimatorwithAnimationClipMenuItem_Click(object sender, EventArgs e) + { + AssetItem animator = null; + List animationList = new List(); + var selectedAssets = GetSelectedAssets(); + foreach (var assetPreloadData in selectedAssets) + { + if (assetPreloadData.Type == ClassIDType.Animator) + { + animator = assetPreloadData; + } + else if (assetPreloadData.Type == ClassIDType.AnimationClip) + { + animationList.Add(assetPreloadData); + } + } + + if (animator != null) + { + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) + { + var exportPath = saveFolderDialog1.Folder + "\\Animator\\"; + ExportAnimatorWithAnimationClip(animator, animationList, exportPath); + } + } + } + + private void exportSelectedObjectsToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportObjects(false); + } + + private void exportObjectswithAnimationClipMenuItem_Click(object sender, EventArgs e) + { + ExportObjects(true); + } + + private void ExportObjects(bool animation) + { + if (sceneTreeView.Nodes.Count > 0) + { + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) + { + var exportPath = saveFolderDialog1.Folder + "\\GameObject\\"; + List animationList = null; + if (animation) + { + animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); + if (animationList.Count == 0) + { + animationList = null; + } + } + ExportObjectsWithAnimationClip(exportPath, sceneTreeView.Nodes, animationList); + } + } + else + { + StatusStripUpdate("No Objects available for export"); + } + } + + private void exportSelectedObjectsmergeToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportMergeObjects(false); + } + + private void exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportMergeObjects(true); + } + + private void ExportMergeObjects(bool animation) + { + if (sceneTreeView.Nodes.Count > 0) + { + var gameObjects = new List(); + GetSelectedParentNode(sceneTreeView.Nodes, gameObjects); + var saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx"; + saveFileDialog.AddExtension = false; + saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx"; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + var exportPath = saveFileDialog.FileName; + List animationList = null; + if (animation) + { + animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); + if (animationList.Count == 0) + { + animationList = null; + } + } + ExportObjectsMergeWithAnimationClip(exportPath, gameObjects, animationList); + } + } + } + + private void goToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) + { + var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; + if (selectasset.TreeNode != null) + { + sceneTreeView.SelectedNode = selectasset.TreeNode; + tabControl1.SelectedTab = tabPage1; + } + } + + private void exportAllAssetsMenuItem_Click(object sender, EventArgs e) + { + ExportAssets(1, ExportType.Convert); + } + + private void exportSelectedAssetsMenuItem_Click(object sender, EventArgs e) + { + ExportAssets(2, ExportType.Convert); + } + + private void exportFilteredAssetsMenuItem_Click(object sender, EventArgs e) + { + ExportAssets(3, ExportType.Convert); + } + + private void toolStripMenuItem4_Click(object sender, EventArgs e) + { + ExportAssets(1, ExportType.Raw); + } + + private void toolStripMenuItem5_Click(object sender, EventArgs e) + { + ExportAssets(2, ExportType.Raw); + } + + private void toolStripMenuItem6_Click(object sender, EventArgs e) + { + ExportAssets(3, ExportType.Raw); + } + + private void toolStripMenuItem7_Click(object sender, EventArgs e) + { + ExportAssets(1, ExportType.Dump); + } + + private void toolStripMenuItem8_Click(object sender, EventArgs e) + { + ExportAssets(2, ExportType.Dump); + } + + private void toolStripMenuItem9_Click(object sender, EventArgs e) + { + ExportAssets(3, ExportType.Dump); + } + + private void exportAllObjectssplitToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (sceneTreeView.Nodes.Count > 0) + { + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) + { + var savePath = saveFolderDialog1.Folder + "\\"; + ExportSplitObjects(savePath, sceneTreeView.Nodes); + } + } + else + { + StatusStripUpdate("No Objects available for export"); + } + } + + private List GetSelectedAssets() + { + var selectedAssets = new List(assetListView.SelectedIndices.Count); + foreach (int index in assetListView.SelectedIndices) + { + selectedAssets.Add((AssetItem)assetListView.Items[index]); + } + + return selectedAssets; + } + + private void FilterAssetList() + { + assetListView.BeginUpdate(); + assetListView.SelectedIndices.Clear(); + var show = new List(); + if (!allToolStripMenuItem.Checked) + { + for (var i = 1; i < filterTypeToolStripMenuItem.DropDownItems.Count; i++) + { + var item = (ToolStripMenuItem)filterTypeToolStripMenuItem.DropDownItems[i]; + if (item.Checked) + { + show.Add((ClassIDType)Enum.Parse(typeof(ClassIDType), item.Text)); + } + } + visibleAssets = exportableAssets.FindAll(x => show.Contains(x.Type)); + } + else + { + visibleAssets = exportableAssets; + } + if (listSearch.Text != " Filter ") + { + visibleAssets = visibleAssets.FindAll( + x => x.Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0 || + x.SubItems[1].Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0 || + x.SubItems[3].Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0); + } + assetListView.VirtualListSize = visibleAssets.Count; + assetListView.EndUpdate(); + } + + private void ExportAssets(int type, ExportType exportType) + { + if (exportableAssets.Count > 0) + { + var saveFolderDialog1 = new OpenFolderDialog(); + if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) + { + timer.Stop(); + + List toExportAssets = null; + switch (type) + { + case 1: //All Assets + toExportAssets = exportableAssets; + break; + case 2: //Selected Assets + toExportAssets = GetSelectedAssets(); + break; + case 3: //Filtered Assets + toExportAssets = visibleAssets; + break; + } + Studio.ExportAssets(saveFolderDialog1.Folder, toExportAssets, exportType); + } + } + else + { + StatusStripUpdate("No exportable assets loaded"); + } + } + + #region FMOD private void FMODinit() { FMODreset(); @@ -1440,47 +1783,9 @@ namespace AssetStudioGUI } return false; } + #endregion - private void SetProgressBarValue(int value) - { - if (InvokeRequired) - { - BeginInvoke(new Action(() => { progressBar1.Value = value; })); - } - else - { - progressBar1.Value = value; - } - } - - private void StatusStripUpdate(string statusText) - { - if (InvokeRequired) - { - BeginInvoke(new Action(() => { toolStripStatusLabel1.Text = statusText; })); - } - else - { - toolStripStatusLabel1.Text = statusText; - } - } - - public AssetStudioGUIForm() - { - Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); - InitializeComponent(); - delayTimer = new System.Timers.Timer(800); - delayTimer.Elapsed += new ElapsedEventHandler(delayTimer_Elapsed); - displayAll.Checked = Properties.Settings.Default.displayAll; - displayInfo.Checked = Properties.Settings.Default.displayInfo; - enablePreview.Checked = Properties.Settings.Default.enablePreview; - FMODinit(); - - Logger.Default = new GUILogger(StatusStripUpdate); - Progress.Default = new GUIProgress(SetProgressBarValue); - Studio.StatusStripUpdate = StatusStripUpdate; - } - + #region GLControl private void InitOpenTK() { ChangeGLSize(glControl1.Size); @@ -1598,15 +1903,6 @@ namespace AssetStudioGUI } } - private void preview_Resize(object sender, EventArgs e) - { - if (glControlLoaded && glControl1.Visible) - { - ChangeGLSize(glControl1.Size); - glControl1.Invalidate(); - } - } - private void glControl1_Load(object sender, EventArgs e) { InitOpenTK(); @@ -1706,332 +2002,6 @@ namespace AssetStudioGUI rmdown = false; } } - - private void ResetForm() - { - Text = "AssetStudioGUI"; - assetsManager.Clear(); - exportableAssets.Clear(); - visibleAssets.Clear(); - sceneTreeView.Nodes.Clear(); - assetListView.VirtualListSize = 0; - assetListView.Items.Clear(); - classesListView.Items.Clear(); - classesListView.Groups.Clear(); - previewPanel.BackgroundImage = Properties.Resources.preview; - imageTexture?.Dispose(); - previewPanel.BackgroundImageLayout = ImageLayout.Center; - assetInfoLabel.Visible = false; - assetInfoLabel.Text = null; - textPreviewBox.Visible = false; - fontPreviewBox.Visible = false; - glControl1.Visible = false; - lastSelectedItem = null; - lastLoadedAsset = null; - sortColumn = -1; - reverseSort = false; - enableFiltering = false; - listSearch.Text = " Filter "; - - var count = filterTypeToolStripMenuItem.DropDownItems.Count; - for (var i = 1; i < count; i++) - { - filterTypeToolStripMenuItem.DropDownItems.RemoveAt(1); - } - - FMODreset(); - - if (scriptDumper != null) - { - scriptDumper.Dispose(); - scriptDumper = null; - } - } - - private void assetListView_MouseClick(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right && assetListView.SelectedIndices.Count > 0) - { - jumpToSceneHierarchyToolStripMenuItem.Visible = false; - showOriginalFileToolStripMenuItem.Visible = false; - exportAnimatorwithselectedAnimationClipMenuItem.Visible = false; - - if (assetListView.SelectedIndices.Count == 1) - { - jumpToSceneHierarchyToolStripMenuItem.Visible = true; - showOriginalFileToolStripMenuItem.Visible = true; - } - if (assetListView.SelectedIndices.Count >= 1) - { - var selectedAssets = GetSelectedAssets(); - if (selectedAssets.Any(x => x.Type == ClassIDType.Animator) && selectedAssets.Any(x => x.Type == ClassIDType.AnimationClip)) - { - exportAnimatorwithselectedAnimationClipMenuItem.Visible = true; - } - } - - contextMenuStrip1.Show(assetListView, e.X, e.Y); - } - } - - private void exportSelectedAssetsToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(2, ExportType.Convert); - } - - private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e) - { - var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; - var args = $"/select, \"{selectasset.SourceFile.originalPath ?? selectasset.SourceFile.fullName}\""; - var pfi = new ProcessStartInfo("explorer.exe", args); - Process.Start(pfi); - } - - private void exportAnimatorwithAnimationClipMenuItem_Click(object sender, EventArgs e) - { - AssetItem animator = null; - List animationList = new List(); - var selectedAssets = GetSelectedAssets(); - foreach (var assetPreloadData in selectedAssets) - { - if (assetPreloadData.Type == ClassIDType.Animator) - { - animator = assetPreloadData; - } - else if (assetPreloadData.Type == ClassIDType.AnimationClip) - { - animationList.Add(assetPreloadData); - } - } - - if (animator != null) - { - var saveFolderDialog1 = new OpenFolderDialog(); - if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) - { - var exportPath = saveFolderDialog1.Folder + "\\Animator\\"; - ExportAnimatorWithAnimationClip(animator, animationList, exportPath); - } - } - } - - private void exportSelectedObjectsToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportObjects(false); - } - - private void exportObjectswithAnimationClipMenuItem_Click(object sender, EventArgs e) - { - ExportObjects(true); - } - - private void ExportObjects(bool animation) - { - if (sceneTreeView.Nodes.Count > 0) - { - var saveFolderDialog1 = new OpenFolderDialog(); - if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) - { - var exportPath = saveFolderDialog1.Folder + "\\GameObject\\"; - List animationList = null; - if (animation) - { - animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); - if (animationList.Count == 0) - { - animationList = null; - } - } - ExportObjectsWithAnimationClip(exportPath, sceneTreeView.Nodes, animationList); - } - } - else - { - StatusStripUpdate("No Objects available for export"); - } - } - - private void exportSelectedObjectsmergeToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportMergeObjects(false); - } - - private void exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem_Click(object sender, EventArgs e) - { - ExportMergeObjects(true); - } - - private void ExportMergeObjects(bool animation) - { - if (sceneTreeView.Nodes.Count > 0) - { - var gameObjects = new List(); - GetSelectedParentNode(sceneTreeView.Nodes, gameObjects); - var saveFileDialog = new SaveFileDialog(); - saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx"; - saveFileDialog.AddExtension = false; - saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx"; - if (saveFileDialog.ShowDialog() == DialogResult.OK) - { - var exportPath = saveFileDialog.FileName; - List animationList = null; - if (animation) - { - animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); - if (animationList.Count == 0) - { - animationList = null; - } - } - ExportObjectsMergeWithAnimationClip(exportPath, gameObjects, animationList); - } - } - } - - private void jumpToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) - { - var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; - if (selectasset.TreeNode != null) - { - sceneTreeView.SelectedNode = selectasset.TreeNode; - tabControl1.SelectedTab = tabPage1; - } - } - - private void exportAllAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(1, ExportType.Convert); - } - - private void exportSelectedAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(2, ExportType.Convert); - } - - private void exportFilteredAssetsMenuItem_Click(object sender, EventArgs e) - { - ExportAssets(3, ExportType.Convert); - } - - private void toolStripMenuItem4_Click(object sender, EventArgs e) - { - ExportAssets(1, ExportType.Raw); - } - - private void toolStripMenuItem5_Click(object sender, EventArgs e) - { - ExportAssets(2, ExportType.Raw); - } - - private void toolStripMenuItem6_Click(object sender, EventArgs e) - { - ExportAssets(3, ExportType.Raw); - } - - private void toolStripMenuItem7_Click(object sender, EventArgs e) - { - ExportAssets(1, ExportType.Dump); - } - - private void toolStripMenuItem8_Click(object sender, EventArgs e) - { - ExportAssets(2, ExportType.Dump); - } - - private void toolStripMenuItem9_Click(object sender, EventArgs e) - { - ExportAssets(3, ExportType.Dump); - } - - private void exportAllObjectssplitToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (sceneTreeView.Nodes.Count > 0) - { - var saveFolderDialog1 = new OpenFolderDialog(); - if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) - { - var savePath = saveFolderDialog1.Folder + "\\"; - ExportSplitObjects(savePath, sceneTreeView.Nodes); - } - } - else - { - StatusStripUpdate("No Objects available for export"); - } - } - - private List GetSelectedAssets() - { - var selectedAssets = new List(assetListView.SelectedIndices.Count); - foreach (int index in assetListView.SelectedIndices) - { - selectedAssets.Add((AssetItem)assetListView.Items[index]); - } - - return selectedAssets; - } - - private void FilterAssetList() - { - assetListView.BeginUpdate(); - assetListView.SelectedIndices.Clear(); - var show = new List(); - if (!allToolStripMenuItem.Checked) - { - for (var i = 1; i < filterTypeToolStripMenuItem.DropDownItems.Count; i++) - { - var item = (ToolStripMenuItem)filterTypeToolStripMenuItem.DropDownItems[i]; - if (item.Checked) - { - show.Add((ClassIDType)Enum.Parse(typeof(ClassIDType), item.Text)); - } - } - visibleAssets = exportableAssets.FindAll(x => show.Contains(x.Type)); - } - else - { - visibleAssets = exportableAssets; - } - if (listSearch.Text != " Filter ") - { - visibleAssets = visibleAssets.FindAll( - x => x.Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0 || - x.SubItems[1].Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0 || - x.SubItems[3].Text.IndexOf(listSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0); - } - assetListView.VirtualListSize = visibleAssets.Count; - assetListView.EndUpdate(); - } - - private void ExportAssets(int type, ExportType exportType) - { - if (exportableAssets.Count > 0) - { - var saveFolderDialog1 = new OpenFolderDialog(); - if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK) - { - timer.Stop(); - - List toExportAssets = null; - switch (type) - { - case 1: //All Assets - toExportAssets = exportableAssets; - break; - case 2: //Selected Assets - toExportAssets = GetSelectedAssets(); - break; - case 3: //Filtered Assets - toExportAssets = visibleAssets; - break; - } - Studio.ExportAssets(saveFolderDialog1.Folder, toExportAssets, exportType); - } - } - else - { - StatusStripUpdate("No exportable assets loaded"); - } - } + #endregion } } diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index 1d09059..205c9fd 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -96,14 +96,15 @@ namespace AssetStudioGUI return extractedCount; } - public static void BuildAssetList(Dictionary tempDic, out string productName) + public static Tuple> BuildAssetData() { StatusStripUpdate("Building asset list..."); - productName = string.Empty; + string productName = null; var assetsNameHash = new HashSet(StringComparer.OrdinalIgnoreCase); - var progressCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count); - int j = 0; + var objectCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count); + var objectAssetItemDic = new Dictionary(objectCount); + int i = 0; Progress.Reset(); foreach (var assetsFile in assetsManager.assetsFileList) { @@ -112,8 +113,8 @@ namespace AssetStudioGUI foreach (var asset in assetsFile.Objects.Values) { var assetItem = new AssetItem(asset); - tempDic.Add(asset, assetItem); - assetItem.UniqueID = " #" + j; + objectAssetItemDic.Add(asset, assetItem); + assetItem.UniqueID = " #" + i; var exportable = false; switch (asset) { @@ -195,8 +196,7 @@ namespace AssetStudioGUI { tempExportableAssets.Add(assetItem); } - - Progress.Report(++j, progressCount); + Progress.Report(++i, objectCount); } foreach (var item in tempExportableAssets) { @@ -213,19 +213,15 @@ namespace AssetStudioGUI exportableAssets.AddRange(tempExportableAssets); tempExportableAssets.Clear(); } - visibleAssets = exportableAssets; assetsNameHash.Clear(); - } - public static List BuildTreeStructure(Dictionary tempDic) - { StatusStripUpdate("Building tree structure..."); var treeNodeCollection = new List(); var treeNodeDictionary = new Dictionary(); - var progressCount = assetsManager.assetsFileList.Count; - int i = 0; + var assetsFileCount = assetsManager.assetsFileList.Count; + int j = 0; Progress.Reset(); foreach (var assetsFile in assetsManager.assetsFileList) { @@ -241,24 +237,26 @@ namespace AssetStudioGUI treeNodeDictionary.Add(m_GameObject, currentNode); } - if (m_GameObject.m_MeshFilter != null) + foreach (var pptr in m_GameObject.m_Components) { - if (m_GameObject.m_MeshFilter.m_Mesh.TryGet(out var m_Mesh)) + if (pptr.TryGet(out var m_Component)) { - var item = tempDic[m_Mesh]; - item.TreeNode = currentNode; + objectAssetItemDic[m_Component].TreeNode = currentNode; + if (m_Component is MeshFilter m_MeshFilter) + { + if (m_MeshFilter.m_Mesh.TryGet(out var m_Mesh)) + { + objectAssetItemDic[m_Mesh].TreeNode = currentNode; + } + } + else if (m_Component is SkinnedMeshRenderer m_SkinnedMeshRenderer) + { + if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out var m_Mesh)) + { + objectAssetItemDic[m_Mesh].TreeNode = currentNode; + } + } } - tempDic[m_GameObject.m_MeshFilter].TreeNode = currentNode; - } - - if (m_GameObject.m_SkinnedMeshRenderer != null) - { - if (m_GameObject.m_SkinnedMeshRenderer.m_Mesh.TryGet(out var m_Mesh)) - { - var item = tempDic[m_Mesh]; - item.TreeNode = currentNode; - } - tempDic[m_GameObject.m_SkinnedMeshRenderer].TreeNode = currentNode; } var parentNode = fileNode; @@ -287,12 +285,13 @@ namespace AssetStudioGUI treeNodeCollection.Add(fileNode); } - Progress.Report(++i, progressCount); + Progress.Report(++j, assetsFileCount); } - treeNodeDictionary.Clear(); - return treeNodeCollection; + objectAssetItemDic.Clear(); + + return new Tuple>(productName, treeNodeCollection); } public static Dictionary> BuildClassStructure()