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