diff --git a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs index 8f43691..0f9dde2 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.Designer.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.Designer.cs @@ -157,6 +157,9 @@ namespace AssetStudioGUI exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + exportSelectedNodessplitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); @@ -334,7 +337,7 @@ namespace AssetStudioGUI // // modelToolStripMenuItem // - modelToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { exportAllObjectssplitToolStripMenuItem1, exportSelectedObjectsToolStripMenuItem, exportSelectedObjectsWithAnimationClipToolStripMenuItem, toolStripSeparator1, exportSelectedObjectsmergeToolStripMenuItem, exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem }); + modelToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { exportAllObjectssplitToolStripMenuItem1, exportSelectedObjectsToolStripMenuItem, exportSelectedObjectsWithAnimationClipToolStripMenuItem, toolStripSeparator1, exportSelectedObjectsmergeToolStripMenuItem, exportSelectedObjectsmergeWithAnimationClipToolStripMenuItem, toolStripSeparator9, exportSelectedNodessplitToolStripMenuItem, exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem }); modelToolStripMenuItem.Name = "modelToolStripMenuItem"; modelToolStripMenuItem.Size = new System.Drawing.Size(53, 20); modelToolStripMenuItem.Text = "Model"; @@ -1226,6 +1229,25 @@ namespace AssetStudioGUI showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; // + // toolStripSeparator9 + // + toolStripSeparator9.Name = "toolStripSeparator9"; + toolStripSeparator9.Size = new System.Drawing.Size(379, 6); + // + // exportSelectedNodessplitToolStripMenuItem + // + exportSelectedNodessplitToolStripMenuItem.Name = "exportSelectedNodessplitToolStripMenuItem"; + exportSelectedNodessplitToolStripMenuItem.Size = new System.Drawing.Size(382, 22); + exportSelectedNodessplitToolStripMenuItem.Text = "Export selected nodes (split)"; + exportSelectedNodessplitToolStripMenuItem.Click += exportSelectedNodessplitToolStripMenuItem_Click; + // + // exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem + // + exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem.Name = "exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem"; + exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem.Size = new System.Drawing.Size(382, 22); + exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem.Text = "Export selected nodes (split) + selected AnimationClips"; + exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem.Click += exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem_Click; + // // AssetStudioGUIForm // AllowDrop = true; @@ -1400,6 +1422,9 @@ namespace AssetStudioGUI private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem assetBrowserToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem exportSelectedNodessplitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem; } } diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 20f5a9b..14d004d 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -1578,6 +1578,41 @@ namespace AssetStudioGUI } } + private void exportSelectedNodessplitToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportNodes(false); + } + + private void exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem_Click(object sender, EventArgs e) + { + ExportNodes(true); + } + + private void ExportNodes(bool animation) + { + if (sceneTreeView.Nodes.Count > 0) + { + var saveFolderDialog = new OpenFolderDialog(); + saveFolderDialog.InitialFolder = saveDirectoryBackup; + if (saveFolderDialog.ShowDialog(this) == DialogResult.OK) + { + saveDirectoryBackup = saveFolderDialog.Folder; + var exportPath = Path.Combine(saveFolderDialog.Folder, "GameObject") + Path.DirectorySeparatorChar; + var roots = sceneTreeView.Nodes.Cast().Where(x => x.Level == 0 && x.Checked).ToList(); + List animationList = null; + if (animation) + { + animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); + if (animationList.Count == 0) + { + animationList = null; + } + } + ExportNodesWithAnimationClip(exportPath, roots, animationList); + } + } + } + private void goToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) { var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index a1b6b5e..1afaf7b 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -850,6 +850,45 @@ namespace AssetStudioGUI }); } + public static void ExportNodesWithAnimationClip(string exportPath, List nodes, List animationList = null) + { + ThreadPool.QueueUserWorkItem(state => + { + int i = 0; + Progress.Reset(); + foreach (var node in nodes) + { + var name = node.Text; + StatusStripUpdate($"Exporting {name}"); + var gameObjects = new List(); + GetSelectedParentNode(node.Nodes, gameObjects); + if (gameObjects.Count > 0) + { + var subExportPath = exportPath + Path.Combine(node.Text, FixFileName(node.Text) + ".fbx"); + try + { + ExportGameObjectMerge(gameObjects, subExportPath, animationList); + Progress.Report(++i, nodes.Count); + StatusStripUpdate($"Finished exporting {name}"); + } + catch (Exception ex) + { + MessageBox.Show($"Export Model:{name} error\r\n{ex.Message}\r\n{ex.StackTrace}"); + StatusStripUpdate("Error in export"); + } + } + else + { + StatusStripUpdate("Empty node selected for export."); + } + } + if (Properties.Settings.Default.openAfterExport) + { + OpenFolderInExplorer(exportPath); + } + }); + } + public static void GetSelectedParentNode(TreeNodeCollection nodes, List gameObjects) { foreach (TreeNode i in nodes)