/**
  * Insert new voxel with hashkey into the hashtree
  * @param voxel voxel to be inserted
  * @param hashkey hashkey of the voxel
  */
 public void Insert(Voxel voxel, int hashkey)
 {
     if (m_hashKey == int.MinValue)
     {
         m_hashKey    = hashkey;
         this.m_voxel = voxel;
         return;
     }
     if (m_hashKey == hashkey)
     {
         this.m_voxel = voxel;
         return;
     }
     if (hashkey < m_hashKey)
     {
         if (m_leftHashTree == null)
         {
             m_leftHashTree = new VoxelHashTree();
             m_leftHashTree.m_parentHashTree = this;
         }
         m_leftHashTree.Insert(voxel, hashkey);
     }
     else
     {
         if (m_rightHashTree == null)
         {
             m_rightHashTree = new VoxelHashTree();
             m_rightHashTree.m_parentHashTree = this;
         }
         m_rightHashTree.Insert(voxel, hashkey);
     }
 }
    /**
     * Clear the tree and subtrees
     */    
    public void Clear() {
        m_hashKey = int.MinValue;

        m_voxel = null;
        m_parentHashTree = null;
        if(m_leftHashTree != null) {
            m_leftHashTree.Clear();
            m_leftHashTree = null;
        }
        if(m_rightHashTree != null) {
            m_rightHashTree.Clear();
            m_rightHashTree = null;
        }
    }
Example #3
0
    /// <summary>
    /// Delete node with specific haskey from tree.
    /// </summary>
    /// <param name="hashkey">Hashkey to delete.</param>
    /// <returns>If it found a node to delete.</returns>
    public bool Delete(int hashkey)
    {
        if (hashkey == m_hashKey)
        {
            if ((m_leftHashTree != null) && (m_rightHashTree != null))
            {
                // we have left and right trees,
                // copy the right's minimum tree into this tree
                // delete from right tree
                VoxelHashTree target = m_rightHashTree.GetMinKey();
                m_voxel   = target.m_voxel;
                m_hashKey = target.m_hashKey;
                m_rightHashTree.Delete(m_hashKey);
            }
            else if (m_parentHashTree.m_leftHashTree == this)
            {
                // point parent directly at child
                // depends on GC to remove this?
                m_parentHashTree.m_leftHashTree = (m_leftHashTree != null) ? m_leftHashTree : m_rightHashTree;
            }
            else if (m_parentHashTree.m_rightHashTree == this)
            {
                // point parent directly at child
                // depends on GC to remove this?
                m_parentHashTree.m_rightHashTree = (m_leftHashTree != null) ? m_leftHashTree : m_rightHashTree;
            }

            return(true);
        }

        if (hashkey < m_hashKey)
        {
            if (m_leftHashTree == null)
            {
                return(false);
            }

            return(m_leftHashTree.Delete(hashkey));
        }
        else
        {
            if (m_rightHashTree == null)
            {
                return(false);
            }

            return(m_rightHashTree.Delete(hashkey));
        }
    }
    /**
     * Clear the tree and subtrees
     */
    public void Clear()
    {
        m_hashKey = int.MinValue;

        m_voxel          = null;
        m_parentHashTree = null;
        if (m_leftHashTree != null)
        {
            m_leftHashTree.Clear();
            m_leftHashTree = null;
        }
        if (m_rightHashTree != null)
        {
            m_rightHashTree.Clear();
            m_rightHashTree = null;
        }
    }
    /// <summary>
    /// Insert new voxel with hashkey into the hashtree.
    /// </summary>
    /// <param name="voxel">Voxel to be inserted.</param>
    /// <param name="hashkey">Hashkey of the voxel.</param>
    public void Insert(Voxel voxel, int hashkey)
    {
        if (m_hashKey == int.MinValue)
        {
            m_hashKey = hashkey;
            this.m_voxel = voxel;
            return;
        }

        if (m_hashKey == hashkey)
        {
            this.m_voxel = voxel;
            return;
        }

        if (hashkey < m_hashKey)
        {
            if (m_leftHashTree == null)
            {
                m_leftHashTree = new VoxelHashTree();
                m_leftHashTree.m_parentHashTree = this;
            }

            m_leftHashTree.Insert(voxel, hashkey);
        }
        else
        {
            if (m_rightHashTree == null)
            {
                m_rightHashTree = new VoxelHashTree();
                m_rightHashTree.m_parentHashTree = this;
            }

            m_rightHashTree.Insert(voxel, hashkey);
        }
    }