/** * 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; } }
/// <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); } }