(Unity): adjusted texture entries deserialization.

This commit is contained in:
morkt 2018-04-20 21:20:50 +04:00
parent 7bbaa26051
commit 1392dc61d3
4 changed files with 40 additions and 34 deletions

View File

@ -79,27 +79,29 @@ namespace GameRes.Formats.Unity
return base.OpenImage (arc, entry); return base.OpenImage (arc, entry);
var obj = aent.AssetObject; var obj = aent.AssetObject;
using (var stream = arc.File.CreateStream (obj.Offset, obj.Size)) var stream = arc.File.CreateStream (obj.Offset, obj.Size);
using (var reader = new AssetReader (stream)) var reader = new AssetReader (stream);
try
{ {
reader.SetupReaders (obj.Asset); reader.SetupReaders (obj.Asset);
var tex = new Texture2D(); var tex = new Texture2D();
tex.Load (reader); tex.Load (reader);
if (0 == tex.m_DataLength)
{
reader.Dispose();
var input = OpenEntry (arc, entry); var input = OpenEntry (arc, entry);
try reader = new AssetReader (input, entry.Name);
{ reader.SetupReaders (obj.Asset);
tex.m_Data = new byte[entry.Size]; tex.m_DataLength = (int)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 var decoder = new Texture2DDecoder (tex, reader);
{ reader = null;
input.Dispose(); return decoder;
throw;
} }
finally
{
if (reader != null)
reader.Dispose();
} }
} }
} }
@ -165,7 +167,7 @@ namespace GameRes.Formats.Unity
{ {
var tex = new Texture2D(); var tex = new Texture2D();
tex.Load (input); 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") if (asset.Tree.Version == "2017.2.0f3")
input.ReadInt64(); 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; break;
} }
case 83: // AudioClip case 83: // AudioClip

View File

@ -130,7 +130,9 @@ namespace GameRes.Formats.Unity
input = new StreamRegion (input, obj.Offset, obj.Size); input = new StreamRegion (input, obj.Offset, obj.Size);
var reader = new AssetReader (input, entry.Name); var reader = new AssetReader (input, entry.Name);
reader.SetupReaders (obj.Asset); 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) internal static byte[] UnpackLzma (byte[] input, int unpacked_size)

View File

@ -120,7 +120,7 @@ namespace GameRes.Formats.Unity
else 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; m_types[obj.TypeId] = null;
} }
} }

View File

@ -67,6 +67,7 @@ namespace GameRes.Formats.Unity
public int m_WrapMode; public int m_WrapMode;
public int m_LightFormat; public int m_LightFormat;
public int m_ColorSpace; public int m_ColorSpace;
public int m_DataLength;
public byte[] m_Data; public byte[] m_Data;
public void Load (AssetReader reader) public void Load (AssetReader reader)
@ -89,8 +90,12 @@ namespace GameRes.Formats.Unity
m_WrapMode = reader.ReadInt32(); m_WrapMode = reader.ReadInt32();
m_LightFormat = reader.ReadInt32(); m_LightFormat = reader.ReadInt32();
m_ColorSpace = reader.ReadInt32(); m_ColorSpace = reader.ReadInt32();
int length = reader.ReadInt32(); m_DataLength = reader.ReadInt32();
m_Data = reader.ReadBytes (length); }
public void LoadData (AssetReader reader)
{
m_Data = reader.ReadBytes (m_DataLength);
} }
} }
@ -100,7 +105,7 @@ namespace GameRes.Formats.Unity
Texture2D m_texture; Texture2D m_texture;
ImageData m_image; 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 ImageFormat SourceFormat { get { return null; } }
public PixelFormat Format { get; private set; } public PixelFormat Format { get; private set; }
public ImageMetaData Info { 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) public Texture2DDecoder (Texture2D texture, AssetReader input)
{ {
m_reader = input; m_reader = input;
@ -171,6 +163,7 @@ namespace GameRes.Formats.Unity
ImageData Unpack () ImageData Unpack ()
{ {
m_texture.LoadData (m_reader);
byte[] pixels; byte[] pixels;
switch (m_texture.m_TextureFormat) switch (m_texture.m_TextureFormat)
{ {