1
0
mirror of synced 2024-11-27 17:00:50 +01:00

Improve PTCL color editing and add texture icon previewing.

This commit is contained in:
KillzXGaming 2019-08-19 18:28:59 -04:00
parent b311e6d012
commit 2f8041bc93
64 changed files with 3306 additions and 141 deletions

Binary file not shown.

View File

@ -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<BinarySavedEntry> BinariesSaved = new List<BinarySavedEntry>();
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<STGenericTexture> DrawableTex = new List<STGenericTexture>();
public List<SamplerInfo> Samplers = new List<SamplerInfo>();
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");

View File

@ -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<STGenericTexture>();
List<STGenericTexture> textures = new List<STGenericTexture>();
foreach (STGenericTexture node in Nodes)
textures.Add(node);

View File

@ -394,6 +394,31 @@
<Compile Include="GUI\BFRES\SmoothNormalsMultiMeshForm.Designer.cs">
<DependentUpon>SmoothNormalsMultiMeshForm.cs</DependentUpon>
</Compile>
<Compile Include="GUI\Editors\PTCL\Color8KeySlider.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="GUI\Editors\PTCL\Color8KeySlider.Designer.cs">
<DependentUpon>Color8KeySlider.cs</DependentUpon>
</Compile>
<Compile Include="GUI\Editors\PTCL\ColorConstantPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\Editors\PTCL\ColorConstantPanel.Designer.cs">
<DependentUpon>ColorConstantPanel.cs</DependentUpon>
</Compile>
<Compile Include="GUI\Editors\PTCL\IColorPanelCommon.cs" />
<Compile Include="GUI\Editors\PTCL\ColorRandomPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\Editors\PTCL\ColorRandomPanel.Designer.cs">
<DependentUpon>ColorRandomPanel.cs</DependentUpon>
</Compile>
<Compile Include="GUI\Editors\PTCL\EmitterEditorNX.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="GUI\Editors\PTCL\EmitterEditorNX.Designer.cs">
<DependentUpon>EmitterEditorNX.cs</DependentUpon>
</Compile>
<Compile Include="GUI\TextureUI\Importers\BNTX\BinaryTextureImporterList.cs">
<SubType>Form</SubType>
</Compile>
@ -1217,6 +1242,18 @@
<EmbeddedResource Include="GUI\Editors\MK8TrackEditor\MK8MapCameraEditor.resx">
<DependentUpon>MK8MapCameraEditor.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\Editors\PTCL\Color8KeySlider.resx">
<DependentUpon>Color8KeySlider.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\Editors\PTCL\ColorConstantPanel.resx">
<DependentUpon>ColorConstantPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\Editors\PTCL\ColorRandomPanel.resx">
<DependentUpon>ColorRandomPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\Editors\PTCL\EmitterEditorNX.resx">
<DependentUpon>EmitterEditorNX.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\Editors\PTCL\EmitterEditor.resx">
<DependentUpon>EmitterEditor.cs</DependentUpon>
</EmbeddedResource>

View File

@ -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;
//

View File

@ -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);

View File

@ -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);

View File

@ -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;
//

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
//

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
//

View File

@ -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);

View File

@ -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;
//

View File

@ -0,0 +1,47 @@
namespace FirstPlugin.Forms
{
partial class Color8KeySlider
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

View File

@ -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<KeyFrame> Keys = new List<KeyFrame>();
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<Color> colors = new List<Color>();
List<float> frames = new List<float>();
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();
}
}
}
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@ -0,0 +1,58 @@
namespace FirstPlugin.Forms
{
partial class ColorConstantPanel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,142 @@
namespace FirstPlugin.Forms
{
partial class ColorRandomPanel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,407 @@
namespace FirstPlugin
{
partial class EmitterEditorNX
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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;
}
}
}

View File

@ -0,0 +1,742 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox3.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
WHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjIx8SBplQAAK8tJREFUeF7t3Qlz21iSBGDZOnifAEiABHif
Ou2e///ftu3OrBILitBMrzzjtvOLaHcHkqsCHnMghfdRuIqyp39d+JIgoM4eCXzdIjCrr4jg3EZAySMS
eMoR0HV4wb9WN0hoGWYc+wioi4D+yBDQzRkJLRtI4DpHQI8dJNT9goTSz0igtUFAu3Adn+KMf4WTuBqF
0/xaIKBGmPHHGYGZvyCChwEC6t8jgS8VAnP8AxHsmggoD0txj+Pu/WIdkMDXHQLz+xQrvGM/R7Fq7+kH
FOukYpGKZVQso2IZFcv9M4p1+wHF+il/xlKxjO5YTsUiFcupWKRiORWLVCz3vymWfsYiFcuoWEbFcvpW
SCqWU7FIxXIqllGxjIpl9BekRsVyumORiuVULPqFi5UFeVldKHMENJ0jgXKGwMyQ0HyCgN6dkYUXVPUZ
4RXzKQKaIqD6jHAd1ax2mgiodh3TeJpxxiQuRe06CgSmNiMud4GAajPmCEwRl7u2Vu/NqK1VbSnijPnV
U1C2bi80KgS0HSCBuyECk9whgu4OAVVhRqtAQPdtJJSckVAaZvTWCOBxi8DMkdC5i4DSAxK4LxBQa4uE
NuEkbqt7JLAfI6BBuI6HGQJzfEQEyw4CuMsR0HGEhDoIzKSBBNorBLQOMxoZAtNDQsOwVk9FmNG5wq3L
VLe4ucHnBQI6dJHApz4CM0JCrSMCWoQZNwUCer5DQqNnJDT+hAQ6WwTwxx6BKZHQUwsBJeEbwvMMAd2G
HwL+tQ/f+a4W4ZvOOX7T6YXr+BJnXN2Hbzrr8E2n9s2z9o2ticBMrpHAXfwGvQ0zPqcITPxhJn7z/FcR
lqKhYhkVi1Qsp2IZFcuoWE7FIhXLqVikYjkVi1Qsp2IZFcuoWE7FIhXLqVikYjkVi1Qsp2IZFcuoWE7F
IhXLqVikYjkViz6kWF+CsvH5wm2FgPY9JHAz+H745fuf342vEUFnj4CqJhJoFAjoMbzg8/gBCSU3SKC7
QQAvOwSmREIPbQSUnJDAY4GAmvE6duEkPldPSOA4RED9cB3PMwTm9Gohv1mF07zJXy/1n05xRhuBmdwi
geYaAW3CjNsMgemEt3QQ1upLEZaidZUEebW4UE0R0GSOhOYIzAwBlRkCmsYZBQJKwwsWsxQJ1WbUThOB
yRFQWiKgWTjNNEdA1QQJTeJpTsNpZvE043XUZixqaxVPM15HFt+PEoEpwmmWtesIM2rvR1J7z+NpxtqU
uHM5bU0mfZjCac+70Z53o2IZFcuoWE7FIhXL/TbF0gdWjYrldMciFcupWKRiORXLqFhGxTIfUSz9jEUq
ltEdy6hYTsUiFcupWKRiuV+lWPp7LKNiORWLVCynb4X0CxerE0y3hwv7CQIaLZHQAoGpENB6hIAmYcYu
R0C98IJD1UNCJQJaJQhohMBMEVB/jYDKARLo5QhoG69jvEdCky4SGMalWIbr6MYZh3ASnXSDAPYFAhos
kNAGgZntkMAmrlUSZ8wRmLhWyyECKsJSbK7i2swH3Qu9OQJajpFAL/l++NXXyXqIYLRCQHFGv0BA2yES
ymLT4oxxWN79EoGZIaHajElYvW2BgAbxOpbhJLrz8BauUwSUxP9JxRnddXhDqnCaf9b98hW1GUMEZtpH
ArW6L+KMKQIzQkJJbFoRlmKoPe9Ge95JH6ZwKpZRsYyK5VQsUrGcikUqllOxSMVyKpZRsYyK5VQsUrGc
ikUqllOxSMVyKpZRsYyK5VQsUrGcikUqlvttihU32qhYr6hY9LPesb4G5d2nCzcLBHToIYHPfQRm9BkR
tA8IaBFm3BYI6KmBhEaPSCgJMzpbBPBlj8CUSOixjYCSMxJ4miGgRryO3TUSqp6RwGmIgPpPSOAlzvgU
TuLrqoUArnMEdI4zmgjM5AYJNNYIaNtEAtcpAhPXqh9PswhL0bza7i7Nhv0LgzkCWiRIKP1++NXXmSCg
8RIBzcOMYYGANiMklG2QUJyRVAhgu0BgZkhoPUZAkxUS2BQIaLhAQvUZ4TSXKQJKwwtqM/qr8IaUcSny
10v9p1WcMUJg8gESGIW12lVhxmCKwMS1SsNa7Yo4A3cup63JpK3JTnvezX+lWPowBalYRncso2I5FYtU
LKdi0W9crJdasfZI4OsWgflnFOsDPrDa+yl/xjojMB9QrKPuWKQ7ltG3QqNiGRXLqVikYjkVi/6NYv2U
P2OpWEZ3LKdikYrlVCxSsZyKRSqW+8+LpV+8ZlQspzsWqVhOxaJfuFirYJaMLoxnCKjKkNAEgZkgoLRC
QHFGUiCgZXjBaLJEQlMElJYIqERg4nUsUwQ0WSCBZYGAkngd5RgJzcJpVnEpsvCC2oxRnDGPS5EjoEVt
uRGYPJxmMkdAZXzP44xVXKssrNWqiDNqW5OrsN38ur41GQm8sTU57Edv1bcmI4E3tiYjoVHY0vs1CfeG
uDX5a9zzXt+aXNvzHrcmx3vDXbyOfdhMflXfmoyAaluT44yr+tZkBPA5bk2+DzM+tRCYSbhNvrE1GQlc
ZwhMO7ylb2xNRgJNfZjC6MMUpE/pOBXLqFhGxXIqFqlYTsUiFcupWKRiORXLqFhGxXIqFqlYTsUiFcup
WKRiORXLqFhGxXIqFqlYTsUiFcupWKRiORXL/CTFOgfzbutCp0RA6xESaI8RmBQJ9TcIqAwzugUCOvSQ
UHpAQlkbCQyXCGiNwMwR0GGAgLIdEjgUCKi7RkLrcBKt8ogEtgkCGoXrOMUZrXAS50UfAbRzBLSLM/oI
zLSDBHoLBLSMMyYITFyr8RYBFWEp+lftYLI7XthnCGi0QgKHJQJTHRDBZoiA4oxdjoC6WyRU9ZBQGWas
EgTQGSEwUyTU2yCgcoAEujkC2o6Q0DicxHHSRQLDBQJahuvoxBnHQQcRpOE0DwUC6scZGwRmtkcC27BW
7XGYsZ8jMGsktAxr1S7ie447l9PWZNKHKZz2vBvteTcqllGxjIrlVCxSsZyKRSqWU7HMu8XSJ6GNiuV0
xyIVy6lYpGI5FcuoWEbFMh9RLP2MRSqW0R3LqFhOxSIVy6lYpGK5X6VY+nsso2I53bHoZy1WEuTV4kI1
RUCTORKaIzAzBFROENA0zsgRUFoioVmKhN6dMUFg3p+RIYE0R0BVbUa4jsU0nGYWT3MeXlCbsQgnkUzj
aRYIKIvvR4nAFOE0y9pbGmZUcUYST2IeTzPWprx6DMrW7YVmhYC2AyRwN0RgkjtE0N0hoKqNBFoFAjqH
F9wmZySUhhn9NQLaIDBzBHTqIqD0gATOBQJqb5HQpoGEynsksB8joGG4jocZAhNO4nEZTrORI6DDCAnc
dRGYaRMRdFYIaB1nZAhMLyz3MJ5mEZaioz3vRnveSR+mcCqWUbGMiuVULFKxnIpFKpZTsUjFciqWUbGM
iuVULFKxnIpFKpZTsUjFciqWUbGMiuVULFKxnIpFKpZTsUjFciqW+UmK9RSUrZsLjQoB7fpI4HaIwCS3
iKC7Q0BVmNEsENB9GwklZySU3iGB3hoBbRHQbYmAzl0klB6RwH2BgFrxOrbhJG7KBySwHyGgwT0SeIgz
bsJJPC07COAuR0DHMOO2g8BMG4igvUJA6zCjkSEwvfCWDg8IqAhL0bnKoyLCcYPDDscNDjscdzjucNzg
sMNxg8MOxx2O0+wDThOHHY4bHH4FgcFhg8MOxx2OGxx2OO5w3OCww3GH4w7HDQ47HHc4bnDnctqaTNqa
7LTn3fxXiqUPU5CKZXTHMiqWU7FIxXIqFqlY7lcplj6walQsp2KRiuX0rZBULKdiGRXLqFhGxTIqlvs5
iqWfsUjFMrpjGRXLqVikYjkVi1Qs96sUS3+PZX5Isa6D7P75wmOKgHpbJPC0QWCWT4jg0EVA6RkJ3OcI
6O6EhJYNJFSFGfshArjpITATJNQ4IqBFGwnc5Qjo3ENC/UcklN4igc4KAW3CddzGGc8tJDQOp/lUIKDW
GgkdEZj5AxI4jRDQMMx4LBGYPRLahLW6zsNSnOq/eK19d6H+i9eGSKAxQmCSBiLoxV9YFme04y9eO3WQ
UHJCQmmYEX/x2sMGgan94rUeAqr/4jUE1Kn94rUmEirD71XbjRHQMFzH/QyB2T8ggkUXATRrv3gtznjj
F68hgc4SAa3ijNovXusjodEeARVhRld73o32vJM+TOFULKNiGRXLqVikYjkVi1Qsp2KRiuVULKNiGRXL
qVikYjkVi1Qsp2KRiuVULKNiGRXLqVikYjkVi1Qsp2KRiuVULKNiGRXL/TLFWgWzZHRhPENAVYaEMgRm
goDSCgHFGUmBgJbhBaPJEgnVZpQIqERg4nUsUwQ0XSCBZYGAkngd1RgJ1dYqnmYWryPOGIWTWM3DaY7j
Wi3ijASBycNpJnMEVMYZUwQmrlUWT7M24wq/2s9kYXfnQ4qA4g7Sxw0CU9tB2kNAcQfpOUdAjfoOUiRU
hR2LuyEC6iOgpwkCah6QUBV+P2Uj7u48xesYhK2Zz1n4hYnd+g5SJFDfQRp/SeY4nOZj/OWS7bCD9OmA
wNR3kCKguIP0oURg9uEtjb9c8ibuID3izuX0YQrShymcPkxh/ivF0ocpSMUyumMZFcupWKRiORWLVCz3
qxRLH1g1KpbTHYtULKdikYrlVCyjYhkVy3xEsfQzFqlYRsUyKpbTt0JSsZyKRSqWU7GMimVULKO/IDU/
pFjLYJaOLyQzBFRmSCCZIDDTBBFkJQKKM9ICAVXhBeNJhYTyOGOOABZzBFS7jipcx3gaZixyBJTG6yjD
SYyLBRIoJwgoXkdtxjheaO39yBFQFWYkGQIT1yoNa7WcvzdjmYUv8e77kV59Dcq7TxduFgjo0EMCn/sI
zOgzImgfENAizLgrENBTAwmNHpFQEmZ0tgjgyx6BKZHQYxsBJWck8DRDQI14HftrJFQ9I4HTEAH1n5DA
S5zxKZzE11ULAVznCOgcZ7QQmMkNEmisEdA2zkgRmA4SGsTTLMJSNLXn3WjPO+nDFE7FMiqWUbGcikUq
llOxSMVyKhapWE7FMu8WK/7Nl4r1iopFumM5FYtULKdiGRXLqFhGxTIqllOxSMVyKhapWE7FMiqWUbGM
imV+SLGOwbzXudAtEdBqjIQSBCZFQMMVAir7SKBXIKB9eEEn3SGhDAGNlghohcDMEdBugICyDRLYFwio
H69j1UVC8z0SWCcIaByu4xBndMJJHKtwmt0cAW3jjAECMw2n2V8goGWcMUFghkgoiadZhBmDq34wXW8v
bKYIKFkgoQqBKRHQMkFAkzBjnSOgYXjBthwioTkCWqYIYJAgMPE6hksENB8hgWGOgFbxOtINEpoMkMA4
LkUVrmMQZ2zDSfSzcJqbAgGNKiS0RGBm4TRXGQJKV0hgM0Ng4lpVYwRUxBm4cznteSfteXfa825ULKNi
mX9KsfRhClKxjO5YRsVyKhapWE7FIhXL/SrF0gdWjYrldMciFcupWKRiORXLqFhGxTIfUSz9jEUqltEd
y6hYTsUiFcupWPQ7FevxjwsvtWLtkcCXLQKz+ooIzvENScKMWrFuHpBQrViLL0jgGBbrUxcBfY3Fuj0h
oWVYrJscAT2ELY5XvRcklIYtda0NAorF+hxn/FEvFgL4Ui8WEjojMPNnJPAwRED9eyTwUivWMbylcWvg
VR6W4v6qG0y3+wu7CQIaLZHQAoEpEdB6hIAmGySwzRFQL7xgX/aR0BwBrRIENEZgpgiov0JA5RAJ9HME
tBkjofEOCU17SGBYIaBFuI5enLEPJ9HN1ghgVyCg2ow1AjMLp7lJEVASZ8wRmLhWi3iaeZix1tZko63J
pD3vTsUyKpZRsZyKRSqWU7FIxXIqFqlYTsUyKpZRsZyKRSqWU7FIxXIqFqlYTsUyKpZRsZyKRSqWU7FI
xXIqFqlYTsUyKpZRsdwvUyxszDJlrVgIqF4sBGYU3vTWEQHFYt3OEFC9WE9IKKkVCwF8rRcLCb1RLCTw
HLfU3R2QUK1YVdjudopvej/suatt27u6D1vqVrViIaD7WrEQmHqxENA27C78nCIwtWKF7Yd/1IuVBfm8
vJQjoOkMAc0QmPiC+RQB1WYUCGgSXzCbIKF3Z0wRmHgdtRlFmDHJEdDfmFFbq3gdcUYZXzB9d61qS4HA
FAiofh3vzcjefT9qa4WCOe15J+15d/owhVGxjIplVCyjYrnfp1hhNVUso2I53bFIxXIqFqlYTsVyKhb9
U4ul3+hnVCynOxapWE7FIhXLqVhGxTIqlvmIYulnLFKxjO5YRsVyKhapWE7Fol+4WDd/uv32xzd//kd2
frrwkCL47vb2pr9FAo/rv5Lvf37/9/IRERx6TPDv9IQEzvlfgb2iEV7wtGz+FXz/80+3VZixGyL46183
t30EZsIE/27tEdCigwSvaOYI6NT/K7BXDB6QUNb4K+ALuisEtGnaCX7/8y7OeGr7Knz/c3xAAI8Fvzhe
0V4joYONx3/Mw2meRv6K7/8eHpHAQ8mE/45rtfm2Vq9fkYcZx6tzMO+2LrRLBLQeIoH2GIFJkdBgg4DK
MKNbIKBjDwmlBySUtZHAYIkATisEZo6E9n0ElO2QwKFAQL01ElqFk2iVRySwGSOgUbiOY5zR2p4QQRVO
sz1FQLsECfURmGkHCfQWCGgZZ0wQmAESGm8RUBGWoq8970Z73kkfpnAqllGxjIrlVCxSsZyKRSqWU7FI
xXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlfpliLYNZmlya
IaBygoAmCEx8QVYioDgjLRDQIp7EtEJCUwSUzRFQicDUZmQIKM5YFAgojddRmzFbIIH6WoUX1GYk8UJn
8TRzBFTVlhuByRFQGtdq/t6MZXzBJJ5mnJFdNYLJ4f7CKUNAgzUSOK8QmMUZEewGCCgLM445AmqHF9wv
2kioCjM2IwTQHCIwEyTU2SGgqocE2jkCOsTrGJ6QUNZCAv0lAlqH62jFGffdJiJIwmmeCwTUjTN2CMws
nOZ+jIBGeyRwKhGYLRJahbVq5OH9qH3D0J53oz3vTh+mMCqWUbHMP6VYYTVVLKNiORWLVCynb4WkYjkV
y6lYpGI5FYt+42LpN/oZFcvpjkUqllOxSMVyKpZRsYyKZT6iWPoZi1QsozuWUbGcikU/a7Gug+z++cJj
ioB6WyTwtEFglk+I4NBFQOkZCdznCOguvOB52UBCizBjP0QAN30EZoKEmgcEtGgjgUaOgM49JNR/RELp
HRLorBDQJlzHbZzx3L5BBOMjAngqEFB7jYSOCMz8AQmcRghoGGY8lgjMHgltwlpd52EpTld5VMwuFDjs
wgvqryj+0y/xN2bkCOhvvOADZry/FAjo3RfMcNyFVxTvfYn6C2qvwGHzb7xh778CCRTammy0NZm0592p
WEbFMiqWU7FIxXIqFqlYTsUiFcupWEbFMiqWU7FIxXIqFqlYTsUiFcupWEbFMiqWU7FIxXIqFqlYTsUi
FcupWEbFMiqW+2WK9RjMW7cXmhUC2g6QQGOIwCR3iKC7RUBVGwm0CgR07iCh5ISE0gYS6K8QwMMGAd3N
kdCph4TSAxI4FwioHa9jE07itrxHArsRAhqG67iPM24PD4hg0UUAjRwBHcKMuy4CM2kigs4SAa3CjGaG
wPTCWzrcI6AiLEXnqhNMtocL+wkCGq2Q0AKBqRDQeoSA4oxdjoB64QWHqoeESgS0ShBAd4zATJFQf42A
ygES6OUIaBuvY7xHQpNwmsMFAlr2kUA3zjiEk+ikGwSwLxDQIM7YIDCzcJqbFAElccYcgYlrtRwioCLO
wJ3Lac87ac+704cpjIplVCyjYhkVy/0+xQqrqWIZFcvpjkUqllOxSMVyKpZTsUjFcioW/cbF0m/0MyqW
0x2LVCynYpGK5VQso2IZFct8RLH0MxapWEZ3LKNiORWLftZidYPpZn9hN0FA4yUS2C2+H+59//O7Egmt
xwhoEmZscwTUDy/YVwMkFGesUgTQGyMwUyQ0WCGgcogE+jkC2sTrSHZIaNJHAqMKAS3CdfTijP3w1UJ+
k60RwK54vdR/GsYZawRmtkUCm7BW3STOmCMwca0WYa26RViK9dWXl5eX7//gP8q7zxduKnvFX6/a95DA
dd/Tv/4ZXyOC9uFb8OoVVQMJ3BV/BfaKxyYSGj/4//n3P5Iwo7tBin9edghM+Sr99s9DGwElpz+DV694
LBBQY4+Qr9iFk/hcPXn47Y/jEAENHpn+9c9znPH5/Cr99s8qnOZ1/j3wV5zijJaHf/3H5BYJNNf+iu+v
2rSQwE32Kv3+TwcJDf5cq4tXFDdIoKU970Z73kkfpnAqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrl
VCxSsZyKRSqWU7FIxXIqllGxjIrlVCxSsZyKRSqWU7FIxXIqllGxjIrlfplipUFeLS5UUwQ0mSOBaobA
zMKXKCcIaFoigTJHYMILFrMMARVhxrw2AwFVcUb2/gwEVLuOSTiJRW3GDAHV1irOWMSTiGtVFQgozqhK
BCauVVl7S9+bkZZxueNpxtqUV9iYZbL7lwtPKQLq7pDA8waBWT4jgmMXAaVhxkOOgG7PSGgVth9+XoQZ
+wECuO4hMBkSahwR0CJsd7vLEdB92OL4uf9tX99radhS11kjoG3cRhlnvLTC5sHxty11r9S2BrbijBMC
M39EAufa9sMw46lCYA5IaBN3SeZhKU64cznteSfteXf6MIVRsYyKZVQso2K536dYYTVVLKNiOd2xSMVy
KhapWE7FcioW/VOLpV+8ZlQspzsWqVhOxSIVy6lYRsUyKpZRsYyK5X6OYoXVVLGMiuV0x6IPKVYrmOzP
F44ZAhqukcBpicBUJ0SwHSKgLMzY5wios0NCVRcJlWHGeoyAhgjoNEFA3Q0SKvtIoJMjoF28jtERCWUd
JDBYIKBVuI52nHEOJ9FKtwjgWCCgXphx2iIwswMi2CUIaBxnzBGYTVjuZTzNIizF7moTzMaDC8MZAqpS
JDBMEZjJEBEkCwQUZ4xyBLQKLxhMVkioNqNEQBUCE6+jPmOJBFYFAhrF66jCSQxmaySwyBBQFq5jHWcM
wklsygQBDONaLeOMMQIzDac5jmtVxvd8isAk4Uuk8TSLOENbk422JpP2vDsVy6hYRsVyKhapWE7FIhXL
qVikYjkVy6hYRsVyKhapWE7FIhXLqVikYjkVy6hYRsVyKhapWE7FIhXLqVikYjkVy6hYRsVyv0yxdsFs
0LvQnyGgZYIE+ikCk/URwWiJgOZDJDAoENAmvKCXbZDQJMwYVwhogYBq17EZIaHJGglsCgQ0jNexCGvV
m22RwCpDQEm4jm2c0VshoTKcZj9HQOsUCY0QmDyc5jCuVRVnTBGYMRJK42nm4f0YXt0E2fn5wkOKgHpb
JPC0QWCWT4jg0ENAaZhxnyOgxgkJLRtIqAozdkME1EdgJgioeUBAizYSaOQI6NRHQoNHJJTeIYHuCgFt
mkjgNs54DidxMw6n+VggoPYaCR0QmPkDEjiNENDwiAQeSwRmH5Z700FAeViKI+5c7rfZ865PQpv4jU0f
pnD6MAWpWE7FcioWqVhOxSIVy+lnLFKxnO5YpGI5FcupWKRiORWLfuNi6e+xjIrldMciFcupWKRiORXL
qFhGxTIfUSz9jEUqltEdy/yQYn0KsocvF55TBNTdIYGXDQKzfEEEpw4CSsOMhxwB3d4jodUtElqEGYcB
AvjcQ2AyJHR3RECLFhK4zRHQfRcJ9Z6RUHqDBNprBLQN13EdZ3xpfUYEoxMCeC4QUDPOOCEw8yckcD9E
QIMzEngqEZgDEtqGtfqUh6U4X+VBMQtw3MVXFDhuivCK2gtyBFTUXoHAvP8lcNghoPoL3r8OBPQjvkR8
wd9ZbgT0/7+Od1/wxisQUKGtyUZbk0l73p2KZVQso2I5FYtULKdikYrlVCxSsZyKZVQso2I5FYtULKdi
kYrlVCxSsZyKZVQso2I5FYtULKdikYrlVCxSsZyKZVQso2I5FYtULKdiUeOqEUyO9xdOGQIarJHAeYXA
VGdEsBsgoOyABI45AmrtkdCijYTijM0IAQ0RmAkCam8RUNVFAu0cAR3idQzDSdxnLSTQXyKgVbiOVpxx
30NCyQ4BnAsE1I0zdgjM7IQE9mMENA7LfZojMHGtVvE08zgDBXPZ4x8XXmp73vdI4OsWgVl9RQTnuFc8
CTPqe94fkNAbe96RQH3POwL6Gve8356Q0DL87/YmR0AP8Tp6L0goDfeG1gYBxT3vn+OMP+p73hHAl/qe
dyR0RmDm4TQfhgiof48EXmp73o9I6I0970jgN/4whT4JbeI3Nn1Kx+lTOqRiORXLqVikYjkVi1Qsp5+x
SMVyumORiuVULKdikYrlVCz6jYulv8cyKpbTHYtULKdikYrlVCyjYhkVy3xEsfQzFqlYRncs80OKNQqm
y/WF1RQBpRUSWJUIzHyFCBYpAoozljkCGi+Q0HyMhGZhRpUhoAwB1a5jHK5jPUuQwDhHQLXryMJJrKfh
NNMSAZXxOuKMdTiJ0SQsxapAQEmcsUBginCaywkCyuKMGQJThS9RxtPM43t+dQ7mneaFdomANkMk0Boh
MEkLEfQ3CKjsIoFOgYCO4QXN9ICE0jBjsERAawRmjoAOfQSU7ZDAsUBA3Xgd6zYSKk9IYJsgoFG4jlOc
0QwncV6E02zlCGg3RkI9BGYaTrMX12rZQwLtDIGJazWOp5nHGdqabLQ1mbTn3alYRsUyKpZTsUjFcioW
qVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lY5icp1tegvMMz
M+FmgYD2PSRw3UdgRuEhoe0DAlo0kMBdgYCemkho/IiEkmsk0N0ggC87BKZEQo9tBJSckcBTfJZpY4+E
duEkPlXPSOAYn2XaD9fxPENgzl8QwSo8y/Q6R0DnOKOFwEzCc1+bawS0CTNuUgSmE97SwQkBFXHGVRHh
iZkOxw0OOxw3OOxw3OG4w3GDwwaHHY47HHc4bnDYTREYHHc4bnDY4bjBYYfjDscdjhscdjhucNjhuMNx
g8OvICAcfQWBwWGH4w7HDe5cTluTSVuT3Q/Y8/7Gb/RDAm/9Rj9E8HMW6wM+sNr7KT9M8cZv9EMEf6NY
x48vlu5YRncso2IZFcuoWE7FIhXLqVhGxTIqlqkXK6ymimVULKc7FqlYTsUiFcupWE7Fon9qsfQb/YyK
5XTHIhXLqVikYjkVy6hYRsUyH1Es/YxF9WLhQYZmcny48MaDMJFA/UGYi3tEsOsjoOyABOoPwgwveHjj
QZhIYFt7ECYCqj8Ic4eE6g/CRED1B2GekFB8EGZviYDW4TqaccZDOIlGEk7zjQdhIoG3HoSJCA7xQZij
PRJ460GYiKD+IMzwfuyvNsFsNLgwnCOgRYoEhikCMxkigmSBgOZhxqhAQOsxEpqskVBtRoWAKgRmhoDW
CQKaLJHAukBAo3gdVTiJwSyc5iJDQGl4QW3GIJzEpgxLMcwR0DLOGCMweTjNcYmAqjhjisDEtcriaRZx
hva8G+15J32YwqlYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZTsUjFcioWqVhOxSIVy6lYRsUyKpZT
sUjFcioWqVhOxSIVy6lY5icp1h9BvVgIqF4sBGYU3vTWEQEtQm9uCwRUL9YTEkpqxUJA9WIhoDeKhQSe
45a6uwMSqhWrekECp3qxkMBbxbpULxYCuq8VC4GJxWpsEFC9WAhMrVhnBFQv1vn+Uv1BmAgoPgizOfp+
+NXXiQ+p7G8QUP1BmAio9iDM5ICEstqDMBHAGw/CREJvPAgTCbzxIEwktA4n0SxPSGAbH1I5Ctfx1oMw
EcEiPKSylb9e6j/VH4SJwMQHYXbDWt2v4owJAlN/ECYCKsJS9FAwp63JpD3vTnvejYplVCzz3yiWPrBq
VCynOxapWE7FIhXLqVhGxTIqlvmIYulnLFKxjO5YRsVyKhapWE7FIhXLqVhGxTIqltFfkBoVy+mORSqW
U7FIxXIqllGxjIplPqJY+hmL6sWaB8UkKBDQbIqAcgQmR0DTGQIqwpeYxhnz//+MGQLz/oz4JeKMyX88
4/21qi33e2tV+xKz2lIgMLUXxNN8d8b7axWvY3r1EpSN6wu3FQLa9ZHAzQCBGd8ggs4eAVVNJNAoENBD
eMH1+AEJJWFGd4MAnncITImEHjoIKDkhgYcCATXjdWxvkVD1iAQOQwQ0CNfxNENgwkm8rNoI4CZHQKc4
o43ATMJpttYIaBNm3GYITBcJDY4IqIgz9GEKow9TkD6l41Qso2IZFcupWKRiORWLVCynYpGK5VQso2IZ
FcupWKRiORWLVCynYpGK5VQso2IZFcupWKRiORWLVCynYpGK5VQs85MUC0/ENGX77kKzRECbIZLvGneN
EQKTNBBCb4uAyg4SaBcI6BRecJfEZ5mmf82wSf0VAtogMHMEdOohoDQ+Z7RAQJ0NEto0kVAZnjO6GyOg
+EzW+zjjLpzEwzKcZu2ZrIcwo9FFYKYtRNCJz31ddZFAM0Ng+q/e0m//GZ/J+lCEpehe4YmYZrrCMzNh
PUFA8Vmm69qzTOfxOaPx+ZxxxipHQKP4AM/4TNb6jPCc0fpzX6dIqPa81Hl4zuio9izT8GzZ2vNSN9P4
3Nfas0zj82vjjM04fInac1/jWtWel7pEYIpwmrVnssbnpa5nCEzt2bLxLc3jDNy5nLYmk/a8O+15NyqW
UbHMf6NY+sCqUbGc7likYjkVi1Qsp2IZFcuoWOYjiqWfsUjFMrpjGRXLqVikYjkVi1Qs96sUS3+PZVQs
pzsWqVhOxSIVy6lYRsUyKpZRscwPKVY/mK63FzYTBJQskFCFwJQIaDlGQJMwY50joOEKCZVDJDRHQMsU
ASUIzBQBDZcIaD5CAsMCAa0SJJRskNBkgATGcSmqcB2DHIGJa5WF09zEtRpVSGiFwBThNFcZAkrDcm9m
CEztPQ9r1c/jjCs8etX83Uf3vpIgoA94dG96RELx8cCDFQKKj+5txEf3HmuP7t0jgR/y6N5wHefao3vD
Sbz16N5L+//Fo3tH8dG9ee3Rvbh1Ge15J+15d/GHmfjNUx+mcCqWUbGcikUqllOxSMVyKpZRsYyKZVQs
o2I5FYtULKdikYrlVCyjYhkVy6hYRsVyKhapWE7FIhXLqVhGxTIqllGxzA8p1pegbHy+cFshoH0PCVwP
EJjxNSJo7xFQFWY0CgT02ERC4wcklIQZ3Q0CeNkhMCUSemgjoOSEBB4LBNSM17G7QULVExI4DhFQ/xEJ
PMUZn08viGAVTvMmR0CnOKOFwExukUBzjYA2LSRwmyEwnbDcg7BWX4qwFK2rKiiy9EJWIKD5FAlNEZg8
fInJHAG9O6MML0inJRLKEdBkhoDmCExtxgQB5WFGGWdk8Trm8TTfX6v3ZqRxxizOyBFQbcYEgYnvRxbX
ahaWIoszqrhWtfcjvqUT3LmctiaTtiY77Xk3KpZRsYyKZVQs988olj4JbVQspzsWqVhOxSIVy6lYRsUy
Kpb5iGLpZyxSsYzuWEbFcioWqVhOxSIVy/0qxdLfYxkVy+mORSqWU7FIxXIqllGxjIplPqJY+hmL6sU6
ni7Ne+0LnTkCWo+Q0Pj74VdfJ0VAgzUCKsOMXoGA9n0klO6RUNZBAsMlAjiuEJh4HfsBAsq2SGBfIKBe
vI5VOIl2eUACmwQBjcN1HOKM9ja8IVVYik7+eqn/tI0z+gjMtIsE+gsEtIgzJgjMEAmNw1qdirAU/as/
grjn/XqBgOp73hGYUdiP3joioEXY0n5bIKD6nvcnJJTU9rwjgK/1Pe9I6I0970jgOd4b7g5IqLbnvXpB
AqchAuqF63hrz/ulVbg3fM4R0H28/zQRmLjnvbFBQHHP+3WKwMTvOf0zAtKHKYw+TGH0KR2nYpGK5VQs
UrGcimVULKNiGRXLqFhOxSIVy6lYpGI5FcuoWEbFMiqWUbGcikUqllOx6H9SrPj/tlaxXlGxSHcsp2KR
iuVULKNimXqxdsE8PgN0joCW8TmjKQITH+A5XiKgOGNYIKBNfIBntkZC8VmmSYUAtgsEZoaENrXnvq6Q
wKZAQMN4HYtwEv35BgnUnvuahhds44x+OIldGU5zkCOgVW25EZg8nOYorNUuPi91MEVg4lql8TSLOOMK
T8Q0kwOemQmnDAEN10jgvEJgFmdEsB0goCzMOOQIqF17zmh47muzCjM28TmjQwR0niCgzhYJVeE5o+3a
s0zjs2WH4YGq91l4lmm/9izTcB2156Xeh5NoJuFZpqf4TNZemHHeITCz8FjXfXwEbnxe6qlEYLZhueMz
WZtFWIratmJtTTba8+60592oWEbFMiqWUbHcP6NY+iS0UbGc7likYjkVi1Qsp2IZFcuoWOYjiqWfsUjF
MrpjGRXLqVikYjkVi1Qs96sUS3+PZVQspzsWqVhOxSIVy6lYRsUy9WLlQRHhuMHhVxAYHH4FgcFhg8MO
xw0Ov4LA4bjBYYPDDscNDr+CwOE44ajDcYPDDsdfQWBw+BUEBocNDjscNzjscPwVBAaHDQ6/goBw1OTv
PhP65gOeCX1AQPGZ0HfvPxM6PEv5hzwT+owEas+Ebnz8M6GfZwhMfNjyu8+EPn/8M6Fv6s+ERkL/xjOh
cesy2vNO2vPu4g8z8ZunPkzhVCyjYjkVi1Qsp2KRiuVULKNiGRXLqFhGxXIqFqlYTsUiFcupWEbFMiqW
UbGMiuVULFKxnIpFKpZTsYyKZVQso2KZH1Is/D4jM+80LrRKBLQZIoHmCIFJmoigv0FAZZjRKRDQqYuE
kvArnu7TMGOwQkBrBGaOgI59BJSFX8p1KhBQJ17HuoWEyvhbosYIaBiu4xxnNGq/GayHAJq139oVZ/QQ
mGk4zW7tt3aFGa0JAhPXKv5Grfv8ckaj93+veSuXxEAIUwAAAABJRU5ErkJggg==
</value>
</data>
<data name="pictureBox2.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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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
</value>
</data>
<data name="pictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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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
</value>
</data>
</root>

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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
/// <summary>
/// A panel which can select and pick colors
/// </summary>
public class ColorSelector : STUserControl
{
private Color _color;
private HSVPixel _hsv = new HSVPixel(0, 100, 100);
/// <summary>
/// The color the dialog gets and sets.
/// </summary>
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);
}
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -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();
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
//

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
//

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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));
}
}
}

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -237,6 +237,9 @@
<Compile Include="Forms\ColorAlphaBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Forms\ColorSelector.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\Editors\Object Editor\SearchNodeForm.cs">
<SubType>UserControl</SubType>
</Compile>
@ -291,9 +294,11 @@
<Compile Include="Interfaces\ModelData\IMeshContainer.cs" />
<Compile Include="Interfaces\Textures\ITextureContainer.cs" />
<Compile Include="Interfaces\Forms\IUpdateForm.cs" />
<Compile Include="IO\Extensions\ColorExtensions.cs" />
<Compile Include="IO\Extensions\StreamExport.cs" />
<Compile Include="IO\Extensions\UintExtension.cs" />
<Compile Include="IO\FileStreamStorage.cs" />
<Compile Include="IO\HSVPixel.cs" />
<Compile Include="IO\IOComoon.cs" />
<Compile Include="IO\STColor.cs" />
<Compile Include="IO\SubStream.cs" />
@ -829,6 +834,9 @@
<EmbeddedResource Include="Forms\BatchFormatExport.resx">
<DependentUpon>BatchFormatExport.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\ColorSelector.resx">
<DependentUpon>ColorSelector.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Custom\ColorSlider.resx" />
<EmbeddedResource Include="Forms\Custom\DropdownPanel\STCollapsePanelButton.resx">
<DependentUpon>STCollapsePanelButton.cs</DependentUpon>

View File

@ -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;
//