// https://msdn.microsoft.com/en-us/library/windows/desktop/bb173059.aspx "DXGI_FORMAT enumeration" // https://msdn.microsoft.com/en-us/library/windows/desktop/cc308051.aspx "Legacy Formats: Map Direct3D 9 Formats to Direct3D 10" private static Squish.DDS.PixelFormat GetPixelFormat(TextureDX10ArchiveFile.Entry entry) { switch (entry.Format) { case 71: // DXGI_FORMAT_BC1_UNORM { var pixelFormat = new Squish.DDS.PixelFormat(); pixelFormat.Initialise(Squish.DDS.FileFormat.DXT1); return(pixelFormat); } case 74: // DXGI_FORMAT_BC2_UNORM { var pixelFormat = new Squish.DDS.PixelFormat(); pixelFormat.Initialise(Squish.DDS.FileFormat.DXT3); return(pixelFormat); } case 77: // DXGI_FORMAT_BC3_UNORM { var pixelFormat = new Squish.DDS.PixelFormat(); pixelFormat.Initialise(Squish.DDS.FileFormat.DXT5); return(pixelFormat); } case 87: // DXGI_FORMAT_B8G8R8A8_UNORM { var pixelFormat = new Squish.DDS.PixelFormat(); pixelFormat.Initialise(Squish.DDS.FileFormat.A8R8G8B8); return(pixelFormat); } case 61: // DXGI_FORMAT_R8_UNORM case 83: // DXGI_FORMAT_BC5_UNORM case 98: // DXGI_FORMAT_BC7_UNORM { var pixelFormat = new Squish.DDS.PixelFormat(); pixelFormat.Size = pixelFormat.GetSize(); pixelFormat.FourCC = 0x30315844; // 'DX10' return(pixelFormat); } } throw new NotSupportedException(); }
private static void ConvertTexture(Stream input, TextureDX10ArchiveFile.Entry entry, Stream output) { const Endian endian = Endian.Little; var header = new Squish.DDS.Header(); header.Size = header.GetSize(); header.Flags = Squish.DDS.HeaderFlags.Texture | Squish.DDS.HeaderFlags.Mipmap; header.Width = entry.Width; header.Height = entry.Height; header.PitchOrLinearSize = 0; header.Depth = 0; header.MipMapCount = entry.MipMapCount; header.PixelFormat = GetPixelFormat(entry); header.SurfaceFlags = 8; header.CubemapFlags = 0; output.WriteValueU32(0x20534444, endian); header.Serialize(output, endian); if (header.PixelFormat.FourCC == 0x30315844) { output.WriteValueU32(entry.Format, endian); output.WriteValueU32(2, endian); output.WriteValueU32(0, endian); output.WriteValueU32(1, endian); output.WriteValueU32(0, endian); } foreach (var mipMap in entry.MipMaps) { if (mipMap.DataCompressedSize == 0) { input.Seek(mipMap.DataOffset, SeekOrigin.Begin); output.WriteFromStream(input, mipMap.DataUncompressedSize); } else { input.Seek(mipMap.DataOffset, SeekOrigin.Begin); var zlib = new InflaterInputStream(input); output.WriteFromStream(zlib, mipMap.DataUncompressedSize); } } }