internal OctreeNode <T> Get(int x, int y, int z, int minlevel) { if (GetLevel() == minlevel) { return(this); } int equalOffsetNum = EqualOffsetNum(x, y, z); int l = level; if (equalOffsetNum == offsetBitNum) { l += offsetBitNum; } else { return(null); } int bitIndex = BitHack.BitIndex(x, y, z, l); if (!HasChilds() || nodes[bitIndex] == null) { return(null); } return(nodes[bitIndex].Get(x, y, z, minlevel)); }
// calculates the num of equal bits between bitlevel and offsetBitNum // Example: // x: 00000000000 // xcoord: 00000111001 // from left to right the number of equal bits is 5 // this is done for x,y and z coordinate, minimum of those 3 is returned private int EqualOffsetNum(int x, int y, int z) { int equalX = BitHack.cmpBit(xcoord, x, level, offsetBitNum); int equalY = BitHack.cmpBit(ycoord, y, level, offsetBitNum); int equalZ = BitHack.cmpBit(zcoord, z, level, offsetBitNum); return(BitHack.min(equalX, equalY, equalZ)); }
public Vector3i GetPos() { int mask = (int)BitHack.Mask(0, level - 1); int x = xcoord & mask; int y = ycoord & mask; int z = zcoord & mask; return(new Vector3i(x, y, z)); }
internal void Set(int x, int y, int z, T val, int minlevel) { int equalOffsetNum = EqualOffsetNum(x, y, z); if (equalOffsetNum == offsetBitNum) { int bitIndex = BitHack.BitIndex(x, y, z, level + offsetBitNum); if (GetLevel() == minlevel) { value = val; return; } if (!HasChilds() || nodes[bitIndex] == null) { //Node doesn't exist - create it OctreeNode <T> leaf = initLeaf(bitIndex, x, y, z); //return leaf.value; leaf.value = val; //leaf.setChunkVal(x, y, z, val); } else { //Node exists - refer Set call // if (n.GetLevel() == minlevel) // return n.value; nodes[bitIndex].Set(x, y, z, val, minlevel); } } else { //Create Node OctreeNode <T> newc = parent.initChild(parent.GetChildIndex(this), x, y, z); newc.offsetBitNum = (byte)equalOffsetNum; newc.level = level; //Add this as child to the new Node int bitIndex = BitHack.BitIndex(xcoord, ycoord, zcoord, newc.level + newc.offsetBitNum); newc.SetChild(this, bitIndex); offsetBitNum -= (byte)(equalOffsetNum + 1); level = (byte)(newc.level + newc.offsetBitNum + 1); bitIndex = BitHack.BitIndex(x, y, z, newc.level + newc.offsetBitNum); OctreeNode <T> leaf = newc.initLeaf(bitIndex, x, y, z); //leaf.setChunkVal(x, y, z, val); //leaf.value[x, y, z] = val; leaf.value = val; } }