示例#1
0
        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];
            }
        }
示例#2
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);
        }