diff --git a/Z64 Utils/Forms/ObjectAnalyzerForm.Designer.cs b/Z64 Utils/Forms/ObjectAnalyzerForm.Designer.cs index 61bd12d..1806440 100644 --- a/Z64 Utils/Forms/ObjectAnalyzerForm.Designer.cs +++ b/Z64 Utils/Forms/ObjectAnalyzerForm.Designer.cs @@ -41,24 +41,24 @@ "Vertex"}, -1); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ObjectAnalyzerForm)); this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.ucodeTextBox = new System.Windows.Forms.TextBox(); - this.tabPage3 = new System.Windows.Forms.TabPage(); + this.tabPage_empty = new System.Windows.Forms.TabPage(); + this.tabPage_text = new System.Windows.Forms.TabPage(); + this.textBox_holderInfo = new System.Windows.Forms.TextBox(); + this.tabPage_texture = new System.Windows.Forms.TabPage(); this.pic_texture = new Z64.Forms.TextureBox(); - this.tabPage4 = new System.Windows.Forms.TabPage(); + this.tabPage_vtx = new System.Windows.Forms.TabPage(); this.listView_vtx = new System.Windows.Forms.ListView(); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.tabPage5 = new System.Windows.Forms.TabPage(); + this.columnHeader4 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader5 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader6 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader7 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader8 = new System.Windows.Forms.ColumnHeader(); + this.tabPage_unknow = new System.Windows.Forms.TabPage(); this.hexBox1 = new Be.Windows.Forms.HexBox(); this.listView_map = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.columnHeader3 = new System.Windows.Forms.ColumnHeader(); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.showInDisplayViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.addToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -77,11 +77,11 @@ this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.tabControl1.SuspendLayout(); - this.tabPage2.SuspendLayout(); - this.tabPage3.SuspendLayout(); + this.tabPage_text.SuspendLayout(); + this.tabPage_texture.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pic_texture)).BeginInit(); - this.tabPage4.SuspendLayout(); - this.tabPage5.SuspendLayout(); + this.tabPage_vtx.SuspendLayout(); + this.tabPage_unknow.SuspendLayout(); this.contextMenuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); @@ -91,11 +91,11 @@ this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Controls.Add(this.tabPage2); - this.tabControl1.Controls.Add(this.tabPage3); - this.tabControl1.Controls.Add(this.tabPage4); - this.tabControl1.Controls.Add(this.tabPage5); + this.tabControl1.Controls.Add(this.tabPage_empty); + this.tabControl1.Controls.Add(this.tabPage_text); + this.tabControl1.Controls.Add(this.tabPage_texture); + this.tabControl1.Controls.Add(this.tabPage_vtx); + this.tabControl1.Controls.Add(this.tabPage_unknow); this.tabControl1.ItemSize = new System.Drawing.Size(47, 18); this.tabControl1.Location = new System.Drawing.Point(377, 27); this.tabControl1.MinimumSize = new System.Drawing.Size(357, 207); @@ -104,52 +104,52 @@ this.tabControl1.Size = new System.Drawing.Size(632, 499); this.tabControl1.TabIndex = 8; // - // tabPage1 + // tabPage_empty // - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(624, 473); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "nothing"; - this.tabPage1.UseVisualStyleBackColor = true; + this.tabPage_empty.Location = new System.Drawing.Point(4, 22); + this.tabPage_empty.Name = "tabPage_empty"; + this.tabPage_empty.Padding = new System.Windows.Forms.Padding(3); + this.tabPage_empty.Size = new System.Drawing.Size(624, 473); + this.tabPage_empty.TabIndex = 0; + this.tabPage_empty.Text = "nothing"; + this.tabPage_empty.UseVisualStyleBackColor = true; // - // tabPage2 + // tabPage_text // - this.tabPage2.Controls.Add(this.ucodeTextBox); - this.tabPage2.Location = new System.Drawing.Point(4, 22); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(624, 473); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "ucode"; - this.tabPage2.UseVisualStyleBackColor = true; + this.tabPage_text.Controls.Add(this.textBox_holderInfo); + this.tabPage_text.Location = new System.Drawing.Point(4, 22); + this.tabPage_text.Name = "tabPage_text"; + this.tabPage_text.Padding = new System.Windows.Forms.Padding(3); + this.tabPage_text.Size = new System.Drawing.Size(624, 473); + this.tabPage_text.TabIndex = 1; + this.tabPage_text.Text = "ucode"; + this.tabPage_text.UseVisualStyleBackColor = true; // - // ucodeTextBox + // textBox_holderInfo // - this.ucodeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.textBox_holderInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.ucodeTextBox.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ucodeTextBox.Location = new System.Drawing.Point(6, 6); - this.ucodeTextBox.Multiline = true; - this.ucodeTextBox.Name = "ucodeTextBox"; - this.ucodeTextBox.ReadOnly = true; - this.ucodeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.ucodeTextBox.Size = new System.Drawing.Size(617, 461); - this.ucodeTextBox.TabIndex = 7; - this.ucodeTextBox.WordWrap = false; + this.textBox_holderInfo.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox_holderInfo.Location = new System.Drawing.Point(6, 6); + this.textBox_holderInfo.Multiline = true; + this.textBox_holderInfo.Name = "textBox_holderInfo"; + this.textBox_holderInfo.ReadOnly = true; + this.textBox_holderInfo.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBox_holderInfo.Size = new System.Drawing.Size(617, 461); + this.textBox_holderInfo.TabIndex = 7; + this.textBox_holderInfo.WordWrap = false; // - // tabPage3 + // tabPage_texture // - this.tabPage3.Controls.Add(this.pic_texture); - this.tabPage3.Location = new System.Drawing.Point(4, 22); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.Padding = new System.Windows.Forms.Padding(3); - this.tabPage3.Size = new System.Drawing.Size(624, 473); - this.tabPage3.TabIndex = 2; - this.tabPage3.Text = "texture"; - this.tabPage3.UseVisualStyleBackColor = true; + this.tabPage_texture.Controls.Add(this.pic_texture); + this.tabPage_texture.Location = new System.Drawing.Point(4, 22); + this.tabPage_texture.Name = "tabPage_texture"; + this.tabPage_texture.Padding = new System.Windows.Forms.Padding(3); + this.tabPage_texture.Size = new System.Drawing.Size(624, 473); + this.tabPage_texture.TabIndex = 2; + this.tabPage_texture.Text = "texture"; + this.tabPage_texture.UseVisualStyleBackColor = true; // // pic_texture // @@ -165,16 +165,16 @@ this.pic_texture.TabIndex = 0; this.pic_texture.TabStop = false; // - // tabPage4 + // tabPage_vtx // - this.tabPage4.Controls.Add(this.listView_vtx); - this.tabPage4.Location = new System.Drawing.Point(4, 22); - this.tabPage4.Name = "tabPage4"; - this.tabPage4.Padding = new System.Windows.Forms.Padding(3); - this.tabPage4.Size = new System.Drawing.Size(624, 473); - this.tabPage4.TabIndex = 3; - this.tabPage4.Text = "vertex"; - this.tabPage4.UseVisualStyleBackColor = true; + this.tabPage_vtx.Controls.Add(this.listView_vtx); + this.tabPage_vtx.Location = new System.Drawing.Point(4, 22); + this.tabPage_vtx.Name = "tabPage_vtx"; + this.tabPage_vtx.Padding = new System.Windows.Forms.Padding(3); + this.tabPage_vtx.Size = new System.Drawing.Size(624, 473); + this.tabPage_vtx.TabIndex = 3; + this.tabPage_vtx.Text = "vertex"; + this.tabPage_vtx.UseVisualStyleBackColor = true; // // listView_vtx // @@ -187,7 +187,7 @@ this.columnHeader6, this.columnHeader7, this.columnHeader8}); - this.listView_vtx.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.listView_vtx.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.listView_vtx.FullRowSelect = true; this.listView_vtx.HideSelection = false; this.listView_vtx.Items.AddRange(new System.Windows.Forms.ListViewItem[] { @@ -224,16 +224,16 @@ this.columnHeader8.Text = "Normal/Color"; this.columnHeader8.Width = 149; // - // tabPage5 + // tabPage_unknow // - this.tabPage5.Controls.Add(this.hexBox1); - this.tabPage5.Location = new System.Drawing.Point(4, 22); - this.tabPage5.Name = "tabPage5"; - this.tabPage5.Padding = new System.Windows.Forms.Padding(3); - this.tabPage5.Size = new System.Drawing.Size(624, 473); - this.tabPage5.TabIndex = 4; - this.tabPage5.Text = "unknow"; - this.tabPage5.UseVisualStyleBackColor = true; + this.tabPage_unknow.Controls.Add(this.hexBox1); + this.tabPage_unknow.Location = new System.Drawing.Point(4, 22); + this.tabPage_unknow.Name = "tabPage_unknow"; + this.tabPage_unknow.Padding = new System.Windows.Forms.Padding(3); + this.tabPage_unknow.Size = new System.Drawing.Size(624, 473); + this.tabPage_unknow.TabIndex = 4; + this.tabPage_unknow.Text = "unknow"; + this.tabPage_unknow.UseVisualStyleBackColor = true; // // hexBox1 // @@ -241,7 +241,7 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.hexBox1.ColumnInfoVisible = true; - this.hexBox1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.hexBox1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.hexBox1.LineInfoVisible = true; this.hexBox1.Location = new System.Drawing.Point(6, 6); this.hexBox1.Name = "hexBox1"; @@ -262,7 +262,7 @@ this.columnHeader2, this.columnHeader3}); this.listView_map.ContextMenuStrip = this.contextMenuStrip1; - this.listView_map.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.listView_map.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); this.listView_map.FullRowSelect = true; this.listView_map.HideSelection = false; this.listView_map.Items.AddRange(new System.Windows.Forms.ListViewItem[] { @@ -430,12 +430,12 @@ this.Name = "ObjectAnalyzerForm"; this.Text = "Object Analyzer"; this.tabControl1.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - this.tabPage2.PerformLayout(); - this.tabPage3.ResumeLayout(false); + this.tabPage_text.ResumeLayout(false); + this.tabPage_text.PerformLayout(); + this.tabPage_texture.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.pic_texture)).EndInit(); - this.tabPage4.ResumeLayout(false); - this.tabPage5.ResumeLayout(false); + this.tabPage_vtx.ResumeLayout(false); + this.tabPage_unknow.ResumeLayout(false); this.contextMenuStrip1.ResumeLayout(false); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); @@ -447,12 +447,11 @@ #endregion private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage_empty; + private System.Windows.Forms.TabPage tabPage_texture; private TextureBox pic_texture; - private System.Windows.Forms.TabPage tabPage4; - private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TabPage tabPage_vtx; + private System.Windows.Forms.TabPage tabPage_unknow; private System.Windows.Forms.ListView listView_map; private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader2; @@ -460,7 +459,7 @@ private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem findDlistsToolStripMenuItem; - private System.Windows.Forms.TextBox ucodeTextBox; + private System.Windows.Forms.TextBox textBox_holderInfo; private System.Windows.Forms.ToolStripMenuItem analyzeDlistsToolStripMenuItem; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ToolStripMenuItem showInDisplayViewerToolStripMenuItem; @@ -482,5 +481,6 @@ private System.Windows.Forms.OpenFileDialog openFileDialog1; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exportCToolStripMenuItem; + private System.Windows.Forms.TabPage tabPage_text; } } \ No newline at end of file diff --git a/Z64 Utils/Forms/ObjectAnalyzerForm.cs b/Z64 Utils/Forms/ObjectAnalyzerForm.cs index 77d62f7..8e71a0e 100644 --- a/Z64 Utils/Forms/ObjectAnalyzerForm.cs +++ b/Z64 Utils/Forms/ObjectAnalyzerForm.cs @@ -84,11 +84,11 @@ namespace Z64.Forms var lines = disas.Disassemble(); StringWriter sw = new StringWriter(); lines.ForEach(s => sw.WriteLine(s)); - ucodeTextBox.Text = sw.ToString(); + textBox_holderInfo.Text = sw.ToString(); } catch (Exception ex) { - ucodeTextBox.Text = "ERROR"; + textBox_holderInfo.Text = "ERROR"; } } } @@ -126,7 +126,7 @@ namespace Z64.Forms var holder = GetCurrentHolder(); if (holder == null) { - tabControl1.SelectedIndex = 0; + tabControl1.SelectedTab = tabPage_empty; return; } @@ -134,13 +134,13 @@ namespace Z64.Forms { case Z64Object.EntryType.DList: { - tabControl1.SelectedIndex = 1; + tabControl1.SelectedTab = tabPage_text; UpdateDisassembly(); break; } case Z64Object.EntryType.Vertex: { - tabControl1.SelectedIndex = 3; + tabControl1.SelectedTab = tabPage_vtx; var vtx = (Z64Object.VertexHolder)holder; listView_vtx.BeginUpdate(); @@ -161,29 +161,100 @@ namespace Z64.Forms } case Z64Object.EntryType.Texture: { - tabControl1.SelectedIndex = 2; + tabControl1.SelectedTab = tabPage_texture; var tex = (Z64Object.TextureHolder)holder; if ((tex.Format != N64.N64TexFormat.CI4 && tex.Format != N64.N64TexFormat.CI8) || tex.Tlut != null) pic_texture.Image = tex.GetBitmap(); break; } - case Z64Object.EntryType.Unknown: case Z64Object.EntryType.SkeletonHeader: + { + tabControl1.SelectedTab = tabPage_text; + var skel = (Z64Object.SkeletonHolder)holder; + StringWriter sw = new StringWriter(); + sw.WriteLine($"Limbs: 0x{skel.LimbsSeg.VAddr:X8}"); + sw.WriteLine($"Limb Count: {skel.LimbCount}"); + textBox_holderInfo.Text = sw.ToString(); + break; + } case Z64Object.EntryType.FlexSkeletonHeader: - case Z64Object.EntryType.SkeletonLimb: + { + tabControl1.SelectedTab = tabPage_text; + var skel = (Z64Object.FlexSkeletonHolder)holder; + + StringWriter sw = new StringWriter(); + sw.WriteLine($"Limbs: 0x{skel.LimbsSeg.VAddr:X8}"); + sw.WriteLine($"Limb Count: {skel.LimbCount}"); + sw.WriteLine($"DList Count: {skel.DListCount}"); + + textBox_holderInfo.Text = sw.ToString(); + break; + } case Z64Object.EntryType.SkeletonLimbs: + { + tabControl1.SelectedTab = tabPage_text; + var limbs = (Z64Object.SkeletonLimbsHolder)holder; + + StringWriter sw = new StringWriter(); + sw.WriteLine($"Limbs:"); + foreach (var limb in limbs.LimbSegments) + sw.WriteLine($"0x{limb.VAddr:X8}"); + + textBox_holderInfo.Text = sw.ToString(); + break; + } + case Z64Object.EntryType.SkeletonLimb: + { + tabControl1.SelectedTab = tabPage_text; + var limb = (Z64Object.SkeletonLimbHolder)holder; + + StringWriter sw = new StringWriter(); + sw.WriteLine($"Position: {{ {limb.JointX}, {limb.JointY}, {limb.JointZ} }}"); + sw.WriteLine($"Child: 0x{limb.Child:X2}"); + sw.WriteLine($"Sibling: 0x{limb.Sibling:X2}"); + sw.WriteLine($"DList : 0x{limb.DListSeg.VAddr:X8}"); + + textBox_holderInfo.Text = sw.ToString(); + break; + } case Z64Object.EntryType.AnimationHeader: - case Z64Object.EntryType.FrameData: + { + tabControl1.SelectedTab = tabPage_text; + var anim = (Z64Object.AnimationHolder)holder; + + StringWriter sw = new StringWriter(); + sw.WriteLine($"Frame Count: {anim.FrameCount}"); + sw.WriteLine($"Frame Data: 0x{anim.FrameData.VAddr:X8}"); + sw.WriteLine($"Joint Indices: 0x{anim.JointIndices.VAddr:X8}"); + sw.WriteLine($"Static Index Max: 0x{anim.StaticIndexMax}"); + + textBox_holderInfo.Text = sw.ToString(); + break; + } case Z64Object.EntryType.JointIndices: { - tabControl1.SelectedIndex = 4; + tabControl1.SelectedTab = tabPage_text; + var joints = (Z64Object.AnimationJointIndicesHolder)holder; - var provider = new Be.Windows.Forms.DynamicByteProvider(holder.GetData());; + StringWriter sw = new StringWriter(); + sw.WriteLine($"Joints:"); + foreach (var joint in joints.JointIndices) + sw.WriteLine($"{{ frameData[{joint.X}], frameData[{joint.Y}], frameData[{joint.Z}] }}"); + + textBox_holderInfo.Text = sw.ToString(); + break; + } + case Z64Object.EntryType.FrameData: + case Z64Object.EntryType.Unknown: + { + tabControl1.SelectedTab = tabPage_unknow; + + var provider = new DynamicByteProvider(holder.GetData());; hexBox1.ByteProvider = provider; hexBox1.LineInfoOffset = new SegmentedAddress(_segment, _obj.OffsetOf(holder)).VAddr; break; } - default: tabControl1.SelectedIndex = 0; break; + default: tabControl1.SelectedTab = tabPage_empty; break; } listView_map.Focus(); } diff --git a/Z64 Utils/Forms/ObjectAnalyzerForm.resx b/Z64 Utils/Forms/ObjectAnalyzerForm.resx index 4a79596..76d5a25 100644 --- a/Z64 Utils/Forms/ObjectAnalyzerForm.resx +++ b/Z64 Utils/Forms/ObjectAnalyzerForm.resx @@ -1,64 +1,4 @@ - - - + @@ -117,20 +57,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 132, 17 - - - 17, 17 - - - 287, 17 - - - 423, 17 - - - + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA IACoJQAA7h4AAAAAAAABACAAYnMAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADCDgAAwg4AAAAA diff --git a/Z64 Utils/Z64/Z64Object.cs b/Z64 Utils/Z64/Z64Object.cs index d615c80..85a09ab 100644 --- a/Z64 Utils/Z64/Z64Object.cs +++ b/Z64 Utils/Z64/Z64Object.cs @@ -165,13 +165,13 @@ namespace Z64 } public class SkeletonLimbHolder : ObjectHolder { - public byte[] Raw { get; set; } + public const int ENTRY_SIZE = 0xC; public short JointX { get; set; } public short JointY { get; set; } public short JointZ { get; set; } - public byte Parent { get; set; } public byte Child { get; set; } + public byte Sibling { get; set; } public SegmentedAddress DListSeg { get; set; } public SkeletonLimbHolder(string name, byte[] data) : base(name) @@ -179,28 +179,40 @@ namespace Z64 SetData(data); } - public override byte[] GetData() => Raw; + public override EntryType GetEntryType() => EntryType.SkeletonLimb; - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.SkeletonLimb; + using (var ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + bw.Write(JointX); + bw.Write(JointY); + bw.Write(JointZ); + bw.Write(Child); + bw.Write(Sibling); + bw.Write(DListSeg.VAddr); + return ms.ToArray().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; - JointX = ArrayUtil.ReadInt16BE(data, 0); - JointY = ArrayUtil.ReadInt16BE(data, 2); - JointZ = ArrayUtil.ReadInt16BE(data, 4); - Parent = data[6]; - Child = data[7]; - DListSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, 8)); + using (MemoryStream ms = new MemoryStream(data)) + { + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + JointX = br.ReadInt16(); + JointY = br.ReadInt16(); + JointZ = br.ReadInt16(); + Child = br.Read1Byte(); + Sibling = br.Read1Byte(); + DListSeg = new SegmentedAddress(br.ReadUInt32()); + } } - public override int GetSize() => Raw.Length; + public override int GetSize() => ENTRY_SIZE; } public class SkeletonLimbsHolder : ObjectHolder { - public byte[] Raw { get; set; } - public SegmentedAddress[] LimbSegments { get; set; } public SkeletonLimbsHolder(string name, byte[] data) : base(name) @@ -208,85 +220,121 @@ namespace Z64 SetData(data); } - public override byte[] GetData() => Raw; + public override EntryType GetEntryType() => EntryType.SkeletonLimbs; - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.SkeletonLimbs; + using (MemoryStream ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + + for (int i = 0; i < LimbSegments.Length; i++) + bw.Write(LimbSegments[i].VAddr); + + return ms.GetBuffer().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; if ((data.Length % 4) != 0) throw new Z64ObjectException($"Invalid data size (0x{data.Length:X}) should be a multiple of 4"); LimbSegments = new SegmentedAddress[data.Length / 4]; - for (int i = 0; i < data.Length/4; i++) + using (MemoryStream ms = new MemoryStream(data)) { - LimbSegments[i] = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i * 4)); + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + + for (int i = 0; i < LimbSegments.Length; i++) + LimbSegments[i] = new SegmentedAddress(br.ReadUInt32()); } } - public override int GetSize() => Raw.Length; + public override int GetSize() => LimbSegments.Length * 4; } public class SkeletonHolder : ObjectHolder { - public byte[] Raw { get; set; } + public const int HEADER_SIZE = 0x8; - public int LimbCount { get; set; } + public byte LimbCount { get; set; } public SegmentedAddress LimbsSeg { get; set; } public SkeletonHolder(string name, byte[] data) : base(name) { SetData(data); } + public override EntryType GetEntryType() => EntryType.SkeletonHeader; - public override byte[] GetData() => Raw; - - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.SkeletonHeader; + using (var ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + bw.Write(LimbsSeg.VAddr); + bw.Write(LimbCount); + bw.Write(new byte[3]); // padding + return ms.ToArray().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; - LimbsSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data)); - LimbCount = data[4]; + using (var ms = new MemoryStream(data)) + { + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + LimbsSeg = new SegmentedAddress(br.ReadUInt32()); + LimbCount = br.Read1Byte(); + } } - public override int GetSize() => Raw.Length; + public override int GetSize() => HEADER_SIZE; } public class FlexSkeletonHolder : ObjectHolder { - public byte[] Raw { get; set; } + public const int HEADER_SIZE = SkeletonHolder.HEADER_SIZE + 0x4; - public int LimbCount { get; set; } public SegmentedAddress LimbsSeg { get; set; } - public int DListCount { get; set; } + public byte LimbCount { get; set; } + public byte DListCount { get; set; } public FlexSkeletonHolder(string name, byte[] data) : base(name) { SetData(data); } + public override EntryType GetEntryType() => EntryType.FlexSkeletonHeader; - public override byte[] GetData() => Raw; - - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.FlexSkeletonHeader; + using (var ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + bw.Write(LimbsSeg.VAddr); + bw.Write(LimbCount); + bw.Write(new byte[3]); // padding + bw.Write(DListCount); + bw.Write(new byte[3]); // padding + return ms.ToArray().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; - LimbsSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(data)); - LimbCount = data[4]; - DListCount = data[8]; + using (var ms = new MemoryStream(data)) + { + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + LimbsSeg = new SegmentedAddress(br.ReadUInt32()); + LimbCount = br.Read1Byte(); + br.ReadBytes(3); // padding + DListCount = br.Read1Byte(); + br.ReadBytes(3); // padding + } } - public override int GetSize() => Raw.Length; + public override int GetSize() => HEADER_SIZE; } public class AnimationHolder : ObjectHolder { + public const int HEADER_SIZE = 0x10; public byte[] Raw { get; set; } public short FrameCount { get; set; } @@ -299,92 +347,127 @@ namespace Z64 SetData(data); } - public override byte[] GetData() => Raw; + public override EntryType GetEntryType() => EntryType.AnimationHeader; - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.AnimationHeader; + using (var ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + bw.Write(FrameCount); + bw.Write(new byte[2]); // padding + bw.Write(FrameData.VAddr); + bw.Write(JointIndices.VAddr); + bw.Write(StaticIndexMax); + return ms.ToArray().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; - FrameCount = ArrayUtil.ReadInt16BE(data, 0); - FrameData = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, 4)); - JointIndices = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, 8)); - StaticIndexMax = ArrayUtil.ReadUInt16BE(data, 12); + using (var ms = new MemoryStream(data)) + { + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + FrameCount = br.ReadInt16(); + br.ReadBytes(2); // padding + FrameData = new SegmentedAddress(br.ReadUInt32()); + JointIndices = new SegmentedAddress(br.ReadUInt32()); + StaticIndexMax = br.ReadUInt16(); + } } - public override int GetSize() => Raw.Length; + public override int GetSize() => HEADER_SIZE; } public class AnimationFrameDataHolder : ObjectHolder { - public byte[] Raw { get; set; } - public short[] FrameData { get; set; } public AnimationFrameDataHolder(string name, byte[] data) : base(name) { SetData(data); } + public override EntryType GetEntryType() => EntryType.FrameData; - public override byte[] GetData() => Raw; - - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.FrameData; + using (var ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + foreach (var item in FrameData) + bw.Write(item); + return ms.ToArray().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; if ((data.Length % 2) != 0) throw new Z64ObjectException($"Invalid data size (0x{data.Length:X}) should be a multiple of 2"); - FrameData = new short[data.Length / 2]; - for (int i = 0; i < data.Length / 2; i++) + + using (var ms = new MemoryStream(data)) { - FrameData[i] = ArrayUtil.ReadInt16BE(data, i * 2); + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + + FrameData = new short[data.Length / 2]; + for (int i = 0; i < FrameData.Length; i++) + FrameData[i] = br.ReadInt16(); } } - public override int GetSize() => Raw.Length; + public override int GetSize() => FrameData.Length * 2; } public class AnimationJointIndicesHolder : ObjectHolder { + public const int ENTRY_SIZE = 6; public struct JointIndex { - public ushort x, y, z; + public ushort X, Y, Z; }; - public byte[] Raw { get; set; } public JointIndex[] JointIndices { get; set; } public AnimationJointIndicesHolder(string name, byte[] data) : base(name) { SetData(data); } + public override EntryType GetEntryType() => EntryType.JointIndices; - public override byte[] GetData() => Raw; - - public override EntryType GetEntryType() + public override byte[] GetData() { - return EntryType.JointIndices; + using (MemoryStream ms = new MemoryStream()) + { + BinaryStream bw = new BinaryStream(ms, ByteConverter.Big); + + for (int i = 0; i < JointIndices.Length; i++) + { + bw.Write(JointIndices[i].X); + bw.Write(JointIndices[i].Y); + bw.Write(JointIndices[i].Z); + } + + return ms.GetBuffer().Take((int)ms.Length).ToArray(); + } } + public override void SetData(byte[] data) { - Raw = data; - if ((data.Length % 6) != 0) + if ((data.Length % ENTRY_SIZE) != 0) throw new Z64ObjectException($"Invalid data size (0x{data.Length:X}) should be a multiple of 6"); - JointIndices = new JointIndex[data.Length / 6]; - for (int i = 0; i < data.Length / 6; i++) + JointIndices = new JointIndex[data.Length / ENTRY_SIZE]; + using (MemoryStream ms = new MemoryStream(data)) { - JointIndices[i] = - new JointIndex() { - x = ArrayUtil.ReadUInt16BE(data, i * 6), - y = ArrayUtil.ReadUInt16BE(data, i * 6 + 2), - z = ArrayUtil.ReadUInt16BE(data, i * 6 + 4) + BinaryStream br = new BinaryStream(ms, ByteConverter.Big); + + for (int i = 0; i < JointIndices.Length; i++) + JointIndices[i] = new JointIndex() + { + X = br.ReadUInt16(), + Y = br.ReadUInt16(), + Z = br.ReadUInt16() }; } } - public override int GetSize() => Raw.Length; + public override int GetSize() => JointIndices.Length * ENTRY_SIZE; } public List Entries { get; set; } @@ -605,46 +688,46 @@ namespace Z64 AddVertexHolder(holder, off); return holder; } - public SkeletonLimbHolder AddSkeletonLimb(int size, string name = null, int off = -1, int skel_off = -1) + public SkeletonLimbHolder AddSkeletonLimb(string name = null, int off = -1, int skel_off = -1) { if (off == -1) off = GetSize(); - var holder = new SkeletonLimbHolder(name?? $"skel_{skel_off:X8}_limb_{off:X8}", new byte[size]); + var holder = new SkeletonLimbHolder(name?? $"skel_{skel_off:X8}_limb_{off:X8}", new byte[SkeletonLimbHolder.ENTRY_SIZE]); return (SkeletonLimbHolder)AddHolder(holder, off); } - public SkeletonLimbsHolder AddSkeletonLimbs(int size, string name = null, int off = -1, int skel_off = -1) + public SkeletonLimbsHolder AddSkeletonLimbs(int count, string name = null, int off = -1, int skel_off = -1) { if (off == -1) off = GetSize(); - var holder = new SkeletonLimbsHolder(name?? $"skel_{skel_off:X8}_limbs_{off:X8}", new byte[size]); + var holder = new SkeletonLimbsHolder(name?? $"skel_{skel_off:X8}_limbs_{off:X8}", new byte[count * 4]); return (SkeletonLimbsHolder)AddHolder(holder, off); } - public SkeletonHolder AddSkeleton(int size, string name = null, int off = -1) + public SkeletonHolder AddSkeleton(string name = null, int off = -1) { if (off == -1) off = GetSize(); - var holder = new SkeletonHolder(name?? $"skel_{off:X8}", new byte[size]); + var holder = new SkeletonHolder(name?? $"skel_{off:X8}", new byte[SkeletonHolder.HEADER_SIZE]); return (SkeletonHolder)AddHolder(holder, off); } - public FlexSkeletonHolder AddFlexSkeleton(int size, string name = null, int off = -1) + public FlexSkeletonHolder AddFlexSkeleton(string name = null, int off = -1) { if (off == -1) off = GetSize(); - var holder = new FlexSkeletonHolder(name ?? $"skel_{off:X8}", new byte[size]); + var holder = new FlexSkeletonHolder(name ?? $"skel_{off:X8}", new byte[FlexSkeletonHolder.HEADER_SIZE]); return (FlexSkeletonHolder)AddHolder(holder, off); } - public AnimationHolder AddAnimation(int size, string name = null, int off = -1) + public AnimationHolder AddAnimation(string name = null, int off = -1) { if (off == -1) off = GetSize(); - var holder = new AnimationHolder(name?? $"anim_{off:X8}", new byte[size]); + var holder = new AnimationHolder(name?? $"anim_{off:X8}", new byte[AnimationHolder.HEADER_SIZE]); return (AnimationHolder)AddHolder(holder, off); } - public AnimationFrameDataHolder AddFrameData(int size, string name = null, int off = -1) + public AnimationFrameDataHolder AddFrameData(int count, string name = null, int off = -1) { if (off == -1) off = GetSize(); - var holder = new AnimationFrameDataHolder(name ?? $"framedata_{off:X8}", new byte[size]); + var holder = new AnimationFrameDataHolder(name ?? $"framedata_{off:X8}", new byte[count*2]); return (AnimationFrameDataHolder)AddHolder(holder, off); } - public AnimationJointIndicesHolder AddJointIndices(int size, string name = null, int off = -1) + public AnimationJointIndicesHolder AddJointIndices(int count, string name = null, int off = -1) { if (off == -1) off = GetSize(); - var holder = new AnimationJointIndicesHolder(name ?? $"jointindices_{off:X8}", new byte[size]); + var holder = new AnimationJointIndicesHolder(name ?? $"jointindices_{off:X8}", new byte[count*AnimationJointIndicesHolder.ENTRY_SIZE]); return (AnimationJointIndicesHolder)AddHolder(holder, off); } @@ -797,6 +880,13 @@ namespace Z64 public N64TexFormat Format { get; set; } public string Tlut { get; set; } } + private class JsonArrayHolder : JsonObjectHolder + { + public int Count { get; set; } + } + + + public string GetJSON() { var list = new List(); @@ -848,6 +938,51 @@ namespace Z64 }); break; } + case EntryType.SkeletonLimbs: + { + var holder = (SkeletonLimbsHolder)iter; + list.Add(new JsonArrayHolder() + { + Name = iter.Name, + EntryType = iter.GetEntryType(), + Count = holder.LimbSegments.Length + }); + break; + } + case EntryType.JointIndices: + { + var holder = (AnimationJointIndicesHolder)iter; + list.Add(new JsonArrayHolder() + { + Name = iter.Name, + EntryType = iter.GetEntryType(), + Count = holder.JointIndices.Length + }); ; + break; + } + case EntryType.FrameData: + { + var holder = (AnimationFrameDataHolder)iter; + list.Add(new JsonArrayHolder() + { + Name = iter.Name, + EntryType = iter.GetEntryType(), + Count = holder.FrameData.Length + }); + break; + } + case EntryType.SkeletonHeader: + case EntryType.FlexSkeletonHeader: + case EntryType.SkeletonLimb: + case EntryType.AnimationHeader: + { + list.Add(new JsonObjectHolder() + { + Name = iter.Name, + EntryType = iter.GetEntryType() + }); + break; + } default: throw new Z64ObjectException($"Invalid entry type ({iter.GetEntryType()})"); } @@ -864,7 +999,6 @@ namespace Z64 var type = (EntryType)Enum.Parse(typeof(EntryType), iter.GetProperty(nameof(JsonObjectHolder.EntryType)).GetString()); switch (type) { - case EntryType.DList: { var holder = iter.ToObject(); @@ -889,6 +1023,44 @@ namespace Z64 obj.AddUnknow(holder.Size, holder.Name); break; } + case EntryType.SkeletonHeader: + { + obj.AddSkeleton(); + break; + } + case EntryType.FlexSkeletonHeader: + { + obj.AddFlexSkeleton(); + break; + } + case EntryType.SkeletonLimb: + { + obj.AddSkeletonLimb(); + break; + } + case EntryType.AnimationHeader: + { + obj.AddAnimation(); + break; + } + case EntryType.SkeletonLimbs: + { + var holder = iter.ToObject(); + obj.AddSkeletonLimbs(holder.Count); + break; + } + case EntryType.JointIndices: + { + var holder = iter.ToObject(); + obj.AddJointIndices(holder.Count); + break; + } + case EntryType.FrameData: + { + var holder = iter.ToObject(); + obj.AddFrameData(holder.Count); + break; + } default: throw new Z64ObjectException($"Invalid entry type ({type})"); } } diff --git a/Z64 Utils/Z64/Z64ObjectAnalyzer.cs b/Z64 Utils/Z64/Z64ObjectAnalyzer.cs index 5ad27a5..9a16966 100644 --- a/Z64 Utils/Z64/Z64ObjectAnalyzer.cs +++ b/Z64 Utils/Z64/Z64ObjectAnalyzer.cs @@ -334,12 +334,9 @@ namespace Z64 public static void FindSkeletons(Z64Object obj, byte[] data, int segmentId) { - const int SKELETON_HEADER_SIZE = 0x8; - const int FLEX_SKELETON_HEADER_SIZE = SKELETON_HEADER_SIZE + 0x4; - const int SKELETON_LIMB_SIZE = 0xC; // only supports StandardLimb so far // Search for Skeleton Headers // Structure: SS OO OO OO XX 00 00 00 [XX 00 00 00] - for (int i = 0; i < data.Length - SKELETON_HEADER_SIZE; i += 4) + for (int i = 0; i < data.Length - Z64Object.SkeletonHolder.HEADER_SIZE; i += 4) { var segment = new SegmentedAddress(ArrayUtil.ReadUint32BE(data, i)); // check for segmentId match, check for valid segment offset, @@ -358,17 +355,17 @@ namespace Z64 // check for limbs array ending at the start of the skeleton header, // check for limbs array's segmented addresses being 0xC apart from one another if (segment.SegmentOff + nLimbs * 4 == i && - ArrayUtil.ReadUint32BE(limbsData, 4) - ArrayUtil.ReadUint32BE(limbsData, 0) == SKELETON_LIMB_SIZE) + ArrayUtil.ReadUint32BE(limbsData, 4) - ArrayUtil.ReadUint32BE(limbsData, 0) == Z64Object.SkeletonLimbHolder.ENTRY_SIZE) { int nNonNullDlists = 0; - obj.AddSkeletonLimbs(nLimbs * 4, off: (int)segment.SegmentOff); + obj.AddSkeletonLimbs(nLimbs, off: (int)segment.SegmentOff); for (int j = 0; j < nLimbs * 4; j += 4) { SegmentedAddress limbSeg = new SegmentedAddress(ArrayUtil.ReadUint32BE(limbsData, j)); if (limbSeg.SegmentId != segmentId) throw new Z64ObjectAnalyzerException( $"Limb segment {limbSeg.Segmented} is not the correct segment id, mis-detected SkeletonHeader?"); - obj.AddSkeletonLimb(SKELETON_LIMB_SIZE, off: (int)limbSeg.SegmentOff); + obj.AddSkeletonLimb(off: (int)limbSeg.SegmentOff); // check if dlist is non-null (dlists may be null in general, this is only for FlexSkeletonHeader detection) if (ArrayUtil.ReadUint32BE(data, (int)(limbSeg.SegmentOff + 0x8)) != 0) nNonNullDlists++; @@ -378,14 +375,14 @@ namespace Z64 // check if nothing is already assumed to occupy that space, // check if the number of dlists is equal to the actual number of non-null dlists, // check struct padding - if (i < data.Length - FLEX_SKELETON_HEADER_SIZE && obj.IsOffsetFree(i + SKELETON_HEADER_SIZE) && + if (i < data.Length - Z64Object.FlexSkeletonHolder.HEADER_SIZE && obj.IsOffsetFree(i + Z64Object.SkeletonHolder.HEADER_SIZE) && data[i + 8] == nNonNullDlists && data[i + 9] == 0 && data[i + 10] == 0 && data[i + 11] == 0) { - obj.AddFlexSkeleton(FLEX_SKELETON_HEADER_SIZE, off: i); + obj.AddFlexSkeleton(off: i); } else { - obj.AddSkeleton(SKELETON_HEADER_SIZE, off: i); + obj.AddSkeleton(off: i); } } } @@ -393,10 +390,9 @@ namespace Z64 } public static void FindAnimations(Z64Object obj, byte[] data, int segmentId) { - const int ANIMATION_HEADER_SIZE = 0x10; // Search for Animation Headers // Structure: FF FF 00 00 SS OO OO OO SS OO OO OO II II 00 00 - for (int i = 0; i < data.Length - ANIMATION_HEADER_SIZE; i += 4) + for (int i = 0; i < data.Length - Z64Object.AnimationHolder.HEADER_SIZE; i += 4) { var frameCount = ArrayUtil.ReadInt16BE(data, i); // check positive nonzero frame count, check struct padding zeroes @@ -438,9 +434,9 @@ namespace Z64 continue; jointIndicesSize -= (jointIndicesSize % 6); } - obj.AddAnimation(ANIMATION_HEADER_SIZE, off: i); - obj.AddFrameData(frameDataSize, off:(int)frameDataSeg.SegmentOff); - obj.AddJointIndices(jointIndicesSize, off:(int)jointIndicesSeg.SegmentOff); + obj.AddAnimation(off: i); + obj.AddFrameData(frameDataSize/2, off:(int)frameDataSeg.SegmentOff); + obj.AddJointIndices(jointIndicesSize/Z64Object.AnimationJointIndicesHolder.ENTRY_SIZE, off:(int)jointIndicesSeg.SegmentOff); } } }