AssetStudio/AssetStudio/Classes/Texture2D.cs

180 lines
4.9 KiB
C#
Raw Normal View History

2015-10-30 02:41:37 +00:00
using System;
using System.Drawing;
using System.Drawing.Imaging;
2016-08-31 09:17:21 +00:00
using System.IO;
2015-10-30 02:41:37 +00:00
using System.Linq;
using System.Runtime.InteropServices;
2015-10-30 02:41:37 +00:00
2018-04-02 22:51:22 +00:00
namespace AssetStudio
2015-10-30 02:41:37 +00:00
{
public class StreamingInfo
{
public uint offset;
public uint size;
public string path;
public StreamingInfo(ObjectReader reader)
{
offset = reader.ReadUInt32();
size = reader.ReadUInt32();
path = reader.ReadAlignedString();
}
}
public class GLTextureSettings
{
public int m_FilterMode;
public int m_Aniso;
public float m_MipBias;
public int m_WrapMode;
public GLTextureSettings(ObjectReader reader)
{
var version = reader.version;
m_FilterMode = reader.ReadInt32();
m_Aniso = reader.ReadInt32();
m_MipBias = reader.ReadSingle();
if (version[0] >= 2017)//2017.x and up
{
m_WrapMode = reader.ReadInt32(); //m_WrapU
int m_WrapV = reader.ReadInt32();
int m_WrapW = reader.ReadInt32();
}
else
{
m_WrapMode = reader.ReadInt32();
}
}
}
2018-09-26 17:15:37 +00:00
public sealed class Texture2D : Texture
2015-10-30 02:41:37 +00:00
{
public int m_Width;
public int m_Height;
2017-01-16 08:56:04 +00:00
public TextureFormat m_TextureFormat;
2017-02-11 20:57:24 +00:00
public bool m_MipMap;
2018-04-11 15:45:39 +00:00
public int m_MipCount;
public GLTextureSettings m_TextureSettings;
2018-11-21 07:37:56 +00:00
public Lazy<byte[]> image_data;
public StreamingInfo m_StreamData;
2015-10-30 02:41:37 +00:00
2018-11-21 07:37:56 +00:00
public Texture2D(ObjectReader reader) : base(reader)
2015-10-30 02:41:37 +00:00
{
2018-03-01 12:01:25 +00:00
m_Width = reader.ReadInt32();
m_Height = reader.ReadInt32();
var m_CompleteImageSize = reader.ReadInt32();
2018-03-01 12:01:25 +00:00
m_TextureFormat = (TextureFormat)reader.ReadInt32();
if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down
2018-04-11 15:45:39 +00:00
{
m_MipMap = reader.ReadBoolean();
}
2015-11-02 08:11:26 +00:00
else
{
2018-04-11 15:45:39 +00:00
m_MipCount = reader.ReadInt32();
2015-11-02 08:11:26 +00:00
}
var m_IsReadable = reader.ReadBoolean(); //2.6.0 and up
var m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4
//bool m_StreamingMipmaps 2018.2 and up
2018-12-02 18:42:07 +00:00
reader.AlignStream();
2018-07-12 16:54:38 +00:00
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
{
var m_StreamingMipmapsPriority = reader.ReadInt32();
}
var m_ImageCount = reader.ReadInt32();
var m_TextureDimension = reader.ReadInt32();
m_TextureSettings = new GLTextureSettings(reader);
if (version[0] >= 3) //3.0 and up
2018-07-06 18:59:44 +00:00
{
var m_LightmapFormat = reader.ReadInt32();
2018-07-06 18:59:44 +00:00
}
if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5.0 and up
2018-08-03 05:01:51 +00:00
{
var m_ColorSpace = reader.ReadInt32();
2018-08-03 05:01:51 +00:00
}
var image_data_size = reader.ReadInt32();
2018-02-27 09:23:15 +00:00
if (image_data_size == 0 && ((version[0] == 5 && version[1] >= 3) || version[0] > 5))//5.3.0 and up
2016-08-31 09:17:21 +00:00
{
m_StreamData = new StreamingInfo(reader);
2016-08-31 09:17:21 +00:00
}
2018-11-21 07:37:56 +00:00
ResourceReader resourceReader;
if (!string.IsNullOrEmpty(m_StreamData?.path))
2015-10-30 02:41:37 +00:00
{
resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, (int)m_StreamData.size);
2018-11-21 07:37:56 +00:00
}
else
{
resourceReader = new ResourceReader(reader, reader.BaseStream.Position, image_data_size);
2015-10-30 02:41:37 +00:00
}
2018-11-21 07:37:56 +00:00
image_data = new Lazy<byte[]>(resourceReader.GetData);
2015-10-30 02:41:37 +00:00
}
}
2018-03-27 22:29:28 +00:00
public enum TextureFormat
{
Alpha8 = 1,
ARGB4444,
RGB24,
RGBA32,
ARGB32,
RGB565 = 7,
R16 = 9,
DXT1,
DXT5 = 12,
RGBA4444,
BGRA32,
RHalf,
RGHalf,
RGBAHalf,
RFloat,
RGFloat,
RGBAFloat,
YUY2,
RGB9e5Float,
BC4 = 26,
BC5,
BC6H = 24,
BC7,
DXT1Crunched = 28,
DXT5Crunched,
PVRTC_RGB2,
PVRTC_RGBA2,
PVRTC_RGB4,
PVRTC_RGBA4,
ETC_RGB4,
ATC_RGB4,
ATC_RGBA8,
EAC_R = 41,
EAC_R_SIGNED,
EAC_RG,
EAC_RG_SIGNED,
ETC2_RGB,
ETC2_RGBA1,
ETC2_RGBA8,
ASTC_RGB_4x4,
ASTC_RGB_5x5,
ASTC_RGB_6x6,
ASTC_RGB_8x8,
ASTC_RGB_10x10,
ASTC_RGB_12x12,
ASTC_RGBA_4x4,
ASTC_RGBA_5x5,
ASTC_RGBA_6x6,
ASTC_RGBA_8x8,
ASTC_RGBA_10x10,
ASTC_RGBA_12x12,
ETC_RGB4_3DS,
ETC_RGBA8_3DS,
RG16,
R8,
ETC_RGB4Crunched,
ETC2_RGBA8Crunched,
2020-03-23 22:41:58 +00:00
ASTC_HDR_4x4,
ASTC_HDR_5x5,
ASTC_HDR_6x6,
ASTC_HDR_8x8,
ASTC_HDR_10x10,
ASTC_HDR_12x12,
2018-03-27 22:29:28 +00:00
}
2017-02-01 18:23:46 +00:00
}