Export by nodes

This commit is contained in:
Razmoth
2023-05-11 20:42:38 +04:00
parent 7411939a8f
commit 006a87938c
3 changed files with 100 additions and 1 deletions

View File

@@ -157,6 +157,9 @@ namespace AssetStudioGUI
exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem();
goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
showOriginalFileToolStripMenuItem = 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(); menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit();
splitContainer1.Panel1.SuspendLayout(); splitContainer1.Panel1.SuspendLayout();
@@ -334,7 +337,7 @@ namespace AssetStudioGUI
// //
// modelToolStripMenuItem // 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.Name = "modelToolStripMenuItem";
modelToolStripMenuItem.Size = new System.Drawing.Size(53, 20); modelToolStripMenuItem.Size = new System.Drawing.Size(53, 20);
modelToolStripMenuItem.Text = "Model"; modelToolStripMenuItem.Text = "Model";
@@ -1226,6 +1229,25 @@ namespace AssetStudioGUI
showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Visible = false;
showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; 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 // AssetStudioGUIForm
// //
AllowDrop = true; AllowDrop = true;
@@ -1400,6 +1422,9 @@ namespace AssetStudioGUI
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem assetBrowserToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem assetBrowserToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
private System.Windows.Forms.ToolStripMenuItem exportSelectedNodessplitToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exportSelectedNodessplitSelectedAnimationClipsToolStripMenuItem;
} }
} }

View File

@@ -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<TreeNode>().Where(x => x.Level == 0 && x.Checked).ToList();
List<AssetItem> 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) private void goToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e)
{ {
var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]];

View File

@@ -850,6 +850,45 @@ namespace AssetStudioGUI
}); });
} }
public static void ExportNodesWithAnimationClip(string exportPath, List<TreeNode> nodes, List<AssetItem> 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<GameObject>();
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<GameObject> gameObjects) public static void GetSelectedParentNode(TreeNodeCollection nodes, List<GameObject> gameObjects)
{ {
foreach (TreeNode i in nodes) foreach (TreeNode i in nodes)