From dd273d88ed909a0ac151969a392e89844415d1cd Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Mon, 29 Jul 2019 11:19:34 -0400 Subject: [PATCH] Rework ptcl color handling so it works better --- .../FileFormats/Effects/PCTL.cs | 38 ++---- .../FileFormats/Effects/PTCL_3DS.cs | 24 +--- .../FileFormats/Effects/PTCL_WiiU.cs | 24 +--- .../GUI/Editors/PTCL/EmitterEditor.cs | 115 ++++++++---------- Switch_Toolbox_Library/IO/STColor.cs | 48 ++++++++ Switch_Toolbox_Library/Toolbox.Library.dll | Bin 4913152 -> 4914176 bytes Switch_Toolbox_Library/Toolbox.Library.pdb | Bin 3302912 -> 3307008 bytes Switch_Toolbox_Library/Toolbox_Library.csproj | 1 + 8 files changed, 110 insertions(+), 140 deletions(-) create mode 100644 Switch_Toolbox_Library/IO/STColor.cs diff --git a/File_Format_Library/FileFormats/Effects/PCTL.cs b/File_Format_Library/FileFormats/Effects/PCTL.cs index e6d002d1..d28751f2 100644 --- a/File_Format_Library/FileFormats/Effects/PCTL.cs +++ b/File_Format_Library/FileFormats/Effects/PCTL.cs @@ -1010,42 +1010,26 @@ namespace FirstPlugin public class Emitter : TreeNodeCustom { - public Color[] Color0s = new Color[8]; - public Color[] Color1s = new Color[8]; public List DrawableTex = new List(); public List Samplers = new List(); - public ColorData[] Color0Array = new ColorData[8]; - public ColorData[] Color1Array = new ColorData[8]; - - public class ColorData - { - public float R; - public float G; - public float B; - public float A; - } + public STColor[] Color0Array = new STColor[8]; + public STColor[] Color1Array = new STColor[8]; public void Read(FileReader reader, Header ptclHeader) { uint Position = (uint)reader.Position; - Color0Array = new ColorData[8]; - Color1Array = new ColorData[8]; + Color0Array = new STColor[8]; + Color1Array = new STColor[8]; reader.Seek(Position + 880, SeekOrigin.Begin); for (int i = 0; i < 8; i++) { - Color0Array[i] = new ColorData(); + Color0Array[i] = new STColor(); Color0Array[i].R = reader.ReadSingle(); Color0Array[i].G = reader.ReadSingle(); Color0Array[i].B = reader.ReadSingle(); float time = reader.ReadSingle(); - - int red = Utils.FloatToIntClamp(Color0Array[i].R); - int green = Utils.FloatToIntClamp(Color0Array[i].G); - int blue = Utils.FloatToIntClamp(Color0Array[i].B); - - Color0s[i] = Color.FromArgb(255, red, green, blue); } for (int i = 0; i < 8; i++) { @@ -1053,22 +1037,14 @@ namespace FirstPlugin float padding = reader.ReadSingle(); float padding2 = reader.ReadSingle(); float time = reader.ReadSingle(); - - int alpha = Utils.FloatToIntClamp(Color0Array[i].A); } for (int i = 0; i < 8; i++) { - Color1Array[i] = new ColorData(); + Color1Array[i] = new STColor(); Color1Array[i].R = reader.ReadSingle(); Color1Array[i].G = reader.ReadSingle(); Color1Array[i].B = reader.ReadSingle(); float time = reader.ReadSingle(); - - int red = Utils.FloatToIntClamp(Color1Array[i].R); - int green = Utils.FloatToIntClamp(Color1Array[i].G); - int blue = Utils.FloatToIntClamp(Color1Array[i].B); - - Color1s[i] = Color.FromArgb(255, red, green, blue); } for (int i = 0; i < 8; i++) { @@ -1143,7 +1119,7 @@ namespace FirstPlugin { } - float R = reader.ReadSingle(); + float R = reader.ReadSingle(); float G = reader.ReadSingle(); float B = reader.ReadSingle(); float A = reader.ReadSingle(); diff --git a/File_Format_Library/FileFormats/Effects/PTCL_3DS.cs b/File_Format_Library/FileFormats/Effects/PTCL_3DS.cs index 54bb3912..0ba7ac1e 100644 --- a/File_Format_Library/FileFormats/Effects/PTCL_3DS.cs +++ b/File_Format_Library/FileFormats/Effects/PTCL_3DS.cs @@ -283,41 +283,21 @@ namespace FirstPlugin ColorPosition = reader.Position; for (int i = 0; i < 8; i++) { - ColorData clr = new ColorData(); + STColor clr = new STColor(); clr.R = reader.ReadSingle(); clr.G = reader.ReadSingle(); clr.B = reader.ReadSingle(); clr.A = reader.ReadSingle(); Color0Array[i] = clr; - - int red = Utils.FloatToIntClamp(clr.R); - int green = Utils.FloatToIntClamp(clr.G); - int blue = Utils.FloatToIntClamp(clr.B); - int alpha = Utils.FloatToIntClamp(clr.A); - - // Console.WriteLine($"Color0 {i} R {R} G {G} B {B} A {A}"); - // Console.WriteLine($"Color0 {i} R {red} G {green} B {blue} A {alpha}"); - - Color0s[i] = Color.FromArgb(alpha, red, green, blue); } for (int i = 0; i < 8; i++) { - ColorData clr = new ColorData(); + STColor clr = new STColor(); clr.R = reader.ReadSingle(); clr.G = reader.ReadSingle(); clr.B = reader.ReadSingle(); clr.A = reader.ReadSingle(); Color1Array[i] = clr; - - int red = Utils.FloatToIntClamp(clr.R); - int green = Utils.FloatToIntClamp(clr.G); - int blue = Utils.FloatToIntClamp(clr.B); - int alpha = Utils.FloatToIntClamp(clr.A); - - // Console.WriteLine($"Color1 {i} R {R} G {G} B {B} A {A}"); - // Console.WriteLine($"Color1 {i} R {red} G {green} B {blue} A {alpha}"); - - Color1s[i] = Color.FromArgb(alpha, red, green, blue); } } diff --git a/File_Format_Library/FileFormats/Effects/PTCL_WiiU.cs b/File_Format_Library/FileFormats/Effects/PTCL_WiiU.cs index b56bbb98..5ada183d 100644 --- a/File_Format_Library/FileFormats/Effects/PTCL_WiiU.cs +++ b/File_Format_Library/FileFormats/Effects/PTCL_WiiU.cs @@ -262,41 +262,21 @@ namespace FirstPlugin ColorPosition = reader.Position; for (int i = 0; i < 8; i++) { - ColorData clr = new ColorData(); + STColor clr = new STColor(); clr.R = reader.ReadSingle(); clr.G = reader.ReadSingle(); clr.B = reader.ReadSingle(); clr.A = reader.ReadSingle(); Color0Array[i] = clr; - - int red = Utils.FloatToIntClamp(clr.R); - int green = Utils.FloatToIntClamp(clr.G); - int blue = Utils.FloatToIntClamp(clr.B); - int alpha = Utils.FloatToIntClamp(clr.A); - - // Console.WriteLine($"Color0 {i} R {R} G {G} B {B} A {A}"); - // Console.WriteLine($"Color0 {i} R {red} G {green} B {blue} A {alpha}"); - - Color0s[i] = Color.FromArgb(alpha, red, green, blue); } for (int i = 0; i < 8; i++) { - ColorData clr = new ColorData(); + STColor clr = new STColor(); clr.R = reader.ReadSingle(); clr.G = reader.ReadSingle(); clr.B = reader.ReadSingle(); clr.A = reader.ReadSingle(); Color1Array[i] = clr; - - int red = Utils.FloatToIntClamp(clr.R); - int green = Utils.FloatToIntClamp(clr.G); - int blue = Utils.FloatToIntClamp(clr.B); - int alpha = Utils.FloatToIntClamp(clr.A); - - // Console.WriteLine($"Color1 {i} R {R} G {G} B {B} A {A}"); - // Console.WriteLine($"Color1 {i} R {red} G {green} B {blue} A {alpha}"); - - Color1s[i] = Color.FromArgb(alpha, red, green, blue); } } diff --git a/File_Format_Library/GUI/Editors/PTCL/EmitterEditor.cs b/File_Format_Library/GUI/Editors/PTCL/EmitterEditor.cs index ca18bbc1..795bc029 100644 --- a/File_Format_Library/GUI/Editors/PTCL/EmitterEditor.cs +++ b/File_Format_Library/GUI/Editors/PTCL/EmitterEditor.cs @@ -103,41 +103,41 @@ namespace FirstPlugin { IsColorsLoaded = false; - color0Index0.BackColor = Emitter.Color0s[0]; - color0Index1.BackColor = Emitter.Color0s[1]; - color0Index2.BackColor = Emitter.Color0s[2]; - color0Index3.BackColor = Emitter.Color0s[3]; - color0Index4.BackColor = Emitter.Color0s[4]; - color0Index5.BackColor = Emitter.Color0s[5]; - color0Index6.BackColor = Emitter.Color0s[6]; - color0Index7.BackColor = Emitter.Color0s[7]; + color0Index0.BackColor = Emitter.Color0Array[0].Color; + color0Index1.BackColor = Emitter.Color0Array[1].Color; + color0Index2.BackColor = Emitter.Color0Array[2].Color; + color0Index3.BackColor = Emitter.Color0Array[3].Color; + color0Index4.BackColor = Emitter.Color0Array[4].Color; + color0Index5.BackColor = Emitter.Color0Array[5].Color; + color0Index6.BackColor = Emitter.Color0Array[6].Color; + color0Index7.BackColor = Emitter.Color0Array[7].Color; - color1Index0.BackColor = Emitter.Color1s[0]; - color1Index1.BackColor = Emitter.Color1s[1]; - color1Index2.BackColor = Emitter.Color1s[2]; - color1Index3.BackColor = Emitter.Color1s[3]; - color1Index4.BackColor = Emitter.Color1s[4]; - color1Index5.BackColor = Emitter.Color1s[5]; - color1Index6.BackColor = Emitter.Color1s[6]; - color1Index7.BackColor = Emitter.Color1s[7]; + color1Index0.BackColor = Emitter.Color1Array[0].Color; + color1Index1.BackColor = Emitter.Color1Array[1].Color; + color1Index2.BackColor = Emitter.Color1Array[2].Color; + color1Index3.BackColor = Emitter.Color1Array[3].Color; + color1Index4.BackColor = Emitter.Color1Array[4].Color; + color1Index5.BackColor = Emitter.Color1Array[5].Color; + color1Index6.BackColor = Emitter.Color1Array[6].Color; + color1Index7.BackColor = Emitter.Color1Array[7].Color; - color0TB.Text = Utils.ColorToHex(Emitter.Color0s[0]); - color0TB2.Text = Utils.ColorToHex(Emitter.Color0s[1]); - color0TB3.Text = Utils.ColorToHex(Emitter.Color0s[2]); - color0TB4.Text = Utils.ColorToHex(Emitter.Color0s[3]); - color0TB5.Text = Utils.ColorToHex(Emitter.Color0s[4]); - color0TB6.Text = Utils.ColorToHex(Emitter.Color0s[5]); - color0TB7.Text = Utils.ColorToHex(Emitter.Color0s[6]); - color0TB8.Text = Utils.ColorToHex(Emitter.Color0s[7]); - color1TB.Text = Utils.ColorToHex(Emitter.Color1s[0]); - color1TB2.Text = Utils.ColorToHex(Emitter.Color1s[1]); - color1TB3.Text = Utils.ColorToHex(Emitter.Color1s[2]); - color1TB4.Text = Utils.ColorToHex(Emitter.Color1s[3]); - color1TB5.Text = Utils.ColorToHex(Emitter.Color1s[4]); - color1TB6.Text = Utils.ColorToHex(Emitter.Color1s[5]); - color1TB7.Text = Utils.ColorToHex(Emitter.Color1s[6]); - color1TB8.Text = Utils.ColorToHex(Emitter.Color1s[7]); + color0TB.Text = Utils.ColorToHex(Emitter.Color0Array[0].Color); + color0TB2.Text = Utils.ColorToHex(Emitter.Color0Array[1].Color); + color0TB3.Text = Utils.ColorToHex(Emitter.Color0Array[2].Color); + color0TB4.Text = Utils.ColorToHex(Emitter.Color0Array[3].Color); + color0TB5.Text = Utils.ColorToHex(Emitter.Color0Array[4].Color); + color0TB6.Text = Utils.ColorToHex(Emitter.Color0Array[5].Color); + color0TB7.Text = Utils.ColorToHex(Emitter.Color0Array[6].Color); + color0TB8.Text = Utils.ColorToHex(Emitter.Color0Array[7].Color); + color1TB.Text = Utils.ColorToHex(Emitter.Color1Array[0].Color); + color1TB2.Text = Utils.ColorToHex(Emitter.Color1Array[1].Color); + color1TB3.Text = Utils.ColorToHex(Emitter.Color1Array[2].Color); + color1TB4.Text = Utils.ColorToHex(Emitter.Color1Array[3].Color); + color1TB5.Text = Utils.ColorToHex(Emitter.Color1Array[4].Color); + color1TB6.Text = Utils.ColorToHex(Emitter.Color1Array[5].Color); + color1TB7.Text = Utils.ColorToHex(Emitter.Color1Array[6].Color); + color1TB8.Text = Utils.ColorToHex(Emitter.Color1Array[7].Color); IsColorsLoaded = true; } @@ -185,21 +185,9 @@ namespace FirstPlugin if (dialog.ShowDialog() == DialogResult.OK) { if (button.Name.Contains("color0")) - { - ActiveEmitter.Color0Array[index].R = (float)dialog.Color.R / 255; - ActiveEmitter.Color0Array[index].G = (float)dialog.Color.G / 255; - ActiveEmitter.Color0Array[index].B = (float)dialog.Color.B / 255; - ActiveEmitter.Color0Array[index].A = (float)dialog.Color.A / 255; - ActiveEmitter.Color0s[index] = dialog.Color; - } + ActiveEmitter.Color0Array[index].Color = dialog.Color; else - { - ActiveEmitter.Color1Array[index].R = (float)dialog.Color.R / 255; - ActiveEmitter.Color1Array[index].G = (float)dialog.Color.G / 255; - ActiveEmitter.Color1Array[index].B = (float)dialog.Color.B / 255; - ActiveEmitter.Color1Array[index].A = (float)dialog.Color.A / 255; - ActiveEmitter.Color1s[index] = dialog.Color; - } + ActiveEmitter.Color1Array[index].Color = dialog.Color; button.BackColor = dialog.Color; } @@ -222,26 +210,23 @@ namespace FirstPlugin Color[] colors0 = new Color[8]; Color[] colors1 = new Color[8]; - colors0[0] = Utils.HexToColor(color0TB.Text); - colors0[1] = Utils.HexToColor(color0TB2.Text); - colors0[2] = Utils.HexToColor(color0TB3.Text); - colors0[3] = Utils.HexToColor(color0TB4.Text); - colors0[4] = Utils.HexToColor(color0TB5.Text); - colors0[5] = Utils.HexToColor(color0TB6.Text); - colors0[6] = Utils.HexToColor(color0TB7.Text); - colors0[7] = Utils.HexToColor(color0TB8.Text); + ActiveEmitter.Color0Array[0].Color = Utils.HexToColor(color0TB.Text); + ActiveEmitter.Color0Array[1].Color = Utils.HexToColor(color0TB2.Text); + ActiveEmitter.Color0Array[2].Color = Utils.HexToColor(color0TB3.Text); + ActiveEmitter.Color0Array[3].Color = Utils.HexToColor(color0TB4.Text); + ActiveEmitter.Color0Array[4].Color = Utils.HexToColor(color0TB5.Text); + ActiveEmitter.Color0Array[5].Color = Utils.HexToColor(color0TB6.Text); + ActiveEmitter.Color0Array[6].Color = Utils.HexToColor(color0TB7.Text); + ActiveEmitter.Color0Array[7].Color = Utils.HexToColor(color0TB8.Text); - colors1[0] = Utils.HexToColor(color1TB.Text); - colors1[1] = Utils.HexToColor(color1TB2.Text); - colors1[2] = Utils.HexToColor(color1TB3.Text); - colors1[3] = Utils.HexToColor(color1TB4.Text); - colors1[4] = Utils.HexToColor(color1TB5.Text); - colors1[5] = Utils.HexToColor(color1TB6.Text); - colors1[6] = Utils.HexToColor(color1TB7.Text); - colors1[7] = Utils.HexToColor(color1TB8.Text); - - ActiveEmitter.Color0s = colors0; - ActiveEmitter.Color1s = colors1; + ActiveEmitter.Color1Array[0].Color = Utils.HexToColor(color1TB.Text); + ActiveEmitter.Color1Array[1].Color = Utils.HexToColor(color1TB2.Text); + ActiveEmitter.Color1Array[2].Color = Utils.HexToColor(color1TB3.Text); + ActiveEmitter.Color1Array[3].Color = Utils.HexToColor(color1TB4.Text); + ActiveEmitter.Color1Array[4].Color = Utils.HexToColor(color1TB5.Text); + ActiveEmitter.Color1Array[5].Color = Utils.HexToColor(color1TB6.Text); + ActiveEmitter.Color1Array[6].Color = Utils.HexToColor(color1TB7.Text); + ActiveEmitter.Color1Array[7].Color = Utils.HexToColor(color1TB8.Text); LoadColors(ActiveEmitter); } diff --git a/Switch_Toolbox_Library/IO/STColor.cs b/Switch_Toolbox_Library/IO/STColor.cs new file mode 100644 index 00000000..d488f3a4 --- /dev/null +++ b/Switch_Toolbox_Library/IO/STColor.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace Toolbox.Library +{ + //Class that contains colors and useful color related methods + public class STColor + { + public float R { get; set; } + public float G { get; set; } + public float B { get; set; } + public float A { get; set; } + + public Color Color + { + get + { + int red = Utils.FloatToIntClamp(R); + int green = Utils.FloatToIntClamp(G); + int blue = Utils.FloatToIntClamp(B); + int alpha = Utils.FloatToIntClamp(A); + + return Color.FromArgb(alpha, red, green, blue); + } + set + { + var color = value; + R = color.R / 255f; + G = color.G / 255f; + B = color.B / 255f; + A = color.A / 255f; + } + } + + + public STColor() + { + R = 1; + G = 1; + B = 1; + A = 1; + } + } +} diff --git a/Switch_Toolbox_Library/Toolbox.Library.dll b/Switch_Toolbox_Library/Toolbox.Library.dll index fa396ba5bb9df73a0296aa0160c074f2a679136a..7782a8b17efa2dd01703547fc862078f80eeea61 100644 GIT binary patch delta 504290 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