From 1392dc61d32812f2f66533892804d9b50f68c741 Mon Sep 17 00:00:00 2001 From: morkt Date: Fri, 20 Apr 2018 21:20:50 +0400 Subject: [PATCH] (Unity): adjusted texture entries deserialization. --- ArcFormats/Unity/ArcASSET.cs | 43 +++++++++++++++++++++------------- ArcFormats/Unity/ArcUnityFS.cs | 4 +++- ArcFormats/Unity/Asset.cs | 2 +- ArcFormats/Unity/Texture2D.cs | 25 +++++++------------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/ArcFormats/Unity/ArcASSET.cs b/ArcFormats/Unity/ArcASSET.cs index f5c63c47..60998110 100644 --- a/ArcFormats/Unity/ArcASSET.cs +++ b/ArcFormats/Unity/ArcASSET.cs @@ -79,27 +79,29 @@ namespace GameRes.Formats.Unity return base.OpenImage (arc, entry); var obj = aent.AssetObject; - using (var stream = arc.File.CreateStream (obj.Offset, obj.Size)) - using (var reader = new AssetReader (stream)) + var stream = arc.File.CreateStream (obj.Offset, obj.Size); + var reader = new AssetReader (stream); + try { reader.SetupReaders (obj.Asset); var tex = new Texture2D(); tex.Load (reader); - - var input = OpenEntry (arc, entry); - try + if (0 == tex.m_DataLength) { - tex.m_Data = new byte[entry.Size]; - input.Read (tex.m_Data, 0, tex.m_Data.Length); - var tex_reader = new AssetReader (input, entry.Name); - tex_reader.SetupReaders (obj.Asset); - return new Texture2DDecoder (tex, tex_reader); - } - catch - { - input.Dispose(); - throw; + reader.Dispose(); + var input = OpenEntry (arc, entry); + reader = new AssetReader (input, entry.Name); + reader.SetupReaders (obj.Asset); + tex.m_DataLength = (int)entry.Size; } + var decoder = new Texture2DDecoder (tex, reader); + reader = null; + return decoder; + } + finally + { + if (reader != null) + reader.Dispose(); } } } @@ -165,7 +167,7 @@ namespace GameRes.Formats.Unity { var tex = new Texture2D(); tex.Load (input); - if (null == tex.m_Data || 0 == tex.m_Data.Length) + if (0 == tex.m_DataLength) { if (asset.Tree.Version == "2017.2.0f3") input.ReadInt64(); @@ -182,6 +184,15 @@ namespace GameRes.Formats.Unity }; } } + else + { + entry = new AssetEntry { + Name = tex.m_Name, + Type = "image", + Offset = obj.Offset, + Size = obj.Size, + }; + } break; } case 83: // AudioClip diff --git a/ArcFormats/Unity/ArcUnityFS.cs b/ArcFormats/Unity/ArcUnityFS.cs index 3e57bc19..ed2e9e64 100644 --- a/ArcFormats/Unity/ArcUnityFS.cs +++ b/ArcFormats/Unity/ArcUnityFS.cs @@ -130,7 +130,9 @@ namespace GameRes.Formats.Unity input = new StreamRegion (input, obj.Offset, obj.Size); var reader = new AssetReader (input, entry.Name); reader.SetupReaders (obj.Asset); - return new Texture2DDecoder (reader); + var tex = new Texture2D(); + tex.Load (reader); + return new Texture2DDecoder (tex, reader); } internal static byte[] UnpackLzma (byte[] input, int unpacked_size) diff --git a/ArcFormats/Unity/Asset.cs b/ArcFormats/Unity/Asset.cs index 7ea3bdcb..566720ef 100644 --- a/ArcFormats/Unity/Asset.cs +++ b/ArcFormats/Unity/Asset.cs @@ -120,7 +120,7 @@ namespace GameRes.Formats.Unity else */ { - Trace.WriteLine ("Unknown type id", obj.ClassId.ToString()); + Trace.WriteLine (string.Format ("Unknown type id {0}", obj.ClassId.ToString()), "[Unity.Asset]"); m_types[obj.TypeId] = null; } } diff --git a/ArcFormats/Unity/Texture2D.cs b/ArcFormats/Unity/Texture2D.cs index a48baf42..43e8ea49 100644 --- a/ArcFormats/Unity/Texture2D.cs +++ b/ArcFormats/Unity/Texture2D.cs @@ -67,6 +67,7 @@ namespace GameRes.Formats.Unity public int m_WrapMode; public int m_LightFormat; public int m_ColorSpace; + public int m_DataLength; public byte[] m_Data; public void Load (AssetReader reader) @@ -89,8 +90,12 @@ namespace GameRes.Formats.Unity m_WrapMode = reader.ReadInt32(); m_LightFormat = reader.ReadInt32(); m_ColorSpace = reader.ReadInt32(); - int length = reader.ReadInt32(); - m_Data = reader.ReadBytes (length); + m_DataLength = reader.ReadInt32(); + } + + public void LoadData (AssetReader reader) + { + m_Data = reader.ReadBytes (m_DataLength); } } @@ -100,7 +105,7 @@ namespace GameRes.Formats.Unity Texture2D m_texture; ImageData m_image; - public Stream Source { get { return m_reader.Source; } } + public Stream Source { get { m_reader.Position = 0; return m_reader.Source; } } public ImageFormat SourceFormat { get { return null; } } public PixelFormat Format { get; private set; } public ImageMetaData Info { get; private set; } @@ -114,19 +119,6 @@ namespace GameRes.Formats.Unity } } - public Texture2DDecoder (AssetReader input) - { - m_reader = input; - m_texture = new Texture2D(); - m_texture.Load (m_reader); - Info = new ImageMetaData { - Width = (uint)m_texture.m_Width, - Height = (uint)m_texture.m_Height, - }; - SetFormat (m_texture.m_TextureFormat); - m_reader.Position = 0; - } - public Texture2DDecoder (Texture2D texture, AssetReader input) { m_reader = input; @@ -171,6 +163,7 @@ namespace GameRes.Formats.Unity ImageData Unpack () { + m_texture.LoadData (m_reader); byte[] pixels; switch (m_texture.m_TextureFormat) {