From e7a4604a6582e801733bc418075474395da4b57d Mon Sep 17 00:00:00 2001 From: Rudolf Kolbe Date: Tue, 15 Feb 2022 04:19:50 +0100 Subject: [PATCH 01/20] fix apk loading issues (#913) * fix apk loading issues Someone contacted me some days ago and notified me that some problems showed up with my APK loading implementation. Namely: file reference registration (importFilesHash) was missing split files weren't handled external resource files weren't registered This pr fixes those problems. * revert weird changes * fix missing } * fix formatting * use entry.FullName for the basePath instead of entry.Name --- AssetStudio/AssetsManager.cs | 62 ++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 818e35e..afa1727 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; @@ -245,6 +245,56 @@ namespace AssetStudio { using (ZipArchive archive = new ZipArchive(reader.BaseStream, ZipArchiveMode.Read)) { + List splitFiles = new List(); + // register all files before parsing the assets so that the external references can be found + // and find split files + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.Name.Contains(".split")) + { + string baseName = Path.GetFileNameWithoutExtension(entry.Name); + string basePath = Path.Combine(Path.GetDirectoryName(entry.FullName), baseName); + if (!splitFiles.Contains(basePath)) + { + splitFiles.Add(basePath); + importFilesHash.Add(baseName); + } + } + else + { + importFilesHash.Add(entry.Name); + } + } + + // merge split files and load the result + foreach (string basePath in splitFiles) + { + try + { + Stream splitStream = new MemoryStream(); + int i = 0; + while (true) + { + string path = $"{basePath}.split{i++}"; + ZipArchiveEntry entry = archive.GetEntry(path); + if (entry == null) + break; + using (Stream entryStream = entry.Open()) + { + entryStream.CopyTo(splitStream); + } + } + splitStream.Seek(0, SeekOrigin.Begin); + FileReader entryReader = new FileReader(basePath, splitStream); + LoadFile(entryReader); + } + catch (Exception e) + { + Logger.Error($"Error while reading zip split file {basePath}", e); + } + } + + // load all entries foreach (ZipArchiveEntry entry in archive.Entries) { try @@ -262,6 +312,14 @@ namespace AssetStudio FileReader entryReader = new FileReader(dummyPath, streamReader); LoadFile(entryReader); + if (entryReader.FileType == FileType.ResourceFile) + { + entryReader.Position = 0; + if (!resourceFileReaders.ContainsKey(entry.Name)) + { + resourceFileReaders.Add(entry.Name, entryReader); + } + } } catch (Exception e) { @@ -493,4 +551,4 @@ namespace AssetStudio } } } -} \ No newline at end of file +} From d4e21f824c1a3f940a9d6575c59e39295f96234a Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 17 Feb 2022 01:07:24 +0800 Subject: [PATCH 02/20] Fixed #919 --- AssetStudio/Classes/Shader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index fc75c00..5a4744e 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -605,7 +605,7 @@ namespace AssetStudio if ((version[0] == 2020 && version[1] > 3) || (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up (version[0] == 2021 && version[1] > 1) || - (version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 and up + (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up { m_Parameters = new SerializedProgramParameters(reader); } @@ -704,7 +704,7 @@ namespace AssetStudio if ((version[0] == 2020 && version[1] > 3) || (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up (version[0] == 2021 && version[1] > 1) || - (version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 and up + (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up { m_CommonParameters = new SerializedProgramParameters(reader); } From 44145e0b9c29ef9f1d2010fff2aa5f55cb2f43e6 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 19 Mar 2022 06:40:51 +0800 Subject: [PATCH 03/20] using IProgress --- AssetStudio/IProgress.cs | 17 ----------------- AssetStudio/Progress.cs | 6 ++++-- AssetStudioGUI/AssetStudioGUIForm.cs | 2 +- AssetStudioGUI/GUIProgress.cs | 23 ----------------------- 4 files changed, 5 insertions(+), 43 deletions(-) delete mode 100644 AssetStudio/IProgress.cs delete mode 100644 AssetStudioGUI/GUIProgress.cs diff --git a/AssetStudio/IProgress.cs b/AssetStudio/IProgress.cs deleted file mode 100644 index ab203ec..0000000 --- a/AssetStudio/IProgress.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio -{ - public interface IProgress - { - void Report(int value); - } - - public sealed class DummyProgress : IProgress - { - public void Report(int value) { } - } -} diff --git a/AssetStudio/Progress.cs b/AssetStudio/Progress.cs index a197fe2..93db838 100644 --- a/AssetStudio/Progress.cs +++ b/AssetStudio/Progress.cs @@ -1,8 +1,10 @@ -namespace AssetStudio +using System; + +namespace AssetStudio { public static class Progress { - public static IProgress Default = new DummyProgress(); + public static IProgress Default = new Progress(); private static int preValue; public static void Reset() diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index a48fb8f..8dc3a21 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -107,7 +107,7 @@ namespace AssetStudioGUI logger = new GUILogger(StatusStripUpdate); Logger.Default = logger; - Progress.Default = new GUIProgress(SetProgressBarValue); + Progress.Default = new Progress(SetProgressBarValue); Studio.StatusStripUpdate = StatusStripUpdate; } diff --git a/AssetStudioGUI/GUIProgress.cs b/AssetStudioGUI/GUIProgress.cs deleted file mode 100644 index 7efe200..0000000 --- a/AssetStudioGUI/GUIProgress.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using AssetStudio; - -namespace AssetStudioGUI -{ - class GUIProgress : IProgress - { - private Action action; - - public GUIProgress(Action action) - { - this.action = action; - } - - public void Report(int value) - { - action(value); - } - } -} From d7dcd3f40598a8d472dfabe0aee66243796106b5 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 19 Mar 2022 07:43:53 +0800 Subject: [PATCH 04/20] improved Sprite export Fixed #944 Fixed #923 --- AssetStudio/AssetsManager.cs | 12 ++++++++---- AssetStudioUtility/SpriteHelper.cs | 16 +++++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index afa1727..094754f 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -532,10 +532,6 @@ namespace AssetStudio } else if (obj is SpriteAtlas m_SpriteAtlas) { - if (m_SpriteAtlas.m_IsVariant) - { - continue; - } foreach (var m_PackedSprite in m_SpriteAtlas.m_PackedSprites) { if (m_PackedSprite.TryGet(out var m_Sprite)) @@ -544,6 +540,14 @@ namespace AssetStudio { m_Sprite.m_SpriteAtlas.Set(m_SpriteAtlas); } + else + { + m_Sprite.m_SpriteAtlas.TryGet(out var m_SpriteAtlaOld); + if (m_SpriteAtlaOld.m_IsVariant) + { + m_Sprite.m_SpriteAtlas.Set(m_SpriteAtlas); + } + } } } } diff --git a/AssetStudioUtility/SpriteHelper.cs b/AssetStudioUtility/SpriteHelper.cs index ea17f50..62e1eba 100644 --- a/AssetStudioUtility/SpriteHelper.cs +++ b/AssetStudioUtility/SpriteHelper.cs @@ -19,32 +19,38 @@ namespace AssetStudio { if (m_SpriteAtlas.m_RenderDataMap.TryGetValue(m_Sprite.m_RenderDataKey, out var spriteAtlasData) && spriteAtlasData.texture.TryGet(out var m_Texture2D)) { - return CutImage(m_Texture2D, m_Sprite, spriteAtlasData.textureRect, spriteAtlasData.textureRectOffset, spriteAtlasData.settingsRaw); + return CutImage(m_Sprite, m_Texture2D, spriteAtlasData.textureRect, spriteAtlasData.textureRectOffset, spriteAtlasData.downscaleMultiplier, spriteAtlasData.settingsRaw); } } else { if (m_Sprite.m_RD.texture.TryGet(out var m_Texture2D)) { - return CutImage(m_Texture2D, m_Sprite, m_Sprite.m_RD.textureRect, m_Sprite.m_RD.textureRectOffset, m_Sprite.m_RD.settingsRaw); + return CutImage(m_Sprite, m_Texture2D, m_Sprite.m_RD.textureRect, m_Sprite.m_RD.textureRectOffset, m_Sprite.m_RD.downscaleMultiplier, m_Sprite.m_RD.settingsRaw); } } return null; } - private static Image CutImage(Texture2D m_Texture2D, Sprite m_Sprite, Rectf textureRect, Vector2 textureRectOffset, SpriteSettings settingsRaw) + private static Image CutImage(Sprite m_Sprite, Texture2D m_Texture2D, Rectf textureRect, Vector2 textureRectOffset, float downscaleMultiplier, SpriteSettings settingsRaw) { var originalImage = m_Texture2D.ConvertToImage(false); if (originalImage != null) { using (originalImage) { + if (downscaleMultiplier > 0f && downscaleMultiplier != 1f) + { + var width = (int)(m_Texture2D.m_Width / downscaleMultiplier); + var height = (int)(m_Texture2D.m_Height / downscaleMultiplier); + originalImage.Mutate(x => x.Resize(width, height)); + } var rectX = (int)Math.Floor(textureRect.x); var rectY = (int)Math.Floor(textureRect.y); var rectRight = (int)Math.Ceiling(textureRect.x + textureRect.width); var rectBottom = (int)Math.Ceiling(textureRect.y + textureRect.height); - rectRight = Math.Min(rectRight, m_Texture2D.m_Width); - rectBottom = Math.Min(rectBottom, m_Texture2D.m_Height); + rectRight = Math.Min(rectRight, originalImage.Width); + rectBottom = Math.Min(rectBottom, originalImage.Height); var rect = new Rectangle(rectX, rectY, rectRight - rectX, rectBottom - rectY); var spriteImage = originalImage.Clone(x => x.Crop(rect)); if (settingsRaw.packed == 1) From b674e66407cb7bef477fa7a8320122d73a14d9cc Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 19 Mar 2022 07:48:39 +0800 Subject: [PATCH 05/20] Fixed #929 --- AssetStudio/TypeTreeHelper.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/AssetStudio/TypeTreeHelper.cs b/AssetStudio/TypeTreeHelper.cs index a3c5e32..c8cbc50 100644 --- a/AssetStudio/TypeTreeHelper.cs +++ b/AssetStudio/TypeTreeHelper.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Text; @@ -190,9 +191,11 @@ namespace AssetStudio value = reader.ReadSByte(); break; case "UInt8": - case "char": value = reader.ReadByte(); break; + case "char": + value = BitConverter.ToChar(reader.ReadBytes(2), 0); + break; case "short": case "SInt16": value = reader.ReadInt16(); From b90985782079dd34c0144d58a38c4611da0f493e Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 19 Mar 2022 08:06:03 +0800 Subject: [PATCH 06/20] Fixed #924 --- AssetStudioGUI/Components/TreeViewExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AssetStudioGUI/Components/TreeViewExtensions.cs b/AssetStudioGUI/Components/TreeViewExtensions.cs index d06bfa7..e166280 100644 --- a/AssetStudioGUI/Components/TreeViewExtensions.cs +++ b/AssetStudioGUI/Components/TreeViewExtensions.cs @@ -40,7 +40,7 @@ namespace AssetStudioGUI hItem = node.Handle, mask = TVIF_STATE, stateMask = TVIS_STATEIMAGEMASK, - state = 0 + state = TVIS_STATEIMAGEMASK }; SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); } From 7d3a4a10fc8efe62f6cb0a3b9ac831144c6c3e28 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sun, 20 Mar 2022 02:36:32 +0800 Subject: [PATCH 07/20] Create build.yml --- .github/workflows/build.yml | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..0672046 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,57 @@ +name: AssetStudioBuild + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v2 + - uses: microsoft/setup-msbuild@v1.1 + + - name: Download FBX SDK + run: | + md fbx + cd fbx + Invoke-WebRequest "https://damassets.autodesk.net/content/dam/autodesk/www/adn/fbx/2020-2-1/fbx202021_fbxsdk_vs2019_win.exe" -OutFile "fbxsdk.exe" + Start-Process -FilePath "fbxsdk.exe" /S -Wait + Invoke-WebRequest "https://damassets.autodesk.net/content/dam/autodesk/www/adn/fbx/2020-2-1/fbx202021_fbxsdk_vs2019_pdbs.exe" -OutFile "fbxpdb.exe" + Start-Process -FilePath "fbxpdb.exe" /S -Wait + cd .. + + - name: Nuget Restore + run: nuget restore + + - name: Build .Net472 + run: msbuild /p:Configuration=Release /p:TargetFramework=net472 /verbosity:minimal + + - name: Build .Net5 + run: msbuild /t:AssetStudioGUI:publish /p:Configuration=Release /p:TargetFramework=net5.0-windows /p:SelfContained=false /verbosity:minimal + + - name: Build .Net6 + run: msbuild /t:AssetStudioGUI:publish /p:Configuration=Release /p:TargetFramework=net6.0-windows /p:SelfContained=false /verbosity:minimal + + - name: Upload .Net472 Artifact + uses: actions/upload-artifact@v2 + with: + name: AssetStudio.net472 + path: AssetStudioGUI/bin/Release/net472 + + - name: Upload .Net5 Artifact + uses: actions/upload-artifact@v2 + with: + name: AssetStudio.net5 + path: AssetStudioGUI/bin/Release/net5.0-windows/publish + + - name: Upload .Net6 Artifact + uses: actions/upload-artifact@v2 + with: + name: AssetStudio.net6 + path: AssetStudioGUI/bin/Release/net6.0-windows/publish From b1205808e2f02e6ce49f49dcf975de5bb0cf6d0d Mon Sep 17 00:00:00 2001 From: Perfare Date: Tue, 22 Mar 2022 01:00:20 +0800 Subject: [PATCH 08/20] Fix and improve Texture2D convert --- AssetStudio/Classes/Texture2D.cs | 9 +- AssetStudioGUI/AssetStudioGUIForm.cs | 4 +- AssetStudioUtility/ImageExtensions.cs | 2 +- AssetStudioUtility/Texture2DConverter.cs | 124 +++++++++++++++++------ 4 files changed, 103 insertions(+), 36 deletions(-) diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index 45ff7ed..73d4050 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -154,7 +154,8 @@ namespace AssetStudio RGB565 = 7, R16 = 9, DXT1, - DXT5 = 12, + DXT3, + DXT5, RGBA4444, BGRA32, RHalf, @@ -165,11 +166,11 @@ namespace AssetStudio RGBAFloat, YUY2, RGB9e5Float, - BC4 = 26, - BC5, BC6H = 24, BC7, - DXT1Crunched = 28, + BC4, + BC5, + DXT1Crunched, DXT5Crunched, PVRTC_RGB2, PVRTC_RGBA2, diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 8dc3a21..7a8f2dd 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -759,7 +759,7 @@ namespace AssetStudioGUI var image = m_Texture2D.ConvertToImage(true); if (image != null) { - var bitmap = new DirectBitmap(image.ConvertToBgra32Bytes(), m_Texture2D.m_Width, m_Texture2D.m_Height); + var bitmap = new DirectBitmap(image.ConvertToBytes(), m_Texture2D.m_Width, m_Texture2D.m_Height); image.Dispose(); assetItem.InfoText = $"Width: {m_Texture2D.m_Width}\nHeight: {m_Texture2D.m_Height}\nFormat: {m_Texture2D.m_TextureFormat}"; switch (m_Texture2D.m_TextureSettings.m_FilterMode) @@ -1167,7 +1167,7 @@ namespace AssetStudioGUI var image = m_Sprite.GetImage(); if (image != null) { - var bitmap = new DirectBitmap(image.ConvertToBgra32Bytes(), image.Width, image.Height); + var bitmap = new DirectBitmap(image.ConvertToBytes(), image.Width, image.Height); image.Dispose(); assetItem.InfoText = $"Width: {bitmap.Width}\nHeight: {bitmap.Height}\n"; PreviewTexture(bitmap); diff --git a/AssetStudioUtility/ImageExtensions.cs b/AssetStudioUtility/ImageExtensions.cs index faafa10..a6cbad7 100644 --- a/AssetStudioUtility/ImageExtensions.cs +++ b/AssetStudioUtility/ImageExtensions.cs @@ -43,7 +43,7 @@ namespace AssetStudio return stream; } - public static byte[] ConvertToBgra32Bytes(this Image image) + public static byte[] ConvertToBytes(this Image image) where TPixel : unmanaged, IPixel { if (image.TryGetSinglePixelSpan(out var pixelSpan)) { diff --git a/AssetStudioUtility/Texture2DConverter.cs b/AssetStudioUtility/Texture2DConverter.cs index 2459817..ff7e4b2 100644 --- a/AssetStudioUtility/Texture2DConverter.cs +++ b/AssetStudioUtility/Texture2DConverter.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.CompilerServices; using Texture2DDecoder; namespace AssetStudio @@ -11,6 +12,7 @@ namespace AssetStudio private TextureFormat m_TextureFormat; private int[] version; private BuildTarget platform; + private int outPutSize; public Texture2DConverter(Texture2D m_Texture2D) { @@ -20,6 +22,7 @@ namespace AssetStudio m_TextureFormat = m_Texture2D.m_TextureFormat; version = m_Texture2D.version; platform = m_Texture2D.platform; + outPutSize = m_Width * m_Height * 4; } public bool DecodeTexture2D(byte[] bytes) @@ -60,6 +63,8 @@ namespace AssetStudio SwapBytesForXbox(buff); flag = DecodeDXT1(buff, bytes); break; + case TextureFormat.DXT3: + break; case TextureFormat.DXT5: //test pass SwapBytesForXbox(buff); flag = DecodeDXT5(buff, bytes); @@ -94,18 +99,18 @@ namespace AssetStudio case TextureFormat.RGB9e5Float: //test pass flag = DecodeRGB9e5Float(buff, bytes); break; - case TextureFormat.BC4: //test pass - flag = DecodeBC4(buff, bytes); - break; - case TextureFormat.BC5: //test pass - flag = DecodeBC5(buff, bytes); - break; case TextureFormat.BC6H: //test pass flag = DecodeBC6H(buff, bytes); break; case TextureFormat.BC7: //test pass flag = DecodeBC7(buff, bytes); break; + case TextureFormat.BC4: //test pass + flag = DecodeBC4(buff, bytes); + break; + case TextureFormat.BC5: //test pass + flag = DecodeBC5(buff, bytes); + break; case TextureFormat.DXT1Crunched: //test pass flag = DecodeDXT1Crunched(buff, bytes); break; @@ -194,6 +199,15 @@ namespace AssetStudio case TextureFormat.ETC2_RGBA8Crunched: //test pass flag = DecodeETC2A8Crunched(buff, bytes); break; + case TextureFormat.RG32: //test pass + flag = DecodeRG32(buff, bytes); + break; + case TextureFormat.RGB48: //test pass + flag = DecodeRGB48(buff, bytes); + break; + case TextureFormat.RGBA64: //test pass + flag = DecodeRGBA64(buff, bytes); + break; } BigArrayPool.Shared.Return(buff); return flag; @@ -214,9 +228,10 @@ namespace AssetStudio private bool DecodeAlpha8(byte[] image_data, byte[] buff) { + var size = m_Width * m_Height; var span = new Span(buff); span.Fill(0xFF); - for (var i = 0; i < m_Width * m_Height; i++) + for (var i = 0; i < size; i++) { buff[i * 4 + 3] = image_data[i]; } @@ -225,8 +240,9 @@ namespace AssetStudio private bool DecodeARGB4444(byte[] image_data, byte[] buff) { + var size = m_Width * m_Height; var pixelNew = new byte[4]; - for (var i = 0; i < m_Width * m_Height; i++) + for (var i = 0; i < size; i++) { var pixelOldShort = BitConverter.ToUInt16(image_data, i * 2); pixelNew[0] = (byte)(pixelOldShort & 0x000f); @@ -242,7 +258,8 @@ namespace AssetStudio private bool DecodeRGB24(byte[] image_data, byte[] buff) { - for (var i = 0; i < m_Width * m_Height; i++) + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) { buff[i * 4] = image_data[i * 3 + 2]; buff[i * 4 + 1] = image_data[i * 3 + 1]; @@ -254,7 +271,7 @@ namespace AssetStudio private bool DecodeRGBA32(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = image_data[i + 2]; buff[i + 1] = image_data[i + 1]; @@ -266,7 +283,7 @@ namespace AssetStudio private bool DecodeARGB32(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = image_data[i + 3]; buff[i + 1] = image_data[i + 2]; @@ -278,7 +295,8 @@ namespace AssetStudio private bool DecodeRGB565(byte[] image_data, byte[] buff) { - for (var i = 0; i < m_Width * m_Height; i++) + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) { var p = BitConverter.ToUInt16(image_data, i * 2); buff[i * 4] = (byte)((p << 3) | (p >> 2 & 7)); @@ -291,11 +309,12 @@ namespace AssetStudio private bool DecodeR16(byte[] image_data, byte[] buff) { - for (var i = 0; i < m_Width * m_Height; i++) + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) { buff[i * 4] = 0; //b buff[i * 4 + 1] = 0; //g - buff[i * 4 + 2] = image_data[i * 2 + 1]; //r + buff[i * 4 + 2] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 2)); //r buff[i * 4 + 3] = 255; //a } return true; @@ -313,8 +332,9 @@ namespace AssetStudio private bool DecodeRGBA4444(byte[] image_data, byte[] buff) { + var size = m_Width * m_Height; var pixelNew = new byte[4]; - for (var i = 0; i < m_Width * m_Height; i++) + for (var i = 0; i < size; i++) { var pixelOldShort = BitConverter.ToUInt16(image_data, i * 2); pixelNew[0] = (byte)((pixelOldShort & 0x00f0) >> 4); @@ -330,7 +350,7 @@ namespace AssetStudio private bool DecodeBGRA32(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = image_data[i]; buff[i + 1] = image_data[i + 1]; @@ -342,7 +362,7 @@ namespace AssetStudio private bool DecodeRHalf(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = 0; buff[i + 1] = 0; @@ -354,7 +374,7 @@ namespace AssetStudio private bool DecodeRGHalf(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = 0; buff[i + 1] = (byte)Math.Round(Half.ToHalf(image_data, i + 2) * 255f); @@ -366,7 +386,7 @@ namespace AssetStudio private bool DecodeRGBAHalf(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = (byte)Math.Round(Half.ToHalf(image_data, i * 2 + 4) * 255f); buff[i + 1] = (byte)Math.Round(Half.ToHalf(image_data, i * 2 + 2) * 255f); @@ -378,7 +398,7 @@ namespace AssetStudio private bool DecodeRFloat(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = 0; buff[i + 1] = 0; @@ -390,7 +410,7 @@ namespace AssetStudio private bool DecodeRGFloat(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = 0; buff[i + 1] = (byte)Math.Round(BitConverter.ToSingle(image_data, i * 2 + 4) * 255f); @@ -402,7 +422,7 @@ namespace AssetStudio private bool DecodeRGBAFloat(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { buff[i] = (byte)Math.Round(BitConverter.ToSingle(image_data, i * 4 + 8) * 255f); buff[i + 1] = (byte)Math.Round(BitConverter.ToSingle(image_data, i * 4 + 4) * 255f); @@ -412,6 +432,7 @@ namespace AssetStudio return true; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static byte ClampByte(int x) { return (byte)(byte.MaxValue < x ? byte.MaxValue : (x > byte.MinValue ? x : byte.MinValue)); @@ -449,7 +470,7 @@ namespace AssetStudio private bool DecodeRGB9e5Float(byte[] image_data, byte[] buff) { - for (var i = 0; i < buff.Length; i += 4) + for (var i = 0; i < outPutSize; i += 4) { var n = BitConverter.ToInt32(image_data, i); var scale = n >> 27 & 0x1f; @@ -571,19 +592,21 @@ namespace AssetStudio private bool DecodeRG16(byte[] image_data, byte[] buff) { - for (var i = 0; i < m_Width * m_Height; i += 2) + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) { - buff[i * 2] = 0; //B - buff[i * 2 + 1] = image_data[i + 1];//G - buff[i * 2 + 2] = image_data[i];//R - buff[i * 2 + 3] = 255;//A + buff[i * 4] = 0; //B + buff[i * 4 + 1] = image_data[i * 2 + 1];//G + buff[i * 4 + 2] = image_data[i * 2];//R + buff[i * 4 + 3] = 255;//A } return true; } private bool DecodeR8(byte[] image_data, byte[] buff) { - for (var i = 0; i < m_Width * m_Height; i++) + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) { buff[i * 4] = 0; //B buff[i * 4 + 1] = 0; //G @@ -617,6 +640,49 @@ namespace AssetStudio return false; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte DownScaleFrom16BitTo8Bit(ushort component) + { + return (byte)(((component * 255) + 32895) >> 16); + } + + private bool DecodeRG32(byte[] image_data, byte[] buff) + { + for (var i = 0; i < outPutSize; i += 4) + { + buff[i] = 0; //b + buff[i + 1] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i + 2)); //g + buff[i + 2] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i)); //r + buff[i + 3] = byte.MaxValue; //a + } + return true; + } + + private bool DecodeRGB48(byte[] image_data, byte[] buff) + { + var size = m_Width * m_Height; + for (var i = 0; i < size; i++) + { + buff[i * 4] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 6 + 4)); //b + buff[i * 4 + 1] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 6 + 2)); //g + buff[i * 4 + 2] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 6)); //r + buff[i * 4 + 3] = byte.MaxValue; //a + } + return true; + } + + private bool DecodeRGBA64(byte[] image_data, byte[] buff) + { + for (var i = 0; i < outPutSize; i += 4) + { + buff[i] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 2 + 4)); //b + buff[i + 1] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 2 + 2)); //g + buff[i + 2] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 2)); //r + buff[i + 3] = DownScaleFrom16BitTo8Bit(BitConverter.ToUInt16(image_data, i * 2 + 6)); //a + } + return true; + } + private bool UnpackCrunch(byte[] image_data, out byte[] result) { if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3) //2017.3 and up From 44514a4e108360cce54e0b818f0fec971251e06d Mon Sep 17 00:00:00 2001 From: Perfare Date: Tue, 22 Mar 2022 22:54:49 +0800 Subject: [PATCH 09/20] Fixed #941 --- AssetStudio/Classes/Shader.cs | 18 +++---- AssetStudioUtility/ShaderConverter.cs | 74 +++++++++++++++++++-------- 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 5a4744e..e5c6754 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -959,9 +959,9 @@ namespace AssetStudio //5.5 and up public SerializedShader m_ParsedForm; public ShaderCompilerPlatform[] platforms; - public uint[] offsets; - public uint[] compressedLengths; - public uint[] decompressedLengths; + public uint[][] offsets; + public uint[][] compressedLengths; + public uint[][] decompressedLengths; public byte[] compressedBlob; public Shader(ObjectReader reader) : base(reader) @@ -972,15 +972,15 @@ namespace AssetStudio platforms = reader.ReadUInt32Array().Select(x => (ShaderCompilerPlatform)x).ToArray(); if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up { - offsets = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); - compressedLengths = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); - decompressedLengths = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); + offsets = reader.ReadUInt32ArrayArray(); + compressedLengths = reader.ReadUInt32ArrayArray(); + decompressedLengths = reader.ReadUInt32ArrayArray(); } else { - offsets = reader.ReadUInt32Array(); - compressedLengths = reader.ReadUInt32Array(); - decompressedLengths = reader.ReadUInt32Array(); + offsets = reader.ReadUInt32Array().Select(x => new[] { x }).ToArray(); + compressedLengths = reader.ReadUInt32Array().Select(x => new[] { x }).ToArray(); + decompressedLengths = reader.ReadUInt32Array().Select(x => new[] { x }).ToArray(); } compressedBlob = reader.ReadUInt8Array(); reader.AlignStream(); diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index e2385bc..5ee257d 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -19,6 +19,7 @@ namespace AssetStudio using (var blobReader = new BinaryReader(new MemoryStream(decompressedBytes))) { var program = new ShaderProgram(blobReader, shader.version); + program.Read(blobReader, 0); return header + program.Export(Encoding.UTF8.GetString(shader.m_Script)); } } @@ -33,16 +34,25 @@ namespace AssetStudio private static string ConvertSerializedShader(Shader shader) { - var shaderPrograms = new ShaderProgram[shader.platforms.Length]; - for (var i = 0; i < shader.platforms.Length; i++) + var length = shader.platforms.Length; + var shaderPrograms = new ShaderProgram[length]; + for (var i = 0; i < length; i++) { - var compressedBytes = new byte[shader.compressedLengths[i]]; - Buffer.BlockCopy(shader.compressedBlob, (int)shader.offsets[i], compressedBytes, 0, (int)shader.compressedLengths[i]); - var decompressedBytes = new byte[shader.decompressedLengths[i]]; - LZ4Codec.Decode(compressedBytes, decompressedBytes); - using (var blobReader = new BinaryReader(new MemoryStream(decompressedBytes))) + for (var j = 0; j < shader.offsets[i].Length; j++) { - shaderPrograms[i] = new ShaderProgram(blobReader, shader.version); + var offset = shader.offsets[i][j]; + var compressedLength = shader.compressedLengths[i][j]; + var decompressedLength = shader.decompressedLengths[i][j]; + var decompressedBytes = new byte[decompressedLength]; + LZ4Codec.Decode(shader.compressedBlob, (int)offset, (int)compressedLength, decompressedBytes, 0, (int)decompressedLength); + using (var blobReader = new BinaryReader(new MemoryStream(decompressedBytes))) + { + if (j == 0) + { + shaderPrograms[i] = new ShaderProgram(blobReader, shader.version); + } + shaderPrograms[i].Read(blobReader, j); + } } } @@ -854,29 +864,49 @@ namespace AssetStudio "///////////////////////////////////////////\n"; } + public class ShaderSubProgramEntry + { + public int Offset; + public int Length; + public int Segment; + + public ShaderSubProgramEntry(BinaryReader reader, int[] version) + { + Offset = reader.ReadInt32(); + Length = reader.ReadInt32(); + if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up + { + Segment = reader.ReadInt32(); + } + } + } + public class ShaderProgram { + public ShaderSubProgramEntry[] entries; public ShaderSubProgram[] m_SubPrograms; public ShaderProgram(BinaryReader reader, int[] version) { var subProgramsCapacity = reader.ReadInt32(); - m_SubPrograms = new ShaderSubProgram[subProgramsCapacity]; - int entrySize; - if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up - { - entrySize = 12; - } - else - { - entrySize = 8; - } + entries = new ShaderSubProgramEntry[subProgramsCapacity]; for (int i = 0; i < subProgramsCapacity; i++) { - reader.BaseStream.Position = 4 + i * entrySize; - var offset = reader.ReadInt32(); - reader.BaseStream.Position = offset; - m_SubPrograms[i] = new ShaderSubProgram(reader); + entries[i] = new ShaderSubProgramEntry(reader, version); + } + m_SubPrograms = new ShaderSubProgram[subProgramsCapacity]; + } + + public void Read(BinaryReader reader, int segment) + { + for (int i = 0; i < entries.Length; i++) + { + var entry = entries[i]; + if (entry.Segment == segment) + { + reader.BaseStream.Position = entry.Offset; + m_SubPrograms[i] = new ShaderSubProgram(reader); + } } } From e1cfff63c3d13db8191e7ac9247e05f4d310ab5b Mon Sep 17 00:00:00 2001 From: Perfare Date: Wed, 23 Mar 2022 01:41:59 +0800 Subject: [PATCH 10/20] minor fixes and improvements --- AssetStudioGUI/AssetStudioGUIForm.cs | 45 +++++++++-------- .../Components/GameObjectTreeNode.cs | 5 -- AssetStudioGUI/Components/OpenFolderDialog.cs | 4 +- .../Components/TreeViewExtensions.cs | 48 ------------------- AssetStudioGUI/Studio.cs | 19 ++++---- AssetStudioUtility/SpriteHelper.cs | 2 +- 6 files changed, 37 insertions(+), 86 deletions(-) delete mode 100644 AssetStudioGUI/Components/TreeViewExtensions.cs diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 7a8f2dd..95a8316 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -141,7 +141,7 @@ namespace AssetStudioGUI private async void loadFile_Click(object sender, EventArgs e) { openFileDialog1.InitialDirectory = openDirectoryBackup; - if (openFileDialog1.ShowDialog() == DialogResult.OK) + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) { ResetForm(); openDirectoryBackup = Path.GetDirectoryName(openFileDialog1.FileNames[0]); @@ -167,7 +167,7 @@ namespace AssetStudioGUI private async void extractFileToolStripMenuItem_Click(object sender, EventArgs e) { - if (openFileDialog1.ShowDialog() == DialogResult.OK) + if (openFileDialog1.ShowDialog(this) == DialogResult.OK) { var saveFolderDialog = new OpenFolderDialog(); saveFolderDialog.Title = "Select the save folder"; @@ -222,10 +222,6 @@ namespace AssetStudioGUI sceneTreeView.BeginUpdate(); sceneTreeView.Nodes.AddRange(treeNodeCollection.ToArray()); - foreach (var node in treeNodeCollection) - { - node.HideCheckBox(); - } sceneTreeView.EndUpdate(); treeNodeCollection.Clear(); @@ -461,7 +457,7 @@ namespace AssetStudioGUI private void showExpOpt_Click(object sender, EventArgs e) { var exportOpt = new ExportOptions(); - exportOpt.ShowDialog(); + exportOpt.ShowDialog(this); } private void assetListView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) @@ -1384,25 +1380,32 @@ namespace AssetStudioGUI { var gameObjects = new List(); GetSelectedParentNode(sceneTreeView.Nodes, gameObjects); - var saveFileDialog = new SaveFileDialog(); - saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx"; - saveFileDialog.AddExtension = false; - saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx"; - saveFileDialog.InitialDirectory = saveDirectoryBackup; - if (saveFileDialog.ShowDialog() == DialogResult.OK) + if (gameObjects.Count > 0) { - saveDirectoryBackup = Path.GetDirectoryName(saveFileDialog.FileName); - var exportPath = saveFileDialog.FileName; - List animationList = null; - if (animation) + var saveFileDialog = new SaveFileDialog(); + saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx"; + saveFileDialog.AddExtension = false; + saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx"; + saveFileDialog.InitialDirectory = saveDirectoryBackup; + if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { - animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); - if (animationList.Count == 0) + saveDirectoryBackup = Path.GetDirectoryName(saveFileDialog.FileName); + var exportPath = saveFileDialog.FileName; + List animationList = null; + if (animation) { - animationList = null; + animationList = GetSelectedAssets().Where(x => x.Type == ClassIDType.AnimationClip).ToList(); + if (animationList.Count == 0) + { + animationList = null; + } } + ExportObjectsMergeWithAnimationClip(exportPath, gameObjects, animationList); } - ExportObjectsMergeWithAnimationClip(exportPath, gameObjects, animationList); + } + else + { + StatusStripUpdate("No Object selected for export."); } } } diff --git a/AssetStudioGUI/Components/GameObjectTreeNode.cs b/AssetStudioGUI/Components/GameObjectTreeNode.cs index f4c6e4e..f8f6fcd 100644 --- a/AssetStudioGUI/Components/GameObjectTreeNode.cs +++ b/AssetStudioGUI/Components/GameObjectTreeNode.cs @@ -7,11 +7,6 @@ namespace AssetStudioGUI { public GameObject gameObject; - public GameObjectTreeNode(string name) - { - Text = name; - } - public GameObjectTreeNode(GameObject gameObject) { this.gameObject = gameObject; diff --git a/AssetStudioGUI/Components/OpenFolderDialog.cs b/AssetStudioGUI/Components/OpenFolderDialog.cs index cd8dcea..f0b9d65 100644 --- a/AssetStudioGUI/Components/OpenFolderDialog.cs +++ b/AssetStudioGUI/Components/OpenFolderDialog.cs @@ -14,12 +14,12 @@ namespace AssetStudioGUI internal DialogResult ShowDialog(IWin32Window owner = null) { -#if NETFRAMEWORK +//#if NETFRAMEWORK if (Environment.OSVersion.Version.Major >= 6) { return ShowVistaDialog(owner); } -#endif +//#endif return ShowFolderBrowserDialog(owner); } diff --git a/AssetStudioGUI/Components/TreeViewExtensions.cs b/AssetStudioGUI/Components/TreeViewExtensions.cs deleted file mode 100644 index e166280..0000000 --- a/AssetStudioGUI/Components/TreeViewExtensions.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Windows.Forms; - -namespace AssetStudioGUI -{ - internal static class TreeViewExtensions - { - private const int TVIF_STATE = 0x8; - private const int TVIS_STATEIMAGEMASK = 0xF000; - private const int TV_FIRST = 0x1100; - private const int TVM_SETITEM = TV_FIRST + 63; - - [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] - private struct TVITEM - { - public int mask; - public IntPtr hItem; - public int state; - public int stateMask; - [MarshalAs(UnmanagedType.LPTStr)] - public string lpszText; - public int cchTextMax; - public int iImage; - public int iSelectedImage; - public int cChildren; - public IntPtr lParam; - } - - [DllImport("user32.dll", CharSet = CharSet.Auto)] - private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref TVITEM lParam); - - /// - /// Hides the checkbox for the specified node on a TreeView control. - /// - public static void HideCheckBox(this TreeNode node) - { - var tvi = new TVITEM - { - hItem = node.Handle, - mask = TVIF_STATE, - stateMask = TVIS_STATEIMAGEMASK, - state = TVIS_STATEIMAGEMASK - }; - SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); - } - } -} diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index ab7caae..c645509 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -265,7 +265,7 @@ namespace AssetStudioGUI Progress.Reset(); foreach (var assetsFile in assetsManager.assetsFileList) { - var fileNode = new GameObjectTreeNode(assetsFile.fileName); //RootNode + var fileNode = new TreeNode(assetsFile.fileName); //RootNode foreach (var obj in assetsFile.Objects) { @@ -307,11 +307,12 @@ namespace AssetStudioGUI { if (m_Father.m_GameObject.TryGet(out var parentGameObject)) { - if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode)) + if (!treeNodeDictionary.TryGetValue(parentGameObject, out var parentGameObjectNode)) { - parentNode = new GameObjectTreeNode(parentGameObject); - treeNodeDictionary.Add(parentGameObject, parentNode); + parentGameObjectNode = new GameObjectTreeNode(parentGameObject); + treeNodeDictionary.Add(parentGameObject, parentGameObjectNode); } + parentNode = parentGameObjectNode; } } } @@ -514,7 +515,7 @@ namespace AssetStudioGUI var count = nodes.Cast().Sum(x => x.Nodes.Count); int k = 0; Progress.Reset(); - foreach (GameObjectTreeNode node in nodes) + foreach (TreeNode node in nodes) { //遍历一级子节点 foreach (GameObjectTreeNode j in node.Nodes) @@ -635,7 +636,7 @@ namespace AssetStudioGUI } else { - StatusStripUpdate("No Object can be exported."); + StatusStripUpdate("No Object selected for export."); } }); } @@ -667,11 +668,11 @@ namespace AssetStudioGUI public static void GetSelectedParentNode(TreeNodeCollection nodes, List gameObjects) { - foreach (GameObjectTreeNode i in nodes) + foreach (TreeNode i in nodes) { - if (i.Checked) + if (i is GameObjectTreeNode gameObjectTreeNode && i.Checked) { - gameObjects.Add(i.gameObject); + gameObjects.Add(gameObjectTreeNode.gameObject); } else { diff --git a/AssetStudioUtility/SpriteHelper.cs b/AssetStudioUtility/SpriteHelper.cs index 62e1eba..7803827 100644 --- a/AssetStudioUtility/SpriteHelper.cs +++ b/AssetStudioUtility/SpriteHelper.cs @@ -82,7 +82,7 @@ namespace AssetStudio var polygons = triangles.Select(x => new Polygon(new LinearLineSegment(x.Select(y => new PointF(y.X, y.Y)).ToArray()))).ToArray(); IPathCollection path = new PathCollection(polygons); var matrix = Matrix3x2.CreateScale(m_Sprite.m_PixelsToUnits); - matrix *= Matrix3x2.CreateTranslation(m_Sprite.m_Rect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, m_Sprite.m_Rect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y); + matrix *= Matrix3x2.CreateTranslation(textureRect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, textureRect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y); path = path.Transform(matrix); var graphicsOptions = new GraphicsOptions { From dbb3d3fef74a3a8cb7d57bcfb3c74a61a68e9273 Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 24 Mar 2022 09:47:36 +0800 Subject: [PATCH 11/20] revert --- AssetStudioUtility/SpriteHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AssetStudioUtility/SpriteHelper.cs b/AssetStudioUtility/SpriteHelper.cs index 7803827..62e1eba 100644 --- a/AssetStudioUtility/SpriteHelper.cs +++ b/AssetStudioUtility/SpriteHelper.cs @@ -82,7 +82,7 @@ namespace AssetStudio var polygons = triangles.Select(x => new Polygon(new LinearLineSegment(x.Select(y => new PointF(y.X, y.Y)).ToArray()))).ToArray(); IPathCollection path = new PathCollection(polygons); var matrix = Matrix3x2.CreateScale(m_Sprite.m_PixelsToUnits); - matrix *= Matrix3x2.CreateTranslation(textureRect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, textureRect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y); + matrix *= Matrix3x2.CreateTranslation(m_Sprite.m_Rect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, m_Sprite.m_Rect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y); path = path.Transform(matrix); var graphicsOptions = new GraphicsOptions { From 50485a9bd39aff5cc8194bb116eeb0b07eadecbb Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 24 Mar 2022 10:38:52 +0800 Subject: [PATCH 12/20] update project file --- AssetStudio.PInvoke/AssetStudio.PInvoke.csproj | 3 ++- AssetStudio/AssetStudio.csproj | 3 ++- AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj | 3 ++- AssetStudioGUI/AssetStudioGUI.csproj | 3 ++- AssetStudioUtility/AssetStudioUtility.csproj | 3 ++- Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj b/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj index 6e6b75f..8cac907 100644 --- a/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj +++ b/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj @@ -6,7 +6,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2020-2021; Copyright © hozuki 2020 + Copyright © Perfare 2020-2022; Copyright © hozuki 2020 + embedded diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj index 850a85a..7e9262d 100644 --- a/AssetStudio/AssetStudio.csproj +++ b/AssetStudio/AssetStudio.csproj @@ -5,7 +5,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2018-2021 + Copyright © Perfare 2018-2022 + embedded diff --git a/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj b/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj index ea984fe..fe63980 100644 --- a/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj +++ b/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj @@ -6,7 +6,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2018-2021; Copyright © hozuki 2020 + Copyright © Perfare 2018-2022; Copyright © hozuki 2020 + embedded diff --git a/AssetStudioGUI/AssetStudioGUI.csproj b/AssetStudioGUI/AssetStudioGUI.csproj index 3ace84a..f6d3066 100644 --- a/AssetStudioGUI/AssetStudioGUI.csproj +++ b/AssetStudioGUI/AssetStudioGUI.csproj @@ -8,7 +8,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2018-2021 + Copyright © Perfare 2018-2022 + embedded diff --git a/AssetStudioUtility/AssetStudioUtility.csproj b/AssetStudioUtility/AssetStudioUtility.csproj index 49bb7dc..f57ec8d 100644 --- a/AssetStudioUtility/AssetStudioUtility.csproj +++ b/AssetStudioUtility/AssetStudioUtility.csproj @@ -5,7 +5,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2018-2021 + Copyright © Perfare 2018-2022 + embedded diff --git a/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj b/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj index c4f8839..23cfbc3 100644 --- a/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj +++ b/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj @@ -6,7 +6,8 @@ 0.16.0.0 0.16.0.0 0.16.0.0 - Copyright © Perfare 2020-2021; Copyright © hozuki 2020 + Copyright © Perfare 2020-2022; Copyright © hozuki 2020 + embedded From 973d50ce8b3f5cf1278be2e630c11287c12f51f8 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 21 May 2022 05:46:44 +0800 Subject: [PATCH 13/20] Fix type conversion bug --- AssetStudio/TypeTreeHelper.cs | 10 +++++++--- AssetStudioUtility/TypeDefinitionConverter.cs | 16 ++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/AssetStudio/TypeTreeHelper.cs b/AssetStudio/TypeTreeHelper.cs index c8cbc50..7b4e959 100644 --- a/AssetStudio/TypeTreeHelper.cs +++ b/AssetStudio/TypeTreeHelper.cs @@ -40,9 +40,11 @@ namespace AssetStudio value = reader.ReadSByte(); break; case "UInt8": - case "char": value = reader.ReadByte(); break; + case "char": + value = BitConverter.ToChar(reader.ReadBytes(2), 0); + break; case "short": case "SInt16": value = reader.ReadInt16(); @@ -82,7 +84,8 @@ namespace AssetStudio append = false; var str = reader.ReadAlignedString(); sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str); - i += 3; + var toSkip = GetNodes(m_Nodes, i); + i += toSkip.Count - 1; break; case "map": { @@ -233,7 +236,8 @@ namespace AssetStudio break; case "string": value = reader.ReadAlignedString(); - i += 3; + var toSkip = GetNodes(m_Nodes, i); + i += toSkip.Count - 1; break; case "map": { diff --git a/AssetStudioUtility/TypeDefinitionConverter.cs b/AssetStudioUtility/TypeDefinitionConverter.cs index 28f4f03..333a3dc 100644 --- a/AssetStudioUtility/TypeDefinitionConverter.cs +++ b/AssetStudioUtility/TypeDefinitionConverter.cs @@ -253,28 +253,28 @@ namespace AssetStudio switch (typeRef.FullName) { case "UnityEngine.AnimationCurve": - Helper.AddAnimationCurve(nodes, name, indent + 1); + Helper.AddAnimationCurve(nodes, name, indent); break; case "UnityEngine.Gradient": - Helper.AddGradient(nodes, name, indent + 1); + Helper.AddGradient(nodes, name, indent); break; case "UnityEngine.GUIStyle": - Helper.AddGUIStyle(nodes, name, indent + 1); + Helper.AddGUIStyle(nodes, name, indent); break; case "UnityEngine.RectOffset": - Helper.AddRectOffset(nodes, name, indent + 1); + Helper.AddRectOffset(nodes, name, indent); break; case "UnityEngine.Color32": - Helper.AddColor32(nodes, name, indent + 1); + Helper.AddColor32(nodes, name, indent); break; case "UnityEngine.Matrix4x4": - Helper.AddMatrix4x4(nodes, name, indent + 1); + Helper.AddMatrix4x4(nodes, name, indent); break; case "UnityEngine.Rendering.SphericalHarmonicsL2": - Helper.AddSphericalHarmonicsL2(nodes, name, indent + 1); + Helper.AddSphericalHarmonicsL2(nodes, name, indent); break; case "UnityEngine.PropertyName": - Helper.AddPropertyName(nodes, name, indent + 1); + Helper.AddPropertyName(nodes, name, indent); break; } } From 1fcf7a4364aa0153b2c8a0e21bbcf24f0a0730c2 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 21 May 2022 17:24:54 +0800 Subject: [PATCH 14/20] BundleFile fix --- AssetStudio/BundleFile.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AssetStudio/BundleFile.cs b/AssetStudio/BundleFile.cs index 3352ea7..48c85d2 100644 --- a/AssetStudio/BundleFile.cs +++ b/AssetStudio/BundleFile.cs @@ -208,6 +208,7 @@ namespace AssetStudio { reader.AlignStream(16); } + var start = reader.Position; if ((m_Header.flags & 0x80) != 0) //kArchiveBlocksInfoAtTheEnd { var position = reader.Position; @@ -279,6 +280,10 @@ namespace AssetStudio }; } } + //https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch + var blockSize = m_BlocksInfo.Sum(x => x.compressedSize); + var padding = reader.BaseStream.Length - start - m_Header.compressedBlocksInfoSize - blockSize; + reader.Position += padding; } private void ReadBlocks(EndianBinaryReader reader, Stream blocksStream) From 5b83eebdda4e1f3ce26bd0c17880e4d80aec7d04 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 21 May 2022 17:38:40 +0800 Subject: [PATCH 15/20] support 2021.3 --- AssetStudio/Classes/Material.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index 78dff83..dcc9f21 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -74,9 +74,18 @@ namespace AssetStudio var m_ShaderKeywords = reader.ReadStringArray(); } - if (version[0] >= 5) //5.0 and up + if (version[0] > 2021 || (version[0] == 2021 && version[1] >= 3)) //2021.3 and up + { + var m_ValidKeywords = reader.ReadStringArray(); + var m_InvalidKeywords = reader.ReadStringArray(); + } + else if (version[0] >= 5) //5.0 ~ 2021.2 { var m_ShaderKeywords = reader.ReadAlignedString(); + } + + if (version[0] >= 5) //5.0 and up + { var m_LightmapFlags = reader.ReadUInt32(); } From a3c16ed3d6d8cf729d20450f49c953fdda99da55 Mon Sep 17 00:00:00 2001 From: Kanglai Qian Date: Sat, 21 May 2022 21:10:02 +0800 Subject: [PATCH 16/20] avoid useless search for non exist files (#967) --- AssetStudio/AssetsManager.cs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 094754f..dd9c431 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -17,6 +17,7 @@ namespace AssetStudio internal Dictionary resourceFileReaders = new Dictionary(StringComparer.OrdinalIgnoreCase); private List importFiles = new List(); + private List noexistFiles = new List(); private HashSet importFilesHash = new HashSet(StringComparer.OrdinalIgnoreCase); private HashSet assetsFileListHash = new HashSet(StringComparer.OrdinalIgnoreCase); @@ -54,6 +55,7 @@ namespace AssetStudio importFiles.Clear(); importFilesHash.Clear(); + noexistFiles.Clear(); assetsFileListHash.Clear(); ReadAssets(); @@ -110,19 +112,26 @@ namespace AssetStudio if (!importFilesHash.Contains(sharedFileName)) { var sharedFilePath = Path.Combine(Path.GetDirectoryName(reader.FullPath), sharedFileName); - if (!File.Exists(sharedFilePath)) + if (!noexistFiles.Contains(sharedFilePath)) { - var findFiles = Directory.GetFiles(Path.GetDirectoryName(reader.FullPath), sharedFileName, SearchOption.AllDirectories); - if (findFiles.Length > 0) + if (!File.Exists(sharedFilePath)) { - sharedFilePath = findFiles[0]; + var findFiles = Directory.GetFiles(Path.GetDirectoryName(reader.FullPath), sharedFileName, SearchOption.AllDirectories); + if (findFiles.Length > 0) + { + sharedFilePath = findFiles[0]; + } } - } - if (File.Exists(sharedFilePath)) - { - importFiles.Add(sharedFilePath); - importFilesHash.Add(sharedFileName); + if (File.Exists(sharedFilePath)) + { + importFiles.Add(sharedFilePath); + importFilesHash.Add(sharedFileName); + } + else + { + noexistFiles.Add(sharedFilePath); + } } } } From dc9429feac6d991fb5f02c746dacbbabce5a50ed Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 21 May 2022 21:16:34 +0800 Subject: [PATCH 17/20] minor improvements --- AssetStudio/AssetsManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index dd9c431..5b91ea4 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -17,8 +17,8 @@ namespace AssetStudio internal Dictionary resourceFileReaders = new Dictionary(StringComparer.OrdinalIgnoreCase); private List importFiles = new List(); - private List noexistFiles = new List(); private HashSet importFilesHash = new HashSet(StringComparer.OrdinalIgnoreCase); + private HashSet noexistFiles = new HashSet(StringComparer.OrdinalIgnoreCase); private HashSet assetsFileListHash = new HashSet(StringComparer.OrdinalIgnoreCase); public void LoadFiles(params string[] files) @@ -122,7 +122,6 @@ namespace AssetStudio sharedFilePath = findFiles[0]; } } - if (File.Exists(sharedFilePath)) { importFiles.Add(sharedFilePath); From 4f88841026a424055b0b70060da7b3d05a607294 Mon Sep 17 00:00:00 2001 From: Perfare Date: Wed, 1 Jun 2022 15:33:01 +0800 Subject: [PATCH 18/20] Fixed #962 --- AssetStudio/IImported.cs | 22 ++++++++++++++++++++++ AssetStudioUtility/ModelConverter.cs | 11 +++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/AssetStudio/IImported.cs b/AssetStudio/IImported.cs index c207b17..85b2111 100644 --- a/AssetStudio/IImported.cs +++ b/AssetStudio/IImported.cs @@ -73,6 +73,28 @@ namespace AssetStudio return null; } + public ImportedFrame FindRelativeFrameWithPath(string path) + { + var subs = path.Split(new[] { '/' }, 2); + foreach (var child in children) + { + if (child.Name == subs[0]) + { + if (subs.Length == 1) + { + return child; + } + else + { + var result = child.FindRelativeFrameWithPath(subs[1]); + if (result != null) + return result; + } + } + } + return null; + } + public ImportedFrame FindFrame(string name) { if (Name == name) diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index ec1f168..ca2bcdf 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -1063,26 +1063,21 @@ namespace AssetStudio else { transformName = strs.Last(); - var parentFrameName = strs[strs.Length - 2]; - parentFrame = RootFrame.FindChild(parentFrameName); - //var parentFramePath = path.Substring(0, path.LastIndexOf('/')); - //parentFrame = RootFrame.FindFrameByPath(parentFramePath); + var parentFramePath = path.Substring(0, path.LastIndexOf('/')); + parentFrame = RootFrame.FindRelativeFrameWithPath(parentFramePath); } - var skeletonPose = avatar.m_Avatar.m_DefaultPose; var xform = skeletonPose.m_X[i]; - var frame = RootFrame.FindChild(transformName); if (frame != null) { SetFrame(frame, xform.t, xform.q, xform.s); - parentFrame.AddChild(frame); } else { frame = CreateFrame(transformName, xform.t, xform.q, xform.s); - parentFrame.AddChild(frame); } + parentFrame.AddChild(frame); } } From b70b5196e3c9fdcc9845b553a044974bb44f0964 Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 16 Jun 2022 17:45:54 +0800 Subject: [PATCH 19/20] update enum --- AssetStudio/AssetsManager.cs | 2 +- AssetStudio/BuildTarget.cs | 7 +- AssetStudio/BundleFile.cs | 79 ++++-- AssetStudio/Classes/AnimationClip.cs | 8 +- AssetStudio/Classes/AudioClip.cs | 61 +++-- AssetStudio/Classes/Mesh.cs | 200 +++++++-------- AssetStudio/Classes/PPtr.cs | 2 +- AssetStudio/Classes/Shader.cs | 161 ++++++------ AssetStudio/Classes/Sprite.cs | 18 +- AssetStudio/Classes/Texture2D.cs | 9 +- AssetStudio/SerializedFile.cs | 56 ++--- AssetStudio/SerializedFileFormatVersion.cs | 42 ++-- AssetStudioGUI/AssetStudioGUIForm.cs | 26 +- AssetStudioUtility/AudioClipConverter.cs | 40 +-- AssetStudioUtility/ShaderConverter.cs | 275 +++++++++++---------- AssetStudioUtility/SpriteHelper.cs | 10 +- 16 files changed, 527 insertions(+), 469 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 5b91ea4..eea5418 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -156,7 +156,7 @@ namespace AssetStudio { var assetsFile = new SerializedFile(reader, this); assetsFile.originalPath = originalPath; - if (!string.IsNullOrEmpty(unityVersion) && assetsFile.header.m_Version < SerializedFileFormatVersion.kUnknown_7) + if (!string.IsNullOrEmpty(unityVersion) && assetsFile.header.m_Version < SerializedFileFormatVersion.Unknown_7) { assetsFile.SetVersion(unityVersion); } diff --git a/AssetStudio/BuildTarget.cs b/AssetStudio/BuildTarget.cs index 634ba2a..742d86f 100644 --- a/AssetStudio/BuildTarget.cs +++ b/AssetStudio/BuildTarget.cs @@ -8,7 +8,8 @@ namespace AssetStudio public enum BuildTarget { NoTarget = -2, - DashboardWidget = 1, + AnyPlayer = -1, + ValidPlayer = 1, StandaloneOSX = 2, StandaloneOSXPPC = 3, StandaloneOSXIntel = 4, @@ -19,8 +20,10 @@ namespace AssetStudio iOS = 9, PS3, XBOX360, + Broadcom = 12, Android = 13, StandaloneGLESEmu = 14, + StandaloneGLES20Emu = 15, NaCl = 16, StandaloneLinux = 17, FlashPlayer = 18, @@ -48,6 +51,8 @@ namespace AssetStudio GameCoreXboxSeries, GameCoreXboxOne, PS5, + EmbeddedLinux, + QNX, UnknownPlatform = 9999 } } diff --git a/AssetStudio/BundleFile.cs b/AssetStudio/BundleFile.cs index 48c85d2..aea03af 100644 --- a/AssetStudio/BundleFile.cs +++ b/AssetStudio/BundleFile.cs @@ -1,9 +1,36 @@ using K4os.Compression.LZ4; +using System; using System.IO; using System.Linq; namespace AssetStudio { + [Flags] + public enum ArchiveFlags + { + CompressionTypeMask = 0x3f, + BlocksAndDirectoryInfoCombined = 0x40, + BlocksInfoAtTheEnd = 0x80, + OldWebPluginCompatibility = 0x100, + BlockInfoNeedPaddingAtStart = 0x200 + } + + [Flags] + public enum StorageBlockFlags + { + CompressionTypeMask = 0x3f, + Streamed = 0x40 + } + + public enum CompressionType + { + None, + Lzma, + Lz4, + Lz4HC, + Lzham + } + public class BundleFile { public class Header @@ -15,14 +42,14 @@ namespace AssetStudio public long size; public uint compressedBlocksInfoSize; public uint uncompressedBlocksInfoSize; - public uint flags; + public ArchiveFlags flags; } public class StorageBlock { public uint compressedSize; public uint uncompressedSize; - public ushort flags; + public StorageBlockFlags flags; } public class Node @@ -77,7 +104,6 @@ namespace AssetStudio private void ReadHeaderAndBlocksInfo(EndianBinaryReader reader) { - var isCompressed = m_Header.signature == "UnityWeb"; if (m_Header.version >= 4) { var hash = reader.ReadBytes(16); @@ -94,7 +120,6 @@ namespace AssetStudio { compressedSize = reader.ReadUInt32(), uncompressedSize = reader.ReadUInt32(), - flags = (ushort)(isCompressed ? 1 : 0) }; if (i == levelCount - 1) { @@ -131,10 +156,11 @@ namespace AssetStudio private void ReadBlocksAndDirectory(EndianBinaryReader reader, Stream blocksStream) { + var isCompressed = m_Header.signature == "UnityWeb"; foreach (var blockInfo in m_BlocksInfo) { var uncompressedBytes = reader.ReadBytes((int)blockInfo.compressedSize); - if (blockInfo.flags == 1) + if (isCompressed) { using (var memoryStream = new MemoryStream(uncompressedBytes)) { @@ -194,7 +220,7 @@ namespace AssetStudio m_Header.size = reader.ReadInt64(); m_Header.compressedBlocksInfoSize = reader.ReadUInt32(); m_Header.uncompressedBlocksInfoSize = reader.ReadUInt32(); - m_Header.flags = reader.ReadUInt32(); + m_Header.flags = (ArchiveFlags)reader.ReadUInt32(); if (m_Header.signature != "UnityFS") { reader.ReadByte(); @@ -208,28 +234,28 @@ namespace AssetStudio { reader.AlignStream(16); } - var start = reader.Position; - if ((m_Header.flags & 0x80) != 0) //kArchiveBlocksInfoAtTheEnd + if ((m_Header.flags & ArchiveFlags.BlocksInfoAtTheEnd) != 0) { var position = reader.Position; reader.Position = reader.BaseStream.Length - m_Header.compressedBlocksInfoSize; blocksInfoBytes = reader.ReadBytes((int)m_Header.compressedBlocksInfoSize); reader.Position = position; } - else //0x40 kArchiveBlocksAndDirectoryInfoCombined + else //0x40 BlocksAndDirectoryInfoCombined { blocksInfoBytes = reader.ReadBytes((int)m_Header.compressedBlocksInfoSize); } MemoryStream blocksInfoUncompresseddStream; var uncompressedSize = m_Header.uncompressedBlocksInfoSize; - switch (m_Header.flags & 0x3F) //kArchiveCompressionTypeMask + var compressionType = (CompressionType)(m_Header.flags & ArchiveFlags.CompressionTypeMask); + switch (compressionType) { - default: //None + case CompressionType.None: { blocksInfoUncompresseddStream = new MemoryStream(blocksInfoBytes); break; } - case 1: //LZMA + case CompressionType.Lzma: { blocksInfoUncompresseddStream = new MemoryStream((int)(uncompressedSize)); using (var blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes)) @@ -239,8 +265,8 @@ namespace AssetStudio blocksInfoUncompresseddStream.Position = 0; break; } - case 2: //LZ4 - case 3: //LZ4HC + case CompressionType.Lz4: + case CompressionType.Lz4HC: { var uncompressedBytes = new byte[uncompressedSize]; var numWrite = LZ4Codec.Decode(blocksInfoBytes, uncompressedBytes); @@ -251,6 +277,8 @@ namespace AssetStudio blocksInfoUncompresseddStream = new MemoryStream(uncompressedBytes); break; } + default: + throw new IOException($"Unsupported compression type {compressionType}"); } using (var blocksInfoReader = new EndianBinaryReader(blocksInfoUncompresseddStream)) { @@ -263,7 +291,7 @@ namespace AssetStudio { uncompressedSize = blocksInfoReader.ReadUInt32(), compressedSize = blocksInfoReader.ReadUInt32(), - flags = blocksInfoReader.ReadUInt16() + flags = (StorageBlockFlags)blocksInfoReader.ReadUInt16() }; } @@ -280,30 +308,31 @@ namespace AssetStudio }; } } - //https://issuetracker.unity3d.com/issues/files-within-assetbundles-do-not-start-on-aligned-boundaries-breaking-patching-on-nintendo-switch - var blockSize = m_BlocksInfo.Sum(x => x.compressedSize); - var padding = reader.BaseStream.Length - start - m_Header.compressedBlocksInfoSize - blockSize; - reader.Position += padding; + if ((m_Header.flags & ArchiveFlags.BlockInfoNeedPaddingAtStart) != 0) + { + reader.AlignStream(16); + } } private void ReadBlocks(EndianBinaryReader reader, Stream blocksStream) { foreach (var blockInfo in m_BlocksInfo) { - switch (blockInfo.flags & 0x3F) //kStorageBlockCompressionTypeMask + var compressionType = (CompressionType)(blockInfo.flags & StorageBlockFlags.CompressionTypeMask); + switch (compressionType) { - default: //None + case CompressionType.None: { reader.BaseStream.CopyTo(blocksStream, blockInfo.compressedSize); break; } - case 1: //LZMA + case CompressionType.Lzma: { SevenZipHelper.StreamDecompress(reader.BaseStream, blocksStream, blockInfo.compressedSize, blockInfo.uncompressedSize); break; } - case 2: //LZ4 - case 3: //LZ4HC + case CompressionType.Lz4: + case CompressionType.Lz4HC: { var compressedSize = (int)blockInfo.compressedSize; var compressedBytes = BigArrayPool.Shared.Rent(compressedSize); @@ -320,6 +349,8 @@ namespace AssetStudio BigArrayPool.Shared.Return(uncompressedBytes); break; } + default: + throw new IOException($"Unsupported compression type {compressionType}"); } } blocksStream.Position = 0; diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 8b9967c..95a381a 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -909,9 +909,9 @@ namespace AssetStudio public enum AnimationType { - kLegacy = 1, - kGeneric = 2, - kHumanoid = 3 + Legacy = 1, + Generic = 2, + Humanoid = 3 }; public sealed class AnimationClip : NamedObject @@ -945,7 +945,7 @@ namespace AssetStudio else if (version[0] >= 4)//4.0 and up { m_AnimationType = (AnimationType)reader.ReadInt32(); - if (m_AnimationType == AnimationType.kLegacy) + if (m_AnimationType == AnimationType.Legacy) m_Legacy = true; } else diff --git a/AssetStudio/Classes/AudioClip.cs b/AssetStudio/Classes/AudioClip.cs index 4dcf268..90a226c 100644 --- a/AssetStudio/Classes/AudioClip.cs +++ b/AssetStudio/Classes/AudioClip.cs @@ -9,7 +9,7 @@ namespace AssetStudio public sealed class AudioClip : NamedObject { public int m_Format; - public AudioType m_Type; + public FMODSoundType m_Type; public bool m_3D; public bool m_UseHardware; @@ -36,7 +36,7 @@ namespace AssetStudio if (version[0] < 5) { m_Format = reader.ReadInt32(); - m_Type = (AudioType)reader.ReadInt32(); + m_Type = (FMODSoundType)reader.ReadInt32(); m_3D = reader.ReadBoolean(); m_UseHardware = reader.ReadBoolean(); reader.AlignStream(); @@ -92,34 +92,51 @@ namespace AssetStudio } } - public enum AudioType + public enum FMODSoundType { - UNKNOWN, - ACC, - AIFF, + UNKNOWN = 0, + ACC = 1, + AIFF = 2, + ASF = 3, + AT3 = 4, + CDDA = 5, + DLS = 6, + FLAC = 7, + FSB = 8, + GCADPCM = 9, IT = 10, + MIDI = 11, MOD = 12, - MPEG, - OGGVORBIS, + MPEG = 13, + OGGVORBIS = 14, + PLAYLIST = 15, + RAW = 16, S3M = 17, + SF2 = 18, + USER = 19, WAV = 20, - XM, - XMA, - VAG, - AUDIOQUEUE + XM = 21, + XMA = 22, + VAG = 23, + AUDIOQUEUE = 24, + XWMA = 25, + BCWAV = 26, + AT9 = 27, + VORBIS = 28, + MEDIA_FOUNDATION = 29 } public enum AudioCompressionFormat { - PCM, - Vorbis, - ADPCM, - MP3, - VAG, - HEVAG, - XMA, - AAC, - GCADPCM, - ATRAC9 + PCM = 0, + Vorbis = 1, + ADPCM = 2, + MP3 = 3, + PSMVAG = 4, + HEVAG = 5, + XMA = 6, + AAC = 7, + GCADPCM = 8, + ATRAC9 = 9 } } diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 0a2369d..c936d14 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -396,14 +396,14 @@ namespace AssetStudio } } - public enum GfxPrimitiveType : int + public enum GfxPrimitiveType { - kPrimitiveTriangles = 0, - kPrimitiveTriangleStrip = 1, - kPrimitiveQuads = 2, - kPrimitiveLines = 3, - kPrimitiveLineStrip = 4, - kPrimitivePoints = 5, + Triangles = 0, + TriangleStrip = 1, + Quads = 2, + Lines = 3, + LineStrip = 4, + Points = 5 }; public class SubMesh @@ -1060,7 +1060,7 @@ namespace AssetStudio } var indexCount = m_SubMesh.indexCount; var topology = m_SubMesh.topology; - if (topology == GfxPrimitiveType.kPrimitiveTriangles) + if (topology == GfxPrimitiveType.Triangles) { for (int i = 0; i < indexCount; i += 3) { @@ -1069,7 +1069,7 @@ namespace AssetStudio m_Indices.Add(m_IndexBuffer[firstIndex + i + 2]); } } - else if (version[0] < 4 || topology == GfxPrimitiveType.kPrimitiveTriangleStrip) + else if (version[0] < 4 || topology == GfxPrimitiveType.TriangleStrip) { // de-stripify : uint triIndex = 0; @@ -1100,7 +1100,7 @@ namespace AssetStudio //fix indexCount m_SubMesh.indexCount = triIndex; } - else if (topology == GfxPrimitiveType.kPrimitiveQuads) + else if (topology == GfxPrimitiveType.Quads) { for (int q = 0; q < indexCount; q += 4) { @@ -1193,44 +1193,44 @@ namespace AssetStudio { public enum VertexChannelFormat { - kChannelFormatFloat, - kChannelFormatFloat16, - kChannelFormatColor, - kChannelFormatByte, - kChannelFormatUInt32 + Float, + Float16, + Color, + Byte, + UInt32 } public enum VertexFormat2017 { - kVertexFormatFloat, - kVertexFormatFloat16, - kVertexFormatColor, - kVertexFormatUNorm8, - kVertexFormatSNorm8, - kVertexFormatUNorm16, - kVertexFormatSNorm16, - kVertexFormatUInt8, - kVertexFormatSInt8, - kVertexFormatUInt16, - kVertexFormatSInt16, - kVertexFormatUInt32, - kVertexFormatSInt32 + Float, + Float16, + Color, + UNorm8, + SNorm8, + UNorm16, + SNorm16, + UInt8, + SInt8, + UInt16, + SInt16, + UInt32, + SInt32 } public enum VertexFormat { - kVertexFormatFloat, - kVertexFormatFloat16, - kVertexFormatUNorm8, - kVertexFormatSNorm8, - kVertexFormatUNorm16, - kVertexFormatSNorm16, - kVertexFormatUInt8, - kVertexFormatSInt8, - kVertexFormatUInt16, - kVertexFormatSInt16, - kVertexFormatUInt32, - kVertexFormatSInt32 + Float, + Float16, + UNorm8, + SNorm8, + UNorm16, + SNorm16, + UInt8, + SInt8, + UInt16, + SInt16, + UInt32, + SInt32 } public static VertexFormat ToVertexFormat(int format, int[] version) @@ -1239,16 +1239,16 @@ namespace AssetStudio { switch ((VertexChannelFormat)format) { - case VertexChannelFormat.kChannelFormatFloat: - return VertexFormat.kVertexFormatFloat; - case VertexChannelFormat.kChannelFormatFloat16: - return VertexFormat.kVertexFormatFloat16; - case VertexChannelFormat.kChannelFormatColor: //in 4.x is size 4 - return VertexFormat.kVertexFormatUNorm8; - case VertexChannelFormat.kChannelFormatByte: - return VertexFormat.kVertexFormatUInt8; - case VertexChannelFormat.kChannelFormatUInt32: //in 5.x - return VertexFormat.kVertexFormatUInt32; + case VertexChannelFormat.Float: + return VertexFormat.Float; + case VertexChannelFormat.Float16: + return VertexFormat.Float16; + case VertexChannelFormat.Color: //in 4.x is size 4 + return VertexFormat.UNorm8; + case VertexChannelFormat.Byte: + return VertexFormat.UInt8; + case VertexChannelFormat.UInt32: //in 5.x + return VertexFormat.UInt32; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } @@ -1257,31 +1257,31 @@ namespace AssetStudio { switch ((VertexFormat2017)format) { - case VertexFormat2017.kVertexFormatFloat: - return VertexFormat.kVertexFormatFloat; - case VertexFormat2017.kVertexFormatFloat16: - return VertexFormat.kVertexFormatFloat16; - case VertexFormat2017.kVertexFormatColor: - case VertexFormat2017.kVertexFormatUNorm8: - return VertexFormat.kVertexFormatUNorm8; - case VertexFormat2017.kVertexFormatSNorm8: - return VertexFormat.kVertexFormatSNorm8; - case VertexFormat2017.kVertexFormatUNorm16: - return VertexFormat.kVertexFormatUNorm16; - case VertexFormat2017.kVertexFormatSNorm16: - return VertexFormat.kVertexFormatSNorm16; - case VertexFormat2017.kVertexFormatUInt8: - return VertexFormat.kVertexFormatUInt8; - case VertexFormat2017.kVertexFormatSInt8: - return VertexFormat.kVertexFormatSInt8; - case VertexFormat2017.kVertexFormatUInt16: - return VertexFormat.kVertexFormatUInt16; - case VertexFormat2017.kVertexFormatSInt16: - return VertexFormat.kVertexFormatSInt16; - case VertexFormat2017.kVertexFormatUInt32: - return VertexFormat.kVertexFormatUInt32; - case VertexFormat2017.kVertexFormatSInt32: - return VertexFormat.kVertexFormatSInt32; + case VertexFormat2017.Float: + return VertexFormat.Float; + case VertexFormat2017.Float16: + return VertexFormat.Float16; + case VertexFormat2017.Color: + case VertexFormat2017.UNorm8: + return VertexFormat.UNorm8; + case VertexFormat2017.SNorm8: + return VertexFormat.SNorm8; + case VertexFormat2017.UNorm16: + return VertexFormat.UNorm16; + case VertexFormat2017.SNorm16: + return VertexFormat.SNorm16; + case VertexFormat2017.UInt8: + return VertexFormat.UInt8; + case VertexFormat2017.SInt8: + return VertexFormat.SInt8; + case VertexFormat2017.UInt16: + return VertexFormat.UInt16; + case VertexFormat2017.SInt16: + return VertexFormat.SInt16; + case VertexFormat2017.UInt32: + return VertexFormat.UInt32; + case VertexFormat2017.SInt32: + return VertexFormat.SInt32; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } @@ -1297,20 +1297,20 @@ namespace AssetStudio { switch (format) { - case VertexFormat.kVertexFormatFloat: - case VertexFormat.kVertexFormatUInt32: - case VertexFormat.kVertexFormatSInt32: + case VertexFormat.Float: + case VertexFormat.UInt32: + case VertexFormat.SInt32: return 4u; - case VertexFormat.kVertexFormatFloat16: - case VertexFormat.kVertexFormatUNorm16: - case VertexFormat.kVertexFormatSNorm16: - case VertexFormat.kVertexFormatUInt16: - case VertexFormat.kVertexFormatSInt16: + case VertexFormat.Float16: + case VertexFormat.UNorm16: + case VertexFormat.SNorm16: + case VertexFormat.UInt16: + case VertexFormat.SInt16: return 2u; - case VertexFormat.kVertexFormatUNorm8: - case VertexFormat.kVertexFormatSNorm8: - case VertexFormat.kVertexFormatUInt8: - case VertexFormat.kVertexFormatSInt8: + case VertexFormat.UNorm8: + case VertexFormat.SNorm8: + case VertexFormat.UInt8: + case VertexFormat.SInt8: return 1u; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); @@ -1319,7 +1319,7 @@ namespace AssetStudio public static bool IsIntFormat(VertexFormat format) { - return format >= VertexFormat.kVertexFormatUInt8; + return format >= VertexFormat.UInt8; } public static float[] BytesToFloatArray(byte[] inputBytes, VertexFormat format) @@ -1331,22 +1331,22 @@ namespace AssetStudio { switch (format) { - case VertexFormat.kVertexFormatFloat: + case VertexFormat.Float: result[i] = BitConverter.ToSingle(inputBytes, i * 4); break; - case VertexFormat.kVertexFormatFloat16: + case VertexFormat.Float16: result[i] = Half.ToHalf(inputBytes, i * 2); break; - case VertexFormat.kVertexFormatUNorm8: + case VertexFormat.UNorm8: result[i] = inputBytes[i] / 255f; break; - case VertexFormat.kVertexFormatSNorm8: + case VertexFormat.SNorm8: result[i] = Math.Max((sbyte)inputBytes[i] / 127f, -1f); break; - case VertexFormat.kVertexFormatUNorm16: + case VertexFormat.UNorm16: result[i] = BitConverter.ToUInt16(inputBytes, i * 2) / 65535f; break; - case VertexFormat.kVertexFormatSNorm16: + case VertexFormat.SNorm16: result[i] = Math.Max(BitConverter.ToInt16(inputBytes, i * 2) / 32767f, -1f); break; } @@ -1363,16 +1363,16 @@ namespace AssetStudio { switch (format) { - case VertexFormat.kVertexFormatUInt8: - case VertexFormat.kVertexFormatSInt8: + case VertexFormat.UInt8: + case VertexFormat.SInt8: result[i] = inputBytes[i]; break; - case VertexFormat.kVertexFormatUInt16: - case VertexFormat.kVertexFormatSInt16: + case VertexFormat.UInt16: + case VertexFormat.SInt16: result[i] = BitConverter.ToInt16(inputBytes, i * 2); break; - case VertexFormat.kVertexFormatUInt32: - case VertexFormat.kVertexFormatSInt32: + case VertexFormat.UInt32: + case VertexFormat.SInt32: result[i] = BitConverter.ToInt32(inputBytes, i * 4); break; } diff --git a/AssetStudio/Classes/PPtr.cs b/AssetStudio/Classes/PPtr.cs index 4849e9c..a9ec6d6 100644 --- a/AssetStudio/Classes/PPtr.cs +++ b/AssetStudio/Classes/PPtr.cs @@ -13,7 +13,7 @@ namespace AssetStudio public PPtr(ObjectReader reader) { m_FileID = reader.ReadInt32(); - m_PathID = reader.m_Version < SerializedFileFormatVersion.kUnknown_14 ? reader.ReadInt32() : reader.ReadInt64(); + m_PathID = reader.m_Version < SerializedFileFormatVersion.Unknown_14 ? reader.ReadInt32() : reader.ReadInt64(); assetsFile = reader.assetsFile; } diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index e5c6754..0d80c5a 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -56,15 +56,14 @@ namespace AssetStudio } public enum TextureDimension { - kTexDimUnknown = -1, - kTexDimNone = 0, - kTexDimAny = 1, - kTexDim2D = 2, - kTexDim3D = 3, - kTexDimCUBE = 4, - kTexDim2DArray = 5, - kTexDimCubeArray = 6, - kTexDimForce32Bit = 2147483647 + Unknown = -1, + None = 0, + Any = 1, + Tex2D = 2, + Tex3D = 3, + Cube = 4, + Tex2DArray = 5, + CubeArray = 6 }; public class SerializedTextureProperty @@ -81,11 +80,12 @@ namespace AssetStudio public enum SerializedPropertyType { - kColor = 0, - kVector = 1, - kFloat = 2, - kRange = 3, - kTexture = 4 + Color = 0, + Vector = 1, + Float = 2, + Range = 3, + Texture = 4, + Int = 5 }; public class SerializedProperty @@ -195,11 +195,11 @@ namespace AssetStudio public enum FogMode { - kFogUnknown = -1, - kFogDisabled = 0, - kFogLinear = 1, - kFogExp = 2, - kFogExp2 = 3 + Unknown = -1, + Disabled = 0, + Linear = 1, + Exp = 2, + Exp2 = 3 }; public class SerializedShaderState @@ -453,38 +453,39 @@ namespace AssetStudio public enum ShaderGpuProgramType { - kShaderGpuProgramUnknown = 0, - kShaderGpuProgramGLLegacy = 1, - kShaderGpuProgramGLES31AEP = 2, - kShaderGpuProgramGLES31 = 3, - kShaderGpuProgramGLES3 = 4, - kShaderGpuProgramGLES = 5, - kShaderGpuProgramGLCore32 = 6, - kShaderGpuProgramGLCore41 = 7, - kShaderGpuProgramGLCore43 = 8, - kShaderGpuProgramDX9VertexSM20 = 9, - kShaderGpuProgramDX9VertexSM30 = 10, - kShaderGpuProgramDX9PixelSM20 = 11, - kShaderGpuProgramDX9PixelSM30 = 12, - kShaderGpuProgramDX10Level9Vertex = 13, - kShaderGpuProgramDX10Level9Pixel = 14, - kShaderGpuProgramDX11VertexSM40 = 15, - kShaderGpuProgramDX11VertexSM50 = 16, - kShaderGpuProgramDX11PixelSM40 = 17, - kShaderGpuProgramDX11PixelSM50 = 18, - kShaderGpuProgramDX11GeometrySM40 = 19, - kShaderGpuProgramDX11GeometrySM50 = 20, - kShaderGpuProgramDX11HullSM50 = 21, - kShaderGpuProgramDX11DomainSM50 = 22, - kShaderGpuProgramMetalVS = 23, - kShaderGpuProgramMetalFS = 24, - kShaderGpuProgramSPIRV = 25, - kShaderGpuProgramConsoleVS = 26, - kShaderGpuProgramConsoleFS = 27, - kShaderGpuProgramConsoleHS = 28, - kShaderGpuProgramConsoleDS = 29, - kShaderGpuProgramConsoleGS = 30, - kShaderGpuProgramRayTracing = 31, + Unknown = 0, + GLLegacy = 1, + GLES31AEP = 2, + GLES31 = 3, + GLES3 = 4, + GLES = 5, + GLCore32 = 6, + GLCore41 = 7, + GLCore43 = 8, + DX9VertexSM20 = 9, + DX9VertexSM30 = 10, + DX9PixelSM20 = 11, + DX9PixelSM30 = 12, + DX10Level9Vertex = 13, + DX10Level9Pixel = 14, + DX11VertexSM40 = 15, + DX11VertexSM50 = 16, + DX11PixelSM40 = 17, + DX11PixelSM50 = 18, + DX11GeometrySM40 = 19, + DX11GeometrySM50 = 20, + DX11HullSM50 = 21, + DX11DomainSM50 = 22, + MetalVS = 23, + MetalFS = 24, + SPIRV = 25, + ConsoleVS = 26, + ConsoleFS = 27, + ConsoleHS = 28, + ConsoleDS = 29, + ConsoleGS = 30, + RayTracing = 31, + PS5NGGC = 32 }; public class SerializedProgramParameters @@ -713,9 +714,9 @@ namespace AssetStudio public enum PassType { - kPassTypeNormal = 0, - kPassTypeUse = 1, - kPassTypeGrab = 2 + Normal = 0, + Use = 1, + Grab = 2 }; public class SerializedPass @@ -922,32 +923,32 @@ namespace AssetStudio public enum ShaderCompilerPlatform { - kShaderCompPlatformNone = -1, - kShaderCompPlatformGL = 0, - kShaderCompPlatformD3D9 = 1, - kShaderCompPlatformXbox360 = 2, - kShaderCompPlatformPS3 = 3, - kShaderCompPlatformD3D11 = 4, - kShaderCompPlatformGLES20 = 5, - kShaderCompPlatformNaCl = 6, - kShaderCompPlatformFlash = 7, - kShaderCompPlatformD3D11_9x = 8, - kShaderCompPlatformGLES3Plus = 9, - kShaderCompPlatformPSP2 = 10, - kShaderCompPlatformPS4 = 11, - kShaderCompPlatformXboxOne = 12, - kShaderCompPlatformPSM = 13, - kShaderCompPlatformMetal = 14, - kShaderCompPlatformOpenGLCore = 15, - kShaderCompPlatformN3DS = 16, - kShaderCompPlatformWiiU = 17, - kShaderCompPlatformVulkan = 18, - kShaderCompPlatformSwitch = 19, - kShaderCompPlatformXboxOneD3D12 = 20, - kShaderCompPlatformGameCoreXboxOne = 21, - kShaderCompPlatformGameCoreScarlett = 22, - kShaderCompPlatformPS5 = 23, - kShaderCompPlatformPS5NGGC = 24, + None = -1, + GL = 0, + D3D9 = 1, + Xbox360 = 2, + PS3 = 3, + D3D11 = 4, + GLES20 = 5, + NaCl = 6, + Flash = 7, + D3D11_9x = 8, + GLES3Plus = 9, + PSP2 = 10, + PS4 = 11, + XboxOne = 12, + PSM = 13, + Metal = 14, + OpenGLCore = 15, + N3DS = 16, + WiiU = 17, + Vulkan = 18, + Switch = 19, + XboxOneD3D12 = 20, + GameCoreXboxOne = 21, + GameCoreScarlett = 22, + PS5 = 23, + PS5NGGC = 24 }; public class Shader : NamedObject diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 6e3c653..752794f 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -18,23 +18,23 @@ namespace AssetStudio public enum SpritePackingRotation { - kSPRNone = 0, - kSPRFlipHorizontal = 1, - kSPRFlipVertical = 2, - kSPRRotate180 = 3, - kSPRRotate90 = 4 + None = 0, + FlipHorizontal = 1, + FlipVertical = 2, + Rotate180 = 3, + Rotate90 = 4 }; public enum SpritePackingMode { - kSPMTight = 0, - kSPMRectangle + Tight = 0, + Rectangle }; public enum SpriteMeshType { - kSpriteMeshTypeFullRect, - kSpriteMeshTypeTight + FullRect, + Tight }; public class SpriteSettings diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index 73d4050..af90baf 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -151,8 +151,10 @@ namespace AssetStudio RGB24, RGBA32, ARGB32, - RGB565 = 7, - R16 = 9, + ARGBFloat, + RGB565, + BGR24, + R16, DXT1, DXT3, DXT5, @@ -166,7 +168,8 @@ namespace AssetStudio RGBAFloat, YUY2, RGB9e5Float, - BC6H = 24, + RGBFloat, + BC6H, BC7, BC4, BC5, diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index 41f8d90..7617418 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -45,7 +45,7 @@ namespace AssetStudio header.m_Version = (SerializedFileFormatVersion)reader.ReadUInt32(); header.m_DataOffset = reader.ReadUInt32(); - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_9) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_9) { header.m_Endianess = reader.ReadByte(); header.m_Reserved = reader.ReadBytes(3); @@ -57,7 +57,7 @@ namespace AssetStudio m_FileEndianess = reader.ReadByte(); } - if (header.m_Version >= SerializedFileFormatVersion.kLargeFilesSupport) + if (header.m_Version >= SerializedFileFormatVersion.LargeFilesSupport) { header.m_MetadataSize = reader.ReadUInt32(); header.m_FileSize = reader.ReadInt64(); @@ -70,12 +70,12 @@ namespace AssetStudio { reader.Endian = EndianType.LittleEndian; } - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_7) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_7) { unityVersion = reader.ReadStringToNull(); SetVersion(unityVersion); } - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_8) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_8) { m_TargetPlatform = (BuildTarget)reader.ReadInt32(); if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform)) @@ -83,7 +83,7 @@ namespace AssetStudio m_TargetPlatform = BuildTarget.UnknownPlatform; } } - if (header.m_Version >= SerializedFileFormatVersion.kHasTypeTreeHashes) + if (header.m_Version >= SerializedFileFormatVersion.HasTypeTreeHashes) { m_EnableTypeTree = reader.ReadBoolean(); } @@ -96,7 +96,7 @@ namespace AssetStudio m_Types.Add(ReadSerializedType(false)); } - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_7 && header.m_Version < SerializedFileFormatVersion.kUnknown_14) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_7 && header.m_Version < SerializedFileFormatVersion.Unknown_14) { bigIDEnabled = reader.ReadInt32(); } @@ -113,7 +113,7 @@ namespace AssetStudio { objectInfo.m_PathID = reader.ReadInt64(); } - else if (header.m_Version < SerializedFileFormatVersion.kUnknown_14) + else if (header.m_Version < SerializedFileFormatVersion.Unknown_14) { objectInfo.m_PathID = reader.ReadInt32(); } @@ -123,7 +123,7 @@ namespace AssetStudio objectInfo.m_PathID = reader.ReadInt64(); } - if (header.m_Version >= SerializedFileFormatVersion.kLargeFilesSupport) + if (header.m_Version >= SerializedFileFormatVersion.LargeFilesSupport) objectInfo.byteStart = reader.ReadInt64(); else objectInfo.byteStart = reader.ReadUInt32(); @@ -131,7 +131,7 @@ namespace AssetStudio objectInfo.byteStart += header.m_DataOffset; objectInfo.byteSize = reader.ReadUInt32(); objectInfo.typeID = reader.ReadInt32(); - if (header.m_Version < SerializedFileFormatVersion.kRefactoredClassId) + if (header.m_Version < SerializedFileFormatVersion.RefactoredClassId) { objectInfo.classID = reader.ReadUInt16(); objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID); @@ -142,24 +142,24 @@ namespace AssetStudio objectInfo.serializedType = type; objectInfo.classID = type.classID; } - if (header.m_Version < SerializedFileFormatVersion.kHasScriptTypeIndex) + if (header.m_Version < SerializedFileFormatVersion.HasScriptTypeIndex) { objectInfo.isDestroyed = reader.ReadUInt16(); } - if (header.m_Version >= SerializedFileFormatVersion.kHasScriptTypeIndex && header.m_Version < SerializedFileFormatVersion.kRefactorTypeData) + if (header.m_Version >= SerializedFileFormatVersion.HasScriptTypeIndex && header.m_Version < SerializedFileFormatVersion.RefactorTypeData) { var m_ScriptTypeIndex = reader.ReadInt16(); if (objectInfo.serializedType != null) objectInfo.serializedType.m_ScriptTypeIndex = m_ScriptTypeIndex; } - if (header.m_Version == SerializedFileFormatVersion.kSupportsStrippedObject || header.m_Version == SerializedFileFormatVersion.kRefactoredClassId) + if (header.m_Version == SerializedFileFormatVersion.SupportsStrippedObject || header.m_Version == SerializedFileFormatVersion.RefactoredClassId) { objectInfo.stripped = reader.ReadByte(); } m_Objects.Add(objectInfo); } - if (header.m_Version >= SerializedFileFormatVersion.kHasScriptTypeIndex) + if (header.m_Version >= SerializedFileFormatVersion.HasScriptTypeIndex) { int scriptCount = reader.ReadInt32(); m_ScriptTypes = new List(scriptCount); @@ -167,7 +167,7 @@ namespace AssetStudio { var m_ScriptType = new LocalSerializedObjectIdentifier(); m_ScriptType.localSerializedFileIndex = reader.ReadInt32(); - if (header.m_Version < SerializedFileFormatVersion.kUnknown_14) + if (header.m_Version < SerializedFileFormatVersion.Unknown_14) { m_ScriptType.localIdentifierInFile = reader.ReadInt32(); } @@ -185,11 +185,11 @@ namespace AssetStudio for (int i = 0; i < externalsCount; i++) { var m_External = new FileIdentifier(); - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_6) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_6) { var tempEmpty = reader.ReadStringToNull(); } - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_5) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_5) { m_External.guid = new Guid(reader.ReadBytes(16)); m_External.type = reader.ReadInt32(); @@ -199,7 +199,7 @@ namespace AssetStudio m_Externals.Add(m_External); } - if (header.m_Version >= SerializedFileFormatVersion.kSupportsRefObject) + if (header.m_Version >= SerializedFileFormatVersion.SupportsRefObject) { int refTypesCount = reader.ReadInt32(); m_RefTypes = new List(refTypesCount); @@ -209,7 +209,7 @@ namespace AssetStudio } } - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_5) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_5) { userInformation = reader.ReadStringToNull(); } @@ -235,23 +235,23 @@ namespace AssetStudio type.classID = reader.ReadInt32(); - if (header.m_Version >= SerializedFileFormatVersion.kRefactoredClassId) + if (header.m_Version >= SerializedFileFormatVersion.RefactoredClassId) { type.m_IsStrippedType = reader.ReadBoolean(); } - if (header.m_Version >= SerializedFileFormatVersion.kRefactorTypeData) + if (header.m_Version >= SerializedFileFormatVersion.RefactorTypeData) { type.m_ScriptTypeIndex = reader.ReadInt16(); } - if (header.m_Version >= SerializedFileFormatVersion.kHasTypeTreeHashes) + if (header.m_Version >= SerializedFileFormatVersion.HasTypeTreeHashes) { if (isRefType && type.m_ScriptTypeIndex >= 0) { type.m_ScriptID = reader.ReadBytes(16); } - else if ((header.m_Version < SerializedFileFormatVersion.kRefactoredClassId && type.classID < 0) || (header.m_Version >= SerializedFileFormatVersion.kRefactoredClassId && type.classID == 114)) + else if ((header.m_Version < SerializedFileFormatVersion.RefactoredClassId && type.classID < 0) || (header.m_Version >= SerializedFileFormatVersion.RefactoredClassId && type.classID == 114)) { type.m_ScriptID = reader.ReadBytes(16); } @@ -262,7 +262,7 @@ namespace AssetStudio { type.m_Type = new TypeTree(); type.m_Type.m_Nodes = new List(); - if (header.m_Version >= SerializedFileFormatVersion.kUnknown_12 || header.m_Version == SerializedFileFormatVersion.kUnknown_10) + if (header.m_Version >= SerializedFileFormatVersion.Unknown_12 || header.m_Version == SerializedFileFormatVersion.Unknown_10) { TypeTreeBlobRead(type.m_Type); } @@ -270,7 +270,7 @@ namespace AssetStudio { ReadTypeTree(type.m_Type); } - if (header.m_Version >= SerializedFileFormatVersion.kStoresTypeDependencies) + if (header.m_Version >= SerializedFileFormatVersion.StoresTypeDependencies) { if (isRefType) { @@ -296,17 +296,17 @@ namespace AssetStudio typeTreeNode.m_Type = reader.ReadStringToNull(); typeTreeNode.m_Name = reader.ReadStringToNull(); typeTreeNode.m_ByteSize = reader.ReadInt32(); - if (header.m_Version == SerializedFileFormatVersion.kUnknown_2) + if (header.m_Version == SerializedFileFormatVersion.Unknown_2) { var variableCount = reader.ReadInt32(); } - if (header.m_Version != SerializedFileFormatVersion.kUnknown_3) + if (header.m_Version != SerializedFileFormatVersion.Unknown_3) { typeTreeNode.m_Index = reader.ReadInt32(); } typeTreeNode.m_TypeFlags = reader.ReadInt32(); typeTreeNode.m_Version = reader.ReadInt32(); - if (header.m_Version != SerializedFileFormatVersion.kUnknown_3) + if (header.m_Version != SerializedFileFormatVersion.Unknown_3) { typeTreeNode.m_MetaFlag = reader.ReadInt32(); } @@ -334,7 +334,7 @@ namespace AssetStudio typeTreeNode.m_ByteSize = reader.ReadInt32(); typeTreeNode.m_Index = reader.ReadInt32(); typeTreeNode.m_MetaFlag = reader.ReadInt32(); - if (header.m_Version >= SerializedFileFormatVersion.kTypeTreeNodeWithTypeFlags) + if (header.m_Version >= SerializedFileFormatVersion.TypeTreeNodeWithTypeFlags) { typeTreeNode.m_RefTypeHash = reader.ReadUInt64(); } diff --git a/AssetStudio/SerializedFileFormatVersion.cs b/AssetStudio/SerializedFileFormatVersion.cs index fab3bcb..fc853b8 100644 --- a/AssetStudio/SerializedFileFormatVersion.cs +++ b/AssetStudio/SerializedFileFormatVersion.cs @@ -8,80 +8,80 @@ namespace AssetStudio { public enum SerializedFileFormatVersion { - kUnsupported = 1, - kUnknown_2 = 2, - kUnknown_3 = 3, + Unsupported = 1, + Unknown_2 = 2, + Unknown_3 = 3, /// /// 1.2.0 to 2.0.0 /// - kUnknown_5 = 5, + Unknown_5 = 5, /// /// 2.1.0 to 2.6.1 /// - kUnknown_6 = 6, + Unknown_6 = 6, /// /// 3.0.0b /// - kUnknown_7 = 7, + Unknown_7 = 7, /// /// 3.0.0 to 3.4.2 /// - kUnknown_8 = 8, + Unknown_8 = 8, /// /// 3.5.0 to 4.7.2 /// - kUnknown_9 = 9, + Unknown_9 = 9, /// /// 5.0.0aunk1 /// - kUnknown_10 = 10, + Unknown_10 = 10, /// /// 5.0.0aunk2 /// - kHasScriptTypeIndex = 11, + HasScriptTypeIndex = 11, /// /// 5.0.0aunk3 /// - kUnknown_12 = 12, + Unknown_12 = 12, /// /// 5.0.0aunk4 /// - kHasTypeTreeHashes = 13, + HasTypeTreeHashes = 13, /// /// 5.0.0unk /// - kUnknown_14 = 14, + Unknown_14 = 14, /// /// 5.0.1 to 5.4.0 /// - kSupportsStrippedObject = 15, + SupportsStrippedObject = 15, /// /// 5.5.0a /// - kRefactoredClassId = 16, + RefactoredClassId = 16, /// /// 5.5.0unk to 2018.4 /// - kRefactorTypeData = 17, + RefactorTypeData = 17, /// /// 2019.1a /// - kRefactorShareableTypeTreeData = 18, + RefactorShareableTypeTreeData = 18, /// /// 2019.1unk /// - kTypeTreeNodeWithTypeFlags = 19, + TypeTreeNodeWithTypeFlags = 19, /// /// 2019.2 /// - kSupportsRefObject = 20, + SupportsRefObject = 20, /// /// 2019.3 to 2019.4 /// - kStoresTypeDependencies = 21, + StoresTypeDependencies = 21, /// /// 2020.1 to x /// - kLargeFilesSupport = 22 + LargeFilesSupport = 22 } } diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 95a8316..b46c70f 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -816,40 +816,40 @@ namespace AssetStudioGUI { switch (m_AudioClip.m_Type) { - case AudioType.ACC: + case FMODSoundType.ACC: assetItem.InfoText += "Acc"; break; - case AudioType.AIFF: + case FMODSoundType.AIFF: assetItem.InfoText += "AIFF"; break; - case AudioType.IT: + case FMODSoundType.IT: assetItem.InfoText += "Impulse tracker"; break; - case AudioType.MOD: + case FMODSoundType.MOD: assetItem.InfoText += "Protracker / Fasttracker MOD"; break; - case AudioType.MPEG: + case FMODSoundType.MPEG: assetItem.InfoText += "MP2/MP3 MPEG"; break; - case AudioType.OGGVORBIS: + case FMODSoundType.OGGVORBIS: assetItem.InfoText += "Ogg vorbis"; break; - case AudioType.S3M: + case FMODSoundType.S3M: assetItem.InfoText += "ScreamTracker 3"; break; - case AudioType.WAV: + case FMODSoundType.WAV: assetItem.InfoText += "Microsoft WAV"; break; - case AudioType.XM: + case FMODSoundType.XM: assetItem.InfoText += "FastTracker 2 XM"; break; - case AudioType.XMA: + case FMODSoundType.XMA: assetItem.InfoText += "Xbox360 XMA"; break; - case AudioType.VAG: + case FMODSoundType.VAG: assetItem.InfoText += "PlayStation Portable ADPCM"; break; - case AudioType.AUDIOQUEUE: + case FMODSoundType.AUDIOQUEUE: assetItem.InfoText += "iPhone"; break; default: @@ -873,7 +873,7 @@ namespace AssetStudioGUI case AudioCompressionFormat.MP3: assetItem.InfoText += "MP3"; break; - case AudioCompressionFormat.VAG: + case AudioCompressionFormat.PSMVAG: assetItem.InfoText += "PlayStation Portable ADPCM"; break; case AudioCompressionFormat.HEVAG: diff --git a/AssetStudioUtility/AudioClipConverter.cs b/AssetStudioUtility/AudioClipConverter.cs index 5e14637..458334e 100644 --- a/AssetStudioUtility/AudioClipConverter.cs +++ b/AssetStudioUtility/AudioClipConverter.cs @@ -94,29 +94,29 @@ namespace AssetStudio { switch (m_AudioClip.m_Type) { - case AudioType.ACC: + case FMODSoundType.ACC: return ".m4a"; - case AudioType.AIFF: + case FMODSoundType.AIFF: return ".aif"; - case AudioType.IT: + case FMODSoundType.IT: return ".it"; - case AudioType.MOD: + case FMODSoundType.MOD: return ".mod"; - case AudioType.MPEG: + case FMODSoundType.MPEG: return ".mp3"; - case AudioType.OGGVORBIS: + case FMODSoundType.OGGVORBIS: return ".ogg"; - case AudioType.S3M: + case FMODSoundType.S3M: return ".s3m"; - case AudioType.WAV: + case FMODSoundType.WAV: return ".wav"; - case AudioType.XM: + case FMODSoundType.XM: return ".xm"; - case AudioType.XMA: + case FMODSoundType.XMA: return ".wav"; - case AudioType.VAG: + case FMODSoundType.VAG: return ".vag"; - case AudioType.AUDIOQUEUE: + case FMODSoundType.AUDIOQUEUE: return ".fsb"; } @@ -133,7 +133,7 @@ namespace AssetStudio return ".fsb"; case AudioCompressionFormat.MP3: return ".fsb"; - case AudioCompressionFormat.VAG: + case AudioCompressionFormat.PSMVAG: return ".fsb"; case AudioCompressionFormat.HEVAG: return ".fsb"; @@ -159,13 +159,13 @@ namespace AssetStudio { switch (m_AudioClip.m_Type) { - case AudioType.AIFF: - case AudioType.IT: - case AudioType.MOD: - case AudioType.S3M: - case AudioType.XM: - case AudioType.XMA: - case AudioType.AUDIOQUEUE: + case FMODSoundType.AIFF: + case FMODSoundType.IT: + case FMODSoundType.MOD: + case FMODSoundType.S3M: + case FMODSoundType.XM: + case FMODSoundType.XMA: + case FMODSoundType.AUDIOQUEUE: return true; default: return false; diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index 5ee257d..ba346d5 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -109,17 +109,17 @@ namespace AssetStudio var sb = new StringBuilder(); switch (m_Passe.m_Type) { - case PassType.kPassTypeNormal: + case PassType.Normal: sb.Append(" Pass "); break; - case PassType.kPassTypeUse: + case PassType.Use: sb.Append(" UsePass "); break; - case PassType.kPassTypeGrab: + case PassType.Grab: sb.Append(" GrabPass "); break; } - if (m_Passe.m_Type == PassType.kPassTypeUse) + if (m_Passe.m_Type == PassType.Use) { sb.Append($"\"{m_Passe.m_UseName}\"\n"); } @@ -127,7 +127,7 @@ namespace AssetStudio { sb.Append("{\n"); - if (m_Passe.m_Type == PassType.kPassTypeGrab) + if (m_Passe.m_Type == PassType.Grab) { if (!string.IsNullOrEmpty(m_Passe.m_TextureName)) { @@ -358,7 +358,7 @@ namespace AssetStudio sb.Append(" }\n"); } - if (m_State.fogMode != FogMode.kFogUnknown || + if (m_State.fogMode != FogMode.Unknown || m_State.fogColor.x.val != 0f || m_State.fogColor.y.val != 0f || m_State.fogColor.z.val != 0f || @@ -368,21 +368,21 @@ namespace AssetStudio m_State.fogEnd.val != 0f) { sb.Append(" Fog {\n"); - if (m_State.fogMode != FogMode.kFogUnknown) + if (m_State.fogMode != FogMode.Unknown) { sb.Append(" Mode "); switch (m_State.fogMode) { - case FogMode.kFogDisabled: + case FogMode.Disabled: sb.Append("Off"); break; - case FogMode.kFogLinear: + case FogMode.Linear: sb.Append("Linear"); break; - case FogMode.kFogExp: + case FogMode.Exp: sb.Append("Exp"); break; - case FogMode.kFogExp2: + case FogMode.Exp2: sb.Append("Exp2"); break; } @@ -674,37 +674,37 @@ namespace AssetStudio sb.Append($"{m_Prop.m_Name} (\"{m_Prop.m_Description}\", "); switch (m_Prop.m_Type) { - case SerializedPropertyType.kColor: + case SerializedPropertyType.Color: sb.Append("Color"); break; - case SerializedPropertyType.kVector: + case SerializedPropertyType.Vector: sb.Append("Vector"); break; - case SerializedPropertyType.kFloat: + case SerializedPropertyType.Float: sb.Append("Float"); break; - case SerializedPropertyType.kRange: + case SerializedPropertyType.Range: sb.Append($"Range({m_Prop.m_DefValue[1]}, {m_Prop.m_DefValue[2]})"); break; - case SerializedPropertyType.kTexture: + case SerializedPropertyType.Texture: switch (m_Prop.m_DefTexture.m_TexDim) { - case TextureDimension.kTexDimAny: + case TextureDimension.Any: sb.Append("any"); break; - case TextureDimension.kTexDim2D: + case TextureDimension.Tex2D: sb.Append("2D"); break; - case TextureDimension.kTexDim3D: + case TextureDimension.Tex3D: sb.Append("3D"); break; - case TextureDimension.kTexDimCUBE: + case TextureDimension.Cube: sb.Append("Cube"); break; - case TextureDimension.kTexDim2DArray: + case TextureDimension.Tex2DArray: sb.Append("2DArray"); break; - case TextureDimension.kTexDimCubeArray: + case TextureDimension.CubeArray: sb.Append("CubeArray"); break; } @@ -713,15 +713,15 @@ namespace AssetStudio sb.Append(") = "); switch (m_Prop.m_Type) { - case SerializedPropertyType.kColor: - case SerializedPropertyType.kVector: + case SerializedPropertyType.Color: + case SerializedPropertyType.Vector: sb.Append($"({m_Prop.m_DefValue[0]},{m_Prop.m_DefValue[1]},{m_Prop.m_DefValue[2]},{m_Prop.m_DefValue[3]})"); break; - case SerializedPropertyType.kFloat: - case SerializedPropertyType.kRange: + case SerializedPropertyType.Float: + case SerializedPropertyType.Range: sb.Append(m_Prop.m_DefValue[0]); break; - case SerializedPropertyType.kTexture: + case SerializedPropertyType.Texture: sb.Append($"\"{m_Prop.m_DefTexture.m_DefaultName}\" {{ }}"); break; default: @@ -735,64 +735,65 @@ namespace AssetStudio { switch (platform) { - case ShaderCompilerPlatform.kShaderCompPlatformGL: - return programType == ShaderGpuProgramType.kShaderGpuProgramGLLegacy; - case ShaderCompilerPlatform.kShaderCompPlatformD3D9: - return programType == ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM20 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM30 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM20 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30; - case ShaderCompilerPlatform.kShaderCompPlatformXbox360: - case ShaderCompilerPlatform.kShaderCompPlatformPS3: - case ShaderCompilerPlatform.kShaderCompPlatformPSP2: - case ShaderCompilerPlatform.kShaderCompPlatformPS4: - case ShaderCompilerPlatform.kShaderCompPlatformXboxOne: - case ShaderCompilerPlatform.kShaderCompPlatformN3DS: - case ShaderCompilerPlatform.kShaderCompPlatformWiiU: - case ShaderCompilerPlatform.kShaderCompPlatformSwitch: - case ShaderCompilerPlatform.kShaderCompPlatformXboxOneD3D12: - case ShaderCompilerPlatform.kShaderCompPlatformGameCoreXboxOne: - case ShaderCompilerPlatform.kShaderCompPlatformGameCoreScarlett: - case ShaderCompilerPlatform.kShaderCompPlatformPS5: - case ShaderCompilerPlatform.kShaderCompPlatformPS5NGGC: - return programType == ShaderGpuProgramType.kShaderGpuProgramConsoleVS - || programType == ShaderGpuProgramType.kShaderGpuProgramConsoleFS - || programType == ShaderGpuProgramType.kShaderGpuProgramConsoleHS - || programType == ShaderGpuProgramType.kShaderGpuProgramConsoleDS - || programType == ShaderGpuProgramType.kShaderGpuProgramConsoleGS; - case ShaderCompilerPlatform.kShaderCompPlatformD3D11: - return programType == ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM40 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM50 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM40 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM50 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM40 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM50 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11HullSM50 - || programType == ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50; - case ShaderCompilerPlatform.kShaderCompPlatformGLES20: - return programType == ShaderGpuProgramType.kShaderGpuProgramGLES; - case ShaderCompilerPlatform.kShaderCompPlatformNaCl: //Obsolete + case ShaderCompilerPlatform.GL: + return programType == ShaderGpuProgramType.GLLegacy; + case ShaderCompilerPlatform.D3D9: + return programType == ShaderGpuProgramType.DX9VertexSM20 + || programType == ShaderGpuProgramType.DX9VertexSM30 + || programType == ShaderGpuProgramType.DX9PixelSM20 + || programType == ShaderGpuProgramType.DX9PixelSM30; + case ShaderCompilerPlatform.Xbox360: + case ShaderCompilerPlatform.PS3: + case ShaderCompilerPlatform.PSP2: + case ShaderCompilerPlatform.PS4: + case ShaderCompilerPlatform.XboxOne: + case ShaderCompilerPlatform.N3DS: + case ShaderCompilerPlatform.WiiU: + case ShaderCompilerPlatform.Switch: + case ShaderCompilerPlatform.XboxOneD3D12: + case ShaderCompilerPlatform.GameCoreXboxOne: + case ShaderCompilerPlatform.GameCoreScarlett: + case ShaderCompilerPlatform.PS5: + return programType == ShaderGpuProgramType.ConsoleVS + || programType == ShaderGpuProgramType.ConsoleFS + || programType == ShaderGpuProgramType.ConsoleHS + || programType == ShaderGpuProgramType.ConsoleDS + || programType == ShaderGpuProgramType.ConsoleGS; + case ShaderCompilerPlatform.PS5NGGC: + return programType == ShaderGpuProgramType.PS5NGGC; + case ShaderCompilerPlatform.D3D11: + return programType == ShaderGpuProgramType.DX11VertexSM40 + || programType == ShaderGpuProgramType.DX11VertexSM50 + || programType == ShaderGpuProgramType.DX11PixelSM40 + || programType == ShaderGpuProgramType.DX11PixelSM50 + || programType == ShaderGpuProgramType.DX11GeometrySM40 + || programType == ShaderGpuProgramType.DX11GeometrySM50 + || programType == ShaderGpuProgramType.DX11HullSM50 + || programType == ShaderGpuProgramType.DX11DomainSM50; + case ShaderCompilerPlatform.GLES20: + return programType == ShaderGpuProgramType.GLES; + case ShaderCompilerPlatform.NaCl: //Obsolete throw new NotSupportedException(); - case ShaderCompilerPlatform.kShaderCompPlatformFlash: //Obsolete + case ShaderCompilerPlatform.Flash: //Obsolete throw new NotSupportedException(); - case ShaderCompilerPlatform.kShaderCompPlatformD3D11_9x: - return programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Vertex - || programType == ShaderGpuProgramType.kShaderGpuProgramDX10Level9Pixel; - case ShaderCompilerPlatform.kShaderCompPlatformGLES3Plus: - return programType == ShaderGpuProgramType.kShaderGpuProgramGLES31AEP - || programType == ShaderGpuProgramType.kShaderGpuProgramGLES31 - || programType == ShaderGpuProgramType.kShaderGpuProgramGLES3; - case ShaderCompilerPlatform.kShaderCompPlatformPSM: //Unknown + case ShaderCompilerPlatform.D3D11_9x: + return programType == ShaderGpuProgramType.DX10Level9Vertex + || programType == ShaderGpuProgramType.DX10Level9Pixel; + case ShaderCompilerPlatform.GLES3Plus: + return programType == ShaderGpuProgramType.GLES31AEP + || programType == ShaderGpuProgramType.GLES31 + || programType == ShaderGpuProgramType.GLES3; + case ShaderCompilerPlatform.PSM: //Unknown throw new NotSupportedException(); - case ShaderCompilerPlatform.kShaderCompPlatformMetal: - return programType == ShaderGpuProgramType.kShaderGpuProgramMetalVS - || programType == ShaderGpuProgramType.kShaderGpuProgramMetalFS; - case ShaderCompilerPlatform.kShaderCompPlatformOpenGLCore: - return programType == ShaderGpuProgramType.kShaderGpuProgramGLCore32 - || programType == ShaderGpuProgramType.kShaderGpuProgramGLCore41 - || programType == ShaderGpuProgramType.kShaderGpuProgramGLCore43; - case ShaderCompilerPlatform.kShaderCompPlatformVulkan: - return programType == ShaderGpuProgramType.kShaderGpuProgramSPIRV; + case ShaderCompilerPlatform.Metal: + return programType == ShaderGpuProgramType.MetalVS + || programType == ShaderGpuProgramType.MetalFS; + case ShaderCompilerPlatform.OpenGLCore: + return programType == ShaderGpuProgramType.GLCore32 + || programType == ShaderGpuProgramType.GLCore41 + || programType == ShaderGpuProgramType.GLCore43; + case ShaderCompilerPlatform.Vulkan: + return programType == ShaderGpuProgramType.SPIRV; default: throw new NotSupportedException(); } @@ -802,55 +803,55 @@ namespace AssetStudio { switch (platform) { - case ShaderCompilerPlatform.kShaderCompPlatformGL: + case ShaderCompilerPlatform.GL: return "openGL"; - case ShaderCompilerPlatform.kShaderCompPlatformD3D9: + case ShaderCompilerPlatform.D3D9: return "d3d9"; - case ShaderCompilerPlatform.kShaderCompPlatformXbox360: + case ShaderCompilerPlatform.Xbox360: return "xbox360"; - case ShaderCompilerPlatform.kShaderCompPlatformPS3: + case ShaderCompilerPlatform.PS3: return "ps3"; - case ShaderCompilerPlatform.kShaderCompPlatformD3D11: + case ShaderCompilerPlatform.D3D11: return "d3d11"; - case ShaderCompilerPlatform.kShaderCompPlatformGLES20: + case ShaderCompilerPlatform.GLES20: return "gles"; - case ShaderCompilerPlatform.kShaderCompPlatformNaCl: + case ShaderCompilerPlatform.NaCl: return "glesdesktop"; - case ShaderCompilerPlatform.kShaderCompPlatformFlash: + case ShaderCompilerPlatform.Flash: return "flash"; - case ShaderCompilerPlatform.kShaderCompPlatformD3D11_9x: + case ShaderCompilerPlatform.D3D11_9x: return "d3d11_9x"; - case ShaderCompilerPlatform.kShaderCompPlatformGLES3Plus: + case ShaderCompilerPlatform.GLES3Plus: return "gles3"; - case ShaderCompilerPlatform.kShaderCompPlatformPSP2: + case ShaderCompilerPlatform.PSP2: return "psp2"; - case ShaderCompilerPlatform.kShaderCompPlatformPS4: + case ShaderCompilerPlatform.PS4: return "ps4"; - case ShaderCompilerPlatform.kShaderCompPlatformXboxOne: + case ShaderCompilerPlatform.XboxOne: return "xboxone"; - case ShaderCompilerPlatform.kShaderCompPlatformPSM: + case ShaderCompilerPlatform.PSM: return "psm"; - case ShaderCompilerPlatform.kShaderCompPlatformMetal: + case ShaderCompilerPlatform.Metal: return "metal"; - case ShaderCompilerPlatform.kShaderCompPlatformOpenGLCore: + case ShaderCompilerPlatform.OpenGLCore: return "glcore"; - case ShaderCompilerPlatform.kShaderCompPlatformN3DS: + case ShaderCompilerPlatform.N3DS: return "n3ds"; - case ShaderCompilerPlatform.kShaderCompPlatformWiiU: + case ShaderCompilerPlatform.WiiU: return "wiiu"; - case ShaderCompilerPlatform.kShaderCompPlatformVulkan: + case ShaderCompilerPlatform.Vulkan: return "vulkan"; - case ShaderCompilerPlatform.kShaderCompPlatformSwitch: + case ShaderCompilerPlatform.Switch: return "switch"; - case ShaderCompilerPlatform.kShaderCompPlatformXboxOneD3D12: + case ShaderCompilerPlatform.XboxOneD3D12: return "xboxone_d3d12"; - case ShaderCompilerPlatform.kShaderCompPlatformGameCoreXboxOne: + case ShaderCompilerPlatform.GameCoreXboxOne: return "xboxone"; - case ShaderCompilerPlatform.kShaderCompPlatformGameCoreScarlett: + case ShaderCompilerPlatform.GameCoreScarlett: return "xbox_scarlett"; - case ShaderCompilerPlatform.kShaderCompPlatformPS5: + case ShaderCompilerPlatform.PS5: return "ps5"; - case ShaderCompilerPlatform.kShaderCompPlatformPS5NGGC: + case ShaderCompilerPlatform.PS5NGGC: return "ps5_nggc"; default: return "unknown"; @@ -996,36 +997,36 @@ namespace AssetStudio { switch (m_ProgramType) { - case ShaderGpuProgramType.kShaderGpuProgramGLLegacy: - case ShaderGpuProgramType.kShaderGpuProgramGLES31AEP: - case ShaderGpuProgramType.kShaderGpuProgramGLES31: - case ShaderGpuProgramType.kShaderGpuProgramGLES3: - case ShaderGpuProgramType.kShaderGpuProgramGLES: - case ShaderGpuProgramType.kShaderGpuProgramGLCore32: - case ShaderGpuProgramType.kShaderGpuProgramGLCore41: - case ShaderGpuProgramType.kShaderGpuProgramGLCore43: + case ShaderGpuProgramType.GLLegacy: + case ShaderGpuProgramType.GLES31AEP: + case ShaderGpuProgramType.GLES31: + case ShaderGpuProgramType.GLES3: + case ShaderGpuProgramType.GLES: + case ShaderGpuProgramType.GLCore32: + case ShaderGpuProgramType.GLCore41: + case ShaderGpuProgramType.GLCore43: sb.Append(Encoding.UTF8.GetString(m_ProgramCode)); break; - case ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM20: - case ShaderGpuProgramType.kShaderGpuProgramDX9VertexSM30: - case ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM20: - case ShaderGpuProgramType.kShaderGpuProgramDX9PixelSM30: + case ShaderGpuProgramType.DX9VertexSM20: + case ShaderGpuProgramType.DX9VertexSM30: + case ShaderGpuProgramType.DX9PixelSM20: + case ShaderGpuProgramType.DX9PixelSM30: { /*var shaderBytecode = new ShaderBytecode(m_ProgramCode); sb.Append(shaderBytecode.Disassemble());*/ sb.Append("// shader disassembly not supported on DXBC"); break; } - case ShaderGpuProgramType.kShaderGpuProgramDX10Level9Vertex: - case ShaderGpuProgramType.kShaderGpuProgramDX10Level9Pixel: - case ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM40: - case ShaderGpuProgramType.kShaderGpuProgramDX11VertexSM50: - case ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM40: - case ShaderGpuProgramType.kShaderGpuProgramDX11PixelSM50: - case ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM40: - case ShaderGpuProgramType.kShaderGpuProgramDX11GeometrySM50: - case ShaderGpuProgramType.kShaderGpuProgramDX11HullSM50: - case ShaderGpuProgramType.kShaderGpuProgramDX11DomainSM50: + case ShaderGpuProgramType.DX10Level9Vertex: + case ShaderGpuProgramType.DX10Level9Pixel: + case ShaderGpuProgramType.DX11VertexSM40: + case ShaderGpuProgramType.DX11VertexSM50: + case ShaderGpuProgramType.DX11PixelSM40: + case ShaderGpuProgramType.DX11PixelSM50: + case ShaderGpuProgramType.DX11GeometrySM40: + case ShaderGpuProgramType.DX11GeometrySM50: + case ShaderGpuProgramType.DX11HullSM50: + case ShaderGpuProgramType.DX11DomainSM50: { /*int start = 6; if (m_Version == 201509030) // 5.3 @@ -1039,8 +1040,8 @@ namespace AssetStudio sb.Append("// shader disassembly not supported on DXBC"); break; } - case ShaderGpuProgramType.kShaderGpuProgramMetalVS: - case ShaderGpuProgramType.kShaderGpuProgramMetalFS: + case ShaderGpuProgramType.MetalVS: + case ShaderGpuProgramType.MetalFS: using (var reader = new BinaryReader(new MemoryStream(m_ProgramCode))) { var fourCC = reader.ReadUInt32(); @@ -1054,7 +1055,7 @@ namespace AssetStudio sb.Append(Encoding.UTF8.GetString(buff)); } break; - case ShaderGpuProgramType.kShaderGpuProgramSPIRV: + case ShaderGpuProgramType.SPIRV: try { sb.Append(SpirVShaderConverter.Convert(m_ProgramCode)); @@ -1064,11 +1065,11 @@ namespace AssetStudio sb.Append($"// disassembly error {e.Message}\n"); } break; - case ShaderGpuProgramType.kShaderGpuProgramConsoleVS: - case ShaderGpuProgramType.kShaderGpuProgramConsoleFS: - case ShaderGpuProgramType.kShaderGpuProgramConsoleHS: - case ShaderGpuProgramType.kShaderGpuProgramConsoleDS: - case ShaderGpuProgramType.kShaderGpuProgramConsoleGS: + case ShaderGpuProgramType.ConsoleVS: + case ShaderGpuProgramType.ConsoleFS: + case ShaderGpuProgramType.ConsoleHS: + case ShaderGpuProgramType.ConsoleDS: + case ShaderGpuProgramType.ConsoleGS: sb.Append(Encoding.UTF8.GetString(m_ProgramCode)); break; default: diff --git a/AssetStudioUtility/SpriteHelper.cs b/AssetStudioUtility/SpriteHelper.cs index 62e1eba..db1ac99 100644 --- a/AssetStudioUtility/SpriteHelper.cs +++ b/AssetStudioUtility/SpriteHelper.cs @@ -58,23 +58,23 @@ namespace AssetStudio //RotateAndFlip switch (settingsRaw.packingRotation) { - case SpritePackingRotation.kSPRFlipHorizontal: + case SpritePackingRotation.FlipHorizontal: spriteImage.Mutate(x => x.Flip(FlipMode.Horizontal)); break; - case SpritePackingRotation.kSPRFlipVertical: + case SpritePackingRotation.FlipVertical: spriteImage.Mutate(x => x.Flip(FlipMode.Vertical)); break; - case SpritePackingRotation.kSPRRotate180: + case SpritePackingRotation.Rotate180: spriteImage.Mutate(x => x.Rotate(180)); break; - case SpritePackingRotation.kSPRRotate90: + case SpritePackingRotation.Rotate90: spriteImage.Mutate(x => x.Rotate(270)); break; } } //Tight - if (settingsRaw.packingMode == SpritePackingMode.kSPMTight) + if (settingsRaw.packingMode == SpritePackingMode.Tight) { try { From d158e864b556b5970709c2a52e47944d53aa98a2 Mon Sep 17 00:00:00 2001 From: Perfare Date: Thu, 16 Jun 2022 18:41:55 +0800 Subject: [PATCH 20/20] support 2022.1 --- AssetStudio/Classes/AnimationClip.cs | 5 +++++ AssetStudio/Classes/Mesh.cs | 5 +++++ AssetStudio/Classes/Shader.cs | 12 +++++++++++- README.md | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 95a381a..5769838 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -797,6 +797,7 @@ namespace AssetStudio public ClassIDType typeID; public byte customType; public byte isPPtrCurve; + public byte isIntCurve; public GenericBinding() { } @@ -816,6 +817,10 @@ namespace AssetStudio } customType = reader.ReadByte(); isPPtrCurve = reader.ReadByte(); + if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + { + isIntCurve = reader.ReadByte(); + } reader.AlignStream(); } } diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index c936d14..e11c637 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -651,6 +651,11 @@ namespace AssetStudio int m_MeshUsageFlags = reader.ReadInt32(); + if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + { + int m_CookingOptions = reader.ReadInt32(); + } + if (version[0] >= 5) //5.0 and up { var m_BakedConvexCollisionMesh = reader.ReadUInt8Array(); diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 0d80c5a..e0fbc41 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -428,6 +428,7 @@ namespace AssetStudio if ((version[0] == 2020 && version[1] > 3) || (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up + (version[0] > 2021) || (version[0] == 2021 && version[1] > 1) || (version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 and up { @@ -605,6 +606,7 @@ namespace AssetStudio if ((version[0] == 2020 && version[1] > 3) || (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up + (version[0] > 2021) || (version[0] == 2021 && version[1] > 1) || (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up { @@ -690,6 +692,7 @@ namespace AssetStudio { public SerializedSubProgram[] m_SubPrograms; public SerializedProgramParameters m_CommonParameters; + public ushort[] m_SerializedKeywordStateMask; public SerializedProgram(ObjectReader reader) { @@ -704,11 +707,18 @@ namespace AssetStudio if ((version[0] == 2020 && version[1] > 3) || (version[0] == 2020 && version[1] == 3 && version[2] >= 2) || //2020.3.2f1 and up + (version[0] > 2021) || (version[0] == 2021 && version[1] > 1) || (version[0] == 2021 && version[1] == 1 && version[2] >= 1)) //2021.1.1f1 and up { m_CommonParameters = new SerializedProgramParameters(reader); } + + if (version[0] > 2022 || (version[0] == 2022 && version[1] >= 1)) //2022.1 and up + { + m_SerializedKeywordStateMask = reader.ReadUInt16Array(); + reader.AlignStream(); + } } } @@ -795,7 +805,7 @@ namespace AssetStudio m_Name = reader.ReadAlignedString(); m_TextureName = reader.ReadAlignedString(); m_Tags = new SerializedTagMap(reader); - if (version[0] > 2021 || (version[0] == 2021 && version[1] >= 2)) //2021.2 and up + if (version[0] == 2021 && version[1] >= 2) //2021.2 ~2021.x { m_SerializedKeywordStateMask = reader.ReadUInt16Array(); reader.AlignStream(); diff --git a/README.md b/README.md index 1135cb4..47425c4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ AssetStudio is a tool for exploring, extracting and exporting assets and assetbu ## Features * Support version: - * 3.4 - 2021.2 + * 3.4 - 2022.1 * Support asset types: * **Texture2D** : convert to png, tga, jpeg, bmp * **Sprite** : crop Texture2D to png, tga, jpeg, bmp