From bc9380b8bef934a39caa49822cd609fac576364a Mon Sep 17 00:00:00 2001 From: VaDiM Date: Tue, 5 Mar 2024 23:42:14 +0300 Subject: [PATCH] Add Texture2D loading via typetree --- AssetStudio/AssetsManager.cs | 4 ++- AssetStudio/Classes/GLTextureSettings.cs | 2 ++ AssetStudio/Classes/StreamingInfo.cs | 2 ++ AssetStudio/Classes/Texture2D.cs | 34 +++++++++++++++++------- AssetStudio/ResourceReader.cs | 14 ++++++++-- AssetStudio/TypeTreeHelper.cs | 10 +++++-- 6 files changed, 51 insertions(+), 15 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index c4281a6..2d1ab92 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -567,7 +567,9 @@ namespace AssetStudio obj = new TextAsset(objectReader); break; case ClassIDType.Texture2D: - obj = new Texture2D(objectReader); + obj = objectReader.serializedType?.m_Type == null + ? new Texture2D(objectReader) + : new Texture2D(objectReader, TypeTreeHelper.ReadType(objectReader.serializedType.m_Type, objectReader)); break; case ClassIDType.Texture2DArray: obj = new Texture2DArray(objectReader); diff --git a/AssetStudio/Classes/GLTextureSettings.cs b/AssetStudio/Classes/GLTextureSettings.cs index 455076c..c81d1c6 100644 --- a/AssetStudio/Classes/GLTextureSettings.cs +++ b/AssetStudio/Classes/GLTextureSettings.cs @@ -7,6 +7,8 @@ public float m_MipBias; public int m_WrapMode; + public GLTextureSettings() { } + public GLTextureSettings(ObjectReader reader) { var version = reader.version; diff --git a/AssetStudio/Classes/StreamingInfo.cs b/AssetStudio/Classes/StreamingInfo.cs index 8221a8e..535621b 100644 --- a/AssetStudio/Classes/StreamingInfo.cs +++ b/AssetStudio/Classes/StreamingInfo.cs @@ -6,6 +6,8 @@ public uint size; public string path; + public StreamingInfo() { } + public StreamingInfo(ObjectReader reader) { var version = reader.version; diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index f138eab..dc8a232 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using Newtonsoft.Json; namespace AssetStudio { @@ -49,6 +51,25 @@ namespace AssetStudio byteSize = (uint)(m_Width * m_Height) * 4; } + public Texture2D(ObjectReader reader, IDictionary typeDict) : base(reader) + { + var parsedTex2d = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(typeDict)); + m_Width = parsedTex2d.m_Width; + m_Height = parsedTex2d.m_Height; + m_CompleteImageSize = parsedTex2d.m_CompleteImageSize; + m_TextureFormat = parsedTex2d.m_TextureFormat; + m_MipMap = parsedTex2d.m_MipMap; + m_MipCount = parsedTex2d.m_MipCount; + m_ImageCount = parsedTex2d.m_ImageCount; + m_TextureSettings = parsedTex2d.m_TextureSettings; + m_StreamData = parsedTex2d.m_StreamData; + + image_data = !string.IsNullOrEmpty(m_StreamData?.path) + ? new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size) + : new ResourceReader(reader, parsedTex2d.image_data.Offset, parsedTex2d.image_data.Size); + typeDict.Clear(); + } + public Texture2D(ObjectReader reader) : base(reader) { m_Width = reader.ReadInt32(); @@ -129,16 +150,9 @@ namespace AssetStudio m_StreamData = new StreamingInfo(reader); } - ResourceReader resourceReader; - if (!string.IsNullOrEmpty(m_StreamData?.path)) - { - resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size); - } - else - { - resourceReader = new ResourceReader(reader, reader.BaseStream.Position, image_data_size); - } - image_data = resourceReader; + image_data = !string.IsNullOrEmpty(m_StreamData?.path) + ? new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size) + : new ResourceReader(reader, reader.BaseStream.Position, image_data_size); } // https://docs.unity3d.com/2023.3/Documentation/Manual/class-TextureImporterOverride.html diff --git a/AssetStudio/ResourceReader.cs b/AssetStudio/ResourceReader.cs index 6b705ec..85403c1 100644 --- a/AssetStudio/ResourceReader.cs +++ b/AssetStudio/ResourceReader.cs @@ -11,8 +11,18 @@ namespace AssetStudio private long size; private BinaryReader reader; - public int Size => (int)size; - public int Offset => (int)offset; + public int Size + { + get => (int)size; + set => size = value; + } + public int Offset + { + get => (int)offset; + set => offset = value; + } + + public ResourceReader() { } public ResourceReader(string path, SerializedFile assetsFile, long offset, long size) { diff --git a/AssetStudio/TypeTreeHelper.cs b/AssetStudio/TypeTreeHelper.cs index 3f3eebd..77a309b 100644 --- a/AssetStudio/TypeTreeHelper.cs +++ b/AssetStudio/TypeTreeHelper.cs @@ -171,7 +171,7 @@ namespace AssetStudio for (int i = 1; i < m_Nodes.Count; i++) { var m_Node = m_Nodes[i]; - var varNameStr = m_Node.m_Name; + var varNameStr = m_Node.m_Name.Replace("image data", "image_data"); obj[varNameStr] = ReadValue(m_Nodes, reader, ref i); } var readed = reader.Position - reader.byteStart; @@ -262,7 +262,13 @@ namespace AssetStudio case "TypelessData": { var size = reader.ReadInt32(); - value = reader.ReadBytes(size); + var dic = new OrderedDictionary + { + { "Offset", reader.BaseStream.Position }, + { "Size", size } + }; + value = dic; + reader.BaseStream.Position += size; i += 2; break; }