From 9e31eb847c7535db2f46b4a845d7931ec2b7fa1e Mon Sep 17 00:00:00 2001 From: MattNL Date: Tue, 19 Apr 2022 18:05:55 -0400 Subject: [PATCH] Animation Editor and small adjustments -Added an Animation Editor for textures in the "textures/blocks" and "textures/items" folders (besides the clock and compass) and an "EDIT TEXTURE ANIMATION" button. -Within the animation editor, there is a "Set Bulk Animation Speed" function that sets the entire animation to a set frame speed. -Improved the drag and drop function. -Changed some pop up dialogs to child dialogs to prevent multiple extra windows. -Changed the "EDIT AUDIO" button text to "EDIT MUSIC CUES" to describe the Audio.pck functions more accurately. -Changed the main tree's double click event to a NodeMouseDoubleClick event to prevent a rare crash and optimize that event's code. -Adjusted the max display size for large images so that the meta tree would no longer be blocked. --- .../Additional-Popups/programInfo.Designer.cs | 25 +- MinecraftUSkinEditor/Forms/Form1.Designer.cs | 2 +- MinecraftUSkinEditor/Forms/Form1.cs | 105 ++-- .../Animation/FrameEditor.Designer.cs | 198 ++++++++ .../Forms/Utilities/Animation/FrameEditor.cs | 71 +++ .../Utilities/Animation/FrameEditor.resx | 120 +++++ .../Animation/SetBulkSpeed.Designer.cs | 149 ++++++ .../Forms/Utilities/Animation/SetBulkSpeed.cs | 60 +++ .../Utilities/Animation/SetBulkSpeed.resx | 120 +++++ .../Utilities/AnimationEditor.Designer.cs | 233 +++++++++ .../Forms/Utilities/AnimationEditor.cs | 451 ++++++++++++++++++ .../Forms/Utilities/AnimationEditor.resx | 140 ++++++ .../Audio}/addCategory.Designer.cs | 0 .../Audio}/addCategory.cs | 0 .../Audio}/addCategory.resx | 0 .../Forms/Utilities/AudioEditor.resx | 132 ++--- MinecraftUSkinEditor/PckStudio.csproj | 33 +- 17 files changed, 1723 insertions(+), 116 deletions(-) create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx create mode 100644 MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs create mode 100644 MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx rename MinecraftUSkinEditor/Forms/{Skins-And-Textures => Utilities/Audio}/addCategory.Designer.cs (100%) rename MinecraftUSkinEditor/Forms/{Skins-And-Textures => Utilities/Audio}/addCategory.cs (100%) rename MinecraftUSkinEditor/Forms/{Skins-And-Textures => Utilities/Audio}/addCategory.resx (100%) diff --git a/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs b/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs index 637a707d..be047fa6 100644 --- a/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs +++ b/MinecraftUSkinEditor/Forms/Additional-Popups/programInfo.Designer.cs @@ -34,6 +34,7 @@ this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); this.metroLabel3 = new MetroFramework.Controls.MetroLabel(); this.metroLabel4 = new MetroFramework.Controls.MetroLabel(); + this.metroLabel5 = new MetroFramework.Controls.MetroLabel(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // @@ -53,9 +54,9 @@ this.metroLabel1.AutoSize = true; this.metroLabel1.Location = new System.Drawing.Point(6, 333); this.metroLabel1.Name = "metroLabel1"; - this.metroLabel1.Size = new System.Drawing.Size(323, 19); + this.metroLabel1.Size = new System.Drawing.Size(250, 19); this.metroLabel1.TabIndex = 1; - this.metroLabel1.Text = "Restored and maintained By PhoenixARC and MattNL"; + this.metroLabel1.Text = "Restored and maintained by PhoenixARC"; this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; this.metroLabel1.Click += new System.EventHandler(this.metroLabel1_Click); // @@ -72,7 +73,7 @@ // metroLabel3 // this.metroLabel3.AutoSize = true; - this.metroLabel3.Location = new System.Drawing.Point(4, 363); + this.metroLabel3.Location = new System.Drawing.Point(4, 367); this.metroLabel3.Name = "metroLabel3"; this.metroLabel3.Size = new System.Drawing.Size(212, 19); this.metroLabel3.TabIndex = 3; @@ -82,23 +83,34 @@ // metroLabel4 // this.metroLabel4.AutoSize = true; - this.metroLabel4.Location = new System.Drawing.Point(331, 363); + this.metroLabel4.Location = new System.Drawing.Point(331, 367); this.metroLabel4.Name = "metroLabel4"; this.metroLabel4.Size = new System.Drawing.Size(199, 19); this.metroLabel4.TabIndex = 4; this.metroLabel4.Text = "3D renderer found by Newagent"; this.metroLabel4.Theme = MetroFramework.MetroThemeStyle.Dark; // + // metroLabel5 + // + this.metroLabel5.AutoSize = true; + this.metroLabel5.Location = new System.Drawing.Point(4, 350); + this.metroLabel5.Name = "metroLabel5"; + this.metroLabel5.Size = new System.Drawing.Size(236, 19); + this.metroLabel5.TabIndex = 5; + this.metroLabel5.Text = "Additional code and utilities by MattNL"; + this.metroLabel5.Theme = MetroFramework.MetroThemeStyle.Dark; + // // programInfo // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BorderStyle = MetroFramework.Forms.MetroFormBorderStyle.FixedSingle; this.ClientSize = new System.Drawing.Size(602, 392); + this.Controls.Add(this.metroLabel1); + this.Controls.Add(this.metroLabel5); this.Controls.Add(this.metroLabel4); this.Controls.Add(this.metroLabel3); this.Controls.Add(this.metroLabel2); - this.Controls.Add(this.metroLabel1); this.Controls.Add(this.pictureBox1); this.DisplayHeader = false; this.MaximizeBox = false; @@ -125,5 +137,6 @@ private MetroFramework.Controls.MetroLabel metroLabel2; private MetroFramework.Controls.MetroLabel metroLabel3; private MetroFramework.Controls.MetroLabel metroLabel4; - } + private MetroFramework.Controls.MetroLabel metroLabel5; + } } \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Form1.Designer.cs b/MinecraftUSkinEditor/Forms/Form1.Designer.cs index 8bea4db9..ec37788a 100644 --- a/MinecraftUSkinEditor/Forms/Form1.Designer.cs +++ b/MinecraftUSkinEditor/Forms/Form1.Designer.cs @@ -907,7 +907,7 @@ this.treeViewMain.Name = "treeViewMain"; this.myTablePanelPckEdit.SetRowSpan(this.treeViewMain, 6); this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.selectNode); - this.treeViewMain.DoubleClick += new System.EventHandler(this.treeView1_DoubleClick); + this.treeViewMain.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_DoubleClick); this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown); this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag); this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter); diff --git a/MinecraftUSkinEditor/Forms/Form1.cs b/MinecraftUSkinEditor/Forms/Form1.cs index fc8d7a36..18984c5c 100644 --- a/MinecraftUSkinEditor/Forms/Form1.cs +++ b/MinecraftUSkinEditor/Forms/Form1.cs @@ -292,6 +292,17 @@ namespace PckStudio meta.Tag = entry; treeMeta.Nodes.Add(meta); + //Check for Animated Texture + if ((mf.name.StartsWith("res/textures/blocks/") || mf.name.StartsWith("res/textures/items/")) && (!mf.name.EndsWith("clock.png") && (!mf.name.EndsWith("compass.png")))) + { + buttonEdit.Text = "EDIT TEXTURE ANIMATION"; + buttonEdit.Visible = true; + } + else + { + buttonEdit.Visible = false; + } + //Check for if file contains model data if (entry[0].ToString()=="BOX") { @@ -344,7 +355,7 @@ namespace PckStudio else { //Sets images to appear at largest relative size to program window size - Size maxDisplay = new Size(tabPage1.Size.Width / 2 - 5, tabPage1.Size.Height / 2 - 5); + Size maxDisplay = new Size((tabPage1.Size.Width / 2 - 5) / 3, (tabPage1.Size.Height / 2 - 5) / 3); if (skinPicture.Size.Width > maxDisplay.Width) { //calculate aspect ratio @@ -419,7 +430,7 @@ namespace PckStudio } else if (Path.GetFileName(mf.name) == "audio.pck") { - buttonEdit.Text = "EDIT AUDIO"; + buttonEdit.Text = "EDIT MUSIC CUES"; buttonEdit.Visible = true; } else @@ -1027,7 +1038,6 @@ namespace PckStudio #region deciphers what happens when certain pck entries are double clicked private void treeView1_DoubleClick(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.ImageIndex < 0) return; if (treeViewMain.SelectedNode.Tag != null) { mf = (PCK.MineFile)treeViewMain.SelectedNode.Tag; @@ -1062,6 +1072,7 @@ namespace PckStudio { PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf); diag.ShowDialog(this); + diag.Dispose(); } catch(Exception ex) { @@ -1082,7 +1093,8 @@ namespace PckStudio try { PckStudio.Forms.Utilities.COLEditor diag = new PckStudio.Forms.Utilities.COLEditor(mf.data, mf); - diag.Show(); + diag.ShowDialog(this); + diag.Dispose(); } catch { @@ -1309,12 +1321,6 @@ namespace PckStudio { DoDragDrop(e.Item, DragDropEffects.Move); } - - // Copy the dragged node when the right mouse button is used. - else if (e.Button == MouseButtons.Right) - { - DoDragDrop(e.Item, DragDropEffects.Copy); - } } // Set the target drop effect to the effect @@ -1370,27 +1376,13 @@ namespace PckStudio } else // Move file aside { - if(targetNode.Parent != null) + if (targetNode.Parent != null) { - if (draggedNode.Index < targetNode.Index) - { - targetNode.Parent.Nodes.Insert(targetIndex - 1, draggedNode); - } - else - { - targetNode.Parent.Nodes.Insert(targetIndex, draggedNode); - } + targetNode.Parent.Nodes.Insert(targetIndex, draggedNode); } else { - if (draggedNode.Index < targetNode.Index) - { - treeViewMain.Nodes.Insert(targetIndex - 1, draggedNode); - } - else - { - treeViewMain.Nodes.Insert(targetIndex, draggedNode); - } + treeView1.Nodes.Insert(targetIndex, draggedNode); } } } @@ -3627,24 +3619,56 @@ namespace PckStudio using (var ms = new MemoryStream(mf.data)) { SkinPreview frm = new SkinPreview(Image.FromStream(ms)); - frm.Show(); + frm.ShowDialog(this); + frm.Dispose(); } } } + //Check for Animated Texture + if (mf.name.StartsWith("res/textures/blocks/") || mf.name.StartsWith("res/textures/items/")) + { + try + { + PckStudio.AnimationEditor diag = new PckStudio.AnimationEditor(mf); + diag.ShowDialog(this); + diag.Dispose(); + + treeMeta.Nodes.Clear(); + foreach (int type in types.Keys) + comboBox1.Items.Add(types[type]); + + //loads all of selected minefiles metadata into metadata treeview + foreach (object[] entry in file.entries) + { + object[] strings = (object[])entry; TreeNode meta = new TreeNode(); + + foreach (object[] entryy in file.entries) + meta.Text = (string)strings[0]; + meta.Tag = entry; + treeMeta.Nodes.Add(meta); + } + } + catch + { + MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + if (Path.GetFileName(mf.name) == "audio.pck") { - try - { - PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf); - diag.Show(); - } - catch - { - MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK, - MessageBoxIcon.Error); - return; - } + try + { + PckStudio.Forms.Utilities.AudioEditor diag = new PckStudio.Forms.Utilities.AudioEditor(mf.data, mf); + diag.ShowDialog(this); + diag.Dispose(); + } + catch + { + MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK,MessageBoxIcon.Error); + return; + } } if (Path.GetExtension(mf.name) == ".loc") @@ -3674,7 +3698,8 @@ namespace PckStudio try { PckStudio.Forms.Utilities.COLEditor diag = new PckStudio.Forms.Utilities.COLEditor(mf.data, mf); - diag.Show(); + diag.ShowDialog(this); + diag.Dispose(); } catch { diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs new file mode 100644 index 00000000..64da13f0 --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.Designer.cs @@ -0,0 +1,198 @@ + +namespace PckStudio.Forms.Utilities.AnimationEditor +{ + partial class FrameEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.metroTextBox1 = new MetroFramework.Controls.MetroTextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.metroTextBox2 = new MetroFramework.Controls.MetroTextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.ForeColor = System.Drawing.Color.White; + this.button1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.button1.Location = new System.Drawing.Point(55, 111); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 7; + this.button1.Text = "Save"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label2.Location = new System.Drawing.Point(9, 54); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Frame"; + // + // metroTextBox1 + // + // + // + // + this.metroTextBox1.CustomButton.Image = null; + this.metroTextBox1.CustomButton.Location = new System.Drawing.Point(157, 1); + this.metroTextBox1.CustomButton.Name = ""; + this.metroTextBox1.CustomButton.Size = new System.Drawing.Size(21, 21); + this.metroTextBox1.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.metroTextBox1.CustomButton.TabIndex = 1; + this.metroTextBox1.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.metroTextBox1.CustomButton.UseSelectable = true; + this.metroTextBox1.CustomButton.Visible = false; + this.metroTextBox1.Lines = new string[0]; + this.metroTextBox1.Location = new System.Drawing.Point(77, 51); + this.metroTextBox1.MaxLength = 4; + this.metroTextBox1.Name = "metroTextBox1"; + this.metroTextBox1.PasswordChar = '\0'; + this.metroTextBox1.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.metroTextBox1.SelectedText = ""; + this.metroTextBox1.SelectionLength = 0; + this.metroTextBox1.SelectionStart = 0; + this.metroTextBox1.ShortcutsEnabled = true; + this.metroTextBox1.Size = new System.Drawing.Size(179, 23); + this.metroTextBox1.TabIndex = 9; + this.metroTextBox1.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroTextBox1.UseSelectable = true; + this.metroTextBox1.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.metroTextBox1.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + this.metroTextBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label1.Location = new System.Drawing.Point(9, 83); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(62, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Frame Time"; + // + // metroTextBox2 + // + // + // + // + this.metroTextBox2.CustomButton.Image = null; + this.metroTextBox2.CustomButton.Location = new System.Drawing.Point(157, 1); + this.metroTextBox2.CustomButton.Name = ""; + this.metroTextBox2.CustomButton.Size = new System.Drawing.Size(21, 21); + this.metroTextBox2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.metroTextBox2.CustomButton.TabIndex = 1; + this.metroTextBox2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.metroTextBox2.CustomButton.UseSelectable = true; + this.metroTextBox2.CustomButton.Visible = false; + this.metroTextBox2.Lines = new string[0]; + this.metroTextBox2.Location = new System.Drawing.Point(77, 80); + this.metroTextBox2.MaxLength = 4; + this.metroTextBox2.Name = "metroTextBox2"; + this.metroTextBox2.PasswordChar = '\0'; + this.metroTextBox2.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.metroTextBox2.SelectedText = ""; + this.metroTextBox2.SelectionLength = 0; + this.metroTextBox2.SelectionStart = 0; + this.metroTextBox2.ShortcutsEnabled = true; + this.metroTextBox2.Size = new System.Drawing.Size(179, 23); + this.metroTextBox2.TabIndex = 11; + this.metroTextBox2.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroTextBox2.UseSelectable = true; + this.metroTextBox2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.metroTextBox2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + this.metroTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label3.Location = new System.Drawing.Point(47, 13); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(109, 13); + this.label3.TabIndex = 12; + this.label3.Text = "may/matt was here :3"; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button2.ForeColor = System.Drawing.Color.White; + this.button2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.button2.Location = new System.Drawing.Point(135, 111); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 13; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // FrameEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(264, 140); + this.ControlBox = false; + this.Controls.Add(this.button2); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.metroTextBox2); + this.Controls.Add(this.button1); + this.Controls.Add(this.label2); + this.Controls.Add(this.metroTextBox1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrameEditor"; + this.Resizable = false; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label2; + private MetroFramework.Controls.MetroTextBox metroTextBox1; + private System.Windows.Forms.Label label1; + private MetroFramework.Controls.MetroTextBox metroTextBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs new file mode 100644 index 00000000..370aa2de --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MetroFramework.Forms; +using System.Windows.Forms; + +namespace PckStudio.Forms.Utilities.AnimationEditor +{ + public partial class FrameEditor : MetroForm + { + bool newF; + TreeView tv; + TreeNode node; + int limit; + Tuple data = new Tuple("",""); + public FrameEditor(TreeView treeView, Tuple frameData, int frameLimit, bool newFrame, TreeNode nodeToEdit) + { + limit = frameLimit; + node = nodeToEdit; + data = frameData; + tv = treeView; + newF = newFrame; + InitializeComponent(); + label3.Text = "Frame must be within 0 and " + frameLimit + ".\nFrame Time must be greater than 0."; + metroTextBox1.Text = data.Item1; + metroTextBox2.Text = data.Item2; + } + + private void textBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) + { + e.Handled = true; + } + } + + private void button1_Click(object sender, EventArgs e) + { + if(metroTextBox1.Text == "" || metroTextBox2.Text == "") {} + else if(Int16.Parse(metroTextBox1.Text) > limit || Int16.Parse(metroTextBox1.Text) < 0 || Int16.Parse(metroTextBox2.Text) < 0) {} + else + { + if(newF) + { + TreeNode frameNode = new TreeNode(); + Tuple finalFrameData = new Tuple(metroTextBox1.Text, metroTextBox2.Text); + frameNode.Tag = finalFrameData; + frameNode.Text = "Frame: " + metroTextBox1.Text + ", Frame Time: " + metroTextBox2.Text; + tv.Nodes.Add(frameNode); + } + else if(!String.IsNullOrEmpty(data.Item1)) + { + Tuple finalFrameData = new Tuple(metroTextBox1.Text, metroTextBox2.Text); + node.Tag = finalFrameData; + node.Text = "Frame: " + metroTextBox1.Text + ", Frame Time: " + metroTextBox2.Text; + } + this.Close(); + } + } + + private void button2_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/FrameEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs new file mode 100644 index 00000000..fea0419c --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs @@ -0,0 +1,149 @@ + +namespace PckStudio.Forms.Utilities.AnimationEditor +{ + partial class SetBulkSpeed + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.metroTextBox2 = new MetroFramework.Controls.MetroTextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.ForeColor = System.Drawing.Color.White; + this.button1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.button1.Location = new System.Drawing.Point(55, 63); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 7; + this.button1.Text = "Save"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label1.Location = new System.Drawing.Point(9, 35); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(79, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Animation Time"; + // + // metroTextBox2 + // + // + // + // + this.metroTextBox2.CustomButton.Image = null; + this.metroTextBox2.CustomButton.Location = new System.Drawing.Point(140, 1); + this.metroTextBox2.CustomButton.Name = ""; + this.metroTextBox2.CustomButton.Size = new System.Drawing.Size(21, 21); + this.metroTextBox2.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.metroTextBox2.CustomButton.TabIndex = 1; + this.metroTextBox2.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.metroTextBox2.CustomButton.UseSelectable = true; + this.metroTextBox2.CustomButton.Visible = false; + this.metroTextBox2.Lines = new string[0]; + this.metroTextBox2.Location = new System.Drawing.Point(94, 32); + this.metroTextBox2.MaxLength = 4; + this.metroTextBox2.Name = "metroTextBox2"; + this.metroTextBox2.PasswordChar = '\0'; + this.metroTextBox2.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.metroTextBox2.SelectedText = ""; + this.metroTextBox2.SelectionLength = 0; + this.metroTextBox2.SelectionStart = 0; + this.metroTextBox2.ShortcutsEnabled = true; + this.metroTextBox2.Size = new System.Drawing.Size(162, 23); + this.metroTextBox2.TabIndex = 11; + this.metroTextBox2.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroTextBox2.UseSelectable = true; + this.metroTextBox2.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.metroTextBox2.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + this.metroTextBox2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.label3.Location = new System.Drawing.Point(47, 13); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(109, 13); + this.label3.TabIndex = 12; + this.label3.Text = "may/matt was here :3"; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button2.ForeColor = System.Drawing.Color.White; + this.button2.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.button2.Location = new System.Drawing.Point(135, 63); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 13; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // SetBulkSpeed + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(264, 94); + this.ControlBox = false; + this.Controls.Add(this.button2); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.metroTextBox2); + this.Controls.Add(this.button1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SetBulkSpeed"; + this.Resizable = false; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label1; + private MetroFramework.Controls.MetroTextBox metroTextBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs new file mode 100644 index 00000000..fb60ea23 --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MetroFramework.Forms; +using System.Windows.Forms; + +namespace PckStudio.Forms.Utilities.AnimationEditor +{ + public partial class SetBulkSpeed : MetroForm + { + TreeView tv; + public SetBulkSpeed(TreeView treeView) + { + tv = treeView; + InitializeComponent(); + label3.Text = "Frame Time must be greater than 0."; + } + + private void textBox1_KeyPress(object sender, KeyPressEventArgs e) + { + if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) + { + e.Handled = true; + } + } + + private void button1_Click(object sender, EventArgs e) + { + if(metroTextBox2.Text == "") {} + else if(Int16.Parse(metroTextBox2.Text) < 0) {} + else + { + int i = 0; + foreach (TreeNode nodes in tv.Nodes) + { + Tuple frameData = nodes.Tag as Tuple; + tv.Nodes.RemoveAt(i); + TreeNode frameNode = new TreeNode(); + Tuple finalFrameData = new Tuple(frameData.Item1, metroTextBox2.Text); + frameNode.Tag = finalFrameData; + frameNode.Text = "Frame: " + frameData.Item1 + ", Frame Time: " + metroTextBox2.Text; + tv.Nodes.Insert(i, frameNode); + i++; + } + + this.Close(); + } + } + + private void button2_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/Animation/SetBulkSpeed.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs new file mode 100644 index 00000000..05e82b4b --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.Designer.cs @@ -0,0 +1,233 @@ +namespace PckStudio +{ + partial class AnimationEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AnimationEditor)); + this.treeView1 = new System.Windows.Forms.TreeView(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeFrameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bulkAnimationSpeedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.metroCheckBox1 = new MetroFramework.Controls.MetroCheckBox(); + this.metroButton1 = new MetroFramework.Controls.MetroButton(); + this.pictureBoxWithInterpolationMode1 = new PckStudio.PictureBoxWithInterpolationMode(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.metroButton2 = new MetroFramework.Controls.MetroButton(); + this.contextMenuStrip1.SuspendLayout(); + this.menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).BeginInit(); + this.SuspendLayout(); + // + // treeView1 + // + this.treeView1.AllowDrop = true; + this.treeView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.treeView1.ContextMenuStrip = this.contextMenuStrip1; + this.treeView1.ForeColor = System.Drawing.Color.White; + this.treeView1.Location = new System.Drawing.Point(20, 84); + this.treeView1.Margin = new System.Windows.Forms.Padding(0); + this.treeView1.MaximumSize = new System.Drawing.Size(205, 350); + this.treeView1.Name = "treeView1"; + this.treeView1.Size = new System.Drawing.Size(165, 264); + this.treeView1.TabIndex = 15; + this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag); + this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect); + this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_doubleClick); + this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop); + this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter); + this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addFrameToolStripMenuItem, + this.removeFrameToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 70); + // + // addFrameToolStripMenuItem + // + this.addFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; + this.addFrameToolStripMenuItem.Name = "addFrameToolStripMenuItem"; + this.addFrameToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.addFrameToolStripMenuItem.Text = "Add Frame"; + this.addFrameToolStripMenuItem.Click += new System.EventHandler(this.addFrameToolStripMenuItem_Click); + // + // removeFrameToolStripMenuItem + // + this.removeFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Del; + this.removeFrameToolStripMenuItem.Name = "removeFrameToolStripMenuItem"; + this.removeFrameToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.removeFrameToolStripMenuItem.Text = "Remove Frame"; + this.removeFrameToolStripMenuItem.Click += new System.EventHandler(this.removeFrameToolStripMenuItem_Click); + // + // menuStrip + // + this.menuStrip.AutoSize = false; + this.menuStrip.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(20, 60); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(360, 24); + this.menuStrip.TabIndex = 14; + this.menuStrip.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveToolStripMenuItem1}); + this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // saveToolStripMenuItem1 + // + this.saveToolStripMenuItem1.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem1.Image"))); + this.saveToolStripMenuItem1.Name = "saveToolStripMenuItem1"; + this.saveToolStripMenuItem1.Size = new System.Drawing.Size(180, 22); + this.saveToolStripMenuItem1.Text = "Save"; + this.saveToolStripMenuItem1.Click += new System.EventHandler(this.saveToolStripMenuItem1_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.bulkAnimationSpeedToolStripMenuItem}); + this.editToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "Edit"; + // + // bulkAnimationSpeedToolStripMenuItem + // + this.bulkAnimationSpeedToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Replace; + this.bulkAnimationSpeedToolStripMenuItem.Name = "bulkAnimationSpeedToolStripMenuItem"; + this.bulkAnimationSpeedToolStripMenuItem.Size = new System.Drawing.Size(210, 22); + this.bulkAnimationSpeedToolStripMenuItem.Text = "Set Bulk Animation Speed"; + this.bulkAnimationSpeedToolStripMenuItem.Click += new System.EventHandler(this.bulkAnimationSpeedToolStripMenuItem_Click); + // + // metroCheckBox1 + // + this.metroCheckBox1.AutoSize = true; + this.metroCheckBox1.Location = new System.Drawing.Point(188, 285); + this.metroCheckBox1.Name = "metroCheckBox1"; + this.metroCheckBox1.Size = new System.Drawing.Size(85, 15); + this.metroCheckBox1.TabIndex = 17; + this.metroCheckBox1.Text = "Interpolates"; + this.metroCheckBox1.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroCheckBox1.UseSelectable = true; + this.metroCheckBox1.CheckedChanged += new System.EventHandler(this.metroCheckBox1_CheckedChanged); + // + // metroButton1 + // + this.metroButton1.Location = new System.Drawing.Point(188, 306); + this.metroButton1.Name = "metroButton1"; + this.metroButton1.Size = new System.Drawing.Size(103, 24); + this.metroButton1.TabIndex = 18; + this.metroButton1.Text = "Play Animation"; + this.metroButton1.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroButton1.UseSelectable = true; + this.metroButton1.Click += new System.EventHandler(this.metroButton1_Click); + // + // pictureBoxWithInterpolationMode1 + // + this.pictureBoxWithInterpolationMode1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.pictureBoxWithInterpolationMode1.Location = new System.Drawing.Point(188, 88); + this.pictureBoxWithInterpolationMode1.Name = "pictureBoxWithInterpolationMode1"; + this.pictureBoxWithInterpolationMode1.Size = new System.Drawing.Size(192, 192); + this.pictureBoxWithInterpolationMode1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxWithInterpolationMode1.TabIndex = 16; + this.pictureBoxWithInterpolationMode1.TabStop = false; + // + // timer1 + // + this.timer1.Interval = 25; + this.timer1.Tick += new System.EventHandler(this.animate); + // + // metroButton2 + // + this.metroButton2.Enabled = false; + this.metroButton2.Location = new System.Drawing.Point(293, 306); + this.metroButton2.Name = "metroButton2"; + this.metroButton2.Size = new System.Drawing.Size(103, 24); + this.metroButton2.TabIndex = 19; + this.metroButton2.Text = "Stop Animation"; + this.metroButton2.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroButton2.UseSelectable = true; + this.metroButton2.Click += new System.EventHandler(this.metroButton2_Click); + // + // AnimationEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(400, 356); + this.Controls.Add(this.metroButton2); + this.Controls.Add(this.metroButton1); + this.Controls.Add(this.metroCheckBox1); + this.Controls.Add(this.pictureBoxWithInterpolationMode1); + this.Controls.Add(this.treeView1); + this.Controls.Add(this.menuStrip); + this.Name = "AnimationEditor"; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Text = "Animation Editor"; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + this.contextMenuStrip1.ResumeLayout(false); + this.menuStrip.ResumeLayout(false); + this.menuStrip.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem1; + private PictureBoxWithInterpolationMode pictureBoxWithInterpolationMode1; + private MetroFramework.Controls.MetroCheckBox metroCheckBox1; + private MetroFramework.Controls.MetroButton metroButton1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem addFrameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeFrameToolStripMenuItem; + private System.Windows.Forms.Timer timer1; + private MetroFramework.Controls.MetroButton metroButton2; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bulkAnimationSpeedToolStripMenuItem; + } +} \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs new file mode 100644 index 00000000..47d7d25a --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using MetroFramework.Forms; +using PckStudio; + +namespace PckStudio +{ + public partial class AnimationEditor : MetroForm + { + PCK.MineFile mf = new PCK.MineFile(); + List frames = new List(); + Image texture; + int frameCount; + string lastFrameTime = "1"; + + private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) + { + Tuple< string, string > frameData = e.Node.Tag as Tuple; + Console.WriteLine(frameData.Item1 + " --- " + frameData.Item2); + if (metroButton1.Enabled) + { + pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse(frameData.Item1)]; + } + } + + public AnimationEditor(PCK.MineFile MineFile) + { + mf = MineFile; + List strEntries = new List(); + List strEntryData = new List(); + + foreach (object[] entry in mf.entries) //object = metadata entry(name:value) + { + object[] strings = (object[])entry; + TreeNode meta = new TreeNode(); + + foreach (object[] entryy in mf.entries) + strEntries.Add((string)strings[0]); + strEntryData.Add((string)strings[1]); + } + + //if (strEntries.Find(entry => entry == "ANIM") == null) throw new System.Exception("ANIM tag is missing. No animation code is present."); + + InitializeComponent(); + MemoryStream textureMem = new MemoryStream(mf.data); + texture = Image.FromStream(textureMem); + createFrameList(); + + string anim = ""; + if (strEntries.Find(entry => entry == "ANIM") == null) anim = ""; + else anim = strEntryData[strEntries.FindIndex(entry => entry == "ANIM")]; + Console.WriteLine("ANIMATION DATA: " + anim); + if (anim.StartsWith("#")) + { + Console.WriteLine("Interpolate: true"); + metroCheckBox1.Checked = true; + anim = anim.Remove(0, 1); + } + else + { + Console.WriteLine("Interpolate: false"); + metroCheckBox1.Checked = false; + } + + frameCount = texture.Height / texture.Width; + + if (!String.IsNullOrEmpty(anim)) + { + string[] animData = anim.Split(new char[] { ',' }); + if (String.IsNullOrEmpty(animData.Last())) animData = animData.Take(animData.Length - 1).ToArray(); + foreach (string frame in animData) + { + string[] frameData = frame.Split(new char[] { '*' }); + string outFrame = ""; + int i = 0; + string currentFrame = ""; + string currentFrameTime = ""; + foreach (string data in frameData) + { + string label; + string outData; + if (i == 0) + { + outData = data; + if (String.IsNullOrEmpty(data)) throw new System.Exception("Invalid animation data"); + label = "Frame: "; + currentFrame = outData; + } + else + { + outData = data; + // Some textures like the Halloween 2015's Lava texture don't have a + // frame time parameter for certain frames. This will detect that and place the last frame time in its place. + // This is accurate to console edition behavior. + // - MattNL + if (String.IsNullOrEmpty(data)) outData = lastFrameTime; + label = ", Frame Time: "; + currentFrameTime = outData; + } + outFrame += label + outData; + i++; + } + Console.WriteLine(outFrame); + + TreeNode frameNode = new TreeNode(); + Tuple finalFrameData = new Tuple(currentFrame, currentFrameTime); + lastFrameTime = currentFrameTime; + frameNode.Text = outFrame; + frameNode.Tag = finalFrameData; + treeView1.Nodes.Add(frameNode); + } + } + else + { + for(int i = 0; i < frameCount; i++) + { + TreeNode frameNode = new TreeNode(); + Tuple finalFrameData = new Tuple(i.ToString(), "1"); + frameNode.Text = "Frame: " + i.ToString() + ", Frame Time: 1"; + frameNode.Tag = finalFrameData; + treeView1.Nodes.Add(frameNode); + } + } + + pictureBoxWithInterpolationMode1.Image = frames[0]; //Sets image preview to the first frame of animation (0 for now) + Console.WriteLine("Animation Frame Count: " + frameCount); + } + + void createFrameList() + { + int width = texture.Width; + int height = texture.Height; + int totalFrames = height / width; + for (int frameI = 0; frameI < totalFrames; frameI++) + { + Rectangle frameArea = new Rectangle(new Point(0, frameI * width), new Size(width, width)); + + Bitmap frameImage = new Bitmap(width, width); + using (Graphics gfx = Graphics.FromImage(frameImage)) + { + gfx.SmoothingMode = SmoothingMode.None; + gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + + gfx.DrawImage(texture, new Rectangle(0, 0, frameImage.Width, frameImage.Height), frameArea, GraphicsUnit.Pixel); + } + + frames.Add(new Bitmap(frameImage, new Size(width, width))); + } + + } + + private int mix(double ratio, int val1, int val2) // Ported from Java Edition code + { + return (int)(ratio * (double)val1 + (1.0D - ratio) * (double)val2); + } + + int animCurrentFrame = 0; + int animCurrentFrameTime = 0; + int animCurrentTotalFrameTime = -1; + Tuple currentFrameData = new Tuple("",""); + Image img = null; + int nextFrame; + int frameCounter = 0; // ported directly from Java Edition code -MattNL + Image imgB = null; + void animate(object sender, EventArgs e) + { + if (animCurrentFrameTime > animCurrentTotalFrameTime) + { + Console.WriteLine(frameCounter + " $$$ " + frameCount); + frameCounter = (frameCounter + 1) % frameCount; + animCurrentTotalFrameTime = 0; + animCurrentFrameTime = 0; + if (animCurrentFrame > (treeView1.Nodes.Count - 1)) animCurrentFrame = 0; + currentFrameData = treeView1.Nodes[animCurrentFrame].Tag as Tuple; + pictureBoxWithInterpolationMode1.Image = frames[Int16.Parse(currentFrameData.Item1)]; + animCurrentTotalFrameTime = Int16.Parse(currentFrameData.Item2); + animCurrentFrame++; + + if(metroCheckBox1.Checked) + { + img = frames[Int16.Parse(currentFrameData.Item1)]; + nextFrame = animCurrentFrame + 1; + if (nextFrame > frameCount - 1) nextFrame = 0; + Console.WriteLine(nextFrame); + imgB = frames[nextFrame]; + } + } + + // Interpolation Code (Very slow, messy, and resource heavy depending on the resolution!!!) + + /*else if(metroCheckBox1.Checked && (img != null && imgB != null)) + { + double d0 = 1.0D - animCurrentFrame / animCurrentTotalFrameTime; + int i = animCurrentFrame; + int j = frameCount; + int k = (frameCounter + 1) % j; + + for (int l = 0; l < (frames.Count() - 1); ++l) + { + int i1 = img.Width; + int j1 = img.Width; + + Bitmap finalInterpolation = new Bitmap(pictureBoxWithInterpolationMode1.Image); +// pictureBoxWithInterpolationMode1.Image.Dispose(); +// pictureBoxWithInterpolationMode1.Image = null; + + for (int k1 = 0; k1 < j1; ++k1) + { + for (int l1 = 0; l1 < i1; ++l1) + { + //Get Both Colours at the pixel point + Bitmap imgC = new Bitmap(img); + Bitmap imgBC = new Bitmap(imgB); + Color col1 = imgC.GetPixel(l1, k1); + Color col2 = imgBC.GetPixel(l1, k1); + imgC.Dispose(); + imgC = null; + imgBC.Dispose(); + imgBC = null; + + int i2 = 0; + i2 |= col1.A << 24; + i2 |= col1.R << 16; + i2 |= col1.G << 8; + i2 |= col1.B; + + int j2 = 0; + j2 |= col2.A << 24; + j2 |= col2.R << 16; + j2 |= col2.G << 8; + j2 |= col2.B; + + int k2 = this.mix(d0, i2 >> 16 & 255, j2 >> 16 & 255); + int l2 = this.mix(d0, i2 >> 8 & 255, j2 >> 8 & 255); + int i3 = this.mix(d0, i2 & 255, j2 & 255); + + // Create new grayscale RGB colour + uint finalColor = (uint)(i2 & -16777216 | k2 << 16 | l2 << 8 | i3); + + byte[] values = BitConverter.GetBytes(finalColor); + + int a = values[3]; + int b = values[0]; + int g = values[1]; + int r = values[2]; + + Color newcol = Color.FromArgb(a, r, g, b); + + finalInterpolation.SetPixel(l1, k1, newcol); + } + } + + pictureBoxWithInterpolationMode1.Image = finalInterpolation; + //finalInterpolation.Dispose(); + finalInterpolation = null; + } + } + */ + Console.WriteLine(animCurrentFrame + " - " + animCurrentFrameTime + " - " + animCurrentTotalFrameTime + " - " + (treeView1.Nodes.Count - 1)); + animCurrentFrameTime++; + } + + private void metroButton1_Click(object sender, EventArgs e) + { + animCurrentFrame = 0; + animCurrentFrameTime = 0; + animCurrentTotalFrameTime = -1; + frameCounter = 0; + metroButton1.Enabled = false; + metroButton2.Enabled = true; + timer1.Start(); + } + + private void metroButton2_Click(object sender, EventArgs e) + { + metroButton1.Enabled = true; + metroButton2.Enabled = false; + timer1.Stop(); + } + + private void treeView1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Delete) treeView1.Nodes.Remove(treeView1.SelectedNode); + } + + private void saveToolStripMenuItem1_Click(object sender, EventArgs e) + { + int animIndex = mf.entries.FindIndex(entry => (string)entry[0] == "ANIM"); + string animationData = ""; + if(metroCheckBox1.Checked) animationData += "#"; // does the animation interpolate? + foreach (TreeNode node in treeView1.Nodes) + { + Tuple frameData = node.Tag as Tuple; + animationData += frameData.Item1 + "*" + frameData.Item2 + ","; + } + animationData.TrimEnd(','); + object[] newEntry = new object[] + { + "ANIM", + animationData + }; + if (animIndex != -1) mf.entries[animIndex] = newEntry; + else mf.entries.Add(newEntry); + } + + // Most of the code below is modified code from this link: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0 + // - MattNL + + private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) + { + // Move the dragged node when the left mouse button is used. + if (e.Button == MouseButtons.Left) + { + DoDragDrop(e.Item, DragDropEffects.Move); + } + } + + // Set the target drop effect to the effect + // specified in the ItemDrag event handler. + private void treeView1_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.AllowedEffect; + } + + // Select the node under the mouse pointer to indicate the + // expected drop location. + private void treeView1_DragOver(object sender, DragEventArgs e) + { + // Retrieve the client coordinates of the mouse position. + Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y)); + + // Select the node at the mouse position. + treeView1.SelectedNode = treeView1.GetNodeAt(targetPoint); + } + + private void treeView1_DragDrop(object sender, DragEventArgs e) + { + // Retrieve the client coordinates of the drop location. + Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y)); + + // Retrieve the node at the drop location. + TreeNode targetNode = treeView1.GetNodeAt(targetPoint); + + // Retrieve the node that was dragged. + TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); + + // Confirm that the node at the drop location is not + // the dragged node or a descendant of the dragged node. + if (targetNode == null) + { + draggedNode.Remove(); + treeView1.Nodes.Add(draggedNode); + } + else if (!draggedNode.Equals(targetNode) && !ContainsNode(draggedNode, targetNode)) + { + // If it is a move operation, remove the node from its current + // location and add it to the node at the drop location. + + if (e.Effect == DragDropEffects.Move) + { + int draggedIndex = draggedNode.Index; + int targetIndex = targetNode.Index; + draggedNode.Remove(); + + if (targetNode.Tag == null) // Add to folder + { + targetNode.Nodes.Add(draggedNode); + } + else // Move file aside + { + if (targetNode.Parent != null) + { + targetNode.Parent.Nodes.Insert(targetIndex, draggedNode); + } + else + { + treeView1.Nodes.Insert(targetIndex, draggedNode); + } + } + } + + // Expand the node at the location + // to show the dropped node. + targetNode.Expand(); + } + } + + // Determine whether one node is a parent + // or ancestor of a second node. + private bool ContainsNode(TreeNode node1, TreeNode node2) + { + // Check the parent node of the second node. + if (node2.Parent == null) return false; + if (node2.Parent.Equals(node1)) return true; + + // If the parent node is not null or equal to the first node, + // call the ContainsNode method recursively using the parent of + // the second node. + return ContainsNode(node1, node2.Parent); + } + + private void addFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + PckStudio.Forms.Utilities.AnimationEditor.FrameEditor diag = new PckStudio.Forms.Utilities.AnimationEditor.FrameEditor( + treeView1, + new Tuple("",""), + frameCount - 1, + true, + new TreeNode()); + diag.ShowDialog(this); + diag.Dispose(); + } + + private void treeView1_doubleClick(object sender, EventArgs e) + { + PckStudio.Forms.Utilities.AnimationEditor.FrameEditor diag = new PckStudio.Forms.Utilities.AnimationEditor.FrameEditor( + treeView1, + treeView1.SelectedNode.Tag as Tuple, + frameCount - 1, + false, + treeView1.SelectedNode + ); + diag.ShowDialog(this); + diag.Dispose(); + } + + private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + treeView1.SelectedNode.Remove(); + } + + private void metroCheckBox1_CheckedChanged(object sender, EventArgs e) {} + + private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e) + { + PckStudio.Forms.Utilities.AnimationEditor.SetBulkSpeed diag = new PckStudio.Forms.Utilities.AnimationEditor.SetBulkSpeed(treeView1); + diag.ShowDialog(this); + diag.Dispose(); + } + } +} diff --git a/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx new file mode 100644 index 00000000..cc7da445 --- /dev/null +++ b/MinecraftUSkinEditor/Forms/Utilities/AnimationEditor.resx @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 125, 17 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C + y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga + QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN + 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC + + + + 280, 17 + + \ No newline at end of file diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.Designer.cs b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.Designer.cs similarity index 100% rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.Designer.cs rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.Designer.cs diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.cs b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.cs similarity index 100% rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.cs rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.cs diff --git a/MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.resx b/MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.resx similarity index 100% rename from MinecraftUSkinEditor/Forms/Skins-And-Textures/addCategory.resx rename to MinecraftUSkinEditor/Forms/Utilities/Audio/addCategory.resx diff --git a/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx b/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx index aff4c22b..d5ed156b 100644 --- a/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx +++ b/MinecraftUSkinEditor/Forms/Utilities/AudioEditor.resx @@ -121,6 +121,26 @@ 127, 8 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 168, 22 + + + Add Category + + + 168, 22 + + + Remove Category + 169, 48 @@ -159,37 +179,39 @@ 4 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 168, 22 - - - Add Category - - - 168, 22 - - - Remove Category - 19, 8 False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C + y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga + QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN + 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC + + + + 98, 22 + + + Save + + + 37, 20 + + + File + 20, 60 - 411, 24 + 410, 24 11 @@ -209,31 +231,29 @@ 8 - - 37, 20 - - - File - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C - y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga - QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN - 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - - - 98, 22 - - - Save - 282, 8 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 147, 22 + + + Add Entry + + + 147, 22 + + + Remove Entry + 148, 48 @@ -264,26 +284,6 @@ 7 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 147, 22 - - - Add Entry - - - 147, 22 - - - Remove Entry - 290, 155 @@ -351,7 +351,7 @@ $this - 1 + 3 True @@ -378,7 +378,7 @@ $this - 0 + 2 True @@ -390,7 +390,7 @@ 6, 13 - 451, 334 + 450, 330 Audio Editor diff --git a/MinecraftUSkinEditor/PckStudio.csproj b/MinecraftUSkinEditor/PckStudio.csproj index eb2d0711..56417929 100644 --- a/MinecraftUSkinEditor/PckStudio.csproj +++ b/MinecraftUSkinEditor/PckStudio.csproj @@ -372,10 +372,16 @@ rename.cs - + Form - + + SetBulkSpeed.cs + + + Form + + addCategory.cs @@ -453,6 +459,18 @@ Testx-12.cs + + Form + + + AnimationEditor.cs + + + Form + + + FrameEditor.cs + Form @@ -595,7 +613,10 @@ rename.cs - + + SetBulkSpeed.cs + + addCategory.cs @@ -663,6 +684,12 @@ Testx-12.cs + + AnimationEditor.cs + + + FrameEditor.cs + AudioEditor.cs