- [GUI] Change Scene Hierarchy root node to be original file when available.

This commit is contained in:
Razmoth
2023-09-19 18:35:04 +04:00
parent 2e3dcdc5d9
commit 8b49dd5868
2 changed files with 92 additions and 64 deletions

View File

@@ -640,7 +640,7 @@ namespace AssetStudioGUI
if (saveFileDialog.ShowDialog(this) == DialogResult.OK) if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
{ {
var path = saveFileDialog.FileName; var path = saveFileDialog.FileName;
var nodes = new Dictionary<string, dynamic>(); var nodes = new Dictionary<string, object>();
foreach (TreeNode node in sceneTreeView.Nodes) foreach (TreeNode node in sceneTreeView.Nodes)
{ {
var value = GetNode(node); var value = GetNode(node);
@@ -652,21 +652,32 @@ namespace AssetStudioGUI
} }
} }
private dynamic GetNode(TreeNode treeNode) private object GetNode(TreeNode treeNode)
{ {
if (treeNode.GetNodeCount(true) == 0) var nodes = new Dictionary<string, object>();
foreach (TreeNode node in treeNode.Nodes)
{ {
return string.Empty; if (HasGameObjectNode(node))
}
else
{
var nodes = new Dictionary<string, dynamic>();
var exportableNodes = treeNode.Nodes.Cast<GameObjectTreeNode>().Where(x => x.gameObject.m_Animator != null || (bool)x.gameObject.m_Transform?.m_Father.IsNull).ToList();
foreach (TreeNode node in exportableNodes)
{ {
nodes.TryAdd(node.Text, GetNode(node)); nodes.TryAdd(node.Text, GetNode(node));
} }
return nodes; }
return nodes.Count == 0 ? string.Empty : nodes;
}
private bool HasGameObjectNode(TreeNode treeNode)
{
if (treeNode is GameObjectTreeNode gameObjectNode && !(bool)gameObjectNode.gameObject.m_Transform?.m_Father.IsNull)
{
return gameObjectNode.gameObject.m_Animator != null;
}
else
{
foreach (TreeNode node in treeNode.Nodes)
{
return HasGameObjectNode(node);
}
return false;
} }
} }

View File

@@ -421,12 +421,16 @@ namespace AssetStudioGUI
var treeNodeCollection = new List<TreeNode>(); var treeNodeCollection = new List<TreeNode>();
var treeNodeDictionary = new Dictionary<GameObject, GameObjectTreeNode>(); var treeNodeDictionary = new Dictionary<GameObject, GameObjectTreeNode>();
var assetsFileCount = assetsManager.assetsFileList.Count;
int j = 0; int j = 0;
Progress.Reset(); Progress.Reset();
foreach (var assetsFile in assetsManager.assetsFileList) var files = assetsManager.assetsFileList.GroupBy(x => x.originalPath ?? string.Empty).OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.ToList());
foreach (var (file, assetsFiles) in files)
{ {
var fileNode = new TreeNode(assetsFile.fileName); //RootNode var fileNode = !string.IsNullOrEmpty(file) ? new TreeNode(Path.GetFileName(file)) : null; //RootNode
foreach (var assetsFile in assetsFiles)
{
var assetsFileNode = new TreeNode(assetsFile.fileName);
foreach (var obj in assetsFile.Objects) foreach (var obj in assetsFile.Objects)
{ {
@@ -466,7 +470,7 @@ namespace AssetStudioGUI
} }
} }
var parentNode = fileNode; var parentNode = assetsFileNode;
if (m_GameObject.m_Transform != null) if (m_GameObject.m_Transform != null)
{ {
@@ -488,12 +492,25 @@ namespace AssetStudioGUI
} }
} }
if (fileNode.Nodes.Count > 0) if (assetsFileNode.Nodes.Count > 0)
{
if (fileNode == null)
{
treeNodeCollection.Add(assetsFileNode);
}
else
{
fileNode.Nodes.Add(assetsFileNode);
}
}
}
if (fileNode?.Nodes.Count > 0)
{ {
treeNodeCollection.Add(fileNode); treeNodeCollection.Add(fileNode);
} }
Progress.Report(++j, assetsFileCount); Progress.Report(++j, files.Count);
} }
treeNodeDictionary.Clear(); treeNodeDictionary.Clear();