- [Core] Export multiple AssetMap formats

This commit is contained in:
Razmoth
2023-10-18 18:26:29 +04:00
parent a3489cf025
commit 92c52ac108
7 changed files with 101 additions and 104 deletions

View File

@@ -82,7 +82,7 @@
<setting name="enableResolveDependencies" serializeAs="String"> <setting name="enableResolveDependencies" serializeAs="String">
<value>True</value> <value>True</value>
</setting> </setting>
<setting name="selectedAssetMapType" serializeAs="String"> <setting name="assetMapType" serializeAs="String">
<value>0</value> <value>0</value>
</setting> </setting>
<setting name="collectAnimations" serializeAs="String"> <setting name="collectAnimations" serializeAs="String">

View File

@@ -114,7 +114,6 @@ namespace AssetStudio.GUI
toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox(); assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox();
buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
assetMapTypeComboBox = new System.Windows.Forms.ToolStripComboBox();
toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -172,6 +171,7 @@ namespace AssetStudio.GUI
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();
assetMapTypeMenuItem = 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();
@@ -723,7 +723,7 @@ namespace AssetStudio.GUI
// //
// miscToolStripMenuItem // miscToolStripMenuItem
// //
miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeComboBox, toolStripSeparator8, loadAIToolStripMenuItem, assetBrowserToolStripMenuItem }); miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeMenuItem, toolStripSeparator8, loadAIToolStripMenuItem, assetBrowserToolStripMenuItem });
miscToolStripMenuItem.Name = "miscToolStripMenuItem"; miscToolStripMenuItem.Name = "miscToolStripMenuItem";
miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20); miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20);
miscToolStripMenuItem.Text = "Misc."; miscToolStripMenuItem.Text = "Misc.";
@@ -774,13 +774,6 @@ namespace AssetStudio.GUI
buildAssetMapToolStripMenuItem.Text = "Build AssetMap"; buildAssetMapToolStripMenuItem.Text = "Build AssetMap";
buildAssetMapToolStripMenuItem.Click += buildAssetMapToolStripMenuItem_Click; buildAssetMapToolStripMenuItem.Click += buildAssetMapToolStripMenuItem_Click;
// //
// assetMapTypeComboBox
//
assetMapTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
assetMapTypeComboBox.Name = "assetMapTypeComboBox";
assetMapTypeComboBox.Size = new System.Drawing.Size(121, 23);
assetMapTypeComboBox.SelectedIndexChanged += assetMapTypeComboBox_SelectedIndexChanged;
//
// toolStripSeparator8 // toolStripSeparator8
// //
toolStripSeparator8.Name = "toolStripSeparator8"; toolStripSeparator8.Name = "toolStripSeparator8";
@@ -1344,6 +1337,13 @@ namespace AssetStudio.GUI
showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Visible = false;
showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click;
// //
// assetMapTypeMenuItem
//
assetMapTypeMenuItem.Name = "assetMapTypeMenuItem";
assetMapTypeMenuItem.Size = new System.Drawing.Size(181, 22);
assetMapTypeMenuItem.Text = "AssetMap Type";
assetMapTypeMenuItem.DropDownItemClicked += assetMapTypeMenuItem_DropDownItemClicked;
//
// MainForm // MainForm
// //
AllowDrop = true; AllowDrop = true;
@@ -1513,7 +1513,6 @@ namespace AssetStudio.GUI
private System.Windows.Forms.ToolStripMenuItem loadAIToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem loadAIToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem clearConsoleToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem clearConsoleToolStripMenuItem;
private System.Windows.Forms.ToolStripTextBox assetMapNameTextBox; private System.Windows.Forms.ToolStripTextBox assetMapNameTextBox;
private System.Windows.Forms.ToolStripComboBox assetMapTypeComboBox;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem;
@@ -1533,6 +1532,7 @@ namespace AssetStudio.GUI
private System.Windows.Forms.ToolStripMenuItem enableFileLogging; private System.Windows.Forms.ToolStripMenuItem enableFileLogging;
private System.Windows.Forms.ToolStripMenuItem enableVerbose; private System.Windows.Forms.ToolStripMenuItem enableVerbose;
private System.Windows.Forms.ToolStripMenuItem sceneHierarchy; private System.Windows.Forms.ToolStripMenuItem sceneHierarchy;
private System.Windows.Forms.ToolStripMenuItem assetMapTypeMenuItem;
} }
} }

View File

@@ -143,8 +143,13 @@ namespace AssetStudio.GUI
private void InitalizeOptions() private void InitalizeOptions()
{ {
assetMapTypeComboBox.Items.AddRange(Enum.GetValues<ExportListType>().Cast<object>().ToArray()); var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType;
assetMapTypeComboBox.SelectedIndex = Properties.Settings.Default.selectedAssetMapType; var assetMapTypes = Enum.GetValues<ExportListType>().ToArray()[1..];
foreach(var mapType in assetMapTypes)
{
var menuItem = new ToolStripMenuItem(mapType.ToString()) { CheckOnClick = true, Checked = assetMapType.HasFlag(mapType), Tag = (int)mapType };
assetMapTypeMenuItem.DropDownItems.Add(menuItem);
}
specifyGame.Items.AddRange(GameManager.GetGames()); specifyGame.Items.AddRange(GameManager.GetGames());
specifyGame.SelectedIndex = Properties.Settings.Default.selectedGame; specifyGame.SelectedIndex = Properties.Settings.Default.selectedGame;
@@ -1281,7 +1286,7 @@ namespace AssetStudio.GUI
var model = new ModelConverter(m_Animator, Properties.Settings.Default.convertType, Studio.Game, false, Array.Empty<AnimationClip>()); var model = new ModelConverter(m_Animator, Properties.Settings.Default.convertType, Studio.Game, false, Array.Empty<AnimationClip>());
PreviewModel(model); PreviewModel(model);
} }
private void PreviewAnimationClip(AnimationClip clip) private void PreviewAnimationClip(AnimationClip clip)
{ {
var str = clip.Convert(); var str = clip.Convert();
@@ -2017,10 +2022,24 @@ namespace AssetStudio.GUI
SkipContainer = skipContainer.Checked; SkipContainer = skipContainer.Checked;
} }
private void assetMapTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) private void assetMapTypeMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{ {
Properties.Settings.Default.selectedAssetMapType = assetMapTypeComboBox.SelectedIndex; var assetMapType = Properties.Settings.Default.assetMapType;
Properties.Settings.Default.Save(); if (e.ClickedItem is ToolStripMenuItem item)
{
if (item.Checked)
{
assetMapType -= (int)item.Tag;
}
else
{
assetMapType += (int)item.Tag;
}
Properties.Settings.Default.assetMapType = assetMapType;
Properties.Settings.Default.Save();
}
} }
private void modelsOnly_CheckedChanged(object sender, EventArgs e) private void modelsOnly_CheckedChanged(object sender, EventArgs e)
{ {
@@ -2143,7 +2162,7 @@ namespace AssetStudio.GUI
var input = MapNameComboBox.Text; var input = MapNameComboBox.Text;
var selectedText = MapNameComboBox.SelectedText; var selectedText = MapNameComboBox.SelectedText;
var exportListType = (ExportListType)assetMapTypeComboBox.SelectedItem; var exportListType = (ExportListType)assetMapTypeMenuItem.DropDownItems.Cast<ToolStripMenuItem>().Select(x => x.Checked ? (int)x.Tag : 0).Sum();
var name = ""; var name = "";
if (!string.IsNullOrEmpty(selectedText)) if (!string.IsNullOrEmpty(selectedText))
@@ -2192,15 +2211,6 @@ namespace AssetStudio.GUI
saveFolderDialog.Title = "Select Output Folder"; saveFolderDialog.Title = "Select Output Folder";
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK) if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
{ {
if (File.Exists(Path.Combine(saveFolderDialog.Folder, $"{name}{exportListType.GetExtension()}")))
{
var acceptOverride = MessageBox.Show("AssetMap already exist, Do you want to override it ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (acceptOverride != DialogResult.Yes)
{
InvokeUpdate(miscToolStripMenuItem, true);
return;
}
}
saveDirectoryBackup = saveFolderDialog.Folder; saveDirectoryBackup = saveFolderDialog.Folder;
AssetsHelper.SetUnityVersion(version); AssetsHelper.SetUnityVersion(version);
await Task.Run(() => AssetsHelper.BuildBoth(files, name, openFolderDialog.Folder, Studio.Game, saveFolderDialog.Folder, exportListType)); await Task.Run(() => AssetsHelper.BuildBoth(files, name, openFolderDialog.Folder, Studio.Game, saveFolderDialog.Folder, exportListType));
@@ -2317,7 +2327,7 @@ namespace AssetStudio.GUI
InvokeUpdate(miscToolStripMenuItem, false); InvokeUpdate(miscToolStripMenuItem, false);
var input = assetMapNameTextBox.Text; var input = assetMapNameTextBox.Text;
var exportListType = (ExportListType)assetMapTypeComboBox.SelectedItem; var exportListType = (ExportListType)assetMapTypeMenuItem.DropDownItems.Cast<ToolStripMenuItem>().Select(x => x.Checked ? (int)x.Tag : 0).Sum();
var name = "assets_map"; var name = "assets_map";
if (!string.IsNullOrEmpty(input)) if (!string.IsNullOrEmpty(input))
@@ -2346,16 +2356,6 @@ namespace AssetStudio.GUI
saveFolderDialog.Title = "Select Output Folder"; saveFolderDialog.Title = "Select Output Folder";
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK) if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
{ {
if (File.Exists(Path.Combine(saveFolderDialog.Folder, $"{name}{exportListType.GetExtension()}")))
{
var acceptOverride = MessageBox.Show("AssetMap already exist, Do you want to override it ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (acceptOverride != DialogResult.Yes)
{
InvokeUpdate(miscToolStripMenuItem, true);
return;
}
}
saveDirectoryBackup = saveFolderDialog.Folder;
AssetsHelper.SetUnityVersion(version); AssetsHelper.SetUnityVersion(version);
await Task.Run(() => AssetsHelper.BuildAssetMap(files, name, Studio.Game, saveFolderDialog.Folder, exportListType)); await Task.Run(() => AssetsHelper.BuildAssetMap(files, name, Studio.Game, saveFolderDialog.Folder, exportListType));
} }

View File

@@ -12,7 +12,7 @@ namespace AssetStudio.GUI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -338,12 +338,12 @@ namespace AssetStudio.GUI.Properties {
[global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")] [global::System.Configuration.DefaultSettingValueAttribute("0")]
public int selectedAssetMapType { public int assetMapType {
get { get {
return ((int)(this["selectedAssetMapType"])); return ((int)(this["assetMapType"]));
} }
set { set {
this["selectedAssetMapType"] = value; this["assetMapType"] = value;
} }
} }

View File

@@ -80,7 +80,7 @@
<Setting Name="enableResolveDependencies" Type="System.Boolean" Scope="User"> <Setting Name="enableResolveDependencies" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value> <Value Profile="(Default)">True</Value>
</Setting> </Setting>
<Setting Name="selectedAssetMapType" Type="System.Int32" Scope="User"> <Setting Name="assetMapType" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value> <Value Profile="(Default)">0</Value>
</Setting> </Setting>
<Setting Name="collectAnimations" Type="System.Boolean" Scope="User"> <Setting Name="collectAnimations" Type="System.Boolean" Scope="User">

View File

@@ -510,56 +510,60 @@ namespace AssetStudio
Progress.Reset(); Progress.Reset();
string filename = Path.Combine(savePath, $"{name}{exportListType.GetExtension()}"); string filename = string.Empty;
switch (exportListType) if (exportListType.Equals(ExportListType.None))
{ {
case ExportListType.XML: Logger.Info($"No export list type has been selected, skipping...");
var xmlSettings = new XmlWriterSettings() { Indent = true };
using (XmlWriter writer = XmlWriter.Create(filename, xmlSettings))
{
writer.WriteStartDocument();
writer.WriteStartElement("Assets");
writer.WriteAttributeString("filename", filename);
writer.WriteAttributeString("createdAt", DateTime.UtcNow.ToString("s"));
foreach(var asset in toExportAssets)
{
writer.WriteStartElement("Asset");
writer.WriteElementString("Name", asset.Name);
writer.WriteElementString("Container", asset.Container);
writer.WriteStartElement("Type");
writer.WriteAttributeString("id", ((int)asset.Type).ToString());
writer.WriteValue(asset.Type.ToString());
writer.WriteEndElement();
writer.WriteElementString("PathID", asset.PathID.ToString());
writer.WriteElementString("Source", asset.Source);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
break;
case ExportListType.JSON:
using (StreamWriter file = File.CreateText(filename))
{
var serializer = new JsonSerializer() { Formatting = Newtonsoft.Json.Formatting.Indented };
serializer.Converters.Add(new StringEnumConverter());
serializer.Serialize(file, toExportAssets);
}
break;
case ExportListType.MessagePack:
using (var file = File.Create(filename))
{
var assetMap = new AssetMap
{
GameType = game.Type,
AssetEntries = toExportAssets
};
MessagePackSerializer.Serialize(file, assetMap, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
}
break;
} }
else
{
if (exportListType.HasFlag(ExportListType.XML))
{
filename = Path.Combine(savePath, $"{name}.xml");
var xmlSettings = new XmlWriterSettings() { Indent = true };
using XmlWriter writer = XmlWriter.Create(filename, xmlSettings);
writer.WriteStartDocument();
writer.WriteStartElement("Assets");
writer.WriteAttributeString("filename", filename);
writer.WriteAttributeString("createdAt", DateTime.UtcNow.ToString("s"));
foreach (var asset in toExportAssets)
{
writer.WriteStartElement("Asset");
writer.WriteElementString("Name", asset.Name);
writer.WriteElementString("Container", asset.Container);
writer.WriteStartElement("Type");
writer.WriteAttributeString("id", ((int)asset.Type).ToString());
writer.WriteValue(asset.Type.ToString());
writer.WriteEndElement();
writer.WriteElementString("PathID", asset.PathID.ToString());
writer.WriteElementString("Source", asset.Source);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
if (exportListType.HasFlag(ExportListType.JSON))
{
filename = Path.Combine(savePath, $"{name}.json");
using StreamWriter file = File.CreateText(filename);
var serializer = new JsonSerializer() { Formatting = Newtonsoft.Json.Formatting.Indented };
serializer.Converters.Add(new StringEnumConverter());
serializer.Serialize(file, toExportAssets);
}
if (exportListType.HasFlag(ExportListType.MessagePack))
{
filename = Path.Combine(savePath, $"{name}.map");
using var file = File.Create(filename);
var assetMap = new AssetMap
{
GameType = game.Type,
AssetEntries = toExportAssets
};
MessagePackSerializer.Serialize(file, assetMap, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray));
}
Logger.Info($"Finished buidling AssetMap with {toExportAssets.Length} assets."); Logger.Info($"Finished buidling AssetMap with {toExportAssets.Length} assets.");
}
resetEvent?.Set(); resetEvent?.Set();
}); });

View File

@@ -1,20 +1,13 @@
namespace AssetStudio using System;
namespace AssetStudio
{ {
[Flags]
public enum ExportListType public enum ExportListType
{ {
None,
MessagePack,
XML, XML,
JSON, JSON = 4,
MessagePack
}
public static class ExportListTypeExtensions
{
public static string GetExtension(this ExportListType type) => type switch
{
ExportListType.XML => ".xml",
ExportListType.JSON => ".json",
ExportListType.MessagePack => ".map",
_ => throw new System.NotImplementedException(),
};
} }
} }