示例#1
0
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            //Prepare
            int bitmapIndex = (int)bitmapUpDown.Value;

            //Prepare
            HaloBitmap.BitmapProperties bitmap = this.bitmap.Bitmaps[bitmapIndex];

            //Loop
            byte[] buffer = null;
            for (int i = 0; i < 6; i++)
            {
                //Check Offset
                if ((bitmap.RawOffsets[i] & 0xC0000000) != 0 && bitmap.RawOffsets[i] != uint.MaxValue)
                {
                    //Load
                    buffer = bitmap_LoadData(bitmapIndex, i);

                    //Remove?
                    if (SelectedEntry.Raws[RawSection.Bitmap].ContainsRawOffset((int)bitmap.RawOffsets[i]))
                    {
                        SelectedEntry.Raws[RawSection.Bitmap].Delete((int)bitmap.RawOffsets[i]);
                    }

                    //Add
                    int offset = (int)((bitmap.Address + 28 + (i * 4)) - SelectedEntry.PostProcessedOffset);
                    SelectedEntry.Raws[RawSection.Bitmap].Add(new RawStream(buffer, offset));
                    SelectedEntry.Raws[RawSection.Bitmap][offset].OffsetAddresses.Add(bitmap.Address + 28 + (i * 4));
                    SelectedEntry.Raws[RawSection.Bitmap][offset].LengthAddresses.Add(bitmap.Address + 52 + (i * 4));
                    bitmap.RawOffsets[i] = (uint)offset;
                }
            }

            //Write
            this.bitmap.Write();

            //Reload
            tag_Reload();
        }
示例#2
0
        private void exportToolStripButton_Click(object sender, EventArgs e)
        {
            //Prepare
            string filename = string.Empty;
            bool   save     = false;

            //Get Filename
            string[] parts = this.bitmap.Entry.Filename.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length > 0)
            {
                filename = parts[parts.Length - 1];
            }

            //Initialize
            using (SaveFileDialog saveDlg = new SaveFileDialog())
            {
                //Setup
                saveDlg.Filter   = "DirectDraw Surface Files (*.dds)|*.dds";
                saveDlg.Title    = "Save texture as...";
                saveDlg.FileName = filename;
                if (saveDlg.ShowDialog() == DialogResult.OK)
                {
                    filename = saveDlg.FileName;
                    save     = true;
                }
            }

            //Prepare
            HaloBitmap.BitmapProperties bitmap = null;
            int bitmapIndex = (int)bitmapUpDown.Value;

            //Check
            if (save)
            {
                //Get Bitmap
                bitmap = this.bitmap.Bitmaps[bitmapIndex];
                uint width = bitmap.Width, height = bitmap.Height, depth = bitmap.Depth;
                bool swizzled = (bitmap.Flags & HaloBitmap.BitmapFlags.Swizzled) == HaloBitmap.BitmapFlags.Swizzled;
                if ((bitmap.Flags & HaloBitmap.BitmapFlags.PowTwoDimensions) == 0 && bitmap.MipmapCount == 0)
                {
                    width = width + (16 - (width % 16) == 16 ? 0 : 16 - (width % 16));  //Pad width to 16 for some ungodly reason
                }
                //Setup DDS file
                DdsFile file = new DdsFile();
                file.Width             = width;
                file.Height            = height;
                file.MipmapCount       = bitmap.MipmapCount;
                file.DefinitionFlags  |= DirectDrawSurfaceDefinitionFlags.PixelFormat | DirectDrawSurfaceDefinitionFlags.Width | DirectDrawSurfaceDefinitionFlags.Height | DirectDrawSurfaceDefinitionFlags.Caps;
                file.Caps             |= DirectDrawCaps.Texture;
                file.PitchOrLinearSize = (uint)bitmap_GetLength(bitmap.Format, bitmap.Width, bitmap.Height);
                file.DefinitionFlags  |= DirectDrawSurfaceDefinitionFlags.LinearSize;
                if (file.MipmapCount > 0)
                {
                    file.Caps |= DirectDrawCaps.Mipmap | DirectDrawCaps.Complex; file.DefinitionFlags |= DirectDrawSurfaceDefinitionFlags.MipmapCount;
                }

                //Setup Pixel Format
                switch (bitmap.Format)
                {
                case HaloBitmap.BitmapFormat.Dxt1: file.RgbBitCount = 0; file.FourCC = "DXT1"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                case HaloBitmap.BitmapFormat.Dxt3: file.RgbBitCount = 0; file.FourCC = "DXT3"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                case HaloBitmap.BitmapFormat.Dxt5: file.RgbBitCount = 0; file.FourCC = "DXT5"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                case HaloBitmap.BitmapFormat.V8u8: file.RgbBitCount = 16; file.PixelFormatFlags = DirectDrawPixelFormatFlags.VU; break;

                default: file.RgbBitCount = (uint)bitmapFormat_GetBitCount(bitmap.Format); break;
                }
                uint aMask = 0, rMask = 0, gMask = 0, bMask = 0;
                bitmapFormat_GetBitMask(bitmap.Format, out aMask, out rMask, out bMask, out gMask);
                file.AlphaBitmask = aMask; file.RedBitmask = rMask; file.GreenBitmask = gMask; file.BlueBitmask = bMask;

                //Setup Bits
                switch (bitmap.Format)
                {
                case HaloBitmap.BitmapFormat.A8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaPixels; break;

                case HaloBitmap.BitmapFormat.Y8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Luminance; break;

                case HaloBitmap.BitmapFormat.Ay8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaPixels; break;

                case HaloBitmap.BitmapFormat.G8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaLuminance; break;

                case HaloBitmap.BitmapFormat.A8y8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaLuminance; break;

                case HaloBitmap.BitmapFormat.R5g6b5: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Rgb; break;

                case HaloBitmap.BitmapFormat.A4r4g4b4: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Argb; break;

                case HaloBitmap.BitmapFormat.X8r8g8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Rgb; break;

                case HaloBitmap.BitmapFormat.A8r8g8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Argb; break;
                }

                //Prepare File Data
                int mapWidth = (int)width, mapHeight = (int)height;
                file.Data = new byte[bitmap.RawLengths[0]];
                using (MemoryStream ds = new MemoryStream(file.Data))
                    using (MemoryStream ms = new MemoryStream(bitmap_LoadData(bitmapIndex, 0)))
                        using (BinaryWriter writer = new BinaryWriter(ds))
                            using (BinaryReader reader = new BinaryReader(ms))
                                for (int i = 0; i <= bitmap.MipmapCount; i++)
                                {
                                    byte[] data = reader.ReadBytes(bitmap_GetLength(bitmap.Format, mapWidth, mapHeight));
                                    if (data.Length > 0)
                                    {
                                        writer.Write(swizzled ? Swizzler.Swizzle(data, mapWidth, mapHeight, (int)depth, (int)file.RgbBitCount, swizzled) : data);
                                    }
                                    mapWidth /= 2; mapHeight /= 2;
                                }

                //Save
                file.Save(filename);
            }
        }
示例#3
0
        private void dumpTexturesToolStripButton_Click(object sender, EventArgs e)
        {
            //Check
            if (bitmap == null)
            {
                return;
            }

            //Prepare
            string directory = string.Empty;
            bool   ok        = false;

            //Initialize
            using (FolderBrowserDialog folderDlg = new FolderBrowserDialog())
            {
                //Setup
                folderDlg.Description = "Select directory to dump textures.";

                //Show
                if (folderDlg.ShowDialog() == DialogResult.OK)
                {
                    directory = folderDlg.SelectedPath;
                    ok        = true;
                }
            }

            //Check
            if (ok)
            {
                //Prepare
                HaloBitmap.BitmapProperties bitmap = null;
                string[] parts    = this.bitmap.Entry.Filename.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
                string   filename = Path.Combine(directory, $"{parts[parts.Length - 1]}_{{0}}.dds");

                //Loop
                for (int b = 0; b < this.bitmap.BitmapCount; b++)
                {
                    //Get Bitmap
                    bitmap = this.bitmap.Bitmaps[b];
                    uint width = bitmap.Width, height = bitmap.Height, depth = bitmap.Depth;
                    bool swizzled = (bitmap.Flags & HaloBitmap.BitmapFlags.Swizzled) == HaloBitmap.BitmapFlags.Swizzled;
                    if ((bitmap.Flags & HaloBitmap.BitmapFlags.PowTwoDimensions) == 0 && bitmap.MipmapCount == 0)
                    {
                        width = (uint)Math.Ceiling(width / 16f) * 16;    //Pad width to 16 for some ungodly reason
                    }
                    //Setup DDS file
                    DdsFile file = new DdsFile();
                    file.Width             = width;
                    file.Height            = height;
                    file.MipmapCount       = bitmap.MipmapCount;
                    file.DefinitionFlags  |= DirectDrawSurfaceDefinitionFlags.PixelFormat | DirectDrawSurfaceDefinitionFlags.Width | DirectDrawSurfaceDefinitionFlags.Height | DirectDrawSurfaceDefinitionFlags.Caps;
                    file.Caps             |= DirectDrawCaps.Texture;
                    file.PitchOrLinearSize = (uint)bitmap_GetLength(bitmap.Format, bitmap.Width, bitmap.Height);
                    file.DefinitionFlags  |= DirectDrawSurfaceDefinitionFlags.LinearSize;
                    if (file.MipmapCount > 0)
                    {
                        file.Caps |= DirectDrawCaps.Mipmap | DirectDrawCaps.Complex; file.DefinitionFlags |= DirectDrawSurfaceDefinitionFlags.MipmapCount;
                    }

                    //Setup Pixel Format
                    switch (bitmap.Format)
                    {
                    case HaloBitmap.BitmapFormat.Dxt1: file.RgbBitCount = 0; file.FourCC = "DXT1"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                    case HaloBitmap.BitmapFormat.Dxt3: file.RgbBitCount = 0; file.FourCC = "DXT3"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                    case HaloBitmap.BitmapFormat.Dxt5: file.RgbBitCount = 0; file.FourCC = "DXT5"; file.PixelFormatFlags |= DirectDrawPixelFormatFlags.FourCC; break;

                    case HaloBitmap.BitmapFormat.V8u8: file.RgbBitCount = 16; file.PixelFormatFlags = DirectDrawPixelFormatFlags.VU; break;

                    default: file.RgbBitCount = (uint)bitmapFormat_GetBitCount(bitmap.Format); break;
                    }
                    uint aMask = 0, rMask = 0, gMask = 0, bMask = 0;
                    bitmapFormat_GetBitMask(bitmap.Format, out aMask, out rMask, out bMask, out gMask);
                    file.AlphaBitmask = aMask; file.RedBitmask = rMask; file.GreenBitmask = gMask; file.BlueBitmask = bMask;

                    //Setup Bits
                    switch (bitmap.Format)
                    {
                    case HaloBitmap.BitmapFormat.A8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaPixels; break;

                    case HaloBitmap.BitmapFormat.Y8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Luminance; break;

                    case HaloBitmap.BitmapFormat.Ay8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaPixels; break;

                    case HaloBitmap.BitmapFormat.G8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaLuminance; break;

                    case HaloBitmap.BitmapFormat.A8y8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.AlphaLuminance; break;

                    case HaloBitmap.BitmapFormat.R5g6b5: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Rgb; break;

                    case HaloBitmap.BitmapFormat.A4r4g4b4: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Argb; break;

                    case HaloBitmap.BitmapFormat.X8r8g8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Rgb; break;

                    case HaloBitmap.BitmapFormat.A8r8g8b8: file.PixelFormatFlags |= DirectDrawPixelFormatFlags.Argb; break;
                    }

                    //Prepare File Data
                    int mapWidth = (int)width, mapHeight = (int)height;
                    file.Data = new byte[bitmap.RawLengths[0]];
                    using (MemoryStream ds = new MemoryStream(file.Data))
                        using (MemoryStream ms = new MemoryStream(bitmap_LoadData(b, 0)))
                            using (BinaryWriter writer = new BinaryWriter(ds))
                                using (BinaryReader reader = new BinaryReader(ms))
                                    for (int i = 0; i <= bitmap.MipmapCount; i++)
                                    {
                                        byte[] data = reader.ReadBytes(bitmap_GetLength(bitmap.Format, mapWidth, mapHeight));
                                        if (data.Length > 0)
                                        {
                                            writer.Write(swizzled ? Swizzler.Swizzle(data, mapWidth, mapHeight, (int)depth, (int)file.RgbBitCount, swizzled) : data);
                                        }
                                        mapWidth /= 2; mapHeight /= 2;
                                    }

                    //Save
                    file.Save(string.Format(filename, b));
                }
            }
        }