From 885677d33d16f322cd30971a3368d5c3b2e6f73f Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Sat, 20 Aug 2022 20:05:45 +0200 Subject: [PATCH] Refactored Animation Editor --- .../Animation/ChangeTile.Designer.cs | 50 +- .../Additional-Popups/Animation/ChangeTile.cs | 158 ++++ .../Animation/ChangeTile.resx | 0 .../Animation/FrameEditor.Designer.cs | 175 +++++ .../Animation/FrameEditor.cs | 45 ++ .../Animation/FrameEditor.resx | 0 .../Animation/SetBulkSpeed.Designer.cs | 2 +- .../Animation/SetBulkSpeed.cs | 15 +- .../Animation/SetBulkSpeed.resx | 0 .../Forms/Editor/AnimationEditor.Designer.cs | 344 +++++++++ PCK-Studio/Forms/Editor/AnimationEditor.cs | 591 +++++++++++++++ .../Animation => Editor}/AnimationEditor.resx | 3 - .../Animation/AnimationEditor.Designer.cs | 350 --------- .../Utilities/Animation/AnimationEditor.cs | 672 ------------------ .../Forms/Utilities/Animation/ChangeTile.cs | 227 ------ .../Animation/FrameEditor.Designer.cs | 200 ------ .../Forms/Utilities/Animation/FrameEditor.cs | 71 -- PCK-Studio/Forms/Utilities/AnimationUtil.cs | 68 ++ PCK-Studio/MainForm.cs | 54 +- PCK-Studio/PckStudio.csproj | 25 +- PCK-Studio/Resources/tileData.json | 4 +- 21 files changed, 1452 insertions(+), 1602 deletions(-) rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/ChangeTile.Designer.cs (83%) create mode 100644 PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/ChangeTile.resx (100%) create mode 100644 PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs create mode 100644 PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/FrameEditor.resx (100%) rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/SetBulkSpeed.Designer.cs (99%) rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/SetBulkSpeed.cs (79%) rename PCK-Studio/Forms/{Utilities => Additional-Popups}/Animation/SetBulkSpeed.resx (100%) create mode 100644 PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs create mode 100644 PCK-Studio/Forms/Editor/AnimationEditor.cs rename PCK-Studio/Forms/{Utilities/Animation => Editor}/AnimationEditor.resx (99%) delete mode 100644 PCK-Studio/Forms/Utilities/Animation/AnimationEditor.Designer.cs delete mode 100644 PCK-Studio/Forms/Utilities/Animation/AnimationEditor.cs delete mode 100644 PCK-Studio/Forms/Utilities/Animation/ChangeTile.cs delete mode 100644 PCK-Studio/Forms/Utilities/Animation/FrameEditor.Designer.cs delete mode 100644 PCK-Studio/Forms/Utilities/Animation/FrameEditor.cs create mode 100644 PCK-Studio/Forms/Utilities/AnimationUtil.cs diff --git a/PCK-Studio/Forms/Utilities/Animation/ChangeTile.Designer.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.Designer.cs similarity index 83% rename from PCK-Studio/Forms/Utilities/Animation/ChangeTile.Designer.cs rename to PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.Designer.cs index cb35f651..0f269246 100644 --- a/PCK-Studio/Forms/Utilities/Animation/ChangeTile.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.Designer.cs @@ -1,4 +1,4 @@ -namespace PckStudio.Forms.Utilities.AnimationEditor +namespace PckStudio.Forms.Additional_Popups.Animation { partial class ChangeTile { @@ -30,8 +30,8 @@ { this.acceptBtn = new System.Windows.Forms.Button(); this.CancelBtn = new System.Windows.Forms.Button(); - this.treeView1 = new System.Windows.Forms.TreeView(); - this.treeView2 = new System.Windows.Forms.TreeView(); + this.treeViewBlocks = new System.Windows.Forms.TreeView(); + this.treeViewItems = new System.Windows.Forms.TreeView(); this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); this.metroTextBox1 = new MetroFramework.Controls.MetroTextBox(); @@ -54,7 +54,7 @@ this.acceptBtn.TabIndex = 7; this.acceptBtn.Text = "Save"; this.acceptBtn.UseVisualStyleBackColor = true; - this.acceptBtn.Click += new System.EventHandler(this.button1_Click); + this.acceptBtn.Click += new System.EventHandler(this.AcceptBtn_Click); // // CancelBtn // @@ -68,29 +68,29 @@ this.CancelBtn.TabIndex = 13; this.CancelBtn.Text = "Cancel"; this.CancelBtn.UseVisualStyleBackColor = true; - this.CancelBtn.Click += new System.EventHandler(this.button2_Click); + this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); // // treeView1 // - this.treeView1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.ForeColor = System.Drawing.Color.White; - this.treeView1.Location = new System.Drawing.Point(0, 0); - this.treeView1.Name = "treeView1"; - this.treeView1.Size = new System.Drawing.Size(184, 125); - this.treeView1.TabIndex = 14; - this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViews_AfterSelect); + this.treeViewBlocks.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.treeViewBlocks.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeViewBlocks.ForeColor = System.Drawing.Color.White; + this.treeViewBlocks.Location = new System.Drawing.Point(0, 0); + this.treeViewBlocks.Name = "treeView1"; + this.treeViewBlocks.Size = new System.Drawing.Size(184, 125); + this.treeViewBlocks.TabIndex = 14; + this.treeViewBlocks.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViews_AfterSelect); // // treeView2 // - this.treeView2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.treeView2.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView2.ForeColor = System.Drawing.Color.White; - this.treeView2.Location = new System.Drawing.Point(0, 0); - this.treeView2.Name = "treeView2"; - this.treeView2.Size = new System.Drawing.Size(184, 125); - this.treeView2.TabIndex = 14; - this.treeView2.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViews_AfterSelect); + this.treeViewItems.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.treeViewItems.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeViewItems.ForeColor = System.Drawing.Color.White; + this.treeViewItems.Location = new System.Drawing.Point(0, 0); + this.treeViewItems.Name = "treeView2"; + this.treeViewItems.Size = new System.Drawing.Size(184, 125); + this.treeViewItems.TabIndex = 14; + this.treeViewItems.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViews_AfterSelect); // // metroLabel1 // @@ -159,7 +159,7 @@ // Blocks // this.Blocks.BackColor = System.Drawing.SystemColors.WindowFrame; - this.Blocks.Controls.Add(this.treeView1); + this.Blocks.Controls.Add(this.treeViewBlocks); this.Blocks.Location = new System.Drawing.Point(4, 38); this.Blocks.Name = "Blocks"; this.Blocks.Size = new System.Drawing.Size(184, 125); @@ -169,7 +169,7 @@ // Items // this.Items.BackColor = System.Drawing.SystemColors.WindowFrame; - this.Items.Controls.Add(this.treeView2); + this.Items.Controls.Add(this.treeViewItems); this.Items.Location = new System.Drawing.Point(4, 38); this.Items.Name = "Items"; this.Items.Size = new System.Drawing.Size(184, 125); @@ -213,8 +213,8 @@ #endregion private System.Windows.Forms.Button acceptBtn; private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.TreeView treeView1; - private System.Windows.Forms.TreeView treeView2; + private System.Windows.Forms.TreeView treeViewBlocks; + private System.Windows.Forms.TreeView treeViewItems; private MetroFramework.Controls.MetroLabel metroLabel1; private MetroFramework.Controls.MetroLabel metroLabel2; private MetroFramework.Controls.MetroTextBox metroTextBox1; diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs new file mode 100644 index 00000000..f76c24b4 --- /dev/null +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs @@ -0,0 +1,158 @@ +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 System.IO; +using System.Windows.Forms; +using MetroFramework.Forms; +using System.Drawing.Drawing2D; +using Newtonsoft.Json.Linq; +using PckStudio.Forms.Utilities; + +namespace PckStudio.Forms.Additional_Popups.Animation +{ + public partial class ChangeTile : MetroForm + { + string selectedTile = ""; + + bool isItem = false; + public string SelectedTile => selectedTile; + public bool IsItem => isItem; + + List treeViewBlockCache = new List(); + List treeViewItemCache = new List(); + + public ChangeTile() + { + InitializeComponent(); + ImageList tiles = new ImageList(); + tiles.ColorDepth = ColorDepth.Depth32Bit; + tiles.Images.AddRange(AnimationUtil.tileImages); + treeViewBlocks.ImageList = tiles; + treeViewItems.ImageList = tiles; + + try + { + int i = 0; + + if (AnimationUtil.tileData["blocks"] != null) + { + foreach (JObject content in AnimationUtil.tileData["blocks"].Children()) + { + foreach (JProperty prop in content.Properties()) + { + if (!string.IsNullOrEmpty((string)prop.Value)) + { + TreeNode tileNode = new TreeNode((string)prop.Value) + { + Tag = prop.Name, + ImageIndex = i, + SelectedImageIndex = i, + }; + treeViewBlocks.Nodes.Add(tileNode); + treeViewBlockCache.Add(tileNode); + } + i++; + } + } + } + if (AnimationUtil.tileData["items"] != null) + { + foreach (JObject content in AnimationUtil.tileData["items"].Children()) + { + foreach (JProperty prop in content.Properties()) + { + if (!string.IsNullOrEmpty((string)prop.Value)) + { + TreeNode tileNode = new TreeNode((string)prop.Value) + { + Tag = prop.Name, + ImageIndex = i, + SelectedImageIndex = i, + }; + treeViewItems.Nodes.Add(tileNode); + treeViewItemCache.Add(tileNode); + } + i++; + } + } + } + } + catch (Newtonsoft.Json.JsonException j_ex) + { + MessageBox.Show(j_ex.Message, "Error"); + return; + } + } + + private void treeViews_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node.Tag is string tileData) + { + selectedTile = tileData; + Console.WriteLine(selectedTile); + isItem = e.Node.TreeView == treeViewItems; + } + } + + void filter_TextChanged(object sender, EventArgs e) + { + // Some code in this function is modified code from this StackOverflow answer - MattNL + //https://stackoverflow.com/questions/8260322/filter-a-treeview-with-a-textbox-in-a-c-sharp-winforms-app + + //blocks repainting tree until all objects loaded + treeViewBlocks.BeginUpdate(); + treeViewBlocks.Nodes.Clear(); + treeViewItems.BeginUpdate(); + treeViewItems.Nodes.Clear(); + if (!string.IsNullOrEmpty(metroTextBox1.Text)) + { + foreach (TreeNode _node in treeViewBlockCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + treeViewBlocks.Nodes.Add((TreeNode)_node.Clone()); + } + } + foreach (TreeNode _node in treeViewItemCache) + { + if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + { + treeViewItems.Nodes.Add((TreeNode)_node.Clone()); + } + } + } + else + { + foreach (TreeNode _node in treeViewBlockCache) + { + treeViewBlocks.Nodes.Add((TreeNode)_node.Clone()); + } + foreach (TreeNode _node in treeViewItemCache) + { + treeViewItems.Nodes.Add((TreeNode)_node.Clone()); + } + } + //enables redrawing tree after all objects have been added + treeViewBlocks.EndUpdate(); + treeViewItems.EndUpdate(); + } + + private void CancelBtn_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void AcceptBtn_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(selectedTile)) CancelBtn_Click(sender, e); + DialogResult = DialogResult.OK; + Close(); + } + } +} diff --git a/PCK-Studio/Forms/Utilities/Animation/ChangeTile.resx b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.resx similarity index 100% rename from PCK-Studio/Forms/Utilities/Animation/ChangeTile.resx rename to PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.resx diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs new file mode 100644 index 00000000..664d19b9 --- /dev/null +++ b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.Designer.cs @@ -0,0 +1,175 @@ + +namespace PckStudio.Forms.Additional_Popups.Animation +{ + 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.SaveBtn = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.CancelBtn = new System.Windows.Forms.Button(); + this.FrameIndexUpDown = new System.Windows.Forms.NumericUpDown(); + this.FrameTimeUpDown = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.FrameIndexUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).BeginInit(); + this.SuspendLayout(); + // + // SaveBtn + // + this.SaveBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.SaveBtn.ForeColor = System.Drawing.Color.White; + this.SaveBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.SaveBtn.Location = new System.Drawing.Point(55, 111); + this.SaveBtn.Name = "SaveBtn"; + this.SaveBtn.Size = new System.Drawing.Size(75, 23); + this.SaveBtn.TabIndex = 7; + this.SaveBtn.Text = "Save"; + this.SaveBtn.UseVisualStyleBackColor = true; + this.SaveBtn.Click += new System.EventHandler(this.SaveBtn_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(65, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Frame Index"; + // + // 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"; + // + // 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"; + // + // CancelBtn + // + this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.CancelBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.CancelBtn.ForeColor = System.Drawing.Color.White; + this.CancelBtn.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.CancelBtn.Location = new System.Drawing.Point(135, 111); + this.CancelBtn.Name = "CancelBtn"; + this.CancelBtn.Size = new System.Drawing.Size(75, 23); + this.CancelBtn.TabIndex = 13; + this.CancelBtn.Text = "Cancel"; + this.CancelBtn.UseVisualStyleBackColor = true; + this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); + // + // FrameIndexUpDown + // + this.FrameIndexUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + this.FrameIndexUpDown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.FrameIndexUpDown.ForeColor = System.Drawing.SystemColors.Window; + this.FrameIndexUpDown.Location = new System.Drawing.Point(77, 54); + this.FrameIndexUpDown.Maximum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.FrameIndexUpDown.Name = "FrameIndexUpDown"; + this.FrameIndexUpDown.Size = new System.Drawing.Size(179, 20); + this.FrameIndexUpDown.TabIndex = 14; + this.FrameIndexUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // FrameTimeUpDown + // + this.FrameTimeUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); + this.FrameTimeUpDown.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.FrameTimeUpDown.ForeColor = System.Drawing.SystemColors.Window; + this.FrameTimeUpDown.Location = new System.Drawing.Point(77, 81); + this.FrameTimeUpDown.Maximum = new decimal(new int[] { + 10000, + 0, + 0, + 0}); + this.FrameTimeUpDown.Name = "FrameTimeUpDown"; + this.FrameTimeUpDown.Size = new System.Drawing.Size(179, 20); + this.FrameTimeUpDown.TabIndex = 15; + this.FrameTimeUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // FrameEditor + // + this.AcceptButton = this.SaveBtn; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.CancelBtn; + this.ClientSize = new System.Drawing.Size(264, 140); + this.ControlBox = false; + this.Controls.Add(this.FrameTimeUpDown); + this.Controls.Add(this.FrameIndexUpDown); + this.Controls.Add(this.CancelBtn); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.SaveBtn); + this.Controls.Add(this.label2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(266, 142); + this.Name = "FrameEditor"; + this.Resizable = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + ((System.ComponentModel.ISupportInitialize)(this.FrameIndexUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.FrameTimeUpDown)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button SaveBtn; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button CancelBtn; + private System.Windows.Forms.NumericUpDown FrameIndexUpDown; + private System.Windows.Forms.NumericUpDown FrameTimeUpDown; + } +} \ No newline at end of file diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs new file mode 100644 index 00000000..c820c4c3 --- /dev/null +++ b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.cs @@ -0,0 +1,45 @@ +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; + +using PckStudio.Forms.Editor; + +namespace PckStudio.Forms.Additional_Popups.Animation +{ + public partial class FrameEditor : MetroForm + { + public int FrameTextureIndex => (int)FrameIndexUpDown.Value; + public int FrameTime => (int)FrameTimeUpDown.Value; + + public FrameEditor(int indexLimit) + { + InitializeComponent(); + label3.Text = "Frame must be within 0 and " + indexLimit + "."; + FrameIndexUpDown.Maximum = indexLimit; + FrameTimeUpDown.Minimum = 1; + } + public FrameEditor(int frameTime, int frameTextureIndex, int indexLimit) : this(indexLimit) + { + FrameIndexUpDown.Value = frameTextureIndex; + FrameTimeUpDown.Value = frameTime; + } + + private void SaveBtn_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + Close(); + } + + private void CancelBtn_Click(object sender, EventArgs e) + { + Close(); + } + } +} diff --git a/PCK-Studio/Forms/Utilities/Animation/FrameEditor.resx b/PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx similarity index 100% rename from PCK-Studio/Forms/Utilities/Animation/FrameEditor.resx rename to PCK-Studio/Forms/Additional-Popups/Animation/FrameEditor.resx diff --git a/PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs b/PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.Designer.cs similarity index 99% rename from PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs rename to PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.Designer.cs index fec777ee..478e460d 100644 --- a/PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.Designer.cs @@ -1,5 +1,5 @@  -namespace PckStudio.Forms.Utilities.AnimationEditor +namespace PckStudio.Forms.Additional_Popups.Animation { partial class SetBulkSpeed { diff --git a/PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.cs b/PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.cs similarity index 79% rename from PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.cs rename to PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.cs index fb60ea23..c758ce14 100644 --- a/PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using MetroFramework.Forms; using System.Windows.Forms; -namespace PckStudio.Forms.Utilities.AnimationEditor +namespace PckStudio.Forms.Additional_Popups.Animation { public partial class SetBulkSpeed : MetroForm { @@ -23,16 +23,12 @@ namespace PckStudio.Forms.Utilities.AnimationEditor private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { - if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) - { - e.Handled = true; - } + e.Handled = !char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar); } private void button1_Click(object sender, EventArgs e) { - if(metroTextBox2.Text == "") {} - else if(Int16.Parse(metroTextBox2.Text) < 0) {} + if (metroTextBox2.Text == "" || short.Parse(metroTextBox2.Text) < 0) return; else { int i = 0; @@ -47,14 +43,13 @@ namespace PckStudio.Forms.Utilities.AnimationEditor tv.Nodes.Insert(i, frameNode); i++; } - - this.Close(); + Close(); } } private void button2_Click(object sender, EventArgs e) { - this.Close(); + Close(); } } } diff --git a/PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.resx b/PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.resx similarity index 100% rename from PCK-Studio/Forms/Utilities/Animation/SetBulkSpeed.resx rename to PCK-Studio/Forms/Additional-Popups/Animation/SetBulkSpeed.resx diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs new file mode 100644 index 00000000..b12b5916 --- /dev/null +++ b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs @@ -0,0 +1,344 @@ +namespace PckStudio.Forms.Editor +{ + 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.frameTreeView = 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.importJavaAnimationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.changeTileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.InterpolationCheckbox = new MetroFramework.Controls.MetroCheckBox(); + this.AnimationPlayBtn = new MetroFramework.Controls.MetroButton(); + this.AnimationStopBtn = new MetroFramework.Controls.MetroButton(); + this.tileLabel = new MetroFramework.Controls.MetroLabel(); + this.MipMapCheckbox = new MetroFramework.Controls.MetroCheckBox(); + this.MipMapLabel = new MetroFramework.Controls.MetroLabel(); + this.MipMapNumericUpDown = new System.Windows.Forms.NumericUpDown(); + this.pictureBoxWithInterpolationMode1 = new PckStudio.PictureBoxWithInterpolationMode(); + this.contextMenuStrip1.SuspendLayout(); + this.menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.MipMapNumericUpDown)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).BeginInit(); + this.SuspendLayout(); + // + // treeView1 + // + this.frameTreeView.AllowDrop = true; + this.frameTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.frameTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.frameTreeView.ContextMenuStrip = this.contextMenuStrip1; + this.frameTreeView.ForeColor = System.Drawing.Color.White; + this.frameTreeView.Location = new System.Drawing.Point(20, 88); + this.frameTreeView.Margin = new System.Windows.Forms.Padding(0); + this.frameTreeView.Name = "treeView1"; + this.frameTreeView.Size = new System.Drawing.Size(165, 198); + this.frameTreeView.TabIndex = 15; + this.frameTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.frameTreeView_ItemDrag); + this.frameTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.frameTreeView_AfterSelect); + this.frameTreeView.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_doubleClick); + this.frameTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.frameTreeView_DragDrop); + this.frameTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.frameTreeView_DragEnter); + this.frameTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.frameTreeView_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(154, 48); + // + // addFrameToolStripMenuItem + // + this.addFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; + this.addFrameToolStripMenuItem.Name = "addFrameToolStripMenuItem"; + this.addFrameToolStripMenuItem.Size = new System.Drawing.Size(153, 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(153, 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.helpToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(20, 60); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(372, 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(98, 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.importJavaAnimationToolStripMenuItem, + this.changeTileToolStripMenuItem}); + this.editToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(46, 20); + this.editToolStripMenuItem.Text = "Tools"; + // + // bulkAnimationSpeedToolStripMenuItem + // + this.bulkAnimationSpeedToolStripMenuItem.Image = global::PckStudio.Properties.Resources.clock; + 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); + // + // importJavaAnimationToolStripMenuItem + // + this.importJavaAnimationToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; + this.importJavaAnimationToolStripMenuItem.Name = "importJavaAnimationToolStripMenuItem"; + this.importJavaAnimationToolStripMenuItem.Size = new System.Drawing.Size(210, 22); + this.importJavaAnimationToolStripMenuItem.Text = "Import Java Animation"; + this.importJavaAnimationToolStripMenuItem.Click += new System.EventHandler(this.importJavaAnimationToolStripMenuItem_Click); + // + // changeTileToolStripMenuItem + // + this.changeTileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.changeTile; + this.changeTileToolStripMenuItem.Name = "changeTileToolStripMenuItem"; + this.changeTileToolStripMenuItem.Size = new System.Drawing.Size(210, 22); + this.changeTileToolStripMenuItem.Text = "Change Tile"; + this.changeTileToolStripMenuItem.Click += new System.EventHandler(this.changeTileToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem.Text = "Help"; + this.helpToolStripMenuItem.Click += new System.EventHandler(this.helpToolStripMenuItem_Click); + // + // InterpolationCheckbox + // + this.InterpolationCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.InterpolationCheckbox.AutoSize = true; + this.InterpolationCheckbox.Location = new System.Drawing.Point(188, 317); + this.InterpolationCheckbox.Name = "InterpolationCheckbox"; + this.InterpolationCheckbox.Size = new System.Drawing.Size(204, 15); + this.InterpolationCheckbox.TabIndex = 17; + this.InterpolationCheckbox.Text = "Interpolates (not simulated above)"; + this.InterpolationCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.InterpolationCheckbox.UseSelectable = true; + // + // AnimationPlayBtn + // + this.AnimationPlayBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.AnimationPlayBtn.Location = new System.Drawing.Point(188, 291); + this.AnimationPlayBtn.Name = "AnimationPlayBtn"; + this.AnimationPlayBtn.Size = new System.Drawing.Size(99, 24); + this.AnimationPlayBtn.TabIndex = 18; + this.AnimationPlayBtn.Text = "Play Animation"; + this.AnimationPlayBtn.Theme = MetroFramework.MetroThemeStyle.Dark; + this.AnimationPlayBtn.UseSelectable = true; + this.AnimationPlayBtn.Click += new System.EventHandler(this.StartAnimationBtn_Click); + // + // AnimationStopBtn + // + this.AnimationStopBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.AnimationStopBtn.Enabled = false; + this.AnimationStopBtn.Location = new System.Drawing.Point(293, 291); + this.AnimationStopBtn.Name = "AnimationStopBtn"; + this.AnimationStopBtn.Size = new System.Drawing.Size(99, 24); + this.AnimationStopBtn.TabIndex = 19; + this.AnimationStopBtn.Text = "Stop Animation"; + this.AnimationStopBtn.Theme = MetroFramework.MetroThemeStyle.Dark; + this.AnimationStopBtn.UseSelectable = true; + this.AnimationStopBtn.Click += new System.EventHandler(this.StopAnimationBtn_Click); + // + // tileLabel + // + this.tileLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.tileLabel.AutoSize = true; + this.tileLabel.Location = new System.Drawing.Point(20, 290); + this.tileLabel.MinimumSize = new System.Drawing.Size(170, 19); + this.tileLabel.Name = "tileLabel"; + this.tileLabel.Size = new System.Drawing.Size(57, 19); + this.tileLabel.TabIndex = 20; + this.tileLabel.Text = "tileLabel"; + this.tileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // MipMapCheckbox + // + this.MipMapCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.MipMapCheckbox.AutoSize = true; + this.MipMapCheckbox.Location = new System.Drawing.Point(20, 312); + this.MipMapCheckbox.Name = "MipMapCheckbox"; + this.MipMapCheckbox.Size = new System.Drawing.Size(128, 15); + this.MipMapCheckbox.TabIndex = 21; + this.MipMapCheckbox.Text = "Is Mip Map Texture?"; + this.MipMapCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.MipMapCheckbox.UseSelectable = true; + this.MipMapCheckbox.CheckedChanged += new System.EventHandler(this.MipMapCheckBox_CheckedChanged); + // + // MipMapLabel + // + this.MipMapLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.MipMapLabel.AutoSize = true; + this.MipMapLabel.Location = new System.Drawing.Point(21, 330); + this.MipMapLabel.Name = "MipMapLabel"; + this.MipMapLabel.Size = new System.Drawing.Size(99, 19); + this.MipMapLabel.TabIndex = 22; + this.MipMapLabel.Text = "Mip Map Level:"; + this.MipMapLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + this.MipMapLabel.Visible = false; + // + // MipMapNumericUpDown + // + this.MipMapNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.MipMapNumericUpDown.BackColor = System.Drawing.Color.Black; + this.MipMapNumericUpDown.ForeColor = System.Drawing.SystemColors.Window; + this.MipMapNumericUpDown.Location = new System.Drawing.Point(127, 330); + this.MipMapNumericUpDown.Maximum = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.MipMapNumericUpDown.Minimum = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.MipMapNumericUpDown.Name = "MipMapNumericUpDown"; + this.MipMapNumericUpDown.Size = new System.Drawing.Size(44, 20); + this.MipMapNumericUpDown.TabIndex = 23; + this.MipMapNumericUpDown.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + this.MipMapNumericUpDown.Visible = false; + // + // pictureBoxWithInterpolationMode1 + // + this.pictureBoxWithInterpolationMode1.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.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(204, 198); + this.pictureBoxWithInterpolationMode1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxWithInterpolationMode1.TabIndex = 16; + this.pictureBoxWithInterpolationMode1.TabStop = false; + // + // AnimationEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(412, 362); + this.Controls.Add(this.AnimationStopBtn); + this.Controls.Add(this.AnimationPlayBtn); + this.Controls.Add(this.MipMapNumericUpDown); + this.Controls.Add(this.MipMapLabel); + this.Controls.Add(this.MipMapCheckbox); + this.Controls.Add(this.tileLabel); + this.Controls.Add(this.InterpolationCheckbox); + this.Controls.Add(this.pictureBoxWithInterpolationMode1); + this.Controls.Add(this.frameTreeView); + this.Controls.Add(this.menuStrip); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(412, 362); + 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.MipMapNumericUpDown)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxWithInterpolationMode1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TreeView frameTreeView; + 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 InterpolationCheckbox; + private MetroFramework.Controls.MetroButton AnimationPlayBtn; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem addFrameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeFrameToolStripMenuItem; + private MetroFramework.Controls.MetroButton AnimationStopBtn; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bulkAnimationSpeedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importJavaAnimationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem changeTileToolStripMenuItem; + private MetroFramework.Controls.MetroLabel tileLabel; + private MetroFramework.Controls.MetroCheckBox MipMapCheckbox; + private MetroFramework.Controls.MetroLabel MipMapLabel; + private System.Windows.Forms.NumericUpDown MipMapNumericUpDown; + } +} \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs new file mode 100644 index 00000000..736efd66 --- /dev/null +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -0,0 +1,591 @@ +using MetroFramework.Forms; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using PckStudio.Classes.FileTypes; +using PckStudio.Forms.Additional_Popups.Animation; +using PckStudio.Properties; +using PckStudio.Forms.Utilities; + +namespace PckStudio.Forms.Editor +{ + public partial class AnimationEditor : MetroForm + { + PCKFile.FileData animationFile; + Animation currentAnimation; + AnimationPlayer player; + + bool isItem = false; + string animationSection => AnimationUtil.GetAnimationSection(isItem); + + string TileName = string.Empty; + + //int frameCounter = 0; // ported directly from Java Edition code -MattNL + + sealed class Animation + { + public const int MinimumFrameTime = 1; + + private readonly List frameTextures; + + private readonly List frames = new List(); + + public Frame this[int frameIndex] => frames[frameIndex]; + + // not implemented rn... + public bool Interpolate { get; set; } = false; + + public Animation(Image image) + { + frameTextures = new List(SplitImageToFrameTextures(image)); + } + + public Animation(Image image, string ANIM) : this(image) + { + ParseAnim(ANIM); + } + + public struct Frame + { + public readonly Image Texture; + public int Ticks; + + public static implicit operator Image(Frame f) => f.Texture; + + public Frame(Image texture) : this(texture, MinimumFrameTime) + {} + + public Frame(Image texture, int frameTime) + { + Texture = texture; + Ticks = frameTime; + } + } + + public void ParseAnim(string ANIM) + { + _ = ANIM ?? throw new ArgumentNullException(nameof(ANIM)); + ANIM = (Interpolate = ANIM.StartsWith("#")) ? ANIM.Substring(1) : ANIM; + string[] animData = ANIM.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + int lastFrameTime = MinimumFrameTime; + foreach (string frameInfo in animData) + { + string[] frameData = frameInfo.Split('*'); + //if (frameData.Length < 2) + // continue; // shouldn't happen + int currentFrameIndex = int.TryParse(frameData[0], out currentFrameIndex) ? currentFrameIndex : 0; + + // 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 + int currentFrameTime = string.IsNullOrEmpty(frameData[1]) ? lastFrameTime : int.Parse(frameData[1]); + AddFrame(currentFrameIndex, currentFrameTime); + lastFrameTime = currentFrameTime; + } + } + public Frame AddFrame(int frameTextureIndex) => AddFrame(frameTextureIndex, MinimumFrameTime); + public Frame AddFrame(int frameTextureIndex, int frameTime) + { + if (frameTextureIndex < 0 || frameTextureIndex >= frameTextures.Count) + throw new ArgumentOutOfRangeException(nameof(frameTextureIndex)); + Frame f = new Frame(frameTextures[frameTextureIndex], frameTime); + frames.Add(f); + return f; + } + + public bool RemoveFrame(int frameIndex) + { + frames.RemoveAt(frameIndex); + return true; + } + + private static IEnumerable SplitImageToFrameTextures(Image source) + { + for (int i = 0; i < source.Height / source.Width; i++) + { + Rectangle tileArea = new Rectangle(0, i * source.Width, source.Width, source.Width); + Bitmap tileImage = new Bitmap(source.Width, source.Width); + using (Graphics gfx = Graphics.FromImage(tileImage)) + { + gfx.SmoothingMode = SmoothingMode.None; + gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + gfx.DrawImage(source, new Rectangle(0, 0, source.Width, source.Width), tileArea, GraphicsUnit.Pixel); + } + yield return tileImage; + } + yield break; + } + + public Frame GetFrame(int index) => frames[index]; + + public List GetFrames() + { + return frames; + } + + public int GetFrameIndex(Image frameTexture) + { + _ = frameTexture ?? throw new ArgumentNullException(nameof(frameTexture)); + return frameTextures.IndexOf(frameTexture); + } + + public int FrameCount => frames.Count; + public int FrameTextureCount => frameTextures.Count; + + public void SetFrame(Frame frame, int frameTextureIndex, int frameTime = MinimumFrameTime) + => SetFrame(frames.IndexOf(frame), frameTextureIndex, frameTime); + public void SetFrame(int frameIndex, int frameTextureIndex, int frameTime = MinimumFrameTime) + { + frames[frameIndex] = new Frame(frameTextures[frameTextureIndex], frameTime); + } + + public string BuildAnim() + { + string animationData = Interpolate ? "#" : string.Empty; + frames.ForEach(frame => animationData += $"{GetFrameIndex(frame)}*{frame.Ticks},"); + return animationData.TrimEnd(','); + } + + public Image BuildTexture() + { + int width = frameTextures[0].Width; + int height = frameTextures[0].Height; + if (width != height) throw new Exception("Invalid size"); + var img = new Bitmap(width, height * FrameTextureCount); + int pos_y = 0; + using (var g = Graphics.FromImage(img)) + frameTextures.ForEach(texture => + { + g.DrawImage(texture, 0, pos_y); + pos_y += height; + }); + return img; + } + + + //public static Animation FromJson(string json, Image texture) + //{ + // _ = json ?? throw new ArgumentNullException(nameof(json)); + // _ = texture ?? throw new ArgumentNullException(nameof(texture)); + // var _animation = new Animation(texture); + // JObject mcmeta = JObject.Parse(json); + // if (mcmeta["animation"] is JToken animation) + // { + // int frameTime = 1; + // // Some if statements to ensure that the animation is valid. + // if (animation["frametime"] is JToken frametime_token && frametime_token.Type == JTokenType.Integer) + // frameTime = (int)frametime_token; + // if (animation["interpolate"] is JToken interpolate_token && interpolate_token.Type == JTokenType.Boolean) + // _animation.Interpolate = (bool)interpolate_token; + // if (animation["frames"] is JToken frames_token && + // frames_token.Type == JTokenType.Array) + // { + // foreach (JToken frame in frames_token.Children()) + // { + // if (frame.Type == JTokenType.Object) + // { + // if (frame["index"] is JToken frame_index && frame_index.Type == JTokenType.Integer && + // frame["time"] is JToken frame_time && frame_time.Type == JTokenType.Integer) + // { + // Console.WriteLine("{0}*{1}", (int)frame["index"], (int)frame["time"]); + // _animation.AddFrame((int)frame["index"], (int)frame["time"]); + // } + // } + // else if (frame.Type == JTokenType.Integer) + // { + // Console.WriteLine("{0}*{1}", (int)frame, frameTime); + // _animation.AddFrame((int)frame, frameTime); + // } + // } + // } + // } + // return _animation; + //} + } + + sealed class AnimationPlayer + { + public const int BaseTickSpeed = 24; + public bool IsPlaying { get; private set; } = false; + + private int currentAnimationFrameIndex = 0; + private PictureBox display; + private Animation _animation; + private CancellationTokenSource cts = new CancellationTokenSource(); + + public AnimationPlayer(PictureBox display) + { + SetContext(display); + } + + private async void DoAnimate() + { + _ = display ?? throw new ArgumentNullException(nameof(display)); + _ = _animation ?? throw new ArgumentNullException(nameof(_animation)); + IsPlaying = true; + while (!cts.IsCancellationRequested) + { + if (currentAnimationFrameIndex >= _animation.FrameCount) + currentAnimationFrameIndex = 0; + Animation.Frame frame = SetFrameDisplayed(currentAnimationFrameIndex++); + await Task.Delay(BaseTickSpeed * frame.Ticks); + } + IsPlaying = false; + } + + public void Start(Animation animation) + { + _animation = animation; + cts = new CancellationTokenSource(); + Task.Run(DoAnimate, cts.Token); + } + + public void Stop() => cts.Cancel(); + + public Animation.Frame GetCurrentFrame() => _animation[currentAnimationFrameIndex]; + + public void SetContext(PictureBox display) => this.display = display; + + public void SelectFrame(Animation animation, int index) + { + _animation = animation; + if (IsPlaying) Stop(); + SetFrameDisplayed(index); + currentAnimationFrameIndex = index; + } + + private Animation.Frame SetFrameDisplayed(int i) + { + Monitor.Enter(_animation); + Animation.Frame frame = _animation[i]; + display.Image = frame; + Monitor.Exit(_animation); + return frame; + } + } + + public AnimationEditor(PCKFile.FileData file) + { + InitializeComponent(); + isItem = file.filepath.Split('/').Contains("items"); + TileName = Path.GetFileNameWithoutExtension(file.filepath); + animationFile = file; + + // sanity check + if (TileName.EndsWith("MipMapLevel2") || TileName.EndsWith("MipMapLevel3")) + { + string mipMapLvl = TileName.Last().ToString(); + TileName = TileName.Substring(0, TileName.Length - 12); + MipMapCheckbox.Checked = true; + MipMapNumericUpDown.Value = short.Parse(mipMapLvl); + } + + using MemoryStream textureMem = new MemoryStream(animationFile.data); + var texture = new Bitmap(textureMem); + currentAnimation = animationFile.properties.HasProperty("ANIM") + ? new Animation(texture, animationFile.properties.GetProperty("ANIM").Item2) + : new Animation(texture); + InterpolationCheckbox.Checked = currentAnimation.Interpolate; + player = new AnimationPlayer(pictureBoxWithInterpolationMode1); + + foreach (JObject content in AnimationUtil.tileData[animationSection].Children()) + { + var prop = content.Properties().FirstOrDefault(prop => prop.Name == TileName); + if (prop is JProperty) + { + tileLabel.Text = (string)prop.Value; + break; + } + } + LoadAnimationTreeView(); + } + + private void LoadAnimationTreeView() + { + frameTreeView.Nodes.Clear(); + // $"Frame: {i}, Frame Time: {Animation.MinimumFrameTime}" + currentAnimation.GetFrames().ForEach(f => frameTreeView.Nodes.Add($"Frame: {currentAnimation.GetFrameIndex(f.Texture)}, Frame Time: {f.Ticks}")); + } + + private void frameTreeView_AfterSelect(object sender, TreeViewEventArgs e) + { + if (player.IsPlaying && !AnimationPlayBtn.Enabled) + AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); + player.SelectFrame(currentAnimation, frameTreeView.SelectedNode.Index); + } + + private int mix(double ratio, int val1, int val2) // Ported from Java Edition code + { + return (int)(ratio * val1 + (1.0D - ratio) * val2); + } + + private void StartAnimationBtn_Click(object sender, EventArgs e) + { + AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); + if (currentAnimation.FrameCount > 1) + { + player.SetContext(pictureBoxWithInterpolationMode1); + player.Start(currentAnimation); + } + } + + private void StopAnimationBtn_Click(object sender, EventArgs e) + { + AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); + player.Stop(); + } + + private void frameTreeView_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Delete) + removeFrameToolStripMenuItem_Click(sender, e); + } + + private TreeNode FindNodeByName(TreeNode treeNode, string name) + { + foreach (TreeNode node in treeNode.Nodes) + { + if (node.Text.ToLower() == name.ToLower()) return node; + return FindNodeByName(node, name); + } + return null; + } + + private void saveToolStripMenuItem1_Click(object sender, EventArgs e) + { + + string anim = currentAnimation.BuildAnim(); + animationFile.properties.SetProperty("ANIM", anim); + using (var stream = new MemoryStream()) + { + currentAnimation.BuildTexture().Save(stream, ImageFormat.Png); + animationFile.SetData(stream.ToArray()); + } + DialogResult = DialogResult.OK; + } + + // 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 frameTreeView_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 frameTreeView_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.AllowedEffect; + } + + // Select the node under the mouse pointer to indicate the + // expected drop location. + private void frameTreeView_DragOver(object sender, DragEventArgs e) + { + // Retrieve the client coordinates of the mouse position. + Point targetPoint = frameTreeView.PointToClient(new Point(e.X, e.Y)); + + // Select the node at the mouse position. + frameTreeView.SelectedNode = frameTreeView.GetNodeAt(targetPoint); + } + + private void frameTreeView_DragDrop(object sender, DragEventArgs e) + { + // Retrieve the client coordinates of the drop location. + Point targetPoint = frameTreeView.PointToClient(new Point(e.X, e.Y)); + + // Retrieve the node at the drop location. + TreeNode targetNode = frameTreeView.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(); + frameTreeView.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; + currentAnimation.GetFrames().Swap(draggedIndex, targetIndex); + LoadAnimationTreeView(); + } + } + } + + // 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 treeView1_doubleClick(object sender, EventArgs e) + { + var frame = currentAnimation.GetFrame(frameTreeView.SelectedNode.Index); + using FrameEditor diag = new FrameEditor(frame.Ticks, currentAnimation.GetFrameIndex(frame.Texture), currentAnimation.FrameTextureCount-1); + if (diag.ShowDialog(this) == DialogResult.OK) + { + currentAnimation.SetFrame(frame, diag.FrameTextureIndex, diag.FrameTime); + LoadAnimationTreeView(); + } + } + + private void addFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + using FrameEditor diag = new FrameEditor(currentAnimation.FrameTextureCount-1); + if (diag.ShowDialog(this) == DialogResult.OK) + { + currentAnimation.AddFrame(diag.FrameTextureIndex, diag.FrameTime); + LoadAnimationTreeView(); + } + } + + private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) + { + if (frameTreeView.SelectedNode is TreeNode t && + currentAnimation.RemoveFrame(t.Index)) + frameTreeView.SelectedNode.Remove(); + + } + + private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e) + { + SetBulkSpeed diag = new SetBulkSpeed(frameTreeView); + diag.ShowDialog(this); + diag.Dispose(); + } + + private void importJavaAnimationToolStripMenuItem_Click(object sender, EventArgs e) + { + DialogResult query = MessageBox.Show("This feature will replace the existing animation data. It might fail if the selected animation script is invalid. Are you sure that you want to continue?", "Warning", MessageBoxButtons.YesNo); + if (query == DialogResult.No) return; + + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Multiselect = false; + fileDialog.Title = "Please select a valid Minecaft: Java Edition animation script"; + // It's marked as .png.mcmeta just in case + // some weirdo tries to pass a pack.mcmeta or something + // -MattNL + fileDialog.Filter = "Animation Scripts (*.mcmeta)|*.png.mcmeta"; + fileDialog.CheckPathExists = true; + fileDialog.CheckFileExists = true; + if (fileDialog.ShowDialog(this) != DialogResult.OK) return; + Console.WriteLine("Selected Animation Script: " + fileDialog.FileName); + + string textureFile = fileDialog.FileName.Substring(0, fileDialog.FileName.Length - ".mcmeta".Length); + if (!File.Exists(textureFile)) + { + MessageBox.Show(textureFile + " was not found", "Texture not found"); + return; + } + using MemoryStream textureMem = new MemoryStream(File.ReadAllBytes(textureFile)); + var new_animation = new Animation(Image.FromStream(textureMem)); + + try + { + JObject mcmeta = JObject.Parse(File.ReadAllText(fileDialog.FileName)); + if (mcmeta["animation"] is JToken animation) + { + int frameTime = Animation.MinimumFrameTime; + // Some if statements to ensure that the animation is valid. + if (animation["frametime"] is JToken frametime_token && frametime_token.Type == JTokenType.Integer) + frameTime = (int)frametime_token; + if (animation["interpolate"] is JToken interpolate_token && interpolate_token.Type == JTokenType.Boolean) + new_animation.Interpolate = (bool)interpolate_token; + if (animation["frames"] is JToken frames_token && + frames_token.Type == JTokenType.Array) + { + foreach (JToken frame in frames_token.Children()) + { + if (frame.Type == JTokenType.Object) + { + if (frame["index"] is JToken frame_index && frame_index.Type == JTokenType.Integer && + frame["time"] is JToken frame_time && frame_time.Type == JTokenType.Integer) + { + Console.WriteLine((int)frame["index"] + "*" + (int)frame["time"]); + new_animation.AddFrame((int)frame["index"], (int)frame["time"]); + } + } + else if (frame.Type == JTokenType.Integer) + { + Console.WriteLine((int)frame + "*" + frameTime); + new_animation.AddFrame((int)frame); + } + } + } + } + currentAnimation = new_animation; + LoadAnimationTreeView(); + } + catch (JsonException j_ex) + { + MessageBox.Show(j_ex.Message, "Invalid animation"); + return; + } + } + + private void helpToolStripMenuItem_Click(object sender, EventArgs e) + { + MessageBox.Show("Simply drag and drop frames in the tree to rearrange your animation.\n\n" + + "The \"Interpolates\" checkbox enables the blending animation seen with some textures in the game, such as Prismarine.\n\n" + + "You can preview your animation at any time by simply pressing the \"Play Animation\" button!\n\n" + + "You can edit the frame and its speed by double clicking a frame in the tree. If you'd like to change the entire animation's speed, you can do so with the \"Set Bulk Animation Speed\" button in the \"Tools\" tab.\n\n" + + "Porting animations from Java packs are made simple with the \"Import Java Animation\" button found in the \"Tools\" tab!", "Help"); + } + + private void changeTileToolStripMenuItem_Click(object sender, EventArgs e) + { + using (ChangeTile diag = new ChangeTile()) + if (diag.ShowDialog(this) == DialogResult.OK) + { + Console.WriteLine(diag.SelectedTile); + if (TileName != diag.SelectedTile) isItem = diag.IsItem; + TileName = diag.SelectedTile; + foreach (JObject content in AnimationUtil.tileData[animationSection].Children()) + { + var first = content.Properties().FirstOrDefault(p => p.Name == TileName); + if (first is JProperty p) tileLabel.Text = (string)p.Value; + } + } + } + + private void MipMapCheckBox_CheckedChanged(object sender, EventArgs e) + { + MipMapNumericUpDown.Visible = MipMapLabel.Visible = MipMapCheckbox.Checked; + } + } +} diff --git a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.resx b/PCK-Studio/Forms/Editor/AnimationEditor.resx similarity index 99% rename from PCK-Studio/Forms/Utilities/Animation/AnimationEditor.resx rename to PCK-Studio/Forms/Editor/AnimationEditor.resx index 2cad9eca..31e8ec68 100644 --- a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.resx +++ b/PCK-Studio/Forms/Editor/AnimationEditor.resx @@ -134,9 +134,6 @@ 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - 280, 17 - AAABAA0AAAAAAAEAIAD7NAAA1gAAAICAAAABACAAKAgBANE1AACAgAAAAQAIAChMAAD5PQEAQEAAAAEA diff --git a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.Designer.cs b/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.Designer.cs deleted file mode 100644 index 8f996b8d..00000000 --- a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.Designer.cs +++ /dev/null @@ -1,350 +0,0 @@ -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.importJavaAnimationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.changeTileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.InterpolationCheckbox = new MetroFramework.Controls.MetroCheckBox(); - this.AnimationPlayBtn = new MetroFramework.Controls.MetroButton(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.AnimationStopBtn = new MetroFramework.Controls.MetroButton(); - this.tileLabel = new MetroFramework.Controls.MetroLabel(); - this.MipMapCheckbox = new MetroFramework.Controls.MetroCheckBox(); - this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); - this.MipMapNumericUpDown = new System.Windows.Forms.NumericUpDown(); - this.pictureBoxWithInterpolationMode1 = new PckStudio.PictureBoxWithInterpolationMode(); - this.contextMenuStrip1.SuspendLayout(); - this.menuStrip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.MipMapNumericUpDown)).BeginInit(); - ((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, 202); - 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(154, 48); - // - // addFrameToolStripMenuItem - // - this.addFrameToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; - this.addFrameToolStripMenuItem.Name = "addFrameToolStripMenuItem"; - this.addFrameToolStripMenuItem.Size = new System.Drawing.Size(153, 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(153, 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.helpToolStripMenuItem}); - this.menuStrip.Location = new System.Drawing.Point(20, 60); - this.menuStrip.Name = "menuStrip"; - this.menuStrip.Size = new System.Drawing.Size(372, 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(98, 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.importJavaAnimationToolStripMenuItem, - this.changeTileToolStripMenuItem}); - this.editToolStripMenuItem.ForeColor = System.Drawing.Color.White; - this.editToolStripMenuItem.Name = "editToolStripMenuItem"; - this.editToolStripMenuItem.Size = new System.Drawing.Size(46, 20); - this.editToolStripMenuItem.Text = "Tools"; - // - // bulkAnimationSpeedToolStripMenuItem - // - this.bulkAnimationSpeedToolStripMenuItem.Image = global::PckStudio.Properties.Resources.clock; - 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); - // - // importJavaAnimationToolStripMenuItem - // - this.importJavaAnimationToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ExportFile; - this.importJavaAnimationToolStripMenuItem.Name = "importJavaAnimationToolStripMenuItem"; - this.importJavaAnimationToolStripMenuItem.Size = new System.Drawing.Size(210, 22); - this.importJavaAnimationToolStripMenuItem.Text = "Import Java Animation"; - this.importJavaAnimationToolStripMenuItem.Click += new System.EventHandler(this.importJavaAnimationToolStripMenuItem_Click); - // - // changeTileToolStripMenuItem - // - this.changeTileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.changeTile; - this.changeTileToolStripMenuItem.Name = "changeTileToolStripMenuItem"; - this.changeTileToolStripMenuItem.Size = new System.Drawing.Size(210, 22); - this.changeTileToolStripMenuItem.Text = "Change Tile"; - this.changeTileToolStripMenuItem.Click += new System.EventHandler(this.changeTileToolStripMenuItem_Click); - // - // helpToolStripMenuItem - // - this.helpToolStripMenuItem.ForeColor = System.Drawing.Color.White; - this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; - this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); - this.helpToolStripMenuItem.Text = "Help"; - this.helpToolStripMenuItem.Click += new System.EventHandler(this.helpToolStripMenuItem_Click); - // - // InterpolationCheckbox - // - this.InterpolationCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.InterpolationCheckbox.AutoSize = true; - this.InterpolationCheckbox.Location = new System.Drawing.Point(188, 317); - this.InterpolationCheckbox.Name = "InterpolationCheckbox"; - this.InterpolationCheckbox.Size = new System.Drawing.Size(204, 15); - this.InterpolationCheckbox.TabIndex = 17; - this.InterpolationCheckbox.Text = "Interpolates (not simulated above)"; - this.InterpolationCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.InterpolationCheckbox.UseSelectable = true; - // - // AnimationPlayBtn - // - this.AnimationPlayBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AnimationPlayBtn.Location = new System.Drawing.Point(188, 291); - this.AnimationPlayBtn.Name = "AnimationPlayBtn"; - this.AnimationPlayBtn.Size = new System.Drawing.Size(99, 24); - this.AnimationPlayBtn.TabIndex = 18; - this.AnimationPlayBtn.Text = "Play Animation"; - this.AnimationPlayBtn.Theme = MetroFramework.MetroThemeStyle.Dark; - this.AnimationPlayBtn.UseSelectable = true; - this.AnimationPlayBtn.Click += new System.EventHandler(this.StartAnimationBtn_Click); - // - // timer1 - // - this.timer1.Interval = 1; - this.timer1.Tick += new System.EventHandler(this.animate); - // - // AnimationStopBtn - // - this.AnimationStopBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.AnimationStopBtn.Enabled = false; - this.AnimationStopBtn.Location = new System.Drawing.Point(293, 291); - this.AnimationStopBtn.Name = "AnimationStopBtn"; - this.AnimationStopBtn.Size = new System.Drawing.Size(99, 24); - this.AnimationStopBtn.TabIndex = 19; - this.AnimationStopBtn.Text = "Stop Animation"; - this.AnimationStopBtn.Theme = MetroFramework.MetroThemeStyle.Dark; - this.AnimationStopBtn.UseSelectable = true; - this.AnimationStopBtn.Click += new System.EventHandler(this.StopAnimationBtn_Click); - // - // tileLabel - // - this.tileLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.tileLabel.AutoSize = true; - this.tileLabel.Location = new System.Drawing.Point(20, 290); - this.tileLabel.MinimumSize = new System.Drawing.Size(170, 19); - this.tileLabel.Name = "tileLabel"; - this.tileLabel.Size = new System.Drawing.Size(57, 19); - this.tileLabel.TabIndex = 20; - this.tileLabel.Text = "tileLabel"; - this.tileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // MipMapCheckbox - // - this.MipMapCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.MipMapCheckbox.AutoSize = true; - this.MipMapCheckbox.Location = new System.Drawing.Point(20, 312); - this.MipMapCheckbox.Name = "MipMapCheckbox"; - this.MipMapCheckbox.Size = new System.Drawing.Size(128, 15); - this.MipMapCheckbox.TabIndex = 21; - this.MipMapCheckbox.Text = "Is Mip Map Texture?"; - this.MipMapCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.MipMapCheckbox.UseSelectable = true; - this.MipMapCheckbox.CheckedChanged += new System.EventHandler(this.metroCheckBox2_CheckedChanged); - // - // metroLabel1 - // - this.metroLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.metroLabel1.AutoSize = true; - this.metroLabel1.Location = new System.Drawing.Point(21, 330); - this.metroLabel1.Name = "metroLabel1"; - this.metroLabel1.Size = new System.Drawing.Size(99, 19); - this.metroLabel1.TabIndex = 22; - this.metroLabel1.Text = "Mip Map Level:"; - this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; - this.metroLabel1.Visible = false; - // - // MipMapNumericUpDown - // - this.MipMapNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.MipMapNumericUpDown.BackColor = System.Drawing.Color.Black; - this.MipMapNumericUpDown.ForeColor = System.Drawing.SystemColors.Window; - this.MipMapNumericUpDown.Location = new System.Drawing.Point(127, 330); - this.MipMapNumericUpDown.Maximum = new decimal(new int[] { - 5, - 0, - 0, - 0}); - this.MipMapNumericUpDown.Minimum = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.MipMapNumericUpDown.Name = "MipMapNumericUpDown"; - this.MipMapNumericUpDown.Size = new System.Drawing.Size(44, 20); - this.MipMapNumericUpDown.TabIndex = 23; - this.MipMapNumericUpDown.Value = new decimal(new int[] { - 2, - 0, - 0, - 0}); - this.MipMapNumericUpDown.Visible = false; - // - // pictureBoxWithInterpolationMode1 - // - this.pictureBoxWithInterpolationMode1.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.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(204, 198); - this.pictureBoxWithInterpolationMode1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; - this.pictureBoxWithInterpolationMode1.TabIndex = 16; - this.pictureBoxWithInterpolationMode1.TabStop = false; - // - // AnimationEditor - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(412, 362); - this.Controls.Add(this.AnimationStopBtn); - this.Controls.Add(this.AnimationPlayBtn); - this.Controls.Add(this.MipMapNumericUpDown); - this.Controls.Add(this.metroLabel1); - this.Controls.Add(this.MipMapCheckbox); - this.Controls.Add(this.tileLabel); - this.Controls.Add(this.InterpolationCheckbox); - this.Controls.Add(this.pictureBoxWithInterpolationMode1); - this.Controls.Add(this.treeView1); - this.Controls.Add(this.menuStrip); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(412, 362); - 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.MipMapNumericUpDown)).EndInit(); - ((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 InterpolationCheckbox; - private MetroFramework.Controls.MetroButton AnimationPlayBtn; - 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 AnimationStopBtn; - private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bulkAnimationSpeedToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem importJavaAnimationToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem changeTileToolStripMenuItem; - private MetroFramework.Controls.MetroLabel tileLabel; - private MetroFramework.Controls.MetroCheckBox MipMapCheckbox; - private MetroFramework.Controls.MetroLabel metroLabel1; - private System.Windows.Forms.NumericUpDown MipMapNumericUpDown; - } -} \ No newline at end of file diff --git a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.cs b/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.cs deleted file mode 100644 index 09e2e4f6..00000000 --- a/PCK-Studio/Forms/Utilities/Animation/AnimationEditor.cs +++ /dev/null @@ -1,672 +0,0 @@ -using MetroFramework.Forms; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using PckStudio.Classes.FileTypes; -using PckStudio.Forms.Utilities.AnimationEditor; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace PckStudio -{ - public partial class AnimationEditor : MetroForm - { - PCKFile.FileData animationFile = null; - List frames = new List(); - int frameCount => frames.Count; - static JObject tileData = JObject.Parse(Properties.Resources.tileData); - Image texture = null; - bool isItem = false; - int minimumFrameTime = 1; - string TileName = ""; - int animCurrentFrame = 0; - Tuple currentFrameData = new Tuple(0, 1); - Image img = null; - Image imgB = null; - int nextFrame; - //int frameCounter = 0; // ported directly from Java Edition code -MattNL - - public AnimationEditor(Image imgage, string tileName, bool isItem) - { - InitializeComponent(); - this.isItem = isItem; - TileName = tileName; - string filePath = $"res/textures/{(isItem ? "items" : "blocks")}/{tileName}.png"; - animationFile = CreateNewAnimationFile(imgage, filePath); - CreateFrameList(imgage); - } - - public AnimationEditor(PCKFile.FileData file) - { - InitializeComponent(); - isItem = file.filepath.Split('/').Contains("items"); - TileName = Path.GetFileNameWithoutExtension(file.filepath); - animationFile = file; - if (TileName.EndsWith("MipMapLevel2") || TileName.EndsWith("MipMapLevel3")) - { - string mipMapLvl = TileName.Last().ToString(); - TileName = TileName.Substring(0, TileName.Length - 12); - MipMapCheckbox.Checked = true; - MipMapNumericUpDown.Value = short.Parse(mipMapLvl); - } - - string anim = string.Empty; - animationFile.properties.FirstOrDefault(x => x.Item1.Equals("ANIM")); - - MemoryStream textureMem = new MemoryStream(animationFile.data); - texture = new Bitmap(textureMem); - CreateFrameList(texture); - - Console.WriteLine(TileName); - - foreach (JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) - { - foreach (JProperty prop in content.Properties()) - { - if (prop.Name == TileName) tileLabel.Text = (string)prop.Value; - } - } - - if (!string.IsNullOrEmpty(anim)) - { - string[] animData = anim.Split(','); - if (string.IsNullOrEmpty(animData.Last())) animData = animData.Take(animData.Length - 1).ToArray(); - int lastFrameTime = 0; - foreach (string frame in animData) - { - string[] frameData = frame.Split('*'); - if (frameData.Length < 2) - continue; // shouldn't happen - int currentFrame = 0; - int currentFrameTime = 1; - - if (string.IsNullOrEmpty(frameData[0])) throw new Exception("Invalid animation data"); - currentFrame = int.Parse(frameData[0]); - - // 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 - currentFrameTime = string.IsNullOrEmpty(frameData[1]) ? lastFrameTime : int.Parse(frameData[1]); - string label = $"Frame: {currentFrame}, Frame Time: {currentFrameTime}"; - Console.WriteLine(label); - - TreeNode frameNode = new TreeNode(label); - var finalFrameData = new Tuple(currentFrame, currentFrameTime); - frameNode.Tag = finalFrameData; - treeView1.Nodes.Add(frameNode); - lastFrameTime = currentFrameTime; - } - } - else - { - for (int i = 0; i < frameCount; i++) - { - TreeNode frameNode = new TreeNode($"Frame: {i}, Frame Time: {minimumFrameTime}"); - var finalFrameData = new Tuple(i, minimumFrameTime); - 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); - } - - private PCKFile.FileData CreateNewAnimationFile(Image imgageFile, string name = "") - { - PCKFile.FileData file = new PCKFile.FileData(name, 2); - file.properties.Add(("ANIM", "")); - using (var stream = new MemoryStream()) - { - imgageFile.Save(stream, ImageFormat.Png); - file.SetData(stream.ToArray()); - } - return file; - } - - private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) - { - var frameData = e.Node.Tag as Tuple; - Console.WriteLine(frameData.Item1 + " --- " + frameData.Item2); - if (AnimationPlayBtn.Enabled) - { - pictureBoxWithInterpolationMode1.Image = frames[frameData.Item1]; - } - } - - void CreateFrameList(Image texture) - { - frames.Clear(); - frames.AddRange(SplitImageToFrames(texture)); - } - - private IEnumerable SplitImageToFrames(Image source) - { - for (int i = 0; i < source.Height / source.Width; i++) - { - Rectangle tileArea = new Rectangle(new Point(0, i * source.Width), new Size(source.Width, source.Width)); - Bitmap tileImage = new Bitmap(source.Width, source.Width); - using (Graphics gfx = Graphics.FromImage(tileImage)) - { - gfx.SmoothingMode = SmoothingMode.None; - gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - gfx.DrawImage(source, new Rectangle(0, 0, source.Width, source.Width), tileArea, GraphicsUnit.Pixel); - } - yield return tileImage; - } - yield break; - } - - private int mix(double ratio, int val1, int val2) // Ported from Java Edition code - { - return (int)(ratio * val1 + (1.0D - ratio) * val2); - } - - void animate(object sender, EventArgs e) - { - //Console.WriteLine(frameCounter + " $$$ " + frameCount); - //frameCounter = (frameCounter + 1) % frameCount; - if (animCurrentFrame > (treeView1.Nodes.Count - 1)) animCurrentFrame = 0; - currentFrameData = treeView1.Nodes[animCurrentFrame].Tag as Tuple; - pictureBoxWithInterpolationMode1.Image = frames[currentFrameData.Item1]; - //animCurrentTotalFrameTime = Int16.Parse(currentFrameData.Item2); - timer1.Interval = currentFrameData.Item2 * 50; - animCurrentFrame++; - - if (InterpolationCheckbox.Checked) - { - img = frames[currentFrameData.Item1]; - nextFrame = animCurrentFrame + 1; - if (nextFrame > frameCount - 1) nextFrame = 0; - Console.WriteLine(nextFrame); - imgB = frames[nextFrame]; - } - - #region interpolation code (unoptimized and unused at the moment) - // Interpolation Code (Very slow, messy, and resource heavy depending on the resolution!!!) - - else if (InterpolationCheckbox.Checked && (img != null && imgB != null)) - { - double d0 = 1.0D - animCurrentFrame / frameCount; - int i = animCurrentFrame; - int j = frameCount; - int k = (frameCount + 1) % j; - - for (int l = 0; l < (frameCount - 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(); - } - } - - #endregion - - //Console.WriteLine(animCurrentFrame + " - " + animCurrentFrameTime + " - " + animCurrentTotalFrameTime + " - " + (treeView1.Nodes.Count - 1)); - } - - private void StartAnimationBtn_Click(object sender, EventArgs e) - { - animCurrentFrame = 0; - //animCurrentFrameTime = 0; - //animCurrentTotalFrameTime = -1; - //frameCounter = 0; - AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); - timer1.Start(); - } - - private void StopAnimationBtn_Click(object sender, EventArgs e) - { - AnimationPlayBtn.Enabled = !(AnimationStopBtn.Enabled = !AnimationStopBtn.Enabled); - timer1.Stop(); - } - - private void treeView1_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyData == Keys.Delete) treeView1.Nodes.Remove(treeView1.SelectedNode); - } - - private TreeNode FindNodeByName(TreeNode treeNode, string name) - { - foreach (TreeNode node in treeNode.Nodes) - { - if (node.Text.ToLower() == name.ToLower()) return node; - return FindNodeByName(node, name); - } - return null; - } - - private void addNodeToAnimationsFolder(TreeNode newNode) - { - //TreeNode parent = FindNodeByName(treeViewMain, isItem ? "items" : "blocks"); - //if (parent != null) - //{ - // Console.WriteLine("ParentNotNULL"); - // TreeNode check = FindNodeByName(treeViewMain, newNode.Text); - // parent.Nodes.Add(newNode); - //} - //else - //{ - // TreeNode texturesParent = FindNodeByName(treeViewMain, "textures"); - // if (texturesParent != null) - // { - // Console.WriteLine("TextureNotNULL"); - // TreeNode newFolder = new TreeNode(isItem ? "items" : "blocks"); - // texturesParent.Nodes.Add(newFolder); - // newFolder.Nodes.Add(newNode); - // } - // else - // { - // TreeNode resParent = FindNodeByName(treeViewMain, "res"); - // if (resParent != null) - // { - // Console.WriteLine("ResNotNULL"); - // TreeNode newFolder = new TreeNode("textures"); - // resParent.Nodes.Add(newFolder); - // TreeNode newFolderB = new TreeNode(isItem ? "items" : "blocks"); - // newFolder.Nodes.Add(newFolderB); - // newFolderB.Nodes.Add(newNode); - // } - // else - // { - // Console.WriteLine("ResNULL"); - // TreeNode newFolder = new TreeNode("res"); - // treeViewMain.Nodes.Add(newFolder); - // TreeNode newFolderB = new TreeNode("textures"); - // newFolder.Nodes.Add(newFolderB); - // TreeNode newFolderC = new TreeNode(isItem ? "items" : "blocks"); - // newFolderB.Nodes.Add(newFolderC); - // newFolderC.Nodes.Add(newNode); - // } - // } - //} - } - - private void saveToolStripMenuItem1_Click(object sender, EventArgs e) - { - using (var stream = new MemoryStream()) - { - texture.Save(stream, ImageFormat.Png); - animationFile.SetData(stream.ToArray()); - } - - animationFile.filepath = $"res/textures/{(isItem ? "items" : "blocks")}/{TileName}{(MipMapCheckbox.Checked ? $"MipMapLevel{MipMapNumericUpDown.Value}" : string.Empty)}.png"; - - string animationData = InterpolationCheckbox.Checked ? "#" : ""; - foreach (TreeNode node in treeView1.Nodes) - { - var frameData = node.Tag as Tuple; - animationData += $"{frameData.Item1}*{frameData.Item2},"; - } - animationData.TrimEnd(','); - foreach (var pair in animationFile.properties) - { - if (pair.Item1 == "ANIM") - { - animationFile.properties[animationFile.properties.IndexOf(pair)] = ("ANIM", animationData); - break; - } - else - { - animationFile.properties.Add(("ANIM", animationData)); - break; - } - }; - - //if (create) - //{ - // mf.name = "res/textures/" + (isItem ? "items" : "blocks"); - // TreeNode newNode = new TreeNode(newTileName + ".png") { Tag = mf };//creates node for minefile - // newNode.ImageIndex = 2; - // newNode.SelectedImageIndex = 2; - // addNodeToAnimationsFolder(newNode); - // treeViewMain.SelectedNode = newNode; - // create = false; - //} - //else if (isItem && treeViewMain.SelectedNode.Parent.Text == "blocks") - //{ - // Console.WriteLine("block: " + treeViewMain.SelectedNode.Parent.Text); - // TreeNode newNode = treeViewMain.SelectedNode; - // newNode.ImageIndex = 2; - // newNode.SelectedImageIndex = 2; - // treeViewMain.SelectedNode.Remove(); - // addNodeToAnimationsFolder(newNode); - //} - //else if (treeViewMain.SelectedNode.Parent.Text == "items") - //{ - // Console.WriteLine("item: " + treeViewMain.SelectedNode.Parent.Text); - // TreeNode newNode = treeViewMain.SelectedNode; - // newNode.ImageIndex = 2; - // newNode.SelectedImageIndex = 2; - // treeViewMain.SelectedNode.Remove(); - // addNodeToAnimationsFolder(newNode); - //} - - if(MipMapCheckbox.Checked) TileName = TileName.Substring(0, TileName.Length - 12); - } - - // 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 treeView1_doubleClick(object sender, EventArgs e) - { - FrameEditor diag = new FrameEditor( - treeView1, // animation editor tree - treeView1.SelectedNode.Tag as Tuple, // the current selected frame data - frameCount - 1, // frame limit - false, // create new frame? - treeView1.SelectedNode // the current frame selected - ); - diag.ShowDialog(this); - diag.Dispose(); - } - - private void addFrameToolStripMenuItem_Click(object sender, EventArgs e) - { - FrameEditor diag = new FrameEditor( - treeView1, - new Tuple("", ""), - frameCount - 1, - true, - new TreeNode()); - diag.ShowDialog(this); - diag.Dispose(); - } - - private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) - { - treeView1.SelectedNode.Remove(); - } - - private void bulkAnimationSpeedToolStripMenuItem_Click(object sender, EventArgs e) - { - SetBulkSpeed diag = new SetBulkSpeed(treeView1); - diag.ShowDialog(this); - diag.Dispose(); - } - - private void importJavaAnimationToolStripMenuItem_Click(object sender, EventArgs e) - { - DialogResult query = MessageBox.Show("This feature will replace the existing animation data. It might fail if the selected animation script is invalid. Are you sure that you want to continue?", "Warning", MessageBoxButtons.YesNo); - if (query == DialogResult.No) return; - - // In case the import fails, the user won't lose any data - MattNL - Image oldImage = texture; - int oldFrameCount = frameCount; - List oldFrames = frames; - TreeNodeCollection oldAnimData = treeView1.Nodes; - - OpenFileDialog diag = new OpenFileDialog(); - diag.Multiselect = false; - diag.Filter = "Animation Scripts (*.mcmeta)|*.png.mcmeta"; /* It's marked as .png.mcmeta just in case - some weirdo tries to pass a pack.mcmeta or something - -MattNL */ - diag.Title = "Please select a valid Minecaft: Java Edition animation script"; - diag.ShowDialog(this); - diag.Dispose(); - if (String.IsNullOrEmpty(diag.FileName)) return; // Return if name is null or if the user cancels - Console.WriteLine("Selected Animation Script: " + diag.FileName); - - treeView1.Nodes.Clear(); - - MemoryStream textureMem = new MemoryStream(File.ReadAllBytes(Path.GetDirectoryName(diag.FileName) + "\\/" + Path.GetFileNameWithoutExtension(diag.FileName))); - texture = Image.FromStream(textureMem); - CreateFrameList(texture); - - try - { - JObject mcmeta = JObject.Parse(File.ReadAllText(diag.FileName)); - - if (mcmeta["animation"] != null) - { - int frameTime = 1; - // Some if statements to ensure that the animation is valid. - if (mcmeta["animation"]["frametime"] != null && - mcmeta["animation"]["frametime"].Type == JTokenType.Integer) frameTime = (int)mcmeta["animation"]["frametime"]; - if (mcmeta["animation"]["interpolate"] != null && - mcmeta["animation"]["interpolate"].Type == JTokenType.Boolean && (Boolean)mcmeta["animation"]["interpolate"] == true) InterpolationCheckbox.Checked = true; - if (mcmeta["animation"]["frames"] != null && - mcmeta["animation"]["frames"].Type == JTokenType.Array) - { - foreach (JToken frame in mcmeta["animation"]["frames"].Children()) - { - if (frame.Type == JTokenType.Object) - { - if (frame["index"] != null && frame["index"].Type == JTokenType.Integer && - frame["time"] != null && frame["time"].Type == JTokenType.Integer) - { - Console.WriteLine((int)frame["index"] + "*" + (int)frame["time"]); - - TreeNode frameNode = new TreeNode(); - var finalFrameData = new Tuple(((int)frame["index"]), ((int)frame["time"])); - frameNode.Text = "Frame: " + ((int)frame["index"]).ToString() + ", Frame Time: " + ((int)frame["time"]).ToString(); - frameNode.Tag = finalFrameData; - treeView1.Nodes.Add(frameNode); - } - } - else if (frame.Type == JTokenType.Integer) - { - Console.WriteLine((int)frame + "*" + frameTime); - - TreeNode frameNode = new TreeNode(); - var finalFrameData = new Tuple(((int)frame), frameTime); - frameNode.Text = "Frame: " + ((int)frame).ToString() + ", Frame Time: " + frameTime.ToString(); - frameNode.Tag = finalFrameData; - treeView1.Nodes.Add(frameNode); - } - } - } - else - { - for (int i = 0; i < frameCount; i++) - { - TreeNode frameNode = new TreeNode(); - var finalFrameData = new Tuple(i, frameTime); - frameNode.Text = "Frame: " + i.ToString() + ", Frame Time: " + frameTime.ToString(); - frameNode.Tag = finalFrameData; - treeView1.Nodes.Add(frameNode); - } - } - } - } - catch (JsonException j_ex) - { - MessageBox.Show(j_ex.Message, "Invalid animation"); - texture = oldImage; - frames = oldFrames; - foreach (TreeNode node in oldAnimData) - { - treeView1.Nodes.Add(node); - } - return; - } - pictureBoxWithInterpolationMode1.Image = frames[(treeView1.Nodes[0].Tag as Tuple).Item1]; - } - - private void helpToolStripMenuItem_Click(object sender, EventArgs e) - { - MessageBox.Show("Simply drag and drop frames in the tree to rearrange your animation.\n\n" + - "The \"Interpolates\" checkbox enables the blending animation seen with some textures in the game, such as Prismarine.\n\n" + - "You can preview your animation at any time by simply pressing the \"Play Animation\" button!\n\n" + - "You can edit the frame and its speed by double clicking a frame in the tree. If you'd like to change the entire animation's speed, you can do so with the \"Set Bulk Animation Speed\" button in the \"Tools\" tab.\n\n" + - "Porting animations from Java packs are made simple with the \"Import Java Animation\" button found in the \"Tools\" tab!", "Help"); - } - - private void changeTileToolStripMenuItem_Click(object sender, EventArgs e) - { - using (ChangeTile diag = new ChangeTile(TileName)) - if (diag.ShowDialog(this) == DialogResult.OK) - { - Console.WriteLine(diag.SelectedTile); - if (TileName != diag.SelectedTile) isItem = diag.IsItem; - TileName = diag.SelectedTile; - foreach (JObject content in tileData[isItem ? "Items" : "Blocks"].Children()) - { - foreach (JProperty prop in content.Properties()) - { - if (prop.Name == TileName) tileLabel.Text = (string)prop.Value; - } - } - } - } - - private void metroCheckBox2_CheckedChanged(object sender, EventArgs e) - { - MipMapNumericUpDown.Visible = metroLabel1.Visible = MipMapCheckbox.Checked; - } - } -} diff --git a/PCK-Studio/Forms/Utilities/Animation/ChangeTile.cs b/PCK-Studio/Forms/Utilities/Animation/ChangeTile.cs deleted file mode 100644 index 526d7abc..00000000 --- a/PCK-Studio/Forms/Utilities/Animation/ChangeTile.cs +++ /dev/null @@ -1,227 +0,0 @@ -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 System.IO; -using System.Windows.Forms; -using MetroFramework.Forms; -using System.Drawing.Drawing2D; -using Newtonsoft.Json.Linq; -using PckStudio.Properties; - -namespace PckStudio.Forms.Utilities.AnimationEditor -{ - public partial class ChangeTile : MetroForm - { - string selectedTile = ""; - string oldTileName = ""; - bool isItem = false; - public string SelectedTile => selectedTile; - public bool IsItem => isItem; - - List treeView1Cache = new List(); - List treeView2Cache = new List(); - - public ChangeTile(string oldName = "") - { - oldTileName = oldName; - InitializeComponent(); - ImageList tiles = new ImageList(); - - tiles.ColorDepth = ColorDepth.Depth32Bit; - - //for (int i = 0; i < 545; i++) - //{ - // int row = i / 16; - // int column = i % 16; - - // Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); - - // Bitmap tileImage = new Bitmap(16, 16); - // using (Graphics gfx = Graphics.FromImage(tileImage)) - // { - // gfx.SmoothingMode = SmoothingMode.None; - // gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - // gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - - // gfx.DrawImage(Resources.terrain_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); - // } - - // tiles.Images.Add(tileImage); - //} - //for (int i = 0; i < 273; i++) - //{ - // int row = i / 16; - // int column = i % 16; - - // Rectangle tileArea = new Rectangle(new Point(column * 16, row * 16), new Size(16, 16)); - - // Bitmap tileImage = new Bitmap(16, 16); - // using (Graphics gfx = Graphics.FromImage(tileImage)) - // { - // gfx.SmoothingMode = SmoothingMode.None; - // gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - // gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - - // gfx.DrawImage(Resources.items_sheet, new Rectangle(0, 0, 16, 16), tileArea, GraphicsUnit.Pixel); - // } - - // tiles.Images.Add(tileImage); - //} - - tiles.Images.AddRange(CreateImageList(Resources.terrain_sheet, 16, 16).ToArray()); - tiles.Images.AddRange(CreateImageList(Resources.items_sheet, 16, 16).ToArray()); - treeView1.ImageList = tiles; - treeView2.ImageList = tiles; - - try - { - JObject tileData = JObject.Parse(Resources.tileData); - int i = 0; - - if (tileData["Blocks"] != null) - { - foreach (JObject content in tileData["Blocks"].Children()) - { - foreach (JProperty prop in content.Properties()) - { - if (!string.IsNullOrEmpty((string)prop.Value)) - { - TreeNode tileNode = new TreeNode(); - tileNode.Text = (string)prop.Value; - Tuple finalTileData = new Tuple(prop.Name, i); - tileNode.Tag = finalTileData; - tileNode.ImageIndex = i; - tileNode.SelectedImageIndex = i; - treeView1.Nodes.Add(tileNode); - treeView1Cache.Add(tileNode); - } - i++; - } - } - } - if (tileData["Items"] != null) - { - foreach (JObject content in tileData["Items"].Children()) - { - foreach (JProperty prop in content.Properties()) - { - if (!string.IsNullOrEmpty((string)prop.Value)) - { - TreeNode tileNode = new TreeNode(); - tileNode.Text = (string)prop.Value; - Tuple finalTileData = new Tuple(prop.Name, i); - tileNode.Tag = finalTileData; - tileNode.ImageIndex = i; - tileNode.SelectedImageIndex = i; - treeView2.Nodes.Add(tileNode); - treeView2Cache.Add(tileNode); - } - i++; - } - } - } - - //Blocks.Controls.Add(treeView1); - //Items.Controls.Add(treeView2); - } - catch (Newtonsoft.Json.JsonException j_ex) - { - MessageBox.Show(j_ex.Message, "Error"); - return; - } - } - - private IEnumerable CreateImageList(Image source, int width, int height) - { - int img_row_count = source.Width / width; - int img_column_count = source.Height / height; - for (int i = 0; i < img_column_count * img_row_count; i++) - { - int row = i / width; - int column = i % height; - Rectangle tileArea = new Rectangle(new Point(column * width, row * height), new Size(16, 16)); - Bitmap tileImage = new Bitmap(width, height); - using (Graphics gfx = Graphics.FromImage(tileImage)) - { - gfx.SmoothingMode = SmoothingMode.None; - gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - - gfx.DrawImage(source, new Rectangle(0, 0, width, height), tileArea, GraphicsUnit.Pixel); - } - yield return tileImage; - } - yield break; - } - - private void treeViews_AfterSelect(object sender, TreeViewEventArgs e) - { - Tuple tileData = e.Node.Tag as Tuple; - Console.WriteLine(tileData.Item1 + " - " + tileData.Item2); - selectedTile = tileData.Item1; - Console.WriteLine(selectedTile); - isItem = e.Node.TreeView == treeView2; - } - - void filter_TextChanged(object sender, EventArgs e) - { - // Some code in this function is modified code from this StackOverflow answer - MattNL - //https://stackoverflow.com/questions/8260322/filter-a-treeview-with-a-textbox-in-a-c-sharp-winforms-app - - //blocks repainting tree until all objects loaded - treeView1.BeginUpdate(); - treeView1.Nodes.Clear(); - treeView2.BeginUpdate(); - treeView2.Nodes.Clear(); - if (metroTextBox1.Text != string.Empty) - { - foreach (TreeNode _node in treeView1Cache) - { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) - { - treeView1.Nodes.Add((TreeNode)_node.Clone()); - } - } - foreach (TreeNode _node in treeView2Cache) - { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) - { - treeView2.Nodes.Add((TreeNode)_node.Clone()); - } - } - } - else - { - foreach (TreeNode _node in treeView1Cache) - { - treeView1.Nodes.Add((TreeNode)_node.Clone()); - } - foreach (TreeNode _node in treeView2Cache) - { - treeView2.Nodes.Add((TreeNode)_node.Clone()); - } - } - //enables redrawing tree after all objects have been added - treeView1.EndUpdate(); - treeView2.EndUpdate(); - } - - private void button2_Click(object sender, EventArgs e) - { - selectedTile = oldTileName; - Close(); - } - - private void button1_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(selectedTile)) button2_Click(sender, e); - DialogResult = DialogResult.OK; - Close(); - } - } -} diff --git a/PCK-Studio/Forms/Utilities/Animation/FrameEditor.Designer.cs b/PCK-Studio/Forms/Utilities/Animation/FrameEditor.Designer.cs deleted file mode 100644 index c925c1e4..00000000 --- a/PCK-Studio/Forms/Utilities/Animation/FrameEditor.Designer.cs +++ /dev/null @@ -1,200 +0,0 @@ - -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.MinimumSize = new System.Drawing.Size(266, 142); - this.Name = "FrameEditor"; - this.Resizable = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - 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/PCK-Studio/Forms/Utilities/Animation/FrameEditor.cs b/PCK-Studio/Forms/Utilities/Animation/FrameEditor.cs deleted file mode 100644 index 370aa2de..00000000 --- a/PCK-Studio/Forms/Utilities/Animation/FrameEditor.cs +++ /dev/null @@ -1,71 +0,0 @@ -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/PCK-Studio/Forms/Utilities/AnimationUtil.cs b/PCK-Studio/Forms/Utilities/AnimationUtil.cs new file mode 100644 index 00000000..dfc03a5c --- /dev/null +++ b/PCK-Studio/Forms/Utilities/AnimationUtil.cs @@ -0,0 +1,68 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Drawing.Drawing2D; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using PckStudio.Properties; +using PckStudio.Classes.FileTypes; +using System.Drawing.Imaging; +using System.IO; + +namespace PckStudio.Forms.Utilities +{ + public static class AnimationUtil + { + public static string GetAnimationSection(bool isItem) => isItem ? "items" : "blocks"; + + public static readonly JObject tileData = JObject.Parse(Resources.tileData); + private static Image[] _tileImages; + public static Image[] tileImages + { + get { + if (_tileImages == null) + _tileImages = CreateImageList(Resources.terrain_sheet, 16, 16).Concat(CreateImageList(Resources.items_sheet, 16, 16)).ToArray(); + return _tileImages; + } + } + public static PCKFile.FileData CreateNewAnimationFile(Image source, string tileName, bool isItem) + { + PCKFile.FileData file = new PCKFile.FileData($"res/textures/{GetAnimationSection(isItem)}/{tileName}.png", 2); + file.properties.Add(("ANIM", string.Empty)); + using (var stream = new MemoryStream()) + { + source.Save(stream, ImageFormat.Png); + file.SetData(stream.ToArray()); + } + return file; + } + + + private static IEnumerable CreateImageList(Image source, int width, int height) + { + int img_row_count = source.Width / width; + int img_column_count = source.Height / height; + for (int i = 0; i < img_column_count * img_row_count; i++) + { + int row = i / width; + int column = i % height; + Rectangle tileArea = new Rectangle(new Point(column * width, row * height), new Size(width, height)); + Bitmap tileImage = new Bitmap(width, height); + using (Graphics gfx = Graphics.FromImage(tileImage)) + { + gfx.SmoothingMode = SmoothingMode.None; + gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + + gfx.DrawImage(source, new Rectangle(0, 0, width, height), tileArea, GraphicsUnit.Pixel); + } + yield return tileImage; + } + yield break; + } + + } +} diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 27bcbfab..bdd84000 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -6,10 +6,10 @@ using System.Linq; using System.Windows.Forms; using System.Drawing.Drawing2D; using System.Diagnostics; -using PckStudio.Properties; -using Ohana3DS_Rebirth.Ohana; using System.Drawing.Imaging; using RichPresenceClient; +using Ohana3DS_Rebirth.Ohana; +using PckStudio.Properties; using PckStudio.Classes.FileTypes; using PckStudio.Classes.IO; using PckStudio.Classes.IO.LOC; @@ -17,6 +17,7 @@ using PckStudio.Classes.IO.GRF; using PckStudio.Forms; using PckStudio.Forms.Utilities; using PckStudio.Forms.Editor; +using PckStudio.Forms.Additional_Popups.Animation; namespace PckStudio { @@ -526,7 +527,6 @@ namespace PckStudio diag.Dispose(); } - private void createAnimatedTextureToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog()) @@ -535,30 +535,22 @@ namespace PckStudio ofd.Title = "Select a PNG File"; if (ofd.ShowDialog() == DialogResult.OK) { - try - { - using (Forms.Utilities.AnimationEditor.ChangeTile diag = new Forms.Utilities.AnimationEditor.ChangeTile()) + using ChangeTile diag = new ChangeTile(); if (diag.ShowDialog(this) == DialogResult.OK) { - Console.WriteLine(diag.SelectedTile); - using (Image img = new Bitmap(ofd.FileName)) - using (AnimationEditor animationEditor = new AnimationEditor(img, diag.SelectedTile, diag.IsItem)) - { + using Image img = new Bitmap(ofd.FileName); + var file = AnimationUtil.CreateNewAnimationFile(img, diag.SelectedTile, diag.IsItem); + currentPCK.Files.Add(file); + using AnimationEditor animationEditor = new AnimationEditor(file); if (animationEditor.ShowDialog() == DialogResult.OK) { - treeMeta.Nodes.Clear(); + ReloadMetaTreeView(); + BuildMainTreeView(); saved = false; } } } } - catch - { - MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - } - } } private void treeViewMain_DoubleClick(object sender, EventArgs e) @@ -590,6 +582,15 @@ namespace PckStudio } break; + case 2 when file.filepath.StartsWith("res/textures/blocks/") || file.filepath.StartsWith("res/textures/items/"): + using (AnimationEditor animationEditor = new AnimationEditor(file)) + { + if (animationEditor.ShowDialog(this) == DialogResult.OK) + ReloadMetaTreeView(); + } + break; + + case 7: case 10 when (Path.GetExtension(file.filepath) == ".grf" && file.type == 7) || (Path.GetExtension(file.filepath) == ".grh" && file.type == 10): @@ -2626,19 +2627,14 @@ namespace PckStudio //Check for Animated Texture if (file.filepath.StartsWith("res/textures/blocks/") || file.filepath.StartsWith("res/textures/items/")) { - try - { - AnimationEditor diag = new AnimationEditor(file); - diag.ShowDialog(this); - diag.Dispose(); + string filename = Path.GetFileNameWithoutExtension(file.filepath); + if ((filename.EndsWith("MipMapLevel2") ||filename.EndsWith("MipMapLevel3")) && + currentPCK.TryGetFile(file.filepath.Substring(0, file.filepath.Length - 4 - 12) + ".png", 2, out var baseAnimationFile)) + file = baseAnimationFile; + using AnimationEditor diag = new AnimationEditor(file); + if (diag.ShowDialog(this) == DialogResult.OK) ReloadMetaTreeView(); } - catch - { - MessageBox.Show("Invalid animation data.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - } if (Path.GetFileName(file.filepath) == "audio.pck") { diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index af7b392b..2ceaa954 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -225,16 +225,16 @@ LOCEditor.cs - + Form - + ChangeTile.cs - + Form - + SetBulkSpeed.cs @@ -291,6 +291,7 @@ pleaseWait.cs + Form @@ -321,16 +322,16 @@ SkinPreview.cs - + Form - + AnimationEditor.cs - + Form - + FrameEditor.cs @@ -456,10 +457,10 @@ LOCEditor.cs - + ChangeTile.cs - + SetBulkSpeed.cs @@ -527,10 +528,10 @@ SkinPreview.cs - + AnimationEditor.cs - + FrameEditor.cs diff --git a/PCK-Studio/Resources/tileData.json b/PCK-Studio/Resources/tileData.json index adf7c2db..e183ac85 100644 --- a/PCK-Studio/Resources/tileData.json +++ b/PCK-Studio/Resources/tileData.json @@ -1,7 +1,7 @@ { "COMMENT_1": "Tile data research by MattNL", "COMMENT_2": "JSON conversion by PhoenixARC", - "Blocks": [ + "blocks": [ { "grass_top": "Grass Block (Top)" }, { "stone": "Stone" }, { "dirt": "Dirt" }, @@ -547,7 +547,7 @@ { "dark_oak_trapdoor": "Dark Oak Trapdoor" }, { "jungle_trapdoor": "Jungle Trapdoor" } ], - "Items": [ + "items": [ { "helmetCloth": "Leather Helmet" }, { "helmetChain": "Chain Helmet" }, { "helmetIron": "Iron Helmet" },