public void LoadSection(BinaryReaderEx reader) { this.Header = new GtexHeader(); this.Header.Magic = reader.ReadInt32(); this.Header.Unknown1 = reader.ReadByte(); this.Header.Unknown2 = reader.ReadByte(); this.Header.Format = reader.ReadByte(); this.Header.MipMapCount = reader.ReadByte(); this.Header.Unknown3 = reader.ReadByte(); this.Header.IsCubeMap = reader.ReadByte() == 0x1; this.Header.Width = reader.ReadUInt16(Endianness.BigEndian); this.Header.Height = reader.ReadUInt16(Endianness.BigEndian); this.Header.Depth = reader.ReadInt16(Endianness.BigEndian); this.Header.Unknown5 = reader.ReadInt32(Endianness.BigEndian); this.Header.DataOffset = reader.ReadUInt32(Endianness.BigEndian); if (this.Header.IsCubeMap) { this.NumLayers = 6; } else { this.NumLayers = this.Header.MipMapCount; } this.LoadMipMapData(reader); this.GetDataOffset(); this.LoadTextureData(reader); }
private TextureHandle LoadBlpTexture(SlimDX.Direct3D9.Device Render, System.IO.BinaryReader reader) { reader.BaseStream.Position += 4; byte compression = reader.ReadByte(); byte alphaDepth = reader.ReadByte(); byte alphaEncoding = reader.ReadByte(); byte hasMipMap = reader.ReadByte(); int width = reader.ReadInt32(); int height = reader.ReadInt32(); int[] Offsets = new int[16]; int[] Sizes = new int[16]; byte[] ofsTmp = reader.ReadBytes(16 * 4); byte[] sizTmp = reader.ReadBytes(16 * 4); int levelCount = 0; int blockSize = 0; for (int i = 0; i < 16; ++i) { Offsets[i] = BitConverter.ToInt32(ofsTmp, 4 * i); Sizes[i] = BitConverter.ToInt32(sizTmp, 4 * i); if (Offsets[i] != 0 && Sizes[i] != 0) { ++levelCount; } } SlimDX.Direct3D9.Format texFmt = SlimDX.Direct3D9.Format.Unknown; if (compression == 2) { switch (alphaEncoding) { case 0: texFmt = SlimDX.Direct3D9.Format.Dxt1; blockSize = 2; break; case 1: texFmt = SlimDX.Direct3D9.Format.Dxt3; blockSize = 4; break; case 7: texFmt = SlimDX.Direct3D9.Format.Dxt5; blockSize = 4; break; } } if (compression == 3) { texFmt = SlimDX.Direct3D9.Format.A8R8G8B8; blockSize = 4; } if (texFmt == SlimDX.Direct3D9.Format.Unknown) { throw new FormatException("This format is not yet supported, sorry!"); } var texture = new SlimDX.Direct3D9.Texture(Render, width, height, levelCount, SlimDX.Direct3D9.Usage.None, texFmt, SlimDX.Direct3D9.Pool.Managed); int curLevel = 0; for (int i = 0; i < 16; ++i) { if (Sizes[i] != 0 && Offsets[i] != 0) { reader.BaseStream.Position = Offsets[i]; byte[] layerData = reader.ReadBytes(Sizes[i]); SlimDX.Direct3D9.Surface surf = texture.GetSurfaceLevel(curLevel); SlimDX.Direct3D9.SurfaceDescription desc = texture.GetLevelDescription(curLevel); System.Drawing.Rectangle rec = System.Drawing.Rectangle.FromLTRB(0, 0, desc.Width, desc.Height); SlimDX.Direct3D9.Surface.FromMemory(surf, layerData, SlimDX.Direct3D9.Filter.Triangle, 0, texFmt, blockSize * rec.Width, rec); ++curLevel; } } return(new TextureHandle(texture)); }