From 667ec7c752bf26d11fb05b3186a58588593df304 Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Mon, 22 Jul 2019 18:26:23 -0400 Subject: [PATCH] rgba8 channel fix for non direct x tex --- .vs/Toolbox/v15/.suo | Bin 542720 -> 540160 bytes .../FileFormats/Archives/LM2/LM2_Model.cs | 120 +++++++++++++++--- .../FileFormats/Archives/PACx30XL.cs | 101 +++++++++++++++ .../File_Format_Library.csproj | 1 + .../Generics/GenericTexture.cs | 4 +- 5 files changed, 203 insertions(+), 23 deletions(-) create mode 100644 File_Format_Library/FileFormats/Archives/PACx30XL.cs diff --git a/.vs/Toolbox/v15/.suo b/.vs/Toolbox/v15/.suo index 4aeb3eceae391e7b1465d7a595fb2480f693f122..a7b0d5875e3e18e0321c19cb541cd688ef6ae426 100644 GIT binary patch delta 5862 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 delta 8312 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 10) / 1023f, + ((value & 0b00111111_11110000_00000000_00000000) >> 20) / 1023f, + ((value & 0b11000000_00000000_00000000_00000000) >> 30) / 3f); + } + + + public static Vector2 NormalizeUvCoordsToFloat(ushort U, ushort V) + { + return new Vector2( U / 1024f, V / 1024f); } public static float UShortToFloatDecode(short input) @@ -239,6 +274,49 @@ namespace FirstPlugin.LuigisMansion.DarkMoon public void OnPropertyChanged() { } } + + public class DebugVisualBytes : TreeNodeFile, IContextMenuNode + { + public byte[] Data; + + public DebugVisualBytes(byte[] bytes) + { + Data = bytes; + } + + public override void OnClick(TreeView treeView) + { + HexEditor editor = (HexEditor)LibraryGUI.GetActiveContent(typeof(HexEditor)); + if (editor == null) + { + editor = new HexEditor(); + LibraryGUI.LoadEditor(editor); + } + editor.Text = Text; + editor.Dock = DockStyle.Fill; + editor.LoadData(Data); + } + + public ToolStripItem[] GetContextMenuItems() + { + List Items = new List(); + Items.Add(new STToolStipMenuItem("Export Raw Data", null, Export, Keys.Control | Keys.E)); + return Items.ToArray(); + } + + private void Export(object sender, EventArgs args) + { + SaveFileDialog sfd = new SaveFileDialog(); + sfd.FileName = Text; + sfd.Filter = "Raw Data (*.*)|*.*"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + System.IO.File.WriteAllBytes(sfd.FileName, Data); + } + } + } + public class LM2_IndexList { public short[] UnknownIndices { get; set; } diff --git a/File_Format_Library/FileFormats/Archives/PACx30XL.cs b/File_Format_Library/FileFormats/Archives/PACx30XL.cs new file mode 100644 index 00000000..91a676aa --- /dev/null +++ b/File_Format_Library/FileFormats/Archives/PACx30XL.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Toolbox; +using System.Windows.Forms; +using Toolbox.Library; +using Toolbox.Library.IO; + +namespace FirstPlugin +{ + public class PACx30XL : IArchiveFile, IFileFormat + { + public FileType FileType { get; set; } = FileType.Archive; + + public bool CanSave { get; set; } + public string[] Description { get; set; } = new string[] { "Sonic Forces PAC" }; + public string[] Extension { get; set; } = new string[] { "*.pac" }; + public string FileName { get; set; } + public string FilePath { get; set; } + public IFileInfo IFileInfo { get; set; } + + public bool CanAddFiles { get; set; } + public bool CanRenameFiles { get; set; } + public bool CanReplaceFiles { get; set; } + public bool CanDeleteFiles { get; set; } + + public bool Identify(System.IO.Stream stream) + { + using (var reader = new Toolbox.Library.IO.FileReader(stream, true)) + { + return reader.CheckSignature(8, "PACx301L") || reader.CheckSignature(8, "PACx302L"); + } + } + + public Type[] Types + { + get + { + List types = new List(); + return types.ToArray(); + } + } + + public List files = new List(); + + public IEnumerable Files => files; + + public void ClearFiles() { files.Clear(); } + + public void Load(System.IO.Stream stream) + { + using (var reader = new FileReader(stream)) + { + reader.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; + bool IsVersion2 = reader.CheckSignature(8, "PACx302L"); + + + + } + } + + public void Unload() + { + + } + + public byte[] Save() + { + return null; + } + + public bool AddFile(ArchiveFileInfo archiveFileInfo) + { + return false; + } + + public bool DeleteFile(ArchiveFileInfo archiveFileInfo) + { + return false; + } + + public class FileEntry : ArchiveFileInfo + { + public uint Unknown { get; set; } + + internal uint Size; + internal uint Offset; + internal uint NameOffset; + + public void Read(FileReader reader) + { + uint Unknown = reader.ReadUInt32(); + NameOffset = reader.ReadUInt32(); + Offset = reader.ReadUInt32(); + Size = reader.ReadUInt32(); + } + } + } +} diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index c40cf5c1..23d39627 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -213,6 +213,7 @@ + diff --git a/Switch_Toolbox_Library/Generics/GenericTexture.cs b/Switch_Toolbox_Library/Generics/GenericTexture.cs index 4b0bec9d..e6179ae6 100644 --- a/Switch_Toolbox_Library/Generics/GenericTexture.cs +++ b/Switch_Toolbox_Library/Generics/GenericTexture.cs @@ -444,9 +444,9 @@ namespace Toolbox.Library private Bitmap DecodeNotDirectXTex(byte[] data, uint Width, uint Height, TEX_FORMAT Format) { if (Format == TEX_FORMAT.R8G8B8A8_UNORM) - return BitmapExtension.GetBitmap(data, (int)Width, (int)Height); + return BitmapExtension.GetBitmap(ConvertBgraToRgba(data), (int)Width, (int)Height); else if (Format == TEX_FORMAT.R8G8B8A8_UNORM_SRGB) - return BitmapExtension.GetBitmap(data, (int)Width, (int)Height); + return BitmapExtension.GetBitmap(ConvertBgraToRgba(data), (int)Width, (int)Height); else if (Format == TEX_FORMAT.BC1_UNORM) return DDSCompressor.DecompressBC1(data, (int)Width, (int)Height, false); else if (Format == TEX_FORMAT.BC1_UNORM_SRGB)