diff --git a/HSDRawViewer/ContextMenus/JOBJContextMenu.cs b/HSDRawViewer/ContextMenus/JOBJContextMenu.cs index d801413..0223057 100644 --- a/HSDRawViewer/ContextMenus/JOBJContextMenu.cs +++ b/HSDRawViewer/ContextMenus/JOBJContextMenu.cs @@ -24,6 +24,21 @@ public JOBJContextMenu() : base() }; Items.Add(Import); + ToolStripMenuItem ImportSheet = new ToolStripMenuItem("Import Model Info Sheet From File"); + ImportSheet.Click += (sender, args) => + { + if (MainForm.SelectedDataNode.Accessor is HSD_JOBJ root) + { + MainForm.SelectedDataNode.Collapse(); + var f = Tools.FileIO.OpenFile("JSON (*.json)|*.json"); + if (f != null) + { + ModelInfoSheet infoSheet = ModelInfoSheet.Import(f); + infoSheet.updateJobj(root); + } + } + }; + Items.Add(ImportSheet); ToolStripMenuItem GenerateMatAnimJoint = new ToolStripMenuItem("Generate and Export MatAnimJoint Structure"); GenerateMatAnimJoint.Click += (sender, args) => diff --git a/HSDRawViewer/Converters/ModelInfoSheet.cs b/HSDRawViewer/Converters/ModelInfoSheet.cs index 333032b..69772ff 100644 --- a/HSDRawViewer/Converters/ModelInfoSheet.cs +++ b/HSDRawViewer/Converters/ModelInfoSheet.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; +using System.Windows.Forms; namespace HSDRawViewer.Converters { @@ -30,7 +31,12 @@ public class ModelInfoSheet { private HashSet textures = new HashSet(); - public List Objects { get; set; } = new List(); + public List Objects { get; set; } = new List(); + + public ModelInfoSheet() + { + // Necessary in order to deserialize + } /// /// @@ -88,6 +94,47 @@ private void ProcessTexture(HSD_TOBJ texture) } } + public void updateJobj(HSD_JOBJ jobj) + { + int sheetSize = Objects.Count; + int nodeSize = 0; + foreach (var x in jobj.TreeList) + { + if (x.Dobj != null) + { + nodeSize += x.Dobj.List.Count; + } + } + if (sheetSize != nodeSize) + { + string message = "The model info sheet you are importing has {0} objects but the current model has {1}."; + MessageBox.Show(String.Format(message, sheetSize, nodeSize), "Invalid Model Info Sheet"); + return; + } + + int objectIndex = 0; + foreach (var j in jobj.TreeList) + { + if (j.Dobj != null) + { + foreach (var dobj in j.Dobj.List) + { + MI_Object current = this.Objects[objectIndex]; + + var mobj = dobj.Mobj; + var mat = mobj.Material; + + mat.AmbientColor = System.Drawing.Color.FromArgb(Convert.ToInt32(current.Ambient, 16)); + mat.DiffuseColor = System.Drawing.Color.FromArgb(Convert.ToInt32(current.Diffuse, 16)); + mat.SpecularColor = System.Drawing.Color.FromArgb(Convert.ToInt32(current.Specular, 16)); + mat.Shininess = current.Shininess; + mat.Alpha = current.Alpha; + objectIndex++; + } + } + } + } + /// /// /// @@ -98,6 +145,16 @@ public void Export(string filepath) File.WriteAllText(filepath, json); } + /// + /// + /// + /// + public static ModelInfoSheet Import(string filepath) + { + string json = File.ReadAllText(filepath); + return JsonSerializer.Deserialize(json); + } + /// /// /// diff --git a/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.Designer.cs b/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.Designer.cs index 92f8cac..c69fbcb 100644 --- a/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.Designer.cs +++ b/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.Designer.cs @@ -33,6 +33,7 @@ private void InitializeComponent() this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStripDropDownButton2 = new System.Windows.Forms.ToolStripDropDownButton(); this.importModelFromFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importModelInfoSheetStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exportModelToFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.importSceneSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -97,6 +98,7 @@ private void InitializeComponent() this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.importModelFromFileToolStripMenuItem, + this.importModelInfoSheetStripMenuItem, this.exportModelToFileToolStripMenuItem, this.toolStripSeparator2, this.importSceneSettingsToolStripMenuItem, @@ -114,6 +116,13 @@ private void InitializeComponent() this.importModelFromFileToolStripMenuItem.Text = "Import Model From File"; this.importModelFromFileToolStripMenuItem.Click += new System.EventHandler(this.importModelFromFileToolStripMenuItem_Click); // + // importModelInfoSheetStripMenuItem + // + this.importModelInfoSheetStripMenuItem.Name = "importModelInfoSheetStripMenuItem"; + this.importModelInfoSheetStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.importModelInfoSheetStripMenuItem.Text = "Import Model Info Sheet From File"; + this.importModelInfoSheetStripMenuItem.Click += new System.EventHandler(this.importModelInfoSheetToolStripMenuItem_Click); + // // exportModelToFileToolStripMenuItem // this.exportModelToFileToolStripMenuItem.Name = "exportModelToFileToolStripMenuItem"; @@ -373,6 +382,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStrip toolStrip1; private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton2; private System.Windows.Forms.ToolStripMenuItem importModelFromFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importModelInfoSheetStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exportModelToFileToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripMenuItem importSceneSettingsToolStripMenuItem; diff --git a/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.cs b/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.cs index 0e4f0bd..98798b9 100644 --- a/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.cs +++ b/HSDRawViewer/GUI/Controls/JObjEditor/JObjEditorNew.cs @@ -614,6 +614,18 @@ private void importModelFromFileToolStripMenuItem_Click(object sender, EventArgs SetJOBJ(_root); } + private void importModelInfoSheetToolStripMenuItem_Click(object sender, EventArgs e) + { + ClearAnimation(); + var f = Tools.FileIO.OpenFile("JSON (*.json)|*.json"); + if (f != null) + { + ModelInfoSheet infoSheet = ModelInfoSheet.Import(f); + infoSheet.updateJobj(_root); + } + SetJOBJ(_root); + } + /// /// ///