Beispiel #1
0
        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));
        }
Beispiel #2
0
        // 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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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;
            }
        }