Example #1
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));
        }
Example #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);
        }