mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-26 21:35:10 +00:00
Merge branch 'main' into '3dSkinRenderer'
This commit is contained in:
@@ -24,7 +24,7 @@ namespace PckStudio.IO.TGA
|
||||
{
|
||||
private static TGAWriter writer = new TGAWriter();
|
||||
|
||||
public static void SerializeToStream(ref Stream stream, Image image)
|
||||
public static void SerializeToStream(Stream stream, Image image)
|
||||
{
|
||||
writer.WriteToStream(stream, image);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@ using OMI.Formats.Pck;
|
||||
using OMI.Workers;
|
||||
using PckStudio.Internal;
|
||||
using PckStudio.Interfaces;
|
||||
using PckStudio.IO.TGA;
|
||||
using PckStudio.Internal.Deserializer;
|
||||
using PckStudio.Internal.Serializer;
|
||||
|
||||
namespace PckStudio.Extensions
|
||||
{
|
||||
@@ -20,8 +21,6 @@ namespace PckStudio.Extensions
|
||||
{
|
||||
private const string MipMap = "MipMapLevel";
|
||||
|
||||
private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
|
||||
|
||||
internal static Image GetTexture(this PckFileData file)
|
||||
{
|
||||
if (file.Filetype != PckFileType.SkinFile &&
|
||||
@@ -30,21 +29,7 @@ namespace PckStudio.Extensions
|
||||
{
|
||||
throw new Exception("File is not suitable to contain image data.");
|
||||
}
|
||||
using var stream = new MemoryStream(file.Data);
|
||||
|
||||
try
|
||||
{
|
||||
if (Path.GetExtension(file.Filename) == ".tga")
|
||||
return TGADeserializer.DeserializeFromStream(stream);
|
||||
else
|
||||
return Image.FromStream(stream);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.TraceError($"Failed to read image from pck file data({file.Filename}).");
|
||||
Debug.WriteLine(ex.Message);
|
||||
return EmptyImage;
|
||||
}
|
||||
return file.GetDeserializedData(ImageDeserializer.DefaultDeserializer);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -96,7 +81,7 @@ namespace PckStudio.Extensions
|
||||
if (file.Filetype != PckFileType.SkinFile)
|
||||
throw new InvalidOperationException("File is not a skin file");
|
||||
|
||||
file.SetData(skin.Texture, ImageFormat.Png);
|
||||
file.SetTexture(skin.Texture);
|
||||
|
||||
string skinId = skin.Id.ToString("d08");
|
||||
|
||||
@@ -137,32 +122,32 @@ namespace PckStudio.Extensions
|
||||
}
|
||||
}
|
||||
|
||||
internal static T Get<T>(this PckFileData file, IPckDeserializer<T> deserializer)
|
||||
internal static T GetDeserializedData<T>(this PckFileData file, IPckDeserializer<T> deserializer)
|
||||
{
|
||||
return deserializer.Deserialize(file);
|
||||
}
|
||||
|
||||
internal static T Get<T>(this PckFileData file, IDataFormatReader<T> deserializer) where T : class
|
||||
internal static T GetData<T>(this PckFileData file, IDataFormatReader<T> formatReader) where T : class
|
||||
{
|
||||
using var ms = new MemoryStream(file.Data);
|
||||
return deserializer.FromStream(ms);
|
||||
return formatReader.FromStream(ms);
|
||||
}
|
||||
|
||||
internal static void SetData<T>(this PckFileData file, T obj, IPckFileSerializer<T> serializer)
|
||||
internal static void SetSerializedData<T>(this PckFileData file, T obj, IPckFileSerializer<T> serializer)
|
||||
{
|
||||
serializer.Serialize(obj, ref file);
|
||||
}
|
||||
|
||||
internal static void SetData(this PckFileData file, IDataFormatWriter writer)
|
||||
internal static void SetData(this PckFileData file, IDataFormatWriter formatWriter)
|
||||
{
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
writer.WriteToStream(stream);
|
||||
formatWriter.WriteToStream(stream);
|
||||
file.SetData(stream.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetData(this PckFileData file, Image image, ImageFormat imageFormat)
|
||||
internal static void SetTexture(this PckFileData file, Image image)
|
||||
{
|
||||
if (file.Filetype != PckFileType.SkinFile &&
|
||||
file.Filetype != PckFileType.CapeFile &&
|
||||
@@ -170,12 +155,7 @@ namespace PckStudio.Extensions
|
||||
{
|
||||
throw new Exception("File is not suitable to contain image data.");
|
||||
}
|
||||
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
image.Save(stream, imageFormat);
|
||||
file.SetData(stream.ToArray());
|
||||
}
|
||||
file.SetSerializedData(image, ImageSerializer.DefaultSerializer);
|
||||
}
|
||||
|
||||
internal static bool IsMipmappedFile(this PckFileData file)
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace PckStudio.Extensions
|
||||
skinFile.AddProperty(offset.ToProperty());
|
||||
}
|
||||
|
||||
skinFile.SetData(skin.Texture, ImageFormat.Png);
|
||||
skinFile.SetTexture(skin.Texture);
|
||||
|
||||
return skinFile;
|
||||
}
|
||||
@@ -64,7 +64,7 @@ namespace PckStudio.Extensions
|
||||
throw new InvalidOperationException("Skin does not contain a cape.");
|
||||
string skinId = skin.Id.ToString("d08");
|
||||
PckFileData capeFile = new PckFileData($"dlccape{skinId}.png", PckFileType.CapeFile);
|
||||
capeFile.SetData(skin.CapeTexture, ImageFormat.Png);
|
||||
capeFile.SetTexture(skin.CapeTexture);
|
||||
return capeFile;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,7 +246,7 @@ namespace PckStudio.Features
|
||||
|
||||
private void openSkinPackToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DLCTreeView.SelectedNode.Tag is DLCDirectoryInfo dlcDir)
|
||||
if (DLCTreeView.SelectedNode?.Tag is DLCDirectoryInfo dlcDir)
|
||||
{
|
||||
Program.MainInstance.LoadPckFromFile(dlcDir.PackPath);
|
||||
}
|
||||
@@ -254,7 +254,7 @@ namespace PckStudio.Features
|
||||
|
||||
private void openTexturePackToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (DLCTreeView.SelectedNode.Tag is DLCDirectoryInfo dlcDir && dlcDir.HasTexturePack)
|
||||
if (DLCTreeView.SelectedNode?.Tag is DLCDirectoryInfo dlcDir && dlcDir.HasTexturePack)
|
||||
{
|
||||
Program.MainInstance.LoadPckFromFile(dlcDir.TexturePackPath);
|
||||
}
|
||||
|
||||
@@ -32,9 +32,8 @@ using PckStudio.Forms.Additional_Popups.Animation;
|
||||
using PckStudio.Extensions;
|
||||
using PckStudio.Properties;
|
||||
using PckStudio.Internal;
|
||||
using PckStudio.Internal.Json;
|
||||
using PckStudio.Helper;
|
||||
using AnimatedGif;
|
||||
using PckStudio.Internal.Deserializer;
|
||||
|
||||
namespace PckStudio.Forms.Editor
|
||||
{
|
||||
|
||||
@@ -32,7 +32,9 @@ using OMI.Workers.Color;
|
||||
using PckStudio.Extensions;
|
||||
using PckStudio.Helper;
|
||||
using PckStudio.Internal;
|
||||
using PckStudio.Internal.Deserializer;
|
||||
using PckStudio.Internal.Json;
|
||||
using PckStudio.Internal.Serializer;
|
||||
|
||||
namespace PckStudio.Forms.Editor
|
||||
{
|
||||
@@ -252,7 +254,7 @@ namespace PckStudio.Forms.Editor
|
||||
hasAnimation &&
|
||||
animationFile.Size > 0)
|
||||
{
|
||||
var animation = animationFile.Get(AnimationDeserializer.DefaultDeserializer);
|
||||
var animation = animationFile.GetDeserializedData(AnimationDeserializer.DefaultDeserializer);
|
||||
selectTilePictureBox.Start(animation);
|
||||
}
|
||||
}
|
||||
@@ -536,7 +538,7 @@ namespace PckStudio.Forms.Editor
|
||||
PckFileType.TextureFile
|
||||
);
|
||||
|
||||
var animation = file.Get(AnimationDeserializer.DefaultDeserializer);
|
||||
var animation = file.GetDeserializedData(AnimationDeserializer.DefaultDeserializer);
|
||||
|
||||
var animationEditor = new AnimationEditor(animation, _selectedTile.Tile.InternalName, GetBlendColor());
|
||||
if (animationEditor.ShowDialog(this) != DialogResult.OK)
|
||||
@@ -544,7 +546,7 @@ namespace PckStudio.Forms.Editor
|
||||
return;
|
||||
}
|
||||
|
||||
file.SetData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
file.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
// so animations can automatically update upon saving
|
||||
SelectedIndex = _selectedTile.Index;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ using OMI.Formats.Pck;
|
||||
using PckStudio.Extensions;
|
||||
using PckStudio.Interfaces;
|
||||
|
||||
namespace PckStudio.Internal
|
||||
namespace PckStudio.Internal.Deserializer
|
||||
{
|
||||
internal sealed class AnimationDeserializer : IPckDeserializer<Animation>
|
||||
{
|
||||
39
PCK-Studio/Internal/Deserializer/ImageDeserializer.cs
Normal file
39
PCK-Studio/Internal/Deserializer/ImageDeserializer.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OMI.Formats.Pck;
|
||||
using PckStudio.Interfaces;
|
||||
using PckStudio.IO.TGA;
|
||||
|
||||
namespace PckStudio.Internal.Deserializer
|
||||
{
|
||||
internal sealed class ImageDeserializer : IPckDeserializer<Image>
|
||||
{
|
||||
public static readonly ImageDeserializer DefaultDeserializer = new ImageDeserializer();
|
||||
private static Image EmptyImage = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
|
||||
|
||||
public Image Deserialize(PckFileData file)
|
||||
{
|
||||
using var stream = new MemoryStream(file.Data);
|
||||
try
|
||||
{
|
||||
if (Path.GetExtension(file.Filename) == ".tga")
|
||||
return TGADeserializer.DeserializeFromStream(stream);
|
||||
else
|
||||
return Image.FromStream(stream);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.TraceError($"Failed to read image from pck file data({file.Filename}).");
|
||||
Debug.WriteLine(ex.Message);
|
||||
return EmptyImage;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ using OMI.Formats.Pck;
|
||||
using PckStudio.Extensions;
|
||||
using PckStudio.Interfaces;
|
||||
|
||||
namespace PckStudio.Internal
|
||||
namespace PckStudio.Internal.Serializer
|
||||
{
|
||||
internal sealed class AnimationSerializer : IPckFileSerializer<Animation>
|
||||
{
|
||||
@@ -22,7 +22,7 @@ namespace PckStudio.Internal
|
||||
string anim = animation.BuildAnim();
|
||||
file.SetProperty("ANIM", anim);
|
||||
var texture = animation.BuildTexture();
|
||||
file.SetData(texture, ImageFormat.Png);
|
||||
file.SetTexture(texture);
|
||||
}
|
||||
}
|
||||
}
|
||||
38
PCK-Studio/Internal/Serializer/ImageSerializer.cs
Normal file
38
PCK-Studio/Internal/Serializer/ImageSerializer.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OMI.Formats.Pck;
|
||||
using PckStudio.Interfaces;
|
||||
using PckStudio.IO.TGA;
|
||||
|
||||
namespace PckStudio.Internal.Serializer
|
||||
{
|
||||
internal sealed class ImageSerializer : IPckFileSerializer<Image>
|
||||
{
|
||||
public static readonly ImageSerializer DefaultSerializer = new ImageSerializer();
|
||||
|
||||
public void Serialize(Image obj, ref PckFileData file)
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
try
|
||||
{
|
||||
if (Path.GetExtension(file.Filename) == ".tga")
|
||||
TGASerializer.SerializeToStream(stream, obj);
|
||||
else
|
||||
obj.Save(stream, ImageFormat.Png);
|
||||
file.SetData(stream.ToArray());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.TraceError($"Failed to serialize image to pck file data({file.Filename}).");
|
||||
Debug.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
94
PCK-Studio/MainForm.Designer.cs
generated
94
PCK-Studio/MainForm.Designer.cs
generated
@@ -69,6 +69,12 @@
|
||||
this.generateMipMapTextureToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.viewFileInfoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.correctSkinDecimalsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.setSubPCKEndiannessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.setModelContainerFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.version1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.version2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.extractToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -144,15 +150,13 @@
|
||||
this.label11 = new MetroFramework.Controls.MetroLabel();
|
||||
this.treeViewMain = new System.Windows.Forms.TreeView();
|
||||
this.imageList = new System.Windows.Forms.ImageList(this.components);
|
||||
this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox();
|
||||
this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox();
|
||||
this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox();
|
||||
this.version3114ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
logoPictureBox = new System.Windows.Forms.PictureBox();
|
||||
toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||
toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.setSubPCKEndiannessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit();
|
||||
this.contextMenuPCKEntries.SuspendLayout();
|
||||
this.menuStrip.SuspendLayout();
|
||||
@@ -410,7 +414,8 @@
|
||||
this.generateMipMapTextureToolStripMenuItem1,
|
||||
this.viewFileInfoToolStripMenuItem,
|
||||
this.correctSkinDecimalsToolStripMenuItem,
|
||||
this.setSubPCKEndiannessToolStripMenuItem});
|
||||
this.setSubPCKEndiannessToolStripMenuItem,
|
||||
this.setModelContainerFormatToolStripMenuItem});
|
||||
this.miscFunctionsToolStripMenuItem.Name = "miscFunctionsToolStripMenuItem";
|
||||
resources.ApplyResources(this.miscFunctionsToolStripMenuItem, "miscFunctionsToolStripMenuItem");
|
||||
//
|
||||
@@ -432,6 +437,47 @@
|
||||
resources.ApplyResources(this.correctSkinDecimalsToolStripMenuItem, "correctSkinDecimalsToolStripMenuItem");
|
||||
this.correctSkinDecimalsToolStripMenuItem.Click += new System.EventHandler(this.correctSkinDecimalsToolStripMenuItem_Click);
|
||||
//
|
||||
// setSubPCKEndiannessToolStripMenuItem
|
||||
//
|
||||
this.setSubPCKEndiannessToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem,
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem});
|
||||
this.setSubPCKEndiannessToolStripMenuItem.Name = "setSubPCKEndiannessToolStripMenuItem";
|
||||
resources.ApplyResources(this.setSubPCKEndiannessToolStripMenuItem, "setSubPCKEndiannessToolStripMenuItem");
|
||||
//
|
||||
// bigEndianXbox360PS3WiiUToolStripMenuItem
|
||||
//
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem.Name = "bigEndianXbox360PS3WiiUToolStripMenuItem";
|
||||
resources.ApplyResources(this.bigEndianXbox360PS3WiiUToolStripMenuItem, "bigEndianXbox360PS3WiiUToolStripMenuItem");
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem.Click += new System.EventHandler(this.bigEndianToolStripMenuItem_Click);
|
||||
//
|
||||
// littleEndianPS4PSVitaSwitchToolStripMenuItem
|
||||
//
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Name = "littleEndianPS4PSVitaSwitchToolStripMenuItem";
|
||||
resources.ApplyResources(this.littleEndianPS4PSVitaSwitchToolStripMenuItem, "littleEndianPS4PSVitaSwitchToolStripMenuItem");
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Click += new System.EventHandler(this.littleEndianToolStripMenuItem_Click);
|
||||
//
|
||||
// setModelContainerFormatToolStripMenuItem
|
||||
//
|
||||
this.setModelContainerFormatToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.version1ToolStripMenuItem,
|
||||
this.version2ToolStripMenuItem,
|
||||
this.version3114ToolStripMenuItem});
|
||||
this.setModelContainerFormatToolStripMenuItem.Name = "setModelContainerFormatToolStripMenuItem";
|
||||
resources.ApplyResources(this.setModelContainerFormatToolStripMenuItem, "setModelContainerFormatToolStripMenuItem");
|
||||
//
|
||||
// version1ToolStripMenuItem
|
||||
//
|
||||
this.version1ToolStripMenuItem.Name = "version1ToolStripMenuItem";
|
||||
resources.ApplyResources(this.version1ToolStripMenuItem, "version1ToolStripMenuItem");
|
||||
this.version1ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion1ToolStripMenuItem_Click);
|
||||
//
|
||||
// version2ToolStripMenuItem
|
||||
//
|
||||
this.version2ToolStripMenuItem.Name = "version2ToolStripMenuItem";
|
||||
resources.ApplyResources(this.version2ToolStripMenuItem, "version2ToolStripMenuItem");
|
||||
this.version2ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion2ToolStripMenuItem_Click);
|
||||
//
|
||||
// moveUpToolStripMenuItem
|
||||
//
|
||||
this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem";
|
||||
@@ -1082,14 +1128,6 @@
|
||||
resources.ApplyResources(this.imageList, "imageList");
|
||||
this.imageList.TransparentColor = System.Drawing.Color.Transparent;
|
||||
//
|
||||
// previewPictureBox
|
||||
//
|
||||
resources.ApplyResources(this.previewPictureBox, "previewPictureBox");
|
||||
this.previewPictureBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
|
||||
this.previewPictureBox.Name = "previewPictureBox";
|
||||
this.previewPictureBox.TabStop = false;
|
||||
//
|
||||
// LittleEndianCheckBox
|
||||
//
|
||||
resources.ApplyResources(this.LittleEndianCheckBox, "LittleEndianCheckBox");
|
||||
@@ -1099,25 +1137,19 @@
|
||||
this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark;
|
||||
this.LittleEndianCheckBox.UseSelectable = true;
|
||||
//
|
||||
// setSubPCKEndiannessToolStripMenuItem
|
||||
// previewPictureBox
|
||||
//
|
||||
this.setSubPCKEndiannessToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem,
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem});
|
||||
this.setSubPCKEndiannessToolStripMenuItem.Name = "setSubPCKEndiannessToolStripMenuItem";
|
||||
resources.ApplyResources(this.setSubPCKEndiannessToolStripMenuItem, "setSubPCKEndiannessToolStripMenuItem");
|
||||
resources.ApplyResources(this.previewPictureBox, "previewPictureBox");
|
||||
this.previewPictureBox.BackColor = System.Drawing.Color.Transparent;
|
||||
this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
|
||||
this.previewPictureBox.Name = "previewPictureBox";
|
||||
this.previewPictureBox.TabStop = false;
|
||||
//
|
||||
// bigEndianXbox360PS3WiiUToolStripMenuItem
|
||||
// version3114ToolStripMenuItem
|
||||
//
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem.Name = "bigEndianXbox360PS3WiiUToolStripMenuItem";
|
||||
resources.ApplyResources(this.bigEndianXbox360PS3WiiUToolStripMenuItem, "bigEndianXbox360PS3WiiUToolStripMenuItem");
|
||||
this.bigEndianXbox360PS3WiiUToolStripMenuItem.Click += new System.EventHandler(this.bigEndianToolStripMenuItem_Click);
|
||||
//
|
||||
// littleEndianPS4PSVitaSwitchToolStripMenuItem
|
||||
//
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Name = "littleEndianPS4PSVitaSwitchToolStripMenuItem";
|
||||
resources.ApplyResources(this.littleEndianPS4PSVitaSwitchToolStripMenuItem, "littleEndianPS4PSVitaSwitchToolStripMenuItem");
|
||||
this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Click += new System.EventHandler(this.littleEndianToolStripMenuItem_Click);
|
||||
this.version3114ToolStripMenuItem.Name = "version3114ToolStripMenuItem";
|
||||
resources.ApplyResources(this.version3114ToolStripMenuItem, "version3114ToolStripMenuItem");
|
||||
this.version3114ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion3ToolStripMenuItem_Click);
|
||||
//
|
||||
// MainForm
|
||||
//
|
||||
@@ -1272,6 +1304,10 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem setSubPCKEndiannessToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem bigEndianXbox360PS3WiiUToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem littleEndianPS4PSVitaSwitchToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem setModelContainerFormatToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem version1ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem version2ToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem version3114ToolStripMenuItem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,9 +10,12 @@ using System.Drawing.Imaging;
|
||||
using OMI.Formats.Pck;
|
||||
using OMI.Formats.GameRule;
|
||||
using OMI.Formats.Languages;
|
||||
using OMI.Formats.Model;
|
||||
using OMI.Workers.Archive;
|
||||
using OMI.Workers.Pck;
|
||||
using OMI.Workers.GameRule;
|
||||
using OMI.Workers.Language;
|
||||
using OMI.Workers.Model;
|
||||
using PckStudio.Properties;
|
||||
using PckStudio.Internal.FileFormats;
|
||||
using PckStudio.Forms;
|
||||
@@ -30,6 +33,9 @@ using PckStudio.Classes.Utils;
|
||||
using PckStudio.Helper;
|
||||
using System.Text.RegularExpressions;
|
||||
using PckStudio.Internal.Json;
|
||||
using PckStudio.Internal.Deserializer;
|
||||
using PckStudio.Internal.Serializer;
|
||||
using OMI.Workers;
|
||||
|
||||
namespace PckStudio
|
||||
{
|
||||
@@ -92,44 +98,38 @@ namespace PckStudio
|
||||
[PckFileType.TextureFile] = HandleTextureFile,
|
||||
[PckFileType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"),
|
||||
[PckFileType.InfoFile] = null,
|
||||
[PckFileType.TexturePackInfoFile] = HandleInnerPckFile,
|
||||
[PckFileType.TexturePackInfoFile] = null, // HandleInnerPckFile,
|
||||
[PckFileType.LocalisationFile] = HandleLocalisationFile,
|
||||
[PckFileType.GameRulesFile] = HandleGameRuleFile,
|
||||
[PckFileType.AudioFile] = HandleAudioFile,
|
||||
[PckFileType.ColourTableFile] = HandleColourFile,
|
||||
[PckFileType.GameRulesHeader] = HandleGameRuleFile,
|
||||
[PckFileType.SkinDataFile] = HandleInnerPckFile,
|
||||
[PckFileType.ModelsFile] = null, //HandleModelsFile, // Note: Uncomment when implemented
|
||||
[PckFileType.SkinDataFile] = null, // HandleInnerPckFile,
|
||||
[PckFileType.ModelsFile] = null, //HandleModelsFile, // Note: Uncomment when implemented
|
||||
[PckFileType.BehavioursFile] = HandleBehavioursFile,
|
||||
[PckFileType.MaterialFile] = HandleMaterialFile,
|
||||
};
|
||||
}
|
||||
|
||||
// TODO: decide on how to handle embedded pck files
|
||||
private void HandleInnerPckFile(PckFileData file)
|
||||
{
|
||||
// TODO: decide on how to handle embedded pck files
|
||||
return;
|
||||
if (Settings.Default.LoadSubPcks &&
|
||||
(file.Filetype == PckFileType.SkinDataFile || file.Filetype == PckFileType.TexturePackInfoFile) &&
|
||||
file.Size > 0 && treeViewMain.SelectedNode.Nodes.Count == 0)
|
||||
{
|
||||
using (var stream = new MemoryStream(file.Data))
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian);
|
||||
PckFile subPCKfile = reader.FromStream(stream);
|
||||
BuildPckTreeView(treeViewMain.SelectedNode.Nodes, subPCKfile);
|
||||
treeViewMain.SelectedNode.ExpandAll();
|
||||
|
||||
}
|
||||
catch (OverflowException ex)
|
||||
{
|
||||
MessageBox.Show(this, "Failed to open pck\n" +
|
||||
"Try checking the 'Open/Save as Switch/Vita/PS4 pck' checkbox in the upper right corner.",
|
||||
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Debug.WriteLine(ex.Message);
|
||||
}
|
||||
PckFile subPCKfile = file.GetData(new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian));
|
||||
BuildPckTreeView(treeViewMain.SelectedNode.Nodes, subPCKfile);
|
||||
treeViewMain.SelectedNode.ExpandAll();
|
||||
}
|
||||
catch (OverflowException ex)
|
||||
{
|
||||
MessageBox.Show(this, "Failed to open pck\n" +
|
||||
"Try checking the 'Open/Save as Switch/Vita/PS4 pck' checkbox in the upper right corner.",
|
||||
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Debug.WriteLine(ex.Message);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -144,9 +144,9 @@ namespace PckStudio
|
||||
|
||||
public void LoadPckFromFile(string filepath)
|
||||
{
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
treeViewMain.Nodes.Clear();
|
||||
currentPCK = openPck(filepath);
|
||||
currentPCK = OpenPck(filepath);
|
||||
if (currentPCK == null)
|
||||
{
|
||||
MessageBox.Show(this, string.Format("Failed to load {0}", Path.GetFileName(filepath)), "Error");
|
||||
@@ -211,7 +211,7 @@ namespace PckStudio
|
||||
if (!string.IsNullOrWhiteSpace(filepath))
|
||||
{
|
||||
string displayFilepath = Regex.Replace(filepath, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "~\\$3");
|
||||
var item = recentlyOpenToolStripMenuItem.DropDownItems.Add(displayFilepath, null, HandleOpenFile);
|
||||
ToolStripItem item = recentlyOpenToolStripMenuItem.DropDownItems.Add(displayFilepath, null, HandleOpenFile);
|
||||
item.Tag = filepath;
|
||||
}
|
||||
}
|
||||
@@ -219,7 +219,7 @@ namespace PckStudio
|
||||
|
||||
private void HandleOpenFile(object sender, EventArgs e)
|
||||
{
|
||||
if (((ToolStripMenuItem)sender).Tag is string filepath && File.Exists(filepath))
|
||||
if (sender is ToolStripItem menuItem && menuItem.Tag is string filepath && File.Exists(filepath))
|
||||
LoadPckFromFile(filepath);
|
||||
}
|
||||
|
||||
@@ -232,9 +232,9 @@ namespace PckStudio
|
||||
Settings.Default.RecentFiles.Insert(0, filepath);
|
||||
|
||||
for (int i = Settings.Default.RecentFiles.Count - 1; i >= 5; i--)
|
||||
{
|
||||
Settings.Default.RecentFiles.RemoveAt(i);
|
||||
}
|
||||
{
|
||||
Settings.Default.RecentFiles.RemoveAt(i);
|
||||
}
|
||||
Settings.Default.Save();
|
||||
LoadRecentFileList();
|
||||
}
|
||||
@@ -242,10 +242,23 @@ namespace PckStudio
|
||||
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
PckManager?.Close();
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
}
|
||||
|
||||
private void openToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
private void openPckManagerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
PckManager ??= new PckManager();
|
||||
PckManager.FormClosing += (s, e) => PckManager = null;
|
||||
if (!PckManager.Visible)
|
||||
{
|
||||
// Passing in a parent form will make it stay on top of every other form. -miku
|
||||
PckManager.Show();
|
||||
}
|
||||
if (PckManager.Focus())
|
||||
PckManager.BringToFront();
|
||||
}
|
||||
|
||||
private void openToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (var ofd = new OpenFileDialog())
|
||||
{
|
||||
@@ -258,7 +271,7 @@ namespace PckStudio
|
||||
}
|
||||
}
|
||||
|
||||
private PckFile openPck(string filePath)
|
||||
private PckFile OpenPck(string filePath)
|
||||
{
|
||||
isTemplateFile = false;
|
||||
saveLocation = filePath;
|
||||
@@ -501,7 +514,7 @@ namespace PckStudio
|
||||
texture = _img;
|
||||
}
|
||||
|
||||
file.SetData(texture, ImageFormat.Png);
|
||||
file.SetTexture(texture);
|
||||
wasModified = true;
|
||||
BuildMainTreeView();
|
||||
}
|
||||
@@ -512,7 +525,7 @@ namespace PckStudio
|
||||
!file.Filename.StartsWith(ResourceLocation.GetPathFromCategory(ResourceCategory.BlockAnimation)))
|
||||
return;
|
||||
|
||||
Animation animation = file.Get(AnimationDeserializer.DefaultDeserializer);
|
||||
Animation animation = file.GetDeserializedData(AnimationDeserializer.DefaultDeserializer);
|
||||
string filename = Path.GetFileNameWithoutExtension(file.Filename);
|
||||
|
||||
var textureInfos = ResourceLocation.GetCategoryFromPath(file.Filename) switch
|
||||
@@ -530,7 +543,7 @@ namespace PckStudio
|
||||
if (animationEditor.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
wasModified = true;
|
||||
file.SetData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
file.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
BuildMainTreeView();
|
||||
}
|
||||
}
|
||||
@@ -556,7 +569,7 @@ namespace PckStudio
|
||||
_ => GameRuleFile.CompressionType.Unknown
|
||||
};
|
||||
|
||||
GameRuleFile grf = file.Get(new GameRuleFileReader(compressiontype));
|
||||
GameRuleFile grf = file.GetData(new GameRuleFileReader(compressiontype));
|
||||
|
||||
using GameRuleFileEditor grfEditor = new GameRuleFileEditor(grf);
|
||||
if (grfEditor.ShowDialog(this) == DialogResult.OK)
|
||||
@@ -1087,7 +1100,7 @@ namespace PckStudio
|
||||
{
|
||||
wasModified = true;
|
||||
PckFileData file = currentPCK.CreateNewFile(animationFilepath, PckFileType.TextureFile);
|
||||
file.SetData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
file.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer);
|
||||
BuildMainTreeView();
|
||||
ReloadMetaTreeView();
|
||||
}
|
||||
@@ -1443,10 +1456,10 @@ namespace PckStudio
|
||||
PckFile infoPCK = new PckFile(3);
|
||||
|
||||
PckFileData icon = infoPCK.CreateNewFile("icon.png", PckFileType.TextureFile);
|
||||
icon.SetData(Resources.TexturePackIcon, ImageFormat.Png);
|
||||
icon.SetTexture(Resources.TexturePackIcon);
|
||||
|
||||
PckFileData comparison = infoPCK.CreateNewFile("comparison.png", PckFileType.TextureFile);
|
||||
comparison.SetData(Resources.Comparison, ImageFormat.Png);
|
||||
comparison.SetTexture(Resources.Comparison);
|
||||
|
||||
PckFileData texturepackInfo = pack.CreateNewFile($"{res}/{res}Info.pck", PckFileType.TexturePackInfoFile);
|
||||
texturepackInfo.AddProperty("PACKID", "0");
|
||||
@@ -1484,7 +1497,7 @@ namespace PckStudio
|
||||
|
||||
private void skinPackToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
TextPrompt namePrompt = new TextPrompt();
|
||||
namePrompt.OKButtonText = "Ok";
|
||||
if (namePrompt.ShowDialog(this) == DialogResult.OK)
|
||||
@@ -1498,7 +1511,7 @@ namespace PckStudio
|
||||
|
||||
private void texturePackToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
CreateTexturePackPrompt packPrompt = new CreateTexturePackPrompt();
|
||||
if (packPrompt.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
@@ -1511,7 +1524,7 @@ namespace PckStudio
|
||||
|
||||
private void mashUpPackToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
CreateTexturePackPrompt packPrompt = new CreateTexturePackPrompt();
|
||||
if (packPrompt.ShowDialog(this) == DialogResult.OK)
|
||||
{
|
||||
@@ -1535,7 +1548,7 @@ namespace PckStudio
|
||||
|
||||
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
checkSaveState();
|
||||
CheckSaveState();
|
||||
CloseEditorTab();
|
||||
}
|
||||
|
||||
@@ -1835,7 +1848,7 @@ namespace PckStudio
|
||||
pckOpen.Image = Resources.pckClosed;
|
||||
}
|
||||
|
||||
private void checkSaveState()
|
||||
private void CheckSaveState()
|
||||
{
|
||||
if (currentPCK is not null &&
|
||||
wasModified &&
|
||||
@@ -2053,7 +2066,7 @@ namespace PckStudio
|
||||
gfx.DrawImage(originalTexture, tileArea);
|
||||
}
|
||||
|
||||
MipMappedFile.SetData(mippedTexture, ImageFormat.Png);
|
||||
MipMappedFile.SetTexture(mippedTexture);
|
||||
|
||||
currentPCK.InsertFile(currentPCK.IndexOfFile(file) + i - 1, MipMappedFile);
|
||||
}
|
||||
@@ -2237,23 +2250,6 @@ namespace PckStudio
|
||||
Process.Start("https://trello.com/b/0XLNOEbe/pck-studio");
|
||||
}
|
||||
|
||||
private void openPckManagerToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
PckManager ??= new PckManager();
|
||||
PckManager.FormClosing += (s, e) =>
|
||||
{
|
||||
PckManager.Hide();
|
||||
e.Cancel = true;
|
||||
};
|
||||
if (!PckManager.Visible)
|
||||
{
|
||||
// passing in a parent form will make it stay on top of every other form. -miku
|
||||
PckManager.Show();
|
||||
}
|
||||
if (PckManager.Focus())
|
||||
PckManager.BringToFront();
|
||||
}
|
||||
|
||||
private void wavBinkaToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
using OpenFileDialog fileDialog = new OpenFileDialog
|
||||
@@ -2408,24 +2404,21 @@ namespace PckStudio
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
private void setPCKEndiannessStripMenuItem_Click(OMI.Endianness endianness)
|
||||
private void SetPckEndianness(OMI.Endianness endianness)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (treeViewMain.SelectedNode.Tag is PckFileData file && (file.Filetype is PckFileType.AudioFile || file.Filetype is PckFileType.SkinDataFile || file.Filetype is PckFileType.TexturePackInfoFile))
|
||||
{
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
dynamic reader = file.Filetype is PckFileType.AudioFile
|
||||
? new PckAudioFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)
|
||||
: new PckFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian);
|
||||
var pck = reader.FromStream(new MemoryStream(file.Data));
|
||||
dynamic writer = file.Filetype is PckFileType.AudioFile
|
||||
? new PckAudioFileWriter(pck, endianness)
|
||||
: new PckFileWriter(pck, endianness);
|
||||
writer.WriteToStream(stream);
|
||||
file.SetData(stream.ToArray());
|
||||
}
|
||||
IDataFormatReader reader = file.Filetype is PckFileType.AudioFile
|
||||
? new PckAudioFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)
|
||||
: new PckFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian);
|
||||
object pck = reader.FromStream(new MemoryStream(file.Data));
|
||||
|
||||
IDataFormatWriter writer = file.Filetype is PckFileType.AudioFile
|
||||
? new PckAudioFileWriter((PckAudioFile)pck, endianness)
|
||||
: new PckFileWriter((PckFile)pck, endianness);
|
||||
file.SetData(writer);
|
||||
wasModified = true;
|
||||
MessageBox.Show($"\"{file.Filename}\" successfully converted to {(endianness == OMI.Endianness.LittleEndian ? "little" : "big")} endian.", "Converted PCK file");
|
||||
}
|
||||
@@ -2442,7 +2435,67 @@ namespace PckStudio
|
||||
}
|
||||
}
|
||||
|
||||
private void littleEndianToolStripMenuItem_Click(object sender, EventArgs e) => setPCKEndiannessStripMenuItem_Click(OMI.Endianness.LittleEndian);
|
||||
private void bigEndianToolStripMenuItem_Click(object sender, EventArgs e) => setPCKEndiannessStripMenuItem_Click(OMI.Endianness.BigEndian);
|
||||
}
|
||||
private void littleEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.Endianness.LittleEndian);
|
||||
private void bigEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.Endianness.BigEndian);
|
||||
|
||||
private void SetModelVersion(int version)
|
||||
{
|
||||
if (treeViewMain.SelectedNode.Tag is PckFileData file && file.Filetype is PckFileType.ModelsFile)
|
||||
{
|
||||
try
|
||||
{
|
||||
ModelContainer container = file.GetData(new ModelFileReader());
|
||||
|
||||
if (container.Version == version)
|
||||
{
|
||||
MessageBox.Show(
|
||||
this,
|
||||
$"This model container is already Version {version + 1}.",
|
||||
"Can't convert", MessageBoxButtons.OK, MessageBoxIcon.Error
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (version == 2 &&
|
||||
MessageBox.Show(
|
||||
this,
|
||||
"Conversion to 1.14 models.bin format does not yet support parent declaration and may not be 100% accurate.\n" +
|
||||
"Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (container.Version > 1 &&
|
||||
MessageBox.Show(
|
||||
this,
|
||||
"Conversion from 1.14 models.bin format does not yet support parent parts and may not be 100% accurate.\n" +
|
||||
"Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
file.SetData(new ModelFileWriter(container, version));
|
||||
wasModified = true;
|
||||
MessageBox.Show(
|
||||
this,
|
||||
$"\"{file.Filename}\" successfully converted to Version {version + 1} format.",
|
||||
"Converted model container file"
|
||||
);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(this, ex.Message, "Not a valid model container file.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setModelVersion1ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(0);
|
||||
|
||||
private void setModelVersion2ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(1);
|
||||
|
||||
private void setModelVersion3ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(2);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -143,8 +143,9 @@
|
||||
<Compile Include="Extensions\SkinExtensions.cs" />
|
||||
<Compile Include="Extensions\System.Numerics.cs" />
|
||||
<Compile Include="Extensions\TreeNodeExtensions.cs" />
|
||||
<Compile Include="Internal\AnimationSerializer.cs" />
|
||||
<Compile Include="Internal\AnimationDeserializer.cs" />
|
||||
<Compile Include="Internal\Deserializer\ImageDeserializer.cs" />
|
||||
<Compile Include="Internal\Serializer\AnimationSerializer.cs" />
|
||||
<Compile Include="Internal\Deserializer\AnimationDeserializer.cs" />
|
||||
<Compile Include="Interfaces\IPckDeserializer.cs" />
|
||||
<Compile Include="Interfaces\IPckFileSerializer.cs" />
|
||||
<Compile Include="Internal\Json\Entities.cs" />
|
||||
@@ -154,6 +155,7 @@
|
||||
<Compile Include="Internal\SkinPartOffset.cs" />
|
||||
<Compile Include="Internal\CommitInfo.cs" />
|
||||
<Compile Include="Internal\ResourceLocation.cs" />
|
||||
<Compile Include="Internal\Serializer\ImageSerializer.cs" />
|
||||
<Compile Include="Internal\SkinAnimFlag.cs" />
|
||||
<Compile Include="Internal\SkinAnimMask.cs" />
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
|
||||
2
Vendor/OMI-Lib
vendored
2
Vendor/OMI-Lib
vendored
Submodule Vendor/OMI-Lib updated: 9ec8c2228b...637772bfb6
Reference in New Issue
Block a user