public void ReadTexture(cTextureHeader cTextureHeader, BinaryReader binaryReader) { cTextureHeader.ImageData = new byte[cTextureHeader.MipMap][]; cTextureHeader.ImageData[0] = binaryReader.ReadBytes(textureFormat == TextureFormat.DXT1 || textureFormat == TextureFormat.DXT3 || textureFormat == TextureFormat.DXT5 ? binaryReader.ReadInt32() : (int)cTextureHeader.Width * (int)cTextureHeader.Height * (textureFormat == TextureFormat.RGB ? 3 : 4)); for (uint value = 1; value < cTextureHeader.MipMap; value++) { cTextureHeader.ImageData[value] = cTextureHeader.ImageData[0]; } }
public bool ReadFile(string FileName) { cTextureHeader = new cTextureHeader(); using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(File.ReadAllBytes(FileName)))) { cTextureHeader.VersionChunk = binaryReader.ReadBytes(4); //TVER cTextureHeader.Version = binaryReader.ReadInt32(); cTextureHeader.DataChunk = binaryReader.ReadBytes(4); //TDAT if (cTextureHeader.Version != 4) { cTextureHeader.Width = binaryReader.ReadUInt32() ^ 0x12143D3E; cTextureHeader.FirstMipLevel = binaryReader.ReadUInt32() ^ 0x55578081; cTextureHeader.Height = (uint)(binaryReader.ReadUInt32() ^ -1734687804); cTextureHeader.MipMap = (uint)(binaryReader.ReadUInt32() ^ -606271993); cTextureHeader.Bits = binaryReader.ReadUInt32() ^ 0x1E20494A; cTextureHeader.Frames = binaryReader.ReadUInt32() ^ 0x61638C8D; } else { cTextureHeader.Bits = binaryReader.ReadUInt32(); cTextureHeader.Width = binaryReader.ReadUInt32(); cTextureHeader.Height = binaryReader.ReadUInt32(); cTextureHeader.MipMap = binaryReader.ReadUInt32(); cTextureHeader.FirstMipLevel = binaryReader.ReadUInt32(); cTextureHeader.Frames = binaryReader.ReadUInt32(); } cTextureHeader.Width >>= (int)cTextureHeader.FirstMipLevel; cTextureHeader.Height >>= (int)cTextureHeader.FirstMipLevel; cTextureHeader.Format = System.Text.Encoding.ASCII.GetString(binaryReader.ReadBytes(4)); cTextureHeader.AnimOffset = binaryReader.ReadInt32(); if (cTextureHeader.Format != "FRMC" && cTextureHeader.Format != "FRMS") { return(false); } bool DXT5 = Convert.ToBoolean((ulong)TextureFlag.TEX_COMPRESSEDALPHA & cTextureHeader.Bits) && cTextureHeader.Format == "FRMC"; bool DXT3 = Convert.ToBoolean((ulong)TextureFlag.TEX_ALPHACHANNEL & cTextureHeader.Bits) && !Convert.ToBoolean((ulong)TextureFlag.TEX_TRANSPARENT & cTextureHeader.Bits) && cTextureHeader.Format == "FRMC"; bool DXT1 = Convert.ToBoolean((ulong)TextureFlag.TEX_COMPRESSED & cTextureHeader.Bits) && cTextureHeader.Format == "FRMC"; bool RGBA = Convert.ToBoolean((ulong)TextureFlag.TEX_ALPHACHANNEL & cTextureHeader.Bits) && cTextureHeader.Format == "FRMS"; textureFormat = DXT5 ? TextureFormat.DXT5 : DXT3 ? TextureFormat.DXT3 : DXT1 ? TextureFormat.DXT1 : RGBA ? TextureFormat.RGBA : TextureFormat.RGB; ReadTexture(cTextureHeader, binaryReader); } return(true); }