| 78 | |
| 79 | #if USE_EDITOR |
| 80 | static TextureData const* stbDecompress(const TextureData& textureData, TextureData& decompressed) |
| 81 | { |
| 82 | if (!PixelFormatExtensions::IsCompressed(textureData.Format)) |
| 83 | return &textureData; |
| 84 | const bool srgb = PixelFormatExtensions::IsSRGB(textureData.Format); |
| 85 | switch (textureData.Format) |
| 86 | { |
| 87 | case PixelFormat::BC4_UNorm: |
| 88 | case PixelFormat::BC4_SNorm: |
| 89 | decompressed.Format = PixelFormat::R8_UNorm; |
| 90 | break; |
| 91 | case PixelFormat::BC5_UNorm: |
| 92 | case PixelFormat::BC5_SNorm: |
| 93 | decompressed.Format = PixelFormat::R8G8_UNorm; |
| 94 | break; |
| 95 | default: |
| 96 | decompressed.Format = srgb ? PixelFormat::R8G8B8A8_UNorm_sRGB : PixelFormat::R8G8B8A8_UNorm; |
| 97 | break; |
| 98 | } |
| 99 | decompressed.Width = textureData.Width; |
| 100 | decompressed.Height = textureData.Height; |
| 101 | decompressed.Depth = textureData.Depth; |
| 102 | decompressed.Items.Resize(textureData.Items.Count()); |
| 103 | |
| 104 | typedef bool (*detexDecompressBlockFuncType)(const uint8_t* bitstring, uint32_t mode_mask, uint32_t flags, uint8_t* pixel_buffer); |
| 105 | detexDecompressBlockFuncType detexDecompressBlockFunc; |
| 106 | int32 pixelSize, blockSize; |
| 107 | switch (textureData.Format) |
| 108 | { |
| 109 | case PixelFormat::BC1_UNorm: |
| 110 | case PixelFormat::BC1_UNorm_sRGB: |
| 111 | detexDecompressBlockFunc = detexDecompressBlockBC1; |
| 112 | pixelSize = 4; |
| 113 | blockSize = 8; |
| 114 | break; |
| 115 | case PixelFormat::BC2_UNorm: |
| 116 | case PixelFormat::BC2_UNorm_sRGB: |
| 117 | detexDecompressBlockFunc = detexDecompressBlockBC2; |
| 118 | pixelSize = 4; |
| 119 | blockSize = 16; |
| 120 | break; |
| 121 | case PixelFormat::BC3_UNorm: |
| 122 | case PixelFormat::BC3_UNorm_sRGB: |
| 123 | detexDecompressBlockFunc = detexDecompressBlockBC3; |
| 124 | pixelSize = 4; |
| 125 | blockSize = 16; |
| 126 | break; |
| 127 | case PixelFormat::BC4_UNorm: |
| 128 | detexDecompressBlockFunc = detexDecompressBlockRGTC1; |
| 129 | pixelSize = 1; |
| 130 | blockSize = 8; |
| 131 | break; |
| 132 | case PixelFormat::BC5_UNorm: |
| 133 | detexDecompressBlockFunc = detexDecompressBlockRGTC2; |
| 134 | pixelSize = 2; |
| 135 | blockSize = 16; |
| 136 | break; |
| 137 | case PixelFormat::BC7_UNorm: |