Add Texture2D loading via typetree

This commit is contained in:
VaDiM 2024-03-05 23:42:14 +03:00
parent 46f8023756
commit bc9380b8be
6 changed files with 51 additions and 15 deletions

View File

@ -567,7 +567,9 @@ namespace AssetStudio
obj = new TextAsset(objectReader); obj = new TextAsset(objectReader);
break; break;
case ClassIDType.Texture2D: 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; break;
case ClassIDType.Texture2DArray: case ClassIDType.Texture2DArray:
obj = new Texture2DArray(objectReader); obj = new Texture2DArray(objectReader);

View File

@ -7,6 +7,8 @@
public float m_MipBias; public float m_MipBias;
public int m_WrapMode; public int m_WrapMode;
public GLTextureSettings() { }
public GLTextureSettings(ObjectReader reader) public GLTextureSettings(ObjectReader reader)
{ {
var version = reader.version; var version = reader.version;

View File

@ -6,6 +6,8 @@
public uint size; public uint size;
public string path; public string path;
public StreamingInfo() { }
public StreamingInfo(ObjectReader reader) public StreamingInfo(ObjectReader reader)
{ {
var version = reader.version; var version = reader.version;

View File

@ -1,4 +1,6 @@
using System; using System;
using System.Collections;
using Newtonsoft.Json;
namespace AssetStudio namespace AssetStudio
{ {
@ -49,6 +51,25 @@ namespace AssetStudio
byteSize = (uint)(m_Width * m_Height) * 4; byteSize = (uint)(m_Width * m_Height) * 4;
} }
public Texture2D(ObjectReader reader, IDictionary typeDict) : base(reader)
{
var parsedTex2d = JsonConvert.DeserializeObject<Texture2D>(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) public Texture2D(ObjectReader reader) : base(reader)
{ {
m_Width = reader.ReadInt32(); m_Width = reader.ReadInt32();
@ -129,16 +150,9 @@ namespace AssetStudio
m_StreamData = new StreamingInfo(reader); m_StreamData = new StreamingInfo(reader);
} }
ResourceReader resourceReader; image_data = !string.IsNullOrEmpty(m_StreamData?.path)
if (!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);
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;
} }
// https://docs.unity3d.com/2023.3/Documentation/Manual/class-TextureImporterOverride.html // https://docs.unity3d.com/2023.3/Documentation/Manual/class-TextureImporterOverride.html

View File

@ -11,8 +11,18 @@ namespace AssetStudio
private long size; private long size;
private BinaryReader reader; private BinaryReader reader;
public int Size => (int)size; public int Size
public int Offset => (int)offset; {
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) public ResourceReader(string path, SerializedFile assetsFile, long offset, long size)
{ {

View File

@ -171,7 +171,7 @@ namespace AssetStudio
for (int i = 1; i < m_Nodes.Count; i++) for (int i = 1; i < m_Nodes.Count; i++)
{ {
var m_Node = m_Nodes[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); obj[varNameStr] = ReadValue(m_Nodes, reader, ref i);
} }
var readed = reader.Position - reader.byteStart; var readed = reader.Position - reader.byteStart;
@ -262,7 +262,13 @@ namespace AssetStudio
case "TypelessData": case "TypelessData":
{ {
var size = reader.ReadInt32(); 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; i += 2;
break; break;
} }