Merge branch 'main' into '3dSkinRenderer'

This commit is contained in:
miku-666
2024-04-06 12:22:06 +02:00
15 changed files with 1703 additions and 1677 deletions

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

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

View File

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

View File

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

View File

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