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(); }
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); } }
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)); } } }