2018年4月22日日曜日

Morton Code and Reverse Morton Code

なんとなく、MortonCodeの逆変換が欲しくなりました.
10bit対応しました. 3次元で10bitずつ各次元に割り当てる場合に使います.
typedef int s32;

s32 separateBy2(s32 x)
{
    x &= 0x09249249U;
    x = (x | (x << 8) | (x<<16)) & 0x0300F00FU;
    x = (x | (x << 4) | (x<< 8)) & 0x030C30C3U;
    x = (x | (x << 2) | (x<< 4)) & 0x09249249U;
    return x;
}

s32 combineBy2(s32 x)
{
    x = (x | (x>>2) | (x>> 4)) & 0x030C30C3U;
    x = (x | (x>>4) | (x>> 8)) & 0x0300F00FU;
    x = (x | (x>>8) | (x>>16)) & 0x3FFU;
    return x;
}

s32 mortonCode3(s32 x, s32 y, s32 z)
{
    return separateBy2(x) | (separateBy2(y) << 1) | (separateBy2(z) << 2);
}

void rmortonCode3(s32& x, s32& y, s32& z, s32 w)
{
    x = combineBy2(w);
    y = combineBy2(w>>1);
    z = combineBy2(w>>2);
}