diff --git a/.vs/Toolbox/v15/.suo b/.vs/Toolbox/v15/.suo index 6cd2587d..8502a326 100644 Binary files a/.vs/Toolbox/v15/.suo and b/.vs/Toolbox/v15/.suo differ diff --git a/File_Format_Library/FileFormats/Effects/PCTL.cs b/File_Format_Library/FileFormats/Effects/PCTL.cs index 8c21330d..1cbd55c4 100644 --- a/File_Format_Library/FileFormats/Effects/PCTL.cs +++ b/File_Format_Library/FileFormats/Effects/PCTL.cs @@ -32,7 +32,7 @@ namespace FirstPlugin if (reader.CheckSignature(4, "VFXB") || reader.CheckSignature(4, "SPBD") || reader.CheckSignature(4, "EFTF") || - reader.CheckSignature(4, "EFTB")) + reader.CheckSignature(4, "EFTB")) return true; else return false; @@ -51,7 +51,7 @@ namespace FirstPlugin public Header header; public PTCL_WiiU.Header headerU; public PTCL_3DS.Header header3DS; - + public byte[] data; bool IsWiiU = false; @@ -222,7 +222,11 @@ namespace FirstPlugin botwTex.Add((TEXR)((SectionBase)node).BinaryData); } - ptcl.header.BinaryTextureFile = bntx; + if (bntx != null) + { + bntx.LoadIcons = true; + ptcl.header.BinaryTextureFile = bntx; + } int index = 0; if (botwTex.Count > 0) @@ -411,15 +415,15 @@ namespace FirstPlugin { get { - /* if (BinaryData == null) - return binaryDataBytes; - else if (BinaryData is BFRES) - return (((BFRES)BinaryData).Save()); - else if (BinaryData is BNTX) - return (((BNTX)BinaryData).Save()); - else*/ + /* if (BinaryData == null) + return binaryDataBytes; + else if (BinaryData is BFRES) + return (((BFRES)BinaryData).Save()); + else if (BinaryData is BNTX) + return (((BNTX)BinaryData).Save()); + else*/ - return binaryDataBytes; + return binaryDataBytes; } set { @@ -434,10 +438,10 @@ namespace FirstPlugin { if (BinaryData is Emitter || Signature == "EMTR") { - EmitterEditor editor = (EmitterEditor)LibraryGUI.GetActiveContent(typeof(EmitterEditor)); + EmitterEditorNX editor = (EmitterEditorNX)LibraryGUI.GetActiveContent(typeof(EmitterEditorNX)); if (editor == null) { - editor = new EmitterEditor(); + editor = new EmitterEditorNX(); LibraryGUI.LoadEditor(editor); } editor.Text = Text; @@ -572,8 +576,11 @@ namespace FirstPlugin case "GRTF": if (section.BinaryDataOffset != NullOffset) { + section.Text = "Textures"; + reader.Seek(section.BinaryDataOffset + section.Position, SeekOrigin.Begin); BinaryData = new BNTX(); + ((BNTX)BinaryData).LoadIcons = true; ((BNTX)BinaryData).FileName = "textures.bntx"; ((BNTX)BinaryData).Load(new MemoryStream(reader.ReadBytes((int)section.SectionSize))); ((BNTX)BinaryData).IFileInfo.InArchive = true; @@ -589,7 +596,7 @@ namespace FirstPlugin break; case "GRSN": section.Text = "Shaders"; - + if (section.BinaryDataOffset != NullOffset) { reader.Seek(section.BinaryDataOffset + section.Position, SeekOrigin.Begin); @@ -603,10 +610,12 @@ namespace FirstPlugin reader.Seek(section.BinaryDataOffset + section.Position, SeekOrigin.Begin); BinaryData = reader.ReadBytes((int)section.SectionSize); } - break; + break; case "G3PR": if (section.BinaryDataOffset != NullOffset) { + section.Text = "Models"; + reader.Seek(section.BinaryDataOffset + section.Position, SeekOrigin.Begin); BinaryData = new BFRES(); ((BFRES)BinaryData).FileName = "model.bfres"; @@ -650,14 +659,14 @@ namespace FirstPlugin SaveHeader(writer, header, BinaryDataBytes, 4096); break; case "G3PR": - // SaveHeader(writer, header, ((BFRES)BinaryData).Save(), 4096); - SaveHeader(writer, header, BinaryDataBytes, 4096); + // SaveHeader(writer, header, ((BFRES)BinaryData).Save(), 4096); + SaveHeader(writer, header, BinaryDataBytes, 4096); break; case "GRTF": var mem = new System.IO.MemoryStream(); ((BNTX)BinaryData).Save(mem); SaveHeader(writer, header, mem.ToArray(), 4096); - // SaveHeader(writer, header, BinaryDataBytes, 4096); + // SaveHeader(writer, header, BinaryDataBytes, 4096); break; case "PRIM": SaveHeader(writer, header, BinaryDataBytes); @@ -671,7 +680,7 @@ namespace FirstPlugin child.Write(writer, header); } - using (writer.TemporarySeek(_emitterPos + BinaryDataOffset +16 + 64, SeekOrigin.Begin)) + using (writer.TemporarySeek(_emitterPos + BinaryDataOffset + 16 + 64, SeekOrigin.Begin)) { ((Emitter)BinaryData).Write(writer, header); } @@ -704,7 +713,7 @@ namespace FirstPlugin public List BinariesSaved = new List(); - private void SaveHeader(FileWriter writer,Header header, byte[] BinaryFile, int BinaryAlignment = 0) + private void SaveHeader(FileWriter writer, Header header, byte[] BinaryFile, int BinaryAlignment = 0) { if (Signature != "PRIM") writer.Align(16); @@ -777,7 +786,7 @@ namespace FirstPlugin { if (Signature != "PRIM") writer.Align(16); - + writer.WriteUint32Offset(_ofsNextPos, BasePosition); } } @@ -874,7 +883,7 @@ namespace FirstPlugin public void Replace(string FileName) { - + } public static GTXImporterSettings SetImporterSettings(string name) { @@ -912,7 +921,7 @@ namespace FirstPlugin byte unk5 = reader.ReadByte(); short unk6 = reader.ReadInt16(); uint unk7 = reader.ReadUInt32(); - + } public override void SetImageData(Bitmap bitmap, int ArrayLevel) @@ -1027,16 +1036,132 @@ namespace FirstPlugin { public List DrawableTex = new List(); public List Samplers = new List(); + + public STColor ConstantColor0; + public STColor ConstantColor1; + public STColor[] Color0Array = new STColor[8]; public STColor[] Color1Array = new STColor[8]; + public STColor[] Color0AlphaArray = new STColor[8]; + public STColor[] Color1AlphaArray = new STColor[8]; + + public STColor ConstantAlpha0 + { + get + { + return new STColor() + { + R = ConstantColor0.A, + G = ConstantColor0.A, + B = ConstantColor0.A, + }; + } + } + + public STColor ConstantAlpha1 + { + get + { + return new STColor() + { + R = ConstantColor1.A, + G = ConstantColor1.A, + B = ConstantColor1.A, + }; + } + } + + public enum ColorType + { + Constant, + Random, + Animated8Key, + } + + public ColorType Color0Type; + public ColorType Alpha0Type; + public ColorType Color1Type; + public ColorType Alpha1Type; + + private bool HasTime(STColor[] colors) + { + for (int i = 0; i < colors.Length; i++) + if (colors[i].Time != 0) return true; + + return false; + } + + private void SetType(bool HasKeys, STColor[] colors, int type, bool isAlpha) + { + if (HasKeys) + { + if (HasTime(colors)) + SetType(type, isAlpha, ColorType.Animated8Key); + else + SetType(type, isAlpha, ColorType.Random); + } + else + SetType(type, isAlpha, ColorType.Constant); + } + + private void SetType(int type, bool isAlpha, ColorType colorType) + { + if (type == 0) + { + if (!isAlpha) + Color0Type = colorType; + else + Alpha0Type = colorType; + } + if (type == 1) + { + if (!isAlpha) + Color1Type = colorType; + else + Alpha1Type = colorType; + } + } + + public uint Color0KeyCount; + public uint Alpha0KeyCount; + public uint Color1KeyCount; + public uint Alpha1KeyCount; + public void Read(FileReader reader, Header ptclHeader) { - uint Position = (uint)reader.Position; + uint Position = (uint)reader.Position; Color0Array = new STColor[8]; Color1Array = new STColor[8]; + Color0AlphaArray = new STColor[8]; + Color1AlphaArray = new STColor[8]; + ConstantColor0 = new STColor(); + ConstantColor1 = new STColor(); + reader.ReadBytes(16); //Unknown padding + Color0KeyCount = reader.ReadUInt32(); + Alpha0KeyCount = reader.ReadUInt32(); + Color1KeyCount = reader.ReadUInt32(); + Alpha1KeyCount = reader.ReadUInt32(); + uint scaleKeyCount = reader.ReadUInt32(); + + //Seek to the contant colors + reader.Seek(Position + 2384, SeekOrigin.Begin); + + ConstantColor0 = new STColor(); + ConstantColor0.R = reader.ReadSingle(); + ConstantColor0.G = reader.ReadSingle(); + ConstantColor0.B = reader.ReadSingle(); + ConstantColor0.A = reader.ReadSingle(); + + ConstantColor1 = new STColor(); + ConstantColor1.R = reader.ReadSingle(); + ConstantColor1.G = reader.ReadSingle(); + ConstantColor1.B = reader.ReadSingle(); + ConstantColor1.A = reader.ReadSingle(); + + //Seek to the random and animated color table reader.Seek(Position + 880, SeekOrigin.Begin); for (int i = 0; i < 8; i++) { @@ -1044,37 +1169,42 @@ namespace FirstPlugin Color0Array[i].R = reader.ReadSingle(); Color0Array[i].G = reader.ReadSingle(); Color0Array[i].B = reader.ReadSingle(); - float time = reader.ReadSingle(); + Color0Array[i].Time = reader.ReadSingle(); } + for (int i = 0; i < 8; i++) { - Color0Array[i].A = reader.ReadSingle(); - float padding = reader.ReadSingle(); - float padding2 = reader.ReadSingle(); - float time = reader.ReadSingle(); + Color0AlphaArray[i] = new STColor(); + Color0AlphaArray[i].R = reader.ReadSingle(); + Color0AlphaArray[i].G = reader.ReadSingle(); + Color0AlphaArray[i].B = reader.ReadSingle(); + Color0AlphaArray[i].Time = reader.ReadSingle(); } + for (int i = 0; i < 8; i++) { Color1Array[i] = new STColor(); Color1Array[i].R = reader.ReadSingle(); Color1Array[i].G = reader.ReadSingle(); Color1Array[i].B = reader.ReadSingle(); - float time = reader.ReadSingle(); + Color1Array[i].Time = reader.ReadSingle(); } + for (int i = 0; i < 8; i++) { - Color1Array[i].A = reader.ReadSingle(); - float padding = reader.ReadSingle(); - float padding2 = reader.ReadSingle(); - float time = reader.ReadSingle(); + Color1AlphaArray[i] = new STColor(); + Color1AlphaArray[i].R = reader.ReadSingle(); + Color1AlphaArray[i].G = reader.ReadSingle(); + Color1AlphaArray[i].B = reader.ReadSingle(); + Color1AlphaArray[i].Time = reader.ReadSingle(); int alpha = Utils.FloatToIntClamp(Color1Array[i].A); } - if (ptclHeader.VFXVersion >= 22) - reader.Seek(Position + 2464, SeekOrigin.Begin); - else - reader.Seek(Position + 2472, SeekOrigin.Begin); + SetType(Color0KeyCount != 0, Color0Array, 0, false); + SetType(Alpha0KeyCount != 0, Color0AlphaArray, 0, true); + SetType(Color1KeyCount != 0, Color1Array, 1, false); + SetType(Alpha1KeyCount != 0, Color1AlphaArray, 1, true); for (int i = 0; i < 3; i++) { @@ -1088,30 +1218,45 @@ namespace FirstPlugin { uint Position = (uint)writer.Position; + //Seek to the contant colors + writer.Seek(Position + 2384, SeekOrigin.Begin); + writer.Write(ConstantColor0.R); + writer.Write(ConstantColor0.G); + writer.Write(ConstantColor0.B); + writer.Write(ConstantAlpha0.R); + writer.Write(ConstantColor1.R); + writer.Write(ConstantColor1.G); + writer.Write(ConstantColor1.B); + writer.Write(ConstantAlpha1.R); + writer.Seek(Position + 880, SeekOrigin.Begin); for (int i = 0; i < 8; i++) { writer.Write(Color0Array[i].R); writer.Write(Color0Array[i].G); writer.Write(Color0Array[i].B); - writer.Seek(4, SeekOrigin.Current); + writer.Write(Color0Array[i].Time); } for (int i = 0; i < 8; i++) { - writer.Write(Color0Array[i].A); - writer.Seek(12, SeekOrigin.Current); + writer.Write(Color0AlphaArray[i].R); + writer.Write(Color0AlphaArray[i].G); + writer.Write(Color0AlphaArray[i].B); + writer.Write(Color0AlphaArray[i].Time); } for (int i = 0; i < 8; i++) { writer.Write(Color1Array[i].R); writer.Write(Color1Array[i].G); writer.Write(Color1Array[i].B); - writer.Seek(4, SeekOrigin.Current); + writer.Write(Color1Array[i].Time); } for (int i = 0; i < 8; i++) { - writer.Write(Color1Array[i].A); - writer.Seek(12, SeekOrigin.Current); + writer.Write(Color1AlphaArray[i].R); + writer.Write(Color1AlphaArray[i].G); + writer.Write(Color1AlphaArray[i].B); + writer.Write(Color1AlphaArray[i].Time); } } @@ -1181,9 +1326,9 @@ namespace FirstPlugin { uint Position = (uint)reader.Position; //Offsets are relative to this - TextureID = reader.ReadUInt64(); + TextureID = reader.ReadUInt64(); uint NextDesriptorOffset = reader.ReadUInt32(); - uint StringLength = reader.ReadUInt32(); + uint StringLength = reader.ReadUInt32(); TexName = reader.ReadString(BinaryStringFormat.ZeroTerminated); Text = TexName + " " + TextureID.ToString("x"); diff --git a/File_Format_Library/FileFormats/Texture/BNTX.cs b/File_Format_Library/FileFormats/Texture/BNTX.cs index b2e48c7c..ffdfde16 100644 --- a/File_Format_Library/FileFormats/Texture/BNTX.cs +++ b/File_Format_Library/FileFormats/Texture/BNTX.cs @@ -21,8 +21,10 @@ using FirstPlugin.Forms; namespace FirstPlugin { - public class BNTX : TreeNodeFile, IFileFormat, IContextMenuNode + public class BNTX : TreeNodeFile, IFileFormat, IContextMenuNode, ITextureIconLoader { + public bool LoadIcons = false; + public FileType FileType { get; set; } = FileType.Image; public bool CanSave { get; set; } @@ -60,6 +62,9 @@ namespace FirstPlugin { get { + if (!LoadIcons) + return new List(); + List textures = new List(); foreach (STGenericTexture node in Nodes) textures.Add(node); diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index eafda126..6893e3bc 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -394,6 +394,31 @@ SmoothNormalsMultiMeshForm.cs + + Component + + + Color8KeySlider.cs + + + UserControl + + + ColorConstantPanel.cs + + + + UserControl + + + ColorRandomPanel.cs + + + UserControl + + + EmitterEditorNX.cs + Form @@ -1217,6 +1242,18 @@ MK8MapCameraEditor.cs + + Color8KeySlider.cs + + + ColorConstantPanel.cs + + + ColorRandomPanel.cs + + + EmitterEditorNX.cs + EmitterEditor.cs diff --git a/File_Format_Library/GUI/BCRES/Material/SamplerEditorSimple.Designer.cs b/File_Format_Library/GUI/BCRES/Material/SamplerEditorSimple.Designer.cs index e229eb54..f5a2f57b 100644 --- a/File_Format_Library/GUI/BCRES/Material/SamplerEditorSimple.Designer.cs +++ b/File_Format_Library/GUI/BCRES/Material/SamplerEditorSimple.Designer.cs @@ -125,7 +125,6 @@ this.samplerCB.FormattingEnabled = true; this.samplerCB.Location = new System.Drawing.Point(66, 77); this.samplerCB.Name = "samplerCB"; - this.samplerCB.ReadOnly = true; this.samplerCB.Size = new System.Drawing.Size(206, 21); this.samplerCB.TabIndex = 4; // diff --git a/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs b/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs index e1c8aca4..d056e7f4 100644 --- a/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs +++ b/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs @@ -144,7 +144,6 @@ this.fontTypeCB.FormattingEnabled = true; this.fontTypeCB.Location = new System.Drawing.Point(87, 42); this.fontTypeCB.Name = "fontTypeCB"; - this.fontTypeCB.ReadOnly = true; this.fontTypeCB.Size = new System.Drawing.Size(108, 21); this.fontTypeCB.TabIndex = 17; // @@ -156,7 +155,6 @@ this.encodingTypeCB.FormattingEnabled = true; this.encodingTypeCB.Location = new System.Drawing.Point(87, 73); this.encodingTypeCB.Name = "encodingTypeCB"; - this.encodingTypeCB.ReadOnly = true; this.encodingTypeCB.Size = new System.Drawing.Size(108, 21); this.encodingTypeCB.TabIndex = 16; // @@ -420,7 +418,6 @@ this.characterCodeCB.FormattingEnabled = true; this.characterCodeCB.Location = new System.Drawing.Point(103, 27); this.characterCodeCB.Name = "characterCodeCB"; - this.characterCodeCB.ReadOnly = true; this.characterCodeCB.Size = new System.Drawing.Size(72, 39); this.characterCodeCB.TabIndex = 2; // @@ -485,7 +482,6 @@ this.imagesCB.FormattingEnabled = true; this.imagesCB.Location = new System.Drawing.Point(82, 6); this.imagesCB.Name = "imagesCB"; - this.imagesCB.ReadOnly = true; this.imagesCB.Size = new System.Drawing.Size(213, 21); this.imagesCB.TabIndex = 1; this.imagesCB.SelectedIndexChanged += new System.EventHandler(this.imagesCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/BatchEditBaseAnimDataForm.Designer.cs b/File_Format_Library/GUI/BFRES/BatchEditBaseAnimDataForm.Designer.cs index 6b38867b..ea949aa3 100644 --- a/File_Format_Library/GUI/BFRES/BatchEditBaseAnimDataForm.Designer.cs +++ b/File_Format_Library/GUI/BFRES/BatchEditBaseAnimDataForm.Designer.cs @@ -85,7 +85,6 @@ this.boneListCB.FormattingEnabled = true; this.boneListCB.Location = new System.Drawing.Point(12, 56); this.boneListCB.Name = "boneListCB"; - this.boneListCB.ReadOnly = true; this.boneListCB.Size = new System.Drawing.Size(132, 21); this.boneListCB.TabIndex = 13; this.boneListCB.SelectedIndexChanged += new System.EventHandler(this.boneListCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/BfresModelImportSettings.Designer.cs b/File_Format_Library/GUI/BFRES/BfresModelImportSettings.Designer.cs index eb9a780c..6c2860d4 100644 --- a/File_Format_Library/GUI/BFRES/BfresModelImportSettings.Designer.cs +++ b/File_Format_Library/GUI/BFRES/BfresModelImportSettings.Designer.cs @@ -151,7 +151,6 @@ this.comboBoxFormatPositions.FormattingEnabled = true; this.comboBoxFormatPositions.Location = new System.Drawing.Point(50, 37); this.comboBoxFormatPositions.Name = "comboBoxFormatPositions"; - this.comboBoxFormatPositions.ReadOnly = true; this.comboBoxFormatPositions.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatPositions.TabIndex = 1; // @@ -191,7 +190,6 @@ this.comboBoxFormatNormals.FormattingEnabled = true; this.comboBoxFormatNormals.Location = new System.Drawing.Point(53, 34); this.comboBoxFormatNormals.Name = "comboBoxFormatNormals"; - this.comboBoxFormatNormals.ReadOnly = true; this.comboBoxFormatNormals.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatNormals.TabIndex = 1; // @@ -231,7 +229,6 @@ this.comboBoxFormatUvs.FormattingEnabled = true; this.comboBoxFormatUvs.Location = new System.Drawing.Point(53, 26); this.comboBoxFormatUvs.Name = "comboBoxFormatUvs"; - this.comboBoxFormatUvs.ReadOnly = true; this.comboBoxFormatUvs.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatUvs.TabIndex = 1; // @@ -272,7 +269,6 @@ this.comboBoxFormatVertexColors.FormattingEnabled = true; this.comboBoxFormatVertexColors.Location = new System.Drawing.Point(53, 33); this.comboBoxFormatVertexColors.Name = "comboBoxFormatVertexColors"; - this.comboBoxFormatVertexColors.ReadOnly = true; this.comboBoxFormatVertexColors.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatVertexColors.TabIndex = 1; // @@ -312,7 +308,6 @@ this.comboBoxFormatTangents.FormattingEnabled = true; this.comboBoxFormatTangents.Location = new System.Drawing.Point(60, 37); this.comboBoxFormatTangents.Name = "comboBoxFormatTangents"; - this.comboBoxFormatTangents.ReadOnly = true; this.comboBoxFormatTangents.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatTangents.TabIndex = 1; // @@ -352,7 +347,6 @@ this.comboBoxFormatBitans.FormattingEnabled = true; this.comboBoxFormatBitans.Location = new System.Drawing.Point(51, 34); this.comboBoxFormatBitans.Name = "comboBoxFormatBitans"; - this.comboBoxFormatBitans.ReadOnly = true; this.comboBoxFormatBitans.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatBitans.TabIndex = 1; // @@ -385,7 +379,6 @@ this.comboBoxFormatIndices.FormattingEnabled = true; this.comboBoxFormatIndices.Location = new System.Drawing.Point(92, 60); this.comboBoxFormatIndices.Name = "comboBoxFormatIndices"; - this.comboBoxFormatIndices.ReadOnly = true; this.comboBoxFormatIndices.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatIndices.TabIndex = 5; // @@ -416,7 +409,6 @@ this.comboBoxFormatWeights.FormattingEnabled = true; this.comboBoxFormatWeights.Location = new System.Drawing.Point(92, 30); this.comboBoxFormatWeights.Name = "comboBoxFormatWeights"; - this.comboBoxFormatWeights.ReadOnly = true; this.comboBoxFormatWeights.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatWeights.TabIndex = 1; // @@ -718,7 +710,6 @@ this.comboBoxFormatFaces.FormattingEnabled = true; this.comboBoxFormatFaces.Location = new System.Drawing.Point(102, 7); this.comboBoxFormatFaces.Name = "comboBoxFormatFaces"; - this.comboBoxFormatFaces.ReadOnly = true; this.comboBoxFormatFaces.Size = new System.Drawing.Size(157, 21); this.comboBoxFormatFaces.TabIndex = 5; // diff --git a/File_Format_Library/GUI/BFRES/Materials/ShaderParams/TexSrtPanel.Designer.cs b/File_Format_Library/GUI/BFRES/Materials/ShaderParams/TexSrtPanel.Designer.cs index 6072282d..23d04969 100644 --- a/File_Format_Library/GUI/BFRES/Materials/ShaderParams/TexSrtPanel.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Materials/ShaderParams/TexSrtPanel.Designer.cs @@ -49,7 +49,6 @@ this.scalingModeCN.FormattingEnabled = true; this.scalingModeCN.Location = new System.Drawing.Point(214, 33); this.scalingModeCN.Name = "scalingModeCN"; - this.scalingModeCN.ReadOnly = true; this.scalingModeCN.Size = new System.Drawing.Size(121, 21); this.scalingModeCN.TabIndex = 0; this.scalingModeCN.SelectedIndexChanged += new System.EventHandler(this.barSlider_ValueChanged); diff --git a/File_Format_Library/GUI/BFRES/Materials/VolatileFlagEditor.Designer.cs b/File_Format_Library/GUI/BFRES/Materials/VolatileFlagEditor.Designer.cs index fe1fbe0b..12fcb36e 100644 --- a/File_Format_Library/GUI/BFRES/Materials/VolatileFlagEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Materials/VolatileFlagEditor.Designer.cs @@ -64,7 +64,6 @@ this.stComboBox1.FormattingEnabled = true; this.stComboBox1.Location = new System.Drawing.Point(212, 31); this.stComboBox1.Name = "stComboBox1"; - this.stComboBox1.ReadOnly = true; this.stComboBox1.Size = new System.Drawing.Size(121, 21); this.stComboBox1.TabIndex = 12; this.stComboBox1.SelectedIndexChanged += new System.EventHandler(this.stComboBox1_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/ParamAnim/AnimParamEditor.Designer.cs b/File_Format_Library/GUI/BFRES/ParamAnim/AnimParamEditor.Designer.cs index 3c4b8dd9..295db02f 100644 --- a/File_Format_Library/GUI/BFRES/ParamAnim/AnimParamEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/ParamAnim/AnimParamEditor.Designer.cs @@ -98,7 +98,6 @@ this.materialCB.FormattingEnabled = true; this.materialCB.Location = new System.Drawing.Point(136, 6); this.materialCB.Name = "materialCB"; - this.materialCB.ReadOnly = true; this.materialCB.Size = new System.Drawing.Size(203, 21); this.materialCB.TabIndex = 18; this.materialCB.SelectedIndexChanged += new System.EventHandler(this.materialCB_SelectedIndexChanged); @@ -111,7 +110,6 @@ this.paramCB.FormattingEnabled = true; this.paramCB.Location = new System.Drawing.Point(136, 35); this.paramCB.Name = "paramCB"; - this.paramCB.ReadOnly = true; this.paramCB.Size = new System.Drawing.Size(203, 21); this.paramCB.TabIndex = 16; this.paramCB.SelectedIndexChanged += new System.EventHandler(this.paramCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Shape/BfresShapeEditor.Designer.cs b/File_Format_Library/GUI/BFRES/Shape/BfresShapeEditor.Designer.cs index 1ff8e4ed..5cd39010 100644 --- a/File_Format_Library/GUI/BFRES/Shape/BfresShapeEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Shape/BfresShapeEditor.Designer.cs @@ -269,7 +269,6 @@ "Quaternion"}); this.lodDisplayCB.Location = new System.Drawing.Point(83, 89); this.lodDisplayCB.Name = "lodDisplayCB"; - this.lodDisplayCB.ReadOnly = true; this.lodDisplayCB.Size = new System.Drawing.Size(121, 21); this.lodDisplayCB.TabIndex = 38; this.lodDisplayCB.SelectedIndexChanged += new System.EventHandler(this.lodDisplayCB_SelectedIndexChanged); @@ -404,7 +403,6 @@ "Radians"}); this.measureCB.Location = new System.Drawing.Point(305, 5); this.measureCB.Name = "measureCB"; - this.measureCB.ReadOnly = true; this.measureCB.Size = new System.Drawing.Size(121, 21); this.measureCB.TabIndex = 37; // @@ -428,7 +426,6 @@ "Quaternion"}); this.rotModeCB.Location = new System.Drawing.Point(77, 5); this.rotModeCB.Name = "rotModeCB"; - this.rotModeCB.ReadOnly = true; this.rotModeCB.Size = new System.Drawing.Size(121, 21); this.rotModeCB.TabIndex = 35; this.rotModeCB.SelectedIndexChanged += new System.EventHandler(this.rotModeCB_SelectedIndexChanged); @@ -868,7 +865,6 @@ this.materialComboBox1.FormattingEnabled = true; this.materialComboBox1.Location = new System.Drawing.Point(77, 7); this.materialComboBox1.Name = "materialComboBox1"; - this.materialComboBox1.ReadOnly = true; this.materialComboBox1.Size = new System.Drawing.Size(227, 21); this.materialComboBox1.TabIndex = 0; this.materialComboBox1.SelectedIndexChanged += new System.EventHandler(this.materialComboBox1_SelectedIndexChanged); @@ -933,7 +929,6 @@ this.bonesCB.FormattingEnabled = true; this.bonesCB.Location = new System.Drawing.Point(77, 6); this.bonesCB.Name = "bonesCB"; - this.bonesCB.ReadOnly = true; this.bonesCB.Size = new System.Drawing.Size(227, 21); this.bonesCB.TabIndex = 16; this.bonesCB.SelectedIndexChanged += new System.EventHandler(this.bonesCB_SelectedIndexChanged); @@ -1216,7 +1211,6 @@ this.lodPrimativeTypeCB.FormattingEnabled = true; this.lodPrimativeTypeCB.Location = new System.Drawing.Point(101, 35); this.lodPrimativeTypeCB.Name = "lodPrimativeTypeCB"; - this.lodPrimativeTypeCB.ReadOnly = true; this.lodPrimativeTypeCB.Size = new System.Drawing.Size(137, 21); this.lodPrimativeTypeCB.TabIndex = 36; // @@ -1230,7 +1224,6 @@ this.lodFormatCB.FormattingEnabled = true; this.lodFormatCB.Location = new System.Drawing.Point(101, 5); this.lodFormatCB.Name = "lodFormatCB"; - this.lodFormatCB.ReadOnly = true; this.lodFormatCB.Size = new System.Drawing.Size(137, 21); this.lodFormatCB.TabIndex = 30; // diff --git a/File_Format_Library/GUI/BFRES/Shape/CopyUVChannelDialog.Designer.cs b/File_Format_Library/GUI/BFRES/Shape/CopyUVChannelDialog.Designer.cs index 574d9a68..ebf2ab53 100644 --- a/File_Format_Library/GUI/BFRES/Shape/CopyUVChannelDialog.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Shape/CopyUVChannelDialog.Designer.cs @@ -61,7 +61,6 @@ this.sourceCB.FormattingEnabled = true; this.sourceCB.Location = new System.Drawing.Point(54, 31); this.sourceCB.Name = "sourceCB"; - this.sourceCB.ReadOnly = true; this.sourceCB.Size = new System.Drawing.Size(121, 21); this.sourceCB.TabIndex = 0; this.sourceCB.SelectedIndexChanged += new System.EventHandler(this.sourceCB_SelectedIndexChanged); @@ -92,7 +91,6 @@ this.destCB.FormattingEnabled = true; this.destCB.Location = new System.Drawing.Point(258, 31); this.destCB.Name = "destCB"; - this.destCB.ReadOnly = true; this.destCB.Size = new System.Drawing.Size(121, 21); this.destCB.TabIndex = 3; this.destCB.SelectedIndexChanged += new System.EventHandler(this.destCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Shape/VertexBufferCreator.Designer.cs b/File_Format_Library/GUI/BFRES/Shape/VertexBufferCreator.Designer.cs index 06c36d5e..379a1026 100644 --- a/File_Format_Library/GUI/BFRES/Shape/VertexBufferCreator.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Shape/VertexBufferCreator.Designer.cs @@ -68,7 +68,6 @@ this.formatCB.FormattingEnabled = true; this.formatCB.Location = new System.Drawing.Point(68, 68); this.formatCB.Name = "formatCB"; - this.formatCB.ReadOnly = true; this.formatCB.Size = new System.Drawing.Size(198, 21); this.formatCB.TabIndex = 0; this.formatCB.SelectedIndexChanged += new System.EventHandler(this.formatCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Shape/VertexBufferEncodeEditor.Designer.cs b/File_Format_Library/GUI/BFRES/Shape/VertexBufferEncodeEditor.Designer.cs index 82439211..f2e526f4 100644 --- a/File_Format_Library/GUI/BFRES/Shape/VertexBufferEncodeEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Shape/VertexBufferEncodeEditor.Designer.cs @@ -61,7 +61,6 @@ this.formatCB.FormattingEnabled = true; this.formatCB.Location = new System.Drawing.Point(64, 68); this.formatCB.Name = "formatCB"; - this.formatCB.ReadOnly = true; this.formatCB.Size = new System.Drawing.Size(198, 21); this.formatCB.TabIndex = 0; this.formatCB.SelectedIndexChanged += new System.EventHandler(this.formatCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Skeleton/BfresBoneEditor.Designer.cs b/File_Format_Library/GUI/BFRES/Skeleton/BfresBoneEditor.Designer.cs index beffe692..2c8b0e55 100644 --- a/File_Format_Library/GUI/BFRES/Skeleton/BfresBoneEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Skeleton/BfresBoneEditor.Designer.cs @@ -258,7 +258,6 @@ this.rotModeCB.FormattingEnabled = true; this.rotModeCB.Location = new System.Drawing.Point(94, 5); this.rotModeCB.Name = "rotModeCB"; - this.rotModeCB.ReadOnly = true; this.rotModeCB.Size = new System.Drawing.Size(121, 21); this.rotModeCB.TabIndex = 35; this.rotModeCB.SelectedIndexChanged += new System.EventHandler(this.rotModeCB_SelectedIndexChanged); @@ -692,7 +691,6 @@ this.billboardModeCB.FormattingEnabled = true; this.billboardModeCB.Location = new System.Drawing.Point(93, 7); this.billboardModeCB.Name = "billboardModeCB"; - this.billboardModeCB.ReadOnly = true; this.billboardModeCB.Size = new System.Drawing.Size(144, 21); this.billboardModeCB.TabIndex = 0; this.billboardModeCB.SelectedIndexChanged += new System.EventHandler(this.billboardModeCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Skeleton/FSKLEditor.Designer.cs b/File_Format_Library/GUI/BFRES/Skeleton/FSKLEditor.Designer.cs index 36e60a92..e8d27d49 100644 --- a/File_Format_Library/GUI/BFRES/Skeleton/FSKLEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Skeleton/FSKLEditor.Designer.cs @@ -88,7 +88,6 @@ this.scalingModeCB.FormattingEnabled = true; this.scalingModeCB.Location = new System.Drawing.Point(114, 64); this.scalingModeCB.Name = "scalingModeCB"; - this.scalingModeCB.ReadOnly = true; this.scalingModeCB.Size = new System.Drawing.Size(172, 21); this.scalingModeCB.TabIndex = 4; this.scalingModeCB.SelectedIndexChanged += new System.EventHandler(this.ModeCB_SelectedIndexChanged); @@ -110,7 +109,6 @@ this.rotationModeCB.FormattingEnabled = true; this.rotationModeCB.Location = new System.Drawing.Point(114, 37); this.rotationModeCB.Name = "rotationModeCB"; - this.rotationModeCB.ReadOnly = true; this.rotationModeCB.Size = new System.Drawing.Size(172, 21); this.rotationModeCB.TabIndex = 2; this.rotationModeCB.SelectedIndexChanged += new System.EventHandler(this.ModeCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BFRES/Texture Sampler/SamplerEditorSimple.Designer.cs b/File_Format_Library/GUI/BFRES/Texture Sampler/SamplerEditorSimple.Designer.cs index bcbcf29a..537ed2f7 100644 --- a/File_Format_Library/GUI/BFRES/Texture Sampler/SamplerEditorSimple.Designer.cs +++ b/File_Format_Library/GUI/BFRES/Texture Sampler/SamplerEditorSimple.Designer.cs @@ -125,7 +125,6 @@ this.samplerCB.FormattingEnabled = true; this.samplerCB.Location = new System.Drawing.Point(66, 77); this.samplerCB.Name = "samplerCB"; - this.samplerCB.ReadOnly = true; this.samplerCB.Size = new System.Drawing.Size(206, 21); this.samplerCB.TabIndex = 4; // diff --git a/File_Format_Library/GUI/BFRES/TexturePattern/BfresTexturePatternEditor.Designer.cs b/File_Format_Library/GUI/BFRES/TexturePattern/BfresTexturePatternEditor.Designer.cs index 73609619..d4aa10ae 100644 --- a/File_Format_Library/GUI/BFRES/TexturePattern/BfresTexturePatternEditor.Designer.cs +++ b/File_Format_Library/GUI/BFRES/TexturePattern/BfresTexturePatternEditor.Designer.cs @@ -381,7 +381,6 @@ this.activeAnimCB.FormattingEnabled = true; this.activeAnimCB.Location = new System.Drawing.Point(233, 31); this.activeAnimCB.Name = "activeAnimCB"; - this.activeAnimCB.ReadOnly = true; this.activeAnimCB.Size = new System.Drawing.Size(220, 21); this.activeAnimCB.TabIndex = 7; this.activeAnimCB.SelectedIndexChanged += new System.EventHandler(this.activeAnimCB_SelectedIndexChanged); @@ -410,7 +409,6 @@ this.backgroundCB.FormattingEnabled = true; this.backgroundCB.Location = new System.Drawing.Point(233, 3); this.backgroundCB.Name = "backgroundCB"; - this.backgroundCB.ReadOnly = true; this.backgroundCB.Size = new System.Drawing.Size(144, 21); this.backgroundCB.TabIndex = 4; this.backgroundCB.SelectedIndexChanged += new System.EventHandler(this.backgroundCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/BMD/BMDModelImportSettings.Designer.cs b/File_Format_Library/GUI/BMD/BMDModelImportSettings.Designer.cs index e451b270..9439a2e6 100644 --- a/File_Format_Library/GUI/BMD/BMDModelImportSettings.Designer.cs +++ b/File_Format_Library/GUI/BMD/BMDModelImportSettings.Designer.cs @@ -113,7 +113,6 @@ "static"}); this.stComboBox1.Location = new System.Drawing.Point(22, 56); this.stComboBox1.Name = "stComboBox1"; - this.stComboBox1.ReadOnly = true; this.stComboBox1.Size = new System.Drawing.Size(121, 21); this.stComboBox1.TabIndex = 17; // diff --git a/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.Designer.cs b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.Designer.cs new file mode 100644 index 00000000..bfd3717f --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.Designer.cs @@ -0,0 +1,47 @@ +namespace FirstPlugin.Forms +{ + partial class Color8KeySlider + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Color8KeySlider + // + this.Size = new System.Drawing.Size(396, 42); + this.Click += new System.EventHandler(this.Color8KeySlider_Click); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Color8KeySlider_MouseDown); + this.MouseHover += new System.EventHandler(this.Color8KeySlider_MouseHover); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Color8KeySlider_MouseMove); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Color8KeySlider_MouseUp); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.cs b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.cs new file mode 100644 index 00000000..5633432b --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Toolbox.Library.Forms; +using Toolbox.Library; + +namespace FirstPlugin.Forms +{ + public partial class Color8KeySlider : STPanel, IColorPanelCommon + { + private int SelectedIndex = 0; + public Color GetColor() + { + return Keys[SelectedIndex].Color; + } + + public float GetTime() + { + return Keys[SelectedIndex].STColor.Time; + } + + public void SetColor(Color color) + { + Keys[SelectedIndex].STColor.Color = color; + this.Invalidate(); + } + + public event EventHandler ColorSelected; + + public void SelectPanel() {} + public void DeselectPanel() {} + + public Color8KeySlider() + { + InitializeComponent(); + + this.SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.DoubleBuffer, + true); + + Paint += new PaintEventHandler(panel_Paint); + BorderStyle = BorderStyle.FixedSingle; + MouseHover += Color8KeySlider_MouseHover; + MouseMove += Color8KeySlider_MouseMove; + MouseDown += Color8KeySlider_MouseDown; + MouseUp += Color8KeySlider_MouseUp; + } + + private List Keys = new List(); + + public void LoadColors(STColor[] keys, int keyCount) + { + Keys.Clear(); + for (int i = 0; i < keyCount; i++) + Keys.Add(new KeyFrame(keys[i])); + } + + private void HitDetect() + { + + } + + private Point MouseCursor; + private void panel_Paint(object sender, PaintEventArgs e) + { + var p = sender as Panel; + var g = e.Graphics; + + Color firstColor = Color.White; + Color lastColor = Color.White; + if (Keys.Count > 0) + { + firstColor = Keys[0].Color; + lastColor = Keys[Keys.Count - 1].Color; + } + + float keyMarigin = 10f; + + RectangleF r = new RectangleF(ClientRectangle.X, ClientRectangle.Y + keyMarigin, ClientRectangle.Width, ClientRectangle.Height - keyMarigin); + + //Start our gradient brush + LinearGradientBrush br = new LinearGradientBrush(r, firstColor, lastColor, 0, true); + + List colors = new List(); + List frames = new List(); + + frames.Add(0); + colors.Add(firstColor); + + for (int i = 0; i < Keys.Count; i++) + { + var currentKey = Keys[i]; + Color c2 = currentKey.Color; + c2 = Color.FromArgb(c2.R, c2.G, c2.B); + + float p2 = currentKey.STColor.Time; + + colors.Add(c2); + frames.Add(p2); + } + colors.Add(lastColor); + frames.Add(1); + + ColorBlend cb = new ColorBlend(); + cb.Positions = frames.ToArray(); ; + cb.Colors = colors.ToArray(); + br.InterpolationColors = cb; + + // paint gradient + g.FillRectangle(br, r); + + for (int i = 0; i < Keys.Count; i++) + { + //Create a box to reperesent a key frame + int keyPos = (int)(ClientRectangle.Width * Keys[i].STColor.Time); + if (i == Keys.Count - 1 && Keys[i].STColor.Time >= 0.09f) + keyPos -= 8; + + Rectangle keyBox = new Rectangle(keyPos, (int)r.Y, 7, (int)r.Height); + Keys[i].DrawnRectangle = keyBox; + + // paint keys + Color cursorColor = Color.White; + if (Keys[i].IsHit(MouseCursor.X, MouseCursor.Y) || Keys[i].IsSelected) { + cursorColor = Color.Yellow; + } + + using (Pen pen = new Pen(Color.Black,1)) + g.DrawRectangle(pen, keyBox); + + keyBox.Y += 1; + keyBox.X += 1; + + keyBox.Height -= 2; + keyBox.Width -= 2; + + using (Pen pen = new Pen(cursorColor, 1)) + g.DrawRectangle(pen, keyBox); + + keyBox.Y += 1; + keyBox.X += 1; + + keyBox.Height -= 2; + keyBox.Width -= 2; + + using (Pen pen = new Pen(Color.Black, 1)) + g.DrawRectangle(pen, keyBox); + + + //Draw key pointer at top + + int keyTopPos = (int)(r.Y - 10); + keyPos += keyBox.Width; + Point[] triPoints = { new Point(keyPos - 5, keyTopPos), new Point(keyPos, keyTopPos + 10), new Point(keyPos + 5, keyTopPos) }; + e.Graphics.FillPolygon(new SolidBrush(cursorColor), triPoints); + e.Graphics.DrawPolygon(new Pen(Color.Black,0.5f), triPoints); + } + + frames.Clear(); + colors.Clear(); + } + + private bool IsSelected = false; + private void Color8KeySlider_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + IsSelected = true; + Color8KeySlider_MouseMove(sender, e); + } + } + + private void Color8KeySlider_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + IsSelected = false; + } + } + + private void Color8KeySlider_MouseMove(object sender, MouseEventArgs e) + { + MouseCursor = e.Location; + this.Invalidate(); + } + + private void OnKeySelected() + { + this.Invalidate(); + + if (ColorSelected != null) + ColorSelected(this, null); + } + + private void Color8KeySlider_MouseHover(object sender, EventArgs e) + { + + } + + private class KeyFrame + { + public bool IsSelected = false; + + public Color Color => STColor.Color; + + public STColor STColor; + + public Rectangle DrawnRectangle; + + public KeyFrame(STColor color) + { + STColor = color; + } + + public bool IsHit(int X, int Y) + { + if (DrawnRectangle == null) return false; + + if ((X > DrawnRectangle.X) && (X < DrawnRectangle.X + DrawnRectangle.Width) && + (Y > DrawnRectangle.Y) && (Y < DrawnRectangle.Y + DrawnRectangle.Height)) + return true; + else + return false; + } + } + + private void Color8KeySlider_Click(object sender, EventArgs e) { + for (int i = 0; i < Keys.Count; i++) + Keys[i].IsSelected = false; + + if (IsSelected) + { + for (int i = 0; i < Keys.Count; i++) + { + if (Keys[i].IsHit(MouseCursor.X, MouseCursor.Y)) + { + Keys[i].IsSelected = true; + SelectedIndex = i; + OnKeySelected(); + } + } + } + } + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.resx b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.resx new file mode 100644 index 00000000..e5858cc2 --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/Color8KeySlider.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + \ No newline at end of file diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.Designer.cs b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.Designer.cs new file mode 100644 index 00000000..40466d5b --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.Designer.cs @@ -0,0 +1,58 @@ +namespace FirstPlugin.Forms +{ + partial class ColorConstantPanel + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.color0PB = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // color0PB + // + this.color0PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color0PB.Location = new System.Drawing.Point(3, 4); + this.color0PB.Name = "color0PB"; + this.color0PB.Size = new System.Drawing.Size(30, 30); + this.color0PB.TabIndex = 1; + this.color0PB.Click += new System.EventHandler(this.color0PB_Click); + // + // ColorConstantPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.color0PB); + this.Name = "ColorConstantPanel"; + this.Size = new System.Drawing.Size(291, 37); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel color0PB; + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.cs b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.cs new file mode 100644 index 00000000..8e2200c3 --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Windows.Forms; +using Toolbox.Library; + +namespace FirstPlugin.Forms +{ + public partial class ColorConstantPanel : UserControl, IColorPanelCommon + { + public ColorConstantPanel() + { + InitializeComponent(); + } + + public Color GetColor() + { + return color0PB.BackColor; + } + + public void SetColor(Color color) + { + color0PB.BackColor = color; + ActiveColor.Color = color; + } + + public void SelectPanel() + { + this.BorderStyle = BorderStyle.Fixed3D; + } + + public void DeselectPanel() + { + this.BorderStyle = BorderStyle.None; + } + + public event EventHandler ColorSelected; + + private STColor ActiveColor; + + public void LoadColor(STColor color) + { + ActiveColor = color; + color0PB.BackColor = Color.FromArgb(ActiveColor.Color.R, ActiveColor.Color.G, ActiveColor.Color.B); + } + + private void color0PB_Click(object sender, EventArgs e) + { + if (ColorSelected != null) + ColorSelected(this, null); + } + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.resx b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorConstantPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.Designer.cs b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.Designer.cs new file mode 100644 index 00000000..8ad2540b --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.Designer.cs @@ -0,0 +1,142 @@ +namespace FirstPlugin.Forms +{ + partial class ColorRandomPanel + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.color0PB = new System.Windows.Forms.Panel(); + this.color1PB = new System.Windows.Forms.Panel(); + this.color3PB = new System.Windows.Forms.Panel(); + this.color2PB = new System.Windows.Forms.Panel(); + this.color7PB = new System.Windows.Forms.Panel(); + this.color6PB = new System.Windows.Forms.Panel(); + this.color5PB = new System.Windows.Forms.Panel(); + this.color4PB = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // color0PB + // + this.color0PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color0PB.Location = new System.Drawing.Point(3, 3); + this.color0PB.Name = "color0PB"; + this.color0PB.Size = new System.Drawing.Size(30, 30); + this.color0PB.TabIndex = 0; + this.color0PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color1PB + // + this.color1PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color1PB.Location = new System.Drawing.Point(39, 3); + this.color1PB.Name = "color1PB"; + this.color1PB.Size = new System.Drawing.Size(30, 30); + this.color1PB.TabIndex = 1; + this.color1PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color3PB + // + this.color3PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color3PB.Location = new System.Drawing.Point(111, 3); + this.color3PB.Name = "color3PB"; + this.color3PB.Size = new System.Drawing.Size(30, 30); + this.color3PB.TabIndex = 3; + this.color3PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color2PB + // + this.color2PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color2PB.Location = new System.Drawing.Point(75, 3); + this.color2PB.Name = "color2PB"; + this.color2PB.Size = new System.Drawing.Size(30, 30); + this.color2PB.TabIndex = 2; + this.color2PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color7PB + // + this.color7PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color7PB.Location = new System.Drawing.Point(256, 3); + this.color7PB.Name = "color7PB"; + this.color7PB.Size = new System.Drawing.Size(30, 30); + this.color7PB.TabIndex = 7; + this.color7PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color6PB + // + this.color6PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color6PB.Location = new System.Drawing.Point(220, 3); + this.color6PB.Name = "color6PB"; + this.color6PB.Size = new System.Drawing.Size(30, 30); + this.color6PB.TabIndex = 6; + this.color6PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color5PB + // + this.color5PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color5PB.Location = new System.Drawing.Point(184, 3); + this.color5PB.Name = "color5PB"; + this.color5PB.Size = new System.Drawing.Size(30, 30); + this.color5PB.TabIndex = 5; + this.color5PB.Click += new System.EventHandler(this.colorPB_Click); + // + // color4PB + // + this.color4PB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.color4PB.Location = new System.Drawing.Point(148, 3); + this.color4PB.Name = "color4PB"; + this.color4PB.Size = new System.Drawing.Size(30, 30); + this.color4PB.TabIndex = 4; + this.color4PB.Click += new System.EventHandler(this.colorPB_Click); + // + // ColorRandomPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.color7PB); + this.Controls.Add(this.color6PB); + this.Controls.Add(this.color3PB); + this.Controls.Add(this.color5PB); + this.Controls.Add(this.color2PB); + this.Controls.Add(this.color4PB); + this.Controls.Add(this.color1PB); + this.Controls.Add(this.color0PB); + this.Name = "ColorRandomPanel"; + this.Size = new System.Drawing.Size(291, 37); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel color0PB; + private System.Windows.Forms.Panel color1PB; + private System.Windows.Forms.Panel color3PB; + private System.Windows.Forms.Panel color2PB; + private System.Windows.Forms.Panel color7PB; + private System.Windows.Forms.Panel color6PB; + private System.Windows.Forms.Panel color5PB; + private System.Windows.Forms.Panel color4PB; + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.cs b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.cs new file mode 100644 index 00000000..c66daf63 --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Toolbox.Library; + +namespace FirstPlugin.Forms +{ + public partial class ColorRandomPanel : UserControl, IColorPanelCommon + { + public ColorRandomPanel() + { + InitializeComponent(); + } + + private int SelectedIndex = 0; + + public event EventHandler ColorSelected; + + public Color GetColor() + { + var panel = GetColor(SelectedIndex); + return panel.BackColor; + } + + public void SetColor(Color color) + { + var panel = GetColor(SelectedIndex); + panel.BackColor = color; + activeColors[SelectedIndex].Color = color; + } + + public void SelectPanel() + { + var panel = GetColor(SelectedIndex); + panel.BorderStyle = BorderStyle.Fixed3D; + } + + public void DeselectPanel() + { + foreach (var panel in Controls) + ((Panel)panel).BorderStyle = BorderStyle.None; + } + + STColor[] activeColors; + + public void LoadColors(STColor[] colors) + { + activeColors = colors; + for (int i = 0; i < colors.Length; i++) + { + var panel = GetColor(i); + Color c = colors[i].Color; + panel.BackColor = Color.FromArgb(c.R, c.G, c.B); + } + } + + public Panel GetColor(int index) + { + foreach (Control control in Controls) + { + if (control.Name == $"color{index}PB") + return (Panel)control; + } + return null; + } + + private void colorPB_Click(object sender, EventArgs e) + { + var panel = sender as Panel; + if (panel == null) return; + + for (int i =0; i < 8; i++) + { + if (panel.Name == $"color{i}PB") + SelectedIndex = i; + } + + if (ColorSelected != null) + ColorSelected(this, null); + } + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.resx b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/ColorRandomPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.Designer.cs b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.Designer.cs new file mode 100644 index 00000000..2185829f --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.Designer.cs @@ -0,0 +1,407 @@ +namespace FirstPlugin +{ + partial class EmitterEditorNX + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EmitterEditorNX)); + this.stLabel1 = new Toolbox.Library.Forms.STLabel(); + this.stLabel2 = new Toolbox.Library.Forms.STLabel(); + this.hexTB = new Toolbox.Library.Forms.STTextBox(); + this.stTabControl1 = new Toolbox.Library.Forms.STTabControl(); + this.tabPageColors = new System.Windows.Forms.TabPage(); + this.stPanel2 = new Toolbox.Library.Forms.STPanel(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + this.timeTB = new Toolbox.Library.Forms.STTextBox(); + this.colorSelector1 = new Toolbox.Library.Forms.ColorSelector(); + this.stLabel5 = new Toolbox.Library.Forms.STLabel(); + this.stPanel6 = new Toolbox.Library.Forms.STPanel(); + this.stPanel5 = new Toolbox.Library.Forms.STPanel(); + this.stPanel4 = new Toolbox.Library.Forms.STPanel(); + this.stPanel3 = new Toolbox.Library.Forms.STPanel(); + this.alpha1TypeCB = new Toolbox.Library.Forms.STComboBox(); + this.alpha0TypeCB = new Toolbox.Library.Forms.STComboBox(); + this.stLabel3 = new Toolbox.Library.Forms.STLabel(); + this.stLabel4 = new Toolbox.Library.Forms.STLabel(); + this.color1TypeCB = new Toolbox.Library.Forms.STComboBox(); + this.color0TypeCB = new Toolbox.Library.Forms.STComboBox(); + this.tabPageTextures = new System.Windows.Forms.TabPage(); + this.stPanel1 = new Toolbox.Library.Forms.STPanel(); + this.TBTexture0 = new Toolbox.Library.Forms.STTextBox(); + this.TBTexture2 = new Toolbox.Library.Forms.STTextBox(); + this.pictureBox3 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.TBTexture1 = new Toolbox.Library.Forms.STTextBox(); + this.pictureBox2 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.pictureBox1 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.stTabControl1.SuspendLayout(); + this.tabPageColors.SuspendLayout(); + this.stPanel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + this.tabPageTextures.SuspendLayout(); + this.stPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // stLabel1 + // + this.stLabel1.AutoSize = true; + this.stLabel1.Location = new System.Drawing.Point(3, 18); + this.stLabel1.Name = "stLabel1"; + this.stLabel1.Size = new System.Drawing.Size(40, 13); + this.stLabel1.TabIndex = 0; + this.stLabel1.Text = "Color 0"; + // + // stLabel2 + // + this.stLabel2.AutoSize = true; + this.stLabel2.Location = new System.Drawing.Point(3, 86); + this.stLabel2.Name = "stLabel2"; + this.stLabel2.Size = new System.Drawing.Size(40, 13); + this.stLabel2.TabIndex = 2; + this.stLabel2.Text = "Color 1"; + // + // hexTB + // + this.hexTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.hexTB.Location = new System.Drawing.Point(316, 255); + this.hexTB.Name = "hexTB"; + this.hexTB.Size = new System.Drawing.Size(153, 20); + this.hexTB.TabIndex = 27; + this.hexTB.TextChanged += new System.EventHandler(this.hexTB_TextChanged); + // + // stTabControl1 + // + this.stTabControl1.Controls.Add(this.tabPageColors); + this.stTabControl1.Controls.Add(this.tabPageTextures); + this.stTabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.stTabControl1.Location = new System.Drawing.Point(0, 0); + this.stTabControl1.myBackColor = System.Drawing.Color.Empty; + this.stTabControl1.Name = "stTabControl1"; + this.stTabControl1.SelectedIndex = 0; + this.stTabControl1.Size = new System.Drawing.Size(555, 561); + this.stTabControl1.TabIndex = 38; + // + // tabPageColors + // + this.tabPageColors.Controls.Add(this.stPanel2); + this.tabPageColors.Location = new System.Drawing.Point(4, 25); + this.tabPageColors.Name = "tabPageColors"; + this.tabPageColors.Padding = new System.Windows.Forms.Padding(3); + this.tabPageColors.Size = new System.Drawing.Size(547, 532); + this.tabPageColors.TabIndex = 0; + this.tabPageColors.Text = "Colors"; + this.tabPageColors.UseVisualStyleBackColor = true; + // + // stPanel2 + // + this.stPanel2.Controls.Add(this.pictureBox4); + this.stPanel2.Controls.Add(this.timeTB); + this.stPanel2.Controls.Add(this.colorSelector1); + this.stPanel2.Controls.Add(this.stLabel5); + this.stPanel2.Controls.Add(this.stPanel6); + this.stPanel2.Controls.Add(this.stPanel5); + this.stPanel2.Controls.Add(this.stPanel4); + this.stPanel2.Controls.Add(this.stPanel3); + this.stPanel2.Controls.Add(this.alpha1TypeCB); + this.stPanel2.Controls.Add(this.alpha0TypeCB); + this.stPanel2.Controls.Add(this.stLabel3); + this.stPanel2.Controls.Add(this.stLabel4); + this.stPanel2.Controls.Add(this.color1TypeCB); + this.stPanel2.Controls.Add(this.color0TypeCB); + this.stPanel2.Controls.Add(this.stLabel1); + this.stPanel2.Controls.Add(this.stLabel2); + this.stPanel2.Controls.Add(this.hexTB); + this.stPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.stPanel2.Location = new System.Drawing.Point(3, 3); + this.stPanel2.Name = "stPanel2"; + this.stPanel2.Size = new System.Drawing.Size(541, 526); + this.stPanel2.TabIndex = 0; + // + // pictureBox4 + // + this.pictureBox4.Location = new System.Drawing.Point(488, 235); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.Size = new System.Drawing.Size(40, 40); + this.pictureBox4.TabIndex = 45; + this.pictureBox4.TabStop = false; + // + // timeTB + // + this.timeTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.timeTB.Location = new System.Drawing.Point(352, 18); + this.timeTB.Name = "timeTB"; + this.timeTB.Size = new System.Drawing.Size(100, 20); + this.timeTB.TabIndex = 0; + // + // colorSelector1 + // + this.colorSelector1.Color = System.Drawing.Color.Empty; + this.colorSelector1.Location = new System.Drawing.Point(316, 44); + this.colorSelector1.MaximumSize = new System.Drawing.Size(212, 188); + this.colorSelector1.MinimumSize = new System.Drawing.Size(212, 188); + this.colorSelector1.Name = "colorSelector1"; + this.colorSelector1.Size = new System.Drawing.Size(212, 188); + this.colorSelector1.TabIndex = 44; + this.colorSelector1.ColorChanged += new System.EventHandler(this.colorSelector1_ColorChanged); + // + // stLabel5 + // + this.stLabel5.AutoSize = true; + this.stLabel5.Location = new System.Drawing.Point(313, 18); + this.stLabel5.Name = "stLabel5"; + this.stLabel5.Size = new System.Drawing.Size(33, 13); + this.stLabel5.TabIndex = 43; + this.stLabel5.Text = "Time:"; + // + // stPanel6 + // + this.stPanel6.Location = new System.Drawing.Point(6, 242); + this.stPanel6.Name = "stPanel6"; + this.stPanel6.Size = new System.Drawing.Size(304, 33); + this.stPanel6.TabIndex = 41; + // + // stPanel5 + // + this.stPanel5.Location = new System.Drawing.Point(6, 176); + this.stPanel5.Name = "stPanel5"; + this.stPanel5.Size = new System.Drawing.Size(304, 33); + this.stPanel5.TabIndex = 40; + // + // stPanel4 + // + this.stPanel4.Location = new System.Drawing.Point(6, 110); + this.stPanel4.Name = "stPanel4"; + this.stPanel4.Size = new System.Drawing.Size(304, 33); + this.stPanel4.TabIndex = 39; + // + // stPanel3 + // + this.stPanel3.Location = new System.Drawing.Point(6, 44); + this.stPanel3.Name = "stPanel3"; + this.stPanel3.Size = new System.Drawing.Size(304, 33); + this.stPanel3.TabIndex = 38; + // + // alpha1TypeCB + // + this.alpha1TypeCB.BorderColor = System.Drawing.Color.Empty; + this.alpha1TypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.alpha1TypeCB.ButtonColor = System.Drawing.Color.Empty; + this.alpha1TypeCB.FormattingEnabled = true; + this.alpha1TypeCB.Location = new System.Drawing.Point(175, 215); + this.alpha1TypeCB.Name = "alpha1TypeCB"; + this.alpha1TypeCB.Size = new System.Drawing.Size(135, 21); + this.alpha1TypeCB.TabIndex = 37; + // + // alpha0TypeCB + // + this.alpha0TypeCB.BorderColor = System.Drawing.Color.Empty; + this.alpha0TypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.alpha0TypeCB.ButtonColor = System.Drawing.Color.Empty; + this.alpha0TypeCB.FormattingEnabled = true; + this.alpha0TypeCB.Location = new System.Drawing.Point(175, 149); + this.alpha0TypeCB.Name = "alpha0TypeCB"; + this.alpha0TypeCB.Size = new System.Drawing.Size(135, 21); + this.alpha0TypeCB.TabIndex = 35; + // + // stLabel3 + // + this.stLabel3.AutoSize = true; + this.stLabel3.Location = new System.Drawing.Point(3, 150); + this.stLabel3.Name = "stLabel3"; + this.stLabel3.Size = new System.Drawing.Size(43, 13); + this.stLabel3.TabIndex = 32; + this.stLabel3.Text = "Alpha 0"; + // + // stLabel4 + // + this.stLabel4.AutoSize = true; + this.stLabel4.Location = new System.Drawing.Point(3, 218); + this.stLabel4.Name = "stLabel4"; + this.stLabel4.Size = new System.Drawing.Size(43, 13); + this.stLabel4.TabIndex = 33; + this.stLabel4.Text = "Alpha 1"; + // + // color1TypeCB + // + this.color1TypeCB.BorderColor = System.Drawing.Color.Empty; + this.color1TypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.color1TypeCB.ButtonColor = System.Drawing.Color.Empty; + this.color1TypeCB.FormattingEnabled = true; + this.color1TypeCB.Location = new System.Drawing.Point(175, 83); + this.color1TypeCB.Name = "color1TypeCB"; + this.color1TypeCB.Size = new System.Drawing.Size(135, 21); + this.color1TypeCB.TabIndex = 31; + // + // color0TypeCB + // + this.color0TypeCB.BorderColor = System.Drawing.Color.Empty; + this.color0TypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.color0TypeCB.ButtonColor = System.Drawing.Color.Empty; + this.color0TypeCB.FormattingEnabled = true; + this.color0TypeCB.Location = new System.Drawing.Point(175, 17); + this.color0TypeCB.Name = "color0TypeCB"; + this.color0TypeCB.Size = new System.Drawing.Size(135, 21); + this.color0TypeCB.TabIndex = 29; + // + // tabPageTextures + // + this.tabPageTextures.Controls.Add(this.stPanel1); + this.tabPageTextures.Location = new System.Drawing.Point(4, 25); + this.tabPageTextures.Name = "tabPageTextures"; + this.tabPageTextures.Padding = new System.Windows.Forms.Padding(3); + this.tabPageTextures.Size = new System.Drawing.Size(547, 532); + this.tabPageTextures.TabIndex = 1; + this.tabPageTextures.Text = "Textures"; + this.tabPageTextures.UseVisualStyleBackColor = true; + // + // stPanel1 + // + this.stPanel1.Controls.Add(this.TBTexture0); + this.stPanel1.Controls.Add(this.TBTexture2); + this.stPanel1.Controls.Add(this.pictureBox3); + this.stPanel1.Controls.Add(this.TBTexture1); + this.stPanel1.Controls.Add(this.pictureBox2); + this.stPanel1.Controls.Add(this.pictureBox1); + this.stPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.stPanel1.Location = new System.Drawing.Point(3, 3); + this.stPanel1.Name = "stPanel1"; + this.stPanel1.Size = new System.Drawing.Size(541, 526); + this.stPanel1.TabIndex = 41; + // + // TBTexture0 + // + this.TBTexture0.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TBTexture0.Location = new System.Drawing.Point(14, 15); + this.TBTexture0.Name = "TBTexture0"; + this.TBTexture0.Size = new System.Drawing.Size(150, 20); + this.TBTexture0.TabIndex = 38; + // + // TBTexture2 + // + this.TBTexture2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TBTexture2.Location = new System.Drawing.Point(14, 335); + this.TBTexture2.Name = "TBTexture2"; + this.TBTexture2.Size = new System.Drawing.Size(150, 20); + this.TBTexture2.TabIndex = 40; + // + // pictureBox3 + // + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.BackgroundImage"))); + this.pictureBox3.Location = new System.Drawing.Point(14, 361); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(150, 134); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox3.TabIndex = 37; + this.pictureBox3.TabStop = false; + // + // TBTexture1 + // + this.TBTexture1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.TBTexture1.Location = new System.Drawing.Point(14, 166); + this.TBTexture1.Name = "TBTexture1"; + this.TBTexture1.Size = new System.Drawing.Size(150, 20); + this.TBTexture1.TabIndex = 39; + // + // pictureBox2 + // + this.pictureBox2.BackColor = System.Drawing.Color.Transparent; + this.pictureBox2.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox2.BackgroundImage"))); + this.pictureBox2.Location = new System.Drawing.Point(14, 192); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(150, 134); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 36; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.BackgroundImage"))); + this.pictureBox1.Location = new System.Drawing.Point(14, 41); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(150, 120); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // EmitterEditorNX + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.stTabControl1); + this.Name = "EmitterEditorNX"; + this.Size = new System.Drawing.Size(555, 561); + this.stTabControl1.ResumeLayout(false); + this.tabPageColors.ResumeLayout(false); + this.stPanel2.ResumeLayout(false); + this.stPanel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + this.tabPageTextures.ResumeLayout(false); + this.stPanel1.ResumeLayout(false); + this.stPanel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Toolbox.Library.Forms.STLabel stLabel1; + private Toolbox.Library.Forms.STLabel stLabel2; + private Toolbox.Library.Forms.STTextBox hexTB; + private Toolbox.Library.Forms.PictureBoxCustom pictureBox2; + private Toolbox.Library.Forms.PictureBoxCustom pictureBox3; + private Toolbox.Library.Forms.PictureBoxCustom pictureBox1; + private Toolbox.Library.Forms.STTabControl stTabControl1; + private System.Windows.Forms.TabPage tabPageColors; + private System.Windows.Forms.TabPage tabPageTextures; + private Toolbox.Library.Forms.STTextBox TBTexture2; + private Toolbox.Library.Forms.STTextBox TBTexture1; + private Toolbox.Library.Forms.STTextBox TBTexture0; + private Toolbox.Library.Forms.STPanel stPanel2; + private Toolbox.Library.Forms.STPanel stPanel1; + private Toolbox.Library.Forms.STComboBox color1TypeCB; + private Toolbox.Library.Forms.STComboBox color0TypeCB; + private Toolbox.Library.Forms.STComboBox alpha1TypeCB; + private Toolbox.Library.Forms.STComboBox alpha0TypeCB; + private Toolbox.Library.Forms.STLabel stLabel3; + private Toolbox.Library.Forms.STLabel stLabel4; + private Toolbox.Library.Forms.STPanel stPanel6; + private Toolbox.Library.Forms.STPanel stPanel5; + private Toolbox.Library.Forms.STPanel stPanel4; + private Toolbox.Library.Forms.STPanel stPanel3; + private Toolbox.Library.Forms.STLabel stLabel5; + private Toolbox.Library.Forms.ColorSelector colorSelector1; + private Toolbox.Library.Forms.STTextBox timeTB; + private System.Windows.Forms.PictureBox pictureBox4; + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.cs b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.cs new file mode 100644 index 00000000..1e88e5ad --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.cs @@ -0,0 +1,276 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using Toolbox.Library.Forms; +using Toolbox.Library; +using FirstPlugin.Forms; + +namespace FirstPlugin +{ + public partial class EmitterEditorNX : STUserControl + { + public EmitterEditorNX() + { + InitializeComponent(); + stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor; + tabPageColors.BackColor = FormThemes.BaseTheme.TabPageActive; + + foreach (PTCL.Emitter.ColorType format in (PTCL.Emitter.ColorType[])Enum.GetValues(typeof(PTCL.Emitter.ColorType))) + { + color0TypeCB.Items.Add(format); + color1TypeCB.Items.Add(format); + alpha0TypeCB.Items.Add(format); + alpha1TypeCB.Items.Add(format); + } + + color0TypeCB.SetAsReadOnly(); + color1TypeCB.SetAsReadOnly(); + alpha0TypeCB.SetAsReadOnly(); + alpha1TypeCB.SetAsReadOnly(); + } + + private void Reset() + { + pictureBox1.Image = null; + pictureBox2.Image = null; + pictureBox3.Image = null; + TBTexture0.Text = ""; + TBTexture1.Text = ""; + TBTexture2.Text = ""; + } + + private Thread Thread; + PTCL.Emitter ActiveEmitter; + + private IColorPanelCommon ActivePanel; + + private void LoadColors(STColor[] colors, PTCL.Emitter.ColorType colorType, int type) + { + STPanel panel = new STPanel(); + if (type == 0) + panel = stPanel3; + if (type == 1) + panel = stPanel4; + if (type == 2) + panel = stPanel5; + if (type == 3) + panel = stPanel6; + + panel.Controls.Clear(); + + if (colorType == PTCL.Emitter.ColorType.Animated8Key) + { + Color8KeySlider colorSlider = new Color8KeySlider(); + colorSlider.Dock = DockStyle.Fill; + colorSlider.ColorSelected += ColorPanelSelected; + panel.Controls.Add(colorSlider); + + if (type == 0) + colorSlider.LoadColors(colors, (int)ActiveEmitter.Color0KeyCount); + if (type == 1) + colorSlider.LoadColors(colors, (int)ActiveEmitter.Color1KeyCount); + if (type == 2) + colorSlider.LoadColors(colors, (int)ActiveEmitter.Alpha0KeyCount); + if (type == 3) + colorSlider.LoadColors(colors, (int)ActiveEmitter.Alpha1KeyCount); + } + else if (colorType == PTCL.Emitter.ColorType.Random) + { + ColorRandomPanel colorRandomPnl = new ColorRandomPanel(); + colorRandomPnl.ColorSelected += ColorPanelSelected; + panel.Controls.Add(colorRandomPnl); + + colorRandomPnl.LoadColors(colors); + } + else + { + ColorConstantPanel colorConstantPnl = new ColorConstantPanel(); + colorConstantPnl.ColorSelected += ColorPanelSelected; + panel.Controls.Add(colorConstantPnl); + + if (type == 0) + colorConstantPnl.LoadColor(ActiveEmitter.ConstantColor0); + if (type == 1) + colorConstantPnl.LoadColor(ActiveEmitter.ConstantColor1); + if (type == 2) + colorConstantPnl.LoadColor(ActiveEmitter.ConstantAlpha0); + if (type == 3) + colorConstantPnl.LoadColor(ActiveEmitter.ConstantAlpha1); + } + } + + private void ColorPanelSelected(object sender, EventArgs e) + { + var panel = sender as IColorPanelCommon; + if (panel != null) + { + hexTB.Text = ""; + + ActivePanel = panel; + UpdateColorSelector(panel.GetColor()); + if (panel is Color8KeySlider) + UpdateTimeDisplay(((Color8KeySlider)panel).GetTime()); + } + } + + private void UpdateTimeDisplay(float time) + { + timeTB.Text = time.ToString(); + } + + public void LoadEmitter(PTCL.Emitter Emitter) + { + IsColorsLoaded = false; + + ActiveEmitter = Emitter; + + + Reset(); + + color0TypeCB.SelectedItem = Emitter.Color0Type; + color1TypeCB.SelectedItem = Emitter.Color1Type; + alpha0TypeCB.SelectedItem = Emitter.Alpha0Type; + alpha1TypeCB.SelectedItem = Emitter.Alpha1Type; + + LoadColors(Emitter.Color0Array, Emitter.Color0Type, 0); + LoadColors(Emitter.Color1Array, Emitter.Color1Type, 1); + LoadColors(Emitter.Color0AlphaArray, Emitter.Alpha0Type, 2); + LoadColors(Emitter.Color1AlphaArray, Emitter.Alpha1Type, 3); + + stLabel1.Text = $"Color 0 ({Emitter.Color0KeyCount} Keys)"; + stLabel2.Text = $"Color 1 ({Emitter.Color1KeyCount} Keys)"; + stLabel3.Text = $"Alpha 0 ({Emitter.Alpha0KeyCount} Keys)"; + stLabel4.Text = $"Alpha 1 ({Emitter.Alpha1KeyCount} Keys)"; + + UpdateColorSelector(Color.Black); + + IsColorsLoaded = true; + + if (Emitter.DrawableTex.Count <= 0) + return; + + if (Emitter.DrawableTex[0].MipCount > 0) + { + pictureBox1.Image = Imaging.GetLoadingImage(); + pictureBox1.Image = Emitter.DrawableTex[0].GetBitmap(); + + TBTexture0.Text = Emitter.DrawableTex[0].Text; + } + if (Emitter.DrawableTex.Count < 2) + return; + + if (Emitter.DrawableTex[1].MipCount > 0) + { + pictureBox2.Image = Imaging.GetLoadingImage(); + pictureBox2.Image = Emitter.DrawableTex[1].GetBitmap(); + TBTexture1.Text = Emitter.DrawableTex[1].Text; + } + if (Emitter.DrawableTex.Count < 3) + return; + + if (Emitter.DrawableTex[2].MipCount > 0) + { + pictureBox3.Image = Imaging.GetLoadingImage(); + pictureBox3.Image = Emitter.DrawableTex[2].GetBitmap(); + TBTexture2.Text = Emitter.DrawableTex[2].Text; + } + } + + bool IsColorsLoaded = false; + + public ColorAlphaBox GetColor(int colorType, int index) + { + foreach (Control control in stPanel2.Controls) + { + if (control.Name == $"color{colorType}Index{index}") + return (ColorAlphaBox)control; + } + return null; + } + + public void RefreshColorBoxes() + { + foreach (Control control in stPanel2.Controls) + { + if (control is ColorAlphaBox) + control.Refresh(); + } + } + + private void ExportImage0(object sender, EventArgs e) + { + ActiveEmitter.DrawableTex[0].ExportImage(); + } + private void ReplaceImage0(object sender, EventArgs e) + { + if (ActiveEmitter is PTCL_WiiU.EmitterU) + { + var emitter = (PTCL_WiiU.EmitterU)ActiveEmitter; + + OpenFileDialog ofd = new OpenFileDialog(); + ofd.Filter = "Supported Formats|*.dds; *.png;*.tga;*.jpg;*.tiff|" + + "Microsoft DDS |*.dds|" + + "Portable Network Graphics |*.png|" + + "Joint Photographic Experts Group |*.jpg|" + + "Bitmap Image |*.bmp|" + + "Tagged Image File Format |*.tiff|" + + "All files(*.*)|*.*"; + + ofd.Multiselect = false; + if (ofd.ShowDialog() == DialogResult.OK) + { + ((PTCL_WiiU.TextureInfo)emitter.DrawableTex[0]).Replace(ofd.FileName); + } + } + } + + private void SetEmitterColor(Color color, int index, bool IsColor0) + { + if (IsColor0) + ActiveEmitter.Color0Array[index].Color = color; + else + ActiveEmitter.Color1Array[index].Color = color; + } + + public Color SetColor(Color input, Color output) + { + return Color.FromArgb(input.A, output.R, output.G, output.B); + } + + private void hexTB_TextChanged(object sender, EventArgs e) + { + if (sender is TextBox) + { + ((TextBox)sender).MaxLength = 8; + + if (((TextBox)sender).Text.Length != 8) + return; + + var color = Utils.HexToColor(((TextBox)sender).Text); + UpdateColorSelector(color); + } + } + + private void colorSelector1_ColorChanged(object sender, EventArgs e) + { + if (!IsColorsLoaded) + return; + + hexTB.Text = Utils.ColorToHex(colorSelector1.Color); + pictureBox4.BackColor = colorSelector1.Color; + + if (ActivePanel != null) + ActivePanel.SetColor(colorSelector1.Color); + } + + private void UpdateColorSelector(Color color) { + colorSelector1.Color = color; + } + } +} diff --git a/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.resx b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.resx new file mode 100644 index 00000000..3fd8fc3f --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/EmitterEditorNX.resx @@ -0,0 +1,742 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS + 0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm + 5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6 + +vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDTbOhAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRF + 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 + mGk4zW7tt3aFGa0JAhPXKv5Grfv8ckaj93+veSuXxEAIUwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS + 0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm + 5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6 + +vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + + + \ No newline at end of file diff --git a/File_Format_Library/GUI/Editors/PTCL/IColorPanelCommon.cs b/File_Format_Library/GUI/Editors/PTCL/IColorPanelCommon.cs new file mode 100644 index 00000000..2a4e739d --- /dev/null +++ b/File_Format_Library/GUI/Editors/PTCL/IColorPanelCommon.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace FirstPlugin.Forms +{ + public interface IColorPanelCommon + { + void SetColor(Color color); + Color GetColor(); + event EventHandler ColorSelected; + void SelectPanel(); + void DeselectPanel(); + } +} diff --git a/File_Format_Library/GUI/TextureLoader.Designer.cs b/File_Format_Library/GUI/TextureLoader.Designer.cs index 4a988509..f8b4dfdf 100644 --- a/File_Format_Library/GUI/TextureLoader.Designer.cs +++ b/File_Format_Library/GUI/TextureLoader.Designer.cs @@ -49,7 +49,6 @@ this.stComboBox1.FormattingEnabled = true; this.stComboBox1.Location = new System.Drawing.Point(3, 3); this.stComboBox1.Name = "stComboBox1"; - this.stComboBox1.ReadOnly = true; this.stComboBox1.Size = new System.Drawing.Size(158, 21); this.stComboBox1.TabIndex = 12; this.stComboBox1.SelectedIndexChanged += new System.EventHandler(this.stComboBox1_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs b/File_Format_Library/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs index 6885994a..5dfb9a91 100644 --- a/File_Format_Library/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs +++ b/File_Format_Library/GUI/TextureUI/Importers/BNTX/BinaryTextureImporterList.Designer.cs @@ -171,7 +171,6 @@ this.tileModeCB.FormattingEnabled = true; this.tileModeCB.Location = new System.Drawing.Point(851, 114); this.tileModeCB.Name = "tileModeCB"; - this.tileModeCB.ReadOnly = true; this.tileModeCB.Size = new System.Drawing.Size(230, 21); this.tileModeCB.TabIndex = 26; // @@ -192,7 +191,6 @@ this.ImgDimComb.FormattingEnabled = true; this.ImgDimComb.Location = new System.Drawing.Point(851, 87); this.ImgDimComb.Name = "ImgDimComb"; - this.ImgDimComb.ReadOnly = true; this.ImgDimComb.Size = new System.Drawing.Size(232, 21); this.ImgDimComb.TabIndex = 24; this.ImgDimComb.SelectedIndexChanged += new System.EventHandler(this.ImgDimComb_SelectedIndexChanged); @@ -270,7 +268,6 @@ this.formatComboBox.FormattingEnabled = true; this.formatComboBox.Location = new System.Drawing.Point(851, 60); this.formatComboBox.Name = "formatComboBox"; - this.formatComboBox.ReadOnly = true; this.formatComboBox.Size = new System.Drawing.Size(233, 21); this.formatComboBox.TabIndex = 16; this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged); @@ -283,7 +280,6 @@ this.compressionModeCB.FormattingEnabled = true; this.compressionModeCB.Location = new System.Drawing.Point(851, 33); this.compressionModeCB.Name = "compressionModeCB"; - this.compressionModeCB.ReadOnly = true; this.compressionModeCB.Size = new System.Drawing.Size(232, 21); this.compressionModeCB.TabIndex = 30; this.compressionModeCB.SelectedIndexChanged += new System.EventHandler(this.compressionModeCB_SelectedIndexChanged); diff --git a/File_Format_Library/GUI/TextureUI/Importers/GX2/GTXTextureImporter.cs b/File_Format_Library/GUI/TextureUI/Importers/GX2/GTXTextureImporter.cs index 79ee87a3..c35204c6 100644 --- a/File_Format_Library/GUI/TextureUI/Importers/GX2/GTXTextureImporter.cs +++ b/File_Format_Library/GUI/TextureUI/Importers/GX2/GTXTextureImporter.cs @@ -95,7 +95,7 @@ namespace FirstPlugin { set { - tileModeCB.ReadOnly = value; + tileModeCB.IsReadOnly = value; } } @@ -103,7 +103,7 @@ namespace FirstPlugin { set { - formatComboBox.ReadOnly = value; + formatComboBox.IsReadOnly = value; } } @@ -404,7 +404,6 @@ namespace FirstPlugin this.tileModeCB.FormattingEnabled = true; this.tileModeCB.Location = new System.Drawing.Point(772, 85); this.tileModeCB.Name = "tileModeCB"; - this.tileModeCB.ReadOnly = true; this.tileModeCB.Size = new System.Drawing.Size(172, 21); this.tileModeCB.TabIndex = 42; this.tileModeCB.SelectedIndexChanged += new System.EventHandler(this.tileModeCB_SelectedIndexChanged); @@ -426,7 +425,6 @@ namespace FirstPlugin this.ImgDimComb.FormattingEnabled = true; this.ImgDimComb.Location = new System.Drawing.Point(772, 58); this.ImgDimComb.Name = "ImgDimComb"; - this.ImgDimComb.ReadOnly = true; this.ImgDimComb.Size = new System.Drawing.Size(172, 21); this.ImgDimComb.TabIndex = 40; // @@ -496,7 +494,6 @@ namespace FirstPlugin this.formatComboBox.FormattingEnabled = true; this.formatComboBox.Location = new System.Drawing.Point(772, 31); this.formatComboBox.Name = "formatComboBox"; - this.formatComboBox.ReadOnly = true; this.formatComboBox.Size = new System.Drawing.Size(172, 21); this.formatComboBox.TabIndex = 32; this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/FileFormats/Assimp/AssimpSaver.cs b/Switch_Toolbox_Library/FileFormats/Assimp/AssimpSaver.cs index 1829e6f1..c7a30c6d 100644 --- a/Switch_Toolbox_Library/FileFormats/Assimp/AssimpSaver.cs +++ b/Switch_Toolbox_Library/FileFormats/Assimp/AssimpSaver.cs @@ -30,7 +30,7 @@ namespace Toolbox.Library scene.RootNode = new Node("RootNode"); progressBar = new STProgressBar(); - progressBar.Task = "Exorting Skeleton..."; + progressBar.Task = "Exporting Skeleton..."; progressBar.Value = 0; progressBar.StartPosition = FormStartPosition.CenterScreen; progressBar.Show(); @@ -39,7 +39,7 @@ namespace Toolbox.Library SaveSkeleton(skeleton, scene.RootNode); SaveMaterials(scene, Materials, FileName, Textures); - progressBar.Task = "Exorting Meshes..."; + progressBar.Task = "Exporting Meshes..."; progressBar.Value = 50; SaveMeshes(scene, Meshes, skeleton, FileName, NodeArray); @@ -519,7 +519,7 @@ namespace Toolbox.Library { ExtractedTextures.Add(path); - progressBar.Task = $"Exorting Texture {Textures[i].Text}"; + progressBar.Task = $"Exporting Texture {Textures[i].Text}"; progressBar.Value = ((i * 100) / Textures.Count); progressBar.Refresh(); diff --git a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs index ec5ca0d6..3a5b0419 100644 --- a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs @@ -85,7 +85,6 @@ this.stComboBox1.FormattingEnabled = true; this.stComboBox1.Location = new System.Drawing.Point(53, 2); this.stComboBox1.Name = "stComboBox1"; - this.stComboBox1.ReadOnly = true; this.stComboBox1.Size = new System.Drawing.Size(190, 21); this.stComboBox1.TabIndex = 0; this.stComboBox1.SelectedIndexChanged += new System.EventHandler(this.stComboBox1_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/ColorSelector.cs b/Switch_Toolbox_Library/Forms/ColorSelector.cs new file mode 100644 index 00000000..449fdd2c --- /dev/null +++ b/Switch_Toolbox_Library/Forms/ColorSelector.cs @@ -0,0 +1,291 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; +using Toolbox.Library.IO; + +namespace Toolbox.Library.Forms +{ + //Based on this, very good color slider + //https://github.com/libertyernie/brawltools/blob/40d7431b1a01ef4a0411cd69e51411bd581e93e2/BrawlLib/System/Windows/Controls/GoodColorControl.cs#L394 + //Slimmed down a bit to be more simple + + /// + /// A panel which can select and pick colors + /// + public class ColorSelector : STUserControl + { + private Color _color; + + private HSVPixel _hsv = new HSVPixel(0, 100, 100); + + /// + /// The color the dialog gets and sets. + /// + public Color Color + { + get { return _color; } + set + { + _color = value; + OnColorChanged(false); + } + } + private LinearGradientBrush _hueBrush; + private STPanel colorSquare; + private STPanel huePanel; + private PathGradientBrush _mainBrush; + + public ColorSelector() + { + InitializeComponent(); + + this.SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.DoubleBuffer, + true); + + colorSquare.SetDoubleBuffer(); + huePanel.SetDoubleBuffer(); + } + + private Point CursorPoint = new Point(0,0); + + public event EventHandler ColorChanged; + + private void InitializeComponent() + { + this.colorSquare = new Toolbox.Library.Forms.STPanel(); + this.huePanel = new Toolbox.Library.Forms.STPanel(); + this.SuspendLayout(); + // + // colorSquare + // + this.colorSquare.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.colorSquare.Location = new System.Drawing.Point(3, 3); + this.colorSquare.Name = "colorSquare"; + this.colorSquare.Size = new System.Drawing.Size(180, 180); + this.colorSquare.TabIndex = 0; + this.colorSquare.Paint += new System.Windows.Forms.PaintEventHandler(this.colorSquare_Paint); + this.colorSquare.MouseDown += new System.Windows.Forms.MouseEventHandler(this.colorSquare_MouseDown); + this.colorSquare.MouseMove += new System.Windows.Forms.MouseEventHandler(this.colorSquare_MouseMove); + this.colorSquare.MouseUp += new System.Windows.Forms.MouseEventHandler(this.colorSquare_MouseUp); + // + // huePanel + // + this.huePanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.huePanel.Location = new System.Drawing.Point(189, 3); + this.huePanel.Name = "huePanel"; + this.huePanel.Size = new System.Drawing.Size(16, 180); + this.huePanel.TabIndex = 1; + this.huePanel.Paint += new System.Windows.Forms.PaintEventHandler(this.huePanel_Paint); + this.huePanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.huePanel_MouseDown); + this.huePanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.huePanel_MouseMove); + this.huePanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.huePanel_MouseUp); + // + // ColorSelector + // + this.Controls.Add(this.huePanel); + this.Controls.Add(this.colorSquare); + this.MaximumSize = new System.Drawing.Size(212, 188); + this.MinimumSize = new System.Drawing.Size(212, 188); + this.Name = "ColorSelector"; + this.Size = new System.Drawing.Size(212, 188); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ColorSelector_MouseMove); + this.ResumeLayout(false); + + } + + private void ColorSelector_MouseMove(object sender, MouseEventArgs e) + { + CursorPoint = e.Location; + this.Invalidate(); + } + + + #region HueBar + + private bool _hueSelected = false; + private void huePanel_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + _hueSelected = true; + huePanel_MouseMove(sender, e); + } + } + + private void huePanel_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + _hueSelected = false; + } + + private int hueY; + private void huePanel_MouseMove(object sender, MouseEventArgs e) + { + if (_hueSelected) + { + int y = Math.Max(Math.Min(e.Y, (huePanel.Height - 1)), 0); + if (y != hueY) + { + hueY = y; + + _hsv.H = (ushort)((float)y / (huePanel.Height - 1) * 360); + + OnColorChanged(true); + } + } + } + + private void huePanel_Paint(object sender, PaintEventArgs e) + { + const float numHueColors = 6.0f; + + Rectangle r = colorSquare.ClientRectangle; + + //Split the hue colors + float p = r.Height / numHueColors / r.Height; + + //Draw the hue slider + var g = e.Graphics; + + _hueBrush = new LinearGradientBrush(new Rectangle(0, 0, r.Width, r.Height), Color.Red, Color.Red, LinearGradientMode.Vertical); + + //Create the hue list + ColorBlend blend = new ColorBlend(); + blend.Colors = new Color[] + { + Color.Red, + Color.Yellow, + Color.Lime, + Color.Cyan, + Color.Blue, + Color.Magenta, + Color.Red + }; + + blend.Positions = new float[] { 0, p, p * 2, p * 3, p * 4, p * 5, 1.0f }; + _hueBrush.InterpolationColors = blend; + + g.FillRectangle(_hueBrush, r); + + Color pixel = new HSVPixel(_hsv.H, 100, 100).ToRGBA().Inverse(); + + int y = (int)(_hsv.H / 360.0f * (huePanel.Height - 1)); + Rectangle c = new Rectangle(-1, y - 2, huePanel.Width + 1, 4); + + using (Pen pen = new Pen(pixel)) + g.DrawRectangle(pen, c); + + c.Y += 1; + c.Height -= 2; + pixel = pixel.Lighten(64); + + using (Pen pen = new Pen(pixel)) + g.DrawRectangle(pen, c); + } + + #endregion + + private Color[] _boxColors = new Color[] { Color.Black, Color.White, Color.Black, Color.Black, Color.Black }; + private void colorSquare_Paint(object sender, PaintEventArgs e) + { + var g = e.Graphics; + + Rectangle r = colorSquare.ClientRectangle; + float p = r.Height / 6.0f / r.Height; + + _mainBrush = new PathGradientBrush(new PointF[] { + new PointF(r.Width, 0), + new PointF(r.Width, r.Height), + new PointF(0, r.Height), + new PointF(0,0), + new PointF(r.Width, 0)}); + + _boxColors[0] = _boxColors[4] = new HSVPixel(_hsv.H, 100, 100).ToRGBA(); + _mainBrush.SurroundColors = _boxColors; + _mainBrush.CenterColor = new HSVPixel(_hsv.H, 50, 50).ToRGBA(); + _mainBrush.CenterPoint = new PointF(r.Width / 2, r.Height / 2); + + g.FillRectangle(_mainBrush, r); + + + //Draw indicator + int x = (int)(_hsv.V / 100.0f * colorSquare.Width); + int y = (int)((100 - _hsv.S) / 100.0f * colorSquare.Height); + + Rectangle c = new Rectangle(x - 3, y - 3, 6, 6); + + Color pixel = _color.Inverse(); + pixel.WhiteAlpha(); + + using (Pen pen = new Pen(pixel)) + g.DrawEllipse(pen, c); + + c.X -= 1; + c.Y -= 1; + c.Width += 2; + c.Height += 2; + + pixel = pixel.Lighten(64); + + using (Pen pen = new Pen(pixel)) + g.DrawEllipse(pen, c); + } + + protected virtual void OnColorChanged(bool hsvToRgb) + { + colorSquare.Invalidate(); + huePanel.Invalidate(); + + if (hsvToRgb) + _color = _hsv.ToRGBA(); + else + _hsv = HSVPixel.FromRGBA(_color); + + if (ColorChanged != null) + ColorChanged(this, null); + } + + private int _squareX, _squareY; + private bool _squareSelected = false; + private void colorSquare_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + _squareSelected = true; + colorSquare_MouseMove(sender, e); + } + } + + private void colorSquare_MouseUp(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + _squareSelected = false; + } + + private void colorSquare_MouseMove(object sender, MouseEventArgs e) + { + if (_squareSelected) + { + int x = Math.Min(Math.Max(e.X, 0), colorSquare.Width); + int y = Math.Min(Math.Max(e.Y, 0), colorSquare.Height); + if ((x != _squareX) || (y != _squareY)) + { + _hsv.V = (byte)((float)x / colorSquare.Width * 100); + _hsv.S = (byte)((float)(colorSquare.Height - y) / colorSquare.Height * 100); + + OnColorChanged(true); + } + } + } + } +} diff --git a/Switch_Toolbox_Library/Forms/ColorSelector.resx b/Switch_Toolbox_Library/Forms/ColorSelector.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/Switch_Toolbox_Library/Forms/ColorSelector.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Switch_Toolbox_Library/Forms/Custom/STComboBox.cs b/Switch_Toolbox_Library/Forms/Custom/STComboBox.cs index 461e2690..48976f46 100644 --- a/Switch_Toolbox_Library/Forms/Custom/STComboBox.cs +++ b/Switch_Toolbox_Library/Forms/Custom/STComboBox.cs @@ -54,21 +54,20 @@ namespace Toolbox.Library.Forms if (FormThemes.ActivePreset == FormThemes.Preset.White) DropDownStyle = ComboBoxStyle.DropDownList; - - - ReadOnly = true; - - /* Resize += (s, e) => - { - if (!IsHandleCreated) - return; - - SelectionLength = 0; - };*/ - InitializeComponent(); } + public void SetAsReadOnly() + { + IsReadOnly = true; + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + if (IsReadOnly) + ((HandledMouseEventArgs)e).Handled = true; + } + private dynamic value; public string GetSelectedText() @@ -169,7 +168,6 @@ namespace Toolbox.Library.Forms e.Graphics.FillRectangle(backBrush, this.ClientRectangle); e.Graphics.DrawString(this.Text, this.Font, foreBrush, this.Location); - } protected override void OnLostFocus(System.EventArgs e) @@ -217,10 +215,9 @@ namespace Toolbox.Library.Forms } - private bool _readOnly; + private bool _readOnly = false; - - public bool ReadOnly + public bool IsReadOnly { get { return _readOnly; } set { _readOnly = value; } @@ -269,5 +266,35 @@ namespace Toolbox.Library.Forms value = SelectedItem; } } + + protected override void OnDropDown(EventArgs e) + { + if (_readOnly) + { + DropDownHeight = 1; + var t = new Thread(CloseDropDown); + t.Start(); + return; + } + base.OnDropDown(e); + } + + private delegate void CloseDropDownDelegate(); + private void WaitForDropDown() + { + if (InvokeRequired) + { + var d = new CloseDropDownDelegate(WaitForDropDown); + Invoke(d); + } + else + { + DroppedDown = false; + } + } + private void CloseDropDown() + { + WaitForDropDown(); + } } } diff --git a/Switch_Toolbox_Library/Forms/Custom/STPanel.cs b/Switch_Toolbox_Library/Forms/Custom/STPanel.cs index e8010249..84bf4463 100644 --- a/Switch_Toolbox_Library/Forms/Custom/STPanel.cs +++ b/Switch_Toolbox_Library/Forms/Custom/STPanel.cs @@ -14,5 +14,14 @@ namespace Toolbox.Library.Forms ForeColor = FormThemes.BaseTheme.FormForeColor; BackColor = FormThemes.BaseTheme.FormBackColor; } + + public void SetDoubleBuffer() + { + this.SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.DoubleBuffer, + true); + } } } diff --git a/Switch_Toolbox_Library/Forms/Custom/TreeViewCustom.cs b/Switch_Toolbox_Library/Forms/Custom/TreeViewCustom.cs index c6551fa0..75db8afd 100644 --- a/Switch_Toolbox_Library/Forms/Custom/TreeViewCustom.cs +++ b/Switch_Toolbox_Library/Forms/Custom/TreeViewCustom.cs @@ -158,6 +158,8 @@ namespace Toolbox.Library var image = ((STGenericTexture)node).GetBitmap(); if (image != null) { + image = ((STGenericTexture)node).GetComponentBitmap(image); + imageIcons.Add(image); treeNodes.Add(node); } @@ -242,6 +244,7 @@ namespace Toolbox.Library try { var image = textureIcon.IconTexture.GetBitmap(); + image = textureIcon.IconTexture.GetComponentBitmap(image); AddImageOnThread(image, textureIcon.IconTexture); } catch (Exception ex) @@ -273,6 +276,7 @@ namespace Toolbox.Library var image = ((STGenericTexture)node).GetBitmap(); if (image != null) { + image = ((STGenericTexture)node).GetComponentBitmap(image); treeNodes.Add(node); imageIcons.Add(image); } diff --git a/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayer.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayer.Designer.cs index 6e23fea0..7431bb27 100644 --- a/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayer.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayer.Designer.cs @@ -366,7 +366,6 @@ this.audioDevice.FormattingEnabled = true; this.audioDevice.Location = new System.Drawing.Point(214, 3); this.audioDevice.Name = "audioDevice"; - this.audioDevice.ReadOnly = true; this.audioDevice.Size = new System.Drawing.Size(151, 21); this.audioDevice.TabIndex = 20; this.audioDevice.SelectedIndexChanged += new System.EventHandler(this.audioDevice_SelectedIndexChanged); @@ -380,7 +379,6 @@ this.channelCB.FormattingEnabled = true; this.channelCB.Location = new System.Drawing.Point(371, 3); this.channelCB.Name = "channelCB"; - this.channelCB.ReadOnly = true; this.channelCB.Size = new System.Drawing.Size(151, 21); this.channelCB.TabIndex = 19; this.channelCB.SelectedIndexChanged += new System.EventHandler(this.channelCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayerPanel.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayerPanel.Designer.cs index 3bdd8367..cb8b6c02 100644 --- a/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayerPanel.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/Audio/AudioPlayerPanel.Designer.cs @@ -357,7 +357,6 @@ this.audioDevice.FormattingEnabled = true; this.audioDevice.Location = new System.Drawing.Point(220, 3); this.audioDevice.Name = "audioDevice"; - this.audioDevice.ReadOnly = true; this.audioDevice.Size = new System.Drawing.Size(151, 21); this.audioDevice.TabIndex = 20; this.audioDevice.SelectedIndexChanged += new System.EventHandler(this.audioDevice_SelectedIndexChanged); @@ -371,7 +370,6 @@ this.channelCB.FormattingEnabled = true; this.channelCB.Location = new System.Drawing.Point(377, 3); this.channelCB.Name = "channelCB"; - this.channelCB.ReadOnly = true; this.channelCB.Size = new System.Drawing.Size(151, 21); this.channelCB.TabIndex = 19; this.channelCB.SelectedIndexChanged += new System.EventHandler(this.channelCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs index eab859b8..920cd1a3 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.Designer.cs @@ -328,7 +328,6 @@ this.imageBGComboBox.FormattingEnabled = true; this.imageBGComboBox.Location = new System.Drawing.Point(262, 2); this.imageBGComboBox.Name = "imageBGComboBox"; - this.imageBGComboBox.ReadOnly = true; this.imageBGComboBox.Size = new System.Drawing.Size(95, 21); this.imageBGComboBox.TabIndex = 2; this.imageBGComboBox.SelectedIndexChanged += new System.EventHandler(this.imageBGComboBox_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageProgramSettings.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageProgramSettings.Designer.cs index fada2821..66cf564a 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageProgramSettings.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageProgramSettings.Designer.cs @@ -70,7 +70,6 @@ this.textureImageFormatCB.FormattingEnabled = true; this.textureImageFormatCB.Location = new System.Drawing.Point(148, 64); this.textureImageFormatCB.Name = "textureImageFormatCB"; - this.textureImageFormatCB.ReadOnly = true; this.textureImageFormatCB.Size = new System.Drawing.Size(236, 21); this.textureImageFormatCB.TabIndex = 12; // @@ -82,7 +81,6 @@ this.textureFileFormatCB.FormattingEnabled = true; this.textureFileFormatCB.Location = new System.Drawing.Point(147, 38); this.textureFileFormatCB.Name = "textureFileFormatCB"; - this.textureFileFormatCB.ReadOnly = true; this.textureFileFormatCB.Size = new System.Drawing.Size(236, 21); this.textureFileFormatCB.TabIndex = 14; // diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageResizeDialog.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageResizeDialog.Designer.cs index 3fa24dde..6093395f 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageResizeDialog.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageResizeDialog.Designer.cs @@ -141,7 +141,6 @@ this.resampleCB.FormattingEnabled = true; this.resampleCB.Location = new System.Drawing.Point(564, 52); this.resampleCB.Name = "resampleCB"; - this.resampleCB.ReadOnly = true; this.resampleCB.Size = new System.Drawing.Size(149, 21); this.resampleCB.TabIndex = 16; this.resampleCB.SelectedIndexChanged += new System.EventHandler(this.resampleCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.Designer.cs index 0151684c..95dc5dc3 100644 --- a/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/Object Editor/ObjectEditorTree.Designer.cs @@ -100,7 +100,6 @@ this.nodeSizeCB.FormattingEnabled = true; this.nodeSizeCB.Location = new System.Drawing.Point(172, 29); this.nodeSizeCB.Name = "nodeSizeCB"; - this.nodeSizeCB.ReadOnly = true; this.nodeSizeCB.Size = new System.Drawing.Size(136, 21); this.nodeSizeCB.TabIndex = 5; this.nodeSizeCB.SelectedIndexChanged += new System.EventHandler(this.nodeSizeCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/Object Editor/SearchNodeForm.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/Object Editor/SearchNodeForm.Designer.cs index e2dd2e06..237e36cd 100644 --- a/Switch_Toolbox_Library/Forms/Editors/Object Editor/SearchNodeForm.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/Object Editor/SearchNodeForm.Designer.cs @@ -134,7 +134,6 @@ this.listViewModeCB.FormattingEnabled = true; this.listViewModeCB.Location = new System.Drawing.Point(5, 346); this.listViewModeCB.Name = "listViewModeCB"; - this.listViewModeCB.ReadOnly = true; this.listViewModeCB.Size = new System.Drawing.Size(143, 21); this.listViewModeCB.TabIndex = 18; this.listViewModeCB.SelectedIndexChanged += new System.EventHandler(this.listViewModeCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/TextureImport/3DS/CTR_3DSTextureImporter.cs b/Switch_Toolbox_Library/Forms/Editors/TextureImport/3DS/CTR_3DSTextureImporter.cs index a6056168..7cfd10a0 100644 --- a/Switch_Toolbox_Library/Forms/Editors/TextureImport/3DS/CTR_3DSTextureImporter.cs +++ b/Switch_Toolbox_Library/Forms/Editors/TextureImport/3DS/CTR_3DSTextureImporter.cs @@ -47,7 +47,7 @@ namespace Toolbox.Library.Forms { set { - formatComboBox.ReadOnly = value; + formatComboBox.IsReadOnly = value; } } @@ -272,7 +272,6 @@ namespace Toolbox.Library.Forms this.ImgDimComb.FormattingEnabled = true; this.ImgDimComb.Location = new System.Drawing.Point(772, 61); this.ImgDimComb.Name = "ImgDimComb"; - this.ImgDimComb.ReadOnly = true; this.ImgDimComb.Size = new System.Drawing.Size(172, 21); this.ImgDimComb.TabIndex = 40; // @@ -342,7 +341,6 @@ namespace Toolbox.Library.Forms this.formatComboBox.FormattingEnabled = true; this.formatComboBox.Location = new System.Drawing.Point(772, 31); this.formatComboBox.Name = "formatComboBox"; - this.formatComboBox.ReadOnly = true; this.formatComboBox.Size = new System.Drawing.Size(172, 21); this.formatComboBox.TabIndex = 32; this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/TextureImport/Gamecube/GamecubeTextureImporterList.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/TextureImport/Gamecube/GamecubeTextureImporterList.Designer.cs index 6b5797e7..4ecb938c 100644 --- a/Switch_Toolbox_Library/Forms/Editors/TextureImport/Gamecube/GamecubeTextureImporterList.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/TextureImport/Gamecube/GamecubeTextureImporterList.Designer.cs @@ -192,7 +192,6 @@ this.formatComboBox.FormattingEnabled = true; this.formatComboBox.Location = new System.Drawing.Point(841, 64); this.formatComboBox.Name = "formatComboBox"; - this.formatComboBox.ReadOnly = true; this.formatComboBox.Size = new System.Drawing.Size(133, 21); this.formatComboBox.TabIndex = 16; this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged); @@ -241,7 +240,6 @@ this.paletteFormatCB.FormattingEnabled = true; this.paletteFormatCB.Location = new System.Drawing.Point(844, 165); this.paletteFormatCB.Name = "paletteFormatCB"; - this.paletteFormatCB.ReadOnly = true; this.paletteFormatCB.Size = new System.Drawing.Size(130, 21); this.paletteFormatCB.TabIndex = 34; this.paletteFormatCB.SelectedIndexChanged += new System.EventHandler(this.paletteFormatCB_SelectedIndexChanged); @@ -279,7 +277,6 @@ this.paletteAlgorithmCB.FormattingEnabled = true; this.paletteAlgorithmCB.Location = new System.Drawing.Point(844, 239); this.paletteAlgorithmCB.Name = "paletteAlgorithmCB"; - this.paletteAlgorithmCB.ReadOnly = true; this.paletteAlgorithmCB.Size = new System.Drawing.Size(133, 21); this.paletteAlgorithmCB.TabIndex = 38; // diff --git a/Switch_Toolbox_Library/Forms/Editors/TextureImport/GenericTextureImporterList.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/TextureImport/GenericTextureImporterList.Designer.cs index 08509b49..a528b10b 100644 --- a/Switch_Toolbox_Library/Forms/Editors/TextureImport/GenericTextureImporterList.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/TextureImport/GenericTextureImporterList.Designer.cs @@ -191,7 +191,6 @@ this.formatComboBox.FormattingEnabled = true; this.formatComboBox.Location = new System.Drawing.Point(854, 58); this.formatComboBox.Name = "formatComboBox"; - this.formatComboBox.ReadOnly = true; this.formatComboBox.Size = new System.Drawing.Size(233, 21); this.formatComboBox.TabIndex = 16; this.formatComboBox.SelectedIndexChanged += new System.EventHandler(this.formatComboBox_SelectedIndexChanged); @@ -204,7 +203,6 @@ this.compressionModeCB.FormattingEnabled = true; this.compressionModeCB.Location = new System.Drawing.Point(854, 31); this.compressionModeCB.Name = "compressionModeCB"; - this.compressionModeCB.ReadOnly = true; this.compressionModeCB.Size = new System.Drawing.Size(233, 21); this.compressionModeCB.TabIndex = 30; this.compressionModeCB.SelectedIndexChanged += new System.EventHandler(this.compressionModeCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor.Designer.cs index 8702edcd..ba02aeb7 100644 --- a/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor.Designer.cs @@ -211,7 +211,6 @@ this.drawableContainerCB.FormattingEnabled = true; this.drawableContainerCB.Location = new System.Drawing.Point(294, 7); this.drawableContainerCB.Name = "drawableContainerCB"; - this.drawableContainerCB.ReadOnly = true; this.drawableContainerCB.Size = new System.Drawing.Size(146, 21); this.drawableContainerCB.TabIndex = 20; this.drawableContainerCB.SelectedIndexChanged += new System.EventHandler(this.drawableContainerCB_SelectedIndexChanged); @@ -226,7 +225,6 @@ this.meshesCB.FormattingEnabled = true; this.meshesCB.Location = new System.Drawing.Point(294, 34); this.meshesCB.Name = "meshesCB"; - this.meshesCB.ReadOnly = true; this.meshesCB.Size = new System.Drawing.Size(146, 21); this.meshesCB.TabIndex = 19; this.meshesCB.SelectedIndexChanged += new System.EventHandler(this.meshesCB_SelectedIndexChanged); @@ -284,7 +282,6 @@ this.textureCB.FormattingEnabled = true; this.textureCB.Location = new System.Drawing.Point(446, 34); this.textureCB.Name = "textureCB"; - this.textureCB.ReadOnly = true; this.textureCB.Size = new System.Drawing.Size(156, 21); this.textureCB.TabIndex = 5; this.textureCB.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); @@ -298,7 +295,6 @@ this.comboBox1.FormattingEnabled = true; this.comboBox1.Location = new System.Drawing.Point(550, 7); this.comboBox1.Name = "comboBox1"; - this.comboBox1.ReadOnly = true; this.comboBox1.Size = new System.Drawing.Size(52, 21); this.comboBox1.TabIndex = 3; this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor2.Designer.cs b/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor2.Designer.cs index 34655245..45afd856 100644 --- a/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor2.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Editors/UV/UVEditor2.Designer.cs @@ -262,7 +262,6 @@ this.comboBox2.FormattingEnabled = true; this.comboBox2.Location = new System.Drawing.Point(290, 7); this.comboBox2.Name = "comboBox2"; - this.comboBox2.ReadOnly = true; this.comboBox2.Size = new System.Drawing.Size(166, 21); this.comboBox2.TabIndex = 5; this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged); @@ -276,7 +275,6 @@ this.comboBox1.FormattingEnabled = true; this.comboBox1.Location = new System.Drawing.Point(550, 7); this.comboBox1.Name = "comboBox1"; - this.comboBox1.ReadOnly = true; this.comboBox1.Size = new System.Drawing.Size(52, 21); this.comboBox1.TabIndex = 3; this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Forms/Viewport.Designer.cs b/Switch_Toolbox_Library/Forms/Viewport.Designer.cs index 3d98c95a..9635e424 100644 --- a/Switch_Toolbox_Library/Forms/Viewport.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Viewport.Designer.cs @@ -137,7 +137,6 @@ this.drawContainersCB.FormattingEnabled = true; this.drawContainersCB.Location = new System.Drawing.Point(93, 0); this.drawContainersCB.Name = "drawContainersCB"; - this.drawContainersCB.ReadOnly = true; this.drawContainersCB.Size = new System.Drawing.Size(183, 21); this.drawContainersCB.TabIndex = 0; this.drawContainersCB.SelectedIndexChanged += new System.EventHandler(this.drawContainersCB_SelectedIndexChanged); diff --git a/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs b/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs index 77298b7c..c85c76b4 100644 --- a/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs +++ b/Switch_Toolbox_Library/Generics/Texture/GenericTexture.cs @@ -1060,6 +1060,26 @@ namespace Toolbox.Library return FileName.Substring(0, FileName.Length - extension.Length); } + public Bitmap GetComponentBitmap(Bitmap image) + { + //Check if it's RGBA to save time editing the image + if (UseRGBA()) + return image; + else + return BitmapExtension.SetChannel(image, RedChannel, GreenChannel, BlueChannel, AlphaChannel); + } + + private bool UseRGBA() + { + if (RedChannel == STChannelType.Red && + GreenChannel == STChannelType.Green && + BlueChannel == STChannelType.Blue && + AlphaChannel == STChannelType.Alpha) + return true; + else + return false; + } + private static byte[] ConvertBgraToRgba(byte[] bytes) { if (bytes == null) diff --git a/Switch_Toolbox_Library/IO/Extensions/ColorExtensions.cs b/Switch_Toolbox_Library/IO/Extensions/ColorExtensions.cs new file mode 100644 index 00000000..fd613a7e --- /dev/null +++ b/Switch_Toolbox_Library/IO/Extensions/ColorExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace Toolbox.Library.IO +{ + public static class ColorExtensions + { + public static Color Inverse(this Color color) + { + return Color.FromArgb(color.A, (byte)(255 - color.R), (byte)(255 - color.G), (byte)(255 - color.B)); + } + + public static Color WhiteAlpha(this Color color) + { + return Color.FromArgb(255, color.R, color.G, color.B); + } + + public static Color Lighten(this Color color, int amount) + { + return Color.FromArgb(color.A, (byte)Math.Min(color.R + amount, 255), (byte)Math.Min(color.G + amount, 255), (byte)Math.Min(color.B + amount, 255)); + } + } +} diff --git a/Switch_Toolbox_Library/IO/HSVPixel.cs b/Switch_Toolbox_Library/IO/HSVPixel.cs new file mode 100644 index 00000000..219005e3 --- /dev/null +++ b/Switch_Toolbox_Library/IO/HSVPixel.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; + +namespace Toolbox.Library.IO +{ + //Based on + //https://github.com/libertyernie/brawltools/blob/40d7431b1a01ef4a0411cd69e51411bd581e93e2/BrawlLib/Imaging/PixelTypes.cs + public class HSVPixel + { + public ushort H { get; set; } + public byte S { get; set; } + public byte V { get; set; } + + public HSVPixel(ushort h, byte s, byte v) { H = h; S = s; V = v; } + + public static HSVPixel FromRGBA(Color p) + { + HSVPixel outp = new HSVPixel(0,0,0); + + int min = Math.Min(Math.Min(p.R, p.G), p.B); + int max = Math.Max(Math.Max(p.R, p.G), p.B); + int diff = max - min; + + if (diff == 0) + { + outp.H = 0; + outp.S = 0; + } + else + { + if (max == p.R) + outp.H = (ushort)((60 * ((float)(p.G - p.B) / diff) + 360) % 360); + else if (max == p.G) + outp.H = (ushort)(60 * ((float)(p.B - p.R) / diff) + 120); + else + outp.H = (ushort)(60 * ((float)(p.R - p.G) / diff) + 240); + + if (max == 0) + outp.S = 0; + else + outp.S = (byte)(diff * 100 / max); + } + + outp.V = (byte)(max * 100 / 255); + + return outp; + } + + public Color ToRGBA() + { + var color = new Color(); + + byte v = (byte)(V * 255 / 100); + if (S == 0) + color = Color.FromArgb(255,v,v,v); + else + { + int h = (H / 60) % 6; + float f = (H / 60.0f) - (H / 60); + + byte p = (byte)(V * (100 - S) * 255 / 10000); + byte q = (byte)(V * (100 - (int)(f * S)) * 255 / 10000); + byte t = (byte)(V * (100 - (int)((1.0f - f) * S)) * 255 / 10000); + + switch (h) + { + case 0: color = Color.FromArgb(255, v, t, p); break; + case 1: color = Color.FromArgb(255, q, v, p); break; + case 2: color = Color.FromArgb(255, p, v, t); break; + case 3: color = Color.FromArgb(255, p, q, v); break; + case 4: color = Color.FromArgb(255, t, p, v); break; + default: color = Color.FromArgb(255, v, p, q); break; + } + } + + return color; + } + } +} diff --git a/Switch_Toolbox_Library/IO/STColor.cs b/Switch_Toolbox_Library/IO/STColor.cs index 3fd11cae..f9d0367a 100644 --- a/Switch_Toolbox_Library/IO/STColor.cs +++ b/Switch_Toolbox_Library/IO/STColor.cs @@ -56,5 +56,15 @@ namespace Toolbox.Library B = 1; A = 1; } + + public override string ToString() + { + return String.Format("R:{0} G:{1} B:{2} A:{3}", R, G, B, A); + } + + public string ToHexString() + { + return String.Format("R:{0:X2} G:{1:X2} B:{2:X2} A:{3:X2}", R, G, B, A); + } } } diff --git a/Switch_Toolbox_Library/Toolbox.Library.dll b/Switch_Toolbox_Library/Toolbox.Library.dll index 0962c008..e11cf36a 100644 Binary files a/Switch_Toolbox_Library/Toolbox.Library.dll and b/Switch_Toolbox_Library/Toolbox.Library.dll differ diff --git a/Switch_Toolbox_Library/Toolbox.Library.pdb b/Switch_Toolbox_Library/Toolbox.Library.pdb index 5c2841cc..1f4bc779 100644 Binary files a/Switch_Toolbox_Library/Toolbox.Library.pdb and b/Switch_Toolbox_Library/Toolbox.Library.pdb differ diff --git a/Switch_Toolbox_Library/Toolbox_Library.csproj b/Switch_Toolbox_Library/Toolbox_Library.csproj index 75ac6a70..68edb9ec 100644 --- a/Switch_Toolbox_Library/Toolbox_Library.csproj +++ b/Switch_Toolbox_Library/Toolbox_Library.csproj @@ -237,6 +237,9 @@ Component + + UserControl + UserControl @@ -291,9 +294,11 @@ + + @@ -829,6 +834,9 @@ BatchFormatExport.cs + + ColorSelector.cs + STCollapsePanelButton.cs diff --git a/Toolbox/GUI/GithubIssueDialog.Designer.cs b/Toolbox/GUI/GithubIssueDialog.Designer.cs index eb9e85ba..c21c9db8 100644 --- a/Toolbox/GUI/GithubIssueDialog.Designer.cs +++ b/Toolbox/GUI/GithubIssueDialog.Designer.cs @@ -109,7 +109,6 @@ this.typeCB.FormattingEnabled = true; this.typeCB.Location = new System.Drawing.Point(11, 19); this.typeCB.Name = "typeCB"; - this.typeCB.ReadOnly = true; this.typeCB.Size = new System.Drawing.Size(159, 21); this.typeCB.TabIndex = 3; //