Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }