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();
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;
}
}

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)
{
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)
{
foreach (TreeNode i in nodes)