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);
}
0 件のコメント:
コメントを投稿