#pragma once
#include <array>
#include <whiteout/common_types.h>
namespace whiteout::textures {
static constexpr std::array<std::array<u8, 16>, 32> BC6H_PARTITION_TABLE = {{
{0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1},
{0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1},
{0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1},
{0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1},
{0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1},
{0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1},
{0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0},
{0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0},
{0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1},
{0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0},
{0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0},
{0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0},
{0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0},
{0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0},
}};
static constexpr std::array<u8, 32> BC6H_ANCHOR_2 = {{
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 2, 8, 2, 2, 8, 8, 15, 2, 8, 2, 2, 8, 8, 2, 2,
}};
enum BC6HField : u8 {
BC6H_RW, BC6H_RX, BC6H_RY, BC6H_RZ,
BC6H_GW, BC6H_GX, BC6H_GY, BC6H_GZ,
BC6H_BW, BC6H_BX, BC6H_BY, BC6H_BZ,
BC6H_D, BC6H_M,
};
struct BC6HBitRef {
u8 field; u8 bit; };
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_1 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_GY,4}, {BC6H_BY,4}, {BC6H_BZ,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_GZ,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_2 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_GY,5}, {BC6H_GZ,4}, {BC6H_GZ,5}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_BZ,0}, {BC6H_BZ,1},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_BY,5}, {BC6H_BZ,2}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BZ,3}, {BC6H_BZ,5}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_RY,5}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_RZ,5},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_3 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RW,10}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GW,10}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BW,10}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_4 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RW,10}, {BC6H_GZ,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GW,10}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BW,10}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_BZ,0},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_GY,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_5 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RW,10}, {BC6H_BY,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GW,10}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BW,10}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_BZ,1},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_BZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_6 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_GZ,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_7 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_GZ,4},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_BZ,2}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BZ,3}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_RY,5}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_RZ,5},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_8 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_BZ,0},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GY,5}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_GZ,5}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_GZ,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BZ,1}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_9 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_BZ,1},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_BY,5}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BZ,5}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_GZ,4}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_BZ,0}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_BZ,2}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_BZ,3},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 82> BC6H_LAYOUT_10 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_GZ,4}, {BC6H_BZ,0}, {BC6H_BZ,1},
{BC6H_BY,4}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GY,5}, {BC6H_BY,5}, {BC6H_BZ,2}, {BC6H_GY,4}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_GZ,5}, {BC6H_BZ,3}, {BC6H_BZ,5}, {BC6H_BZ,4},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_GY,0},
{BC6H_GY,1}, {BC6H_GY,2}, {BC6H_GY,3}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GZ,0}, {BC6H_GZ,1}, {BC6H_GZ,2}, {BC6H_GZ,3}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5}, {BC6H_BY,0}, {BC6H_BY,1},
{BC6H_BY,2}, {BC6H_BY,3}, {BC6H_RY,0}, {BC6H_RY,1}, {BC6H_RY,2}, {BC6H_RY,3}, {BC6H_RY,4},
{BC6H_RY,5}, {BC6H_RZ,0}, {BC6H_RZ,1}, {BC6H_RZ,2}, {BC6H_RZ,3}, {BC6H_RZ,4}, {BC6H_RZ,5},
{BC6H_D,0}, {BC6H_D,1}, {BC6H_D,2}, {BC6H_D,3}, {BC6H_D,4}
}};
static constexpr std::array<BC6HBitRef, 65> BC6H_LAYOUT_11 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_RX,6},
{BC6H_RX,7}, {BC6H_RX,8}, {BC6H_RX,9}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GX,6}, {BC6H_GX,7}, {BC6H_GX,8}, {BC6H_GX,9}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5}, {BC6H_BX,6}, {BC6H_BX,7},
{BC6H_BX,8}, {BC6H_BX,9}
}};
static constexpr std::array<BC6HBitRef, 65> BC6H_LAYOUT_12 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_RX,6},
{BC6H_RX,7}, {BC6H_RX,8}, {BC6H_RW,10}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2}, {BC6H_GX,3},
{BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GX,6}, {BC6H_GX,7}, {BC6H_GX,8}, {BC6H_GW,10}, {BC6H_BX,0},
{BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5}, {BC6H_BX,6}, {BC6H_BX,7},
{BC6H_BX,8}, {BC6H_BW,10}
}};
static constexpr std::array<BC6HBitRef, 65> BC6H_LAYOUT_13 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RX,4}, {BC6H_RX,5}, {BC6H_RX,6},
{BC6H_RX,7}, {BC6H_RW,11}, {BC6H_RW,10}, {BC6H_GX,0}, {BC6H_GX,1}, {BC6H_GX,2},
{BC6H_GX,3}, {BC6H_GX,4}, {BC6H_GX,5}, {BC6H_GX,6}, {BC6H_GX,7}, {BC6H_GW,11},
{BC6H_GW,10}, {BC6H_BX,0}, {BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3}, {BC6H_BX,4}, {BC6H_BX,5},
{BC6H_BX,6}, {BC6H_BX,7}, {BC6H_BW,11}, {BC6H_BW,10}
}};
static constexpr std::array<BC6HBitRef, 65> BC6H_LAYOUT_14 = {{
{BC6H_M,0}, {BC6H_M,1}, {BC6H_M,2}, {BC6H_M,3}, {BC6H_M,4}, {BC6H_RW,0}, {BC6H_RW,1},
{BC6H_RW,2}, {BC6H_RW,3}, {BC6H_RW,4}, {BC6H_RW,5}, {BC6H_RW,6}, {BC6H_RW,7}, {BC6H_RW,8},
{BC6H_RW,9}, {BC6H_GW,0}, {BC6H_GW,1}, {BC6H_GW,2}, {BC6H_GW,3}, {BC6H_GW,4}, {BC6H_GW,5},
{BC6H_GW,6}, {BC6H_GW,7}, {BC6H_GW,8}, {BC6H_GW,9}, {BC6H_BW,0}, {BC6H_BW,1}, {BC6H_BW,2},
{BC6H_BW,3}, {BC6H_BW,4}, {BC6H_BW,5}, {BC6H_BW,6}, {BC6H_BW,7}, {BC6H_BW,8}, {BC6H_BW,9},
{BC6H_RX,0}, {BC6H_RX,1}, {BC6H_RX,2}, {BC6H_RX,3}, {BC6H_RW,15}, {BC6H_RW,14},
{BC6H_RW,13}, {BC6H_RW,12}, {BC6H_RW,11}, {BC6H_RW,10}, {BC6H_GX,0}, {BC6H_GX,1},
{BC6H_GX,2}, {BC6H_GX,3}, {BC6H_GW,15}, {BC6H_GW,14}, {BC6H_GW,13}, {BC6H_GW,12},
{BC6H_GW,11}, {BC6H_GW,10}, {BC6H_BX,0}, {BC6H_BX,1}, {BC6H_BX,2}, {BC6H_BX,3},
{BC6H_BW,15}, {BC6H_BW,14}, {BC6H_BW,13}, {BC6H_BW,12}, {BC6H_BW,11}, {BC6H_BW,10}
}};
struct BC6HModeDesc {
u8 subsets; bool transformed; u8 endpoint_bits; std::array<u8, 3> delta_bits; u16 header_bits; const BC6HBitRef* layout;
};
static constexpr std::array<BC6HModeDesc, 15> BC6H_MODES = {{
{0, false, 0, {0, 0, 0}, 0, nullptr},
{2, true, 10, {5, 5, 5}, 82, BC6H_LAYOUT_1.data()},
{2, true, 7, {6, 6, 6}, 82, BC6H_LAYOUT_2.data()},
{2, true, 11, {5, 4, 4}, 82, BC6H_LAYOUT_3.data()},
{2, true, 11, {4, 5, 4}, 82, BC6H_LAYOUT_4.data()},
{2, true, 11, {4, 4, 5}, 82, BC6H_LAYOUT_5.data()},
{2, true, 9, {5, 5, 5}, 82, BC6H_LAYOUT_6.data()},
{2, true, 8, {6, 5, 5}, 82, BC6H_LAYOUT_7.data()},
{2, true, 8, {5, 6, 5}, 82, BC6H_LAYOUT_8.data()},
{2, true, 8, {5, 5, 6}, 82, BC6H_LAYOUT_9.data()},
{2, false, 6, {6, 6, 6}, 82, BC6H_LAYOUT_10.data()},
{1, false, 10, {10, 10, 10}, 65, BC6H_LAYOUT_11.data()},
{1, true, 11, {9, 9, 9}, 65, BC6H_LAYOUT_12.data()},
{1, true, 12, {8, 8, 8}, 65, BC6H_LAYOUT_13.data()},
{1, true, 16, {4, 4, 4}, 65, BC6H_LAYOUT_14.data()},
}};
}