/// <summary> /// Reformats octree upon increase in MinSize. /// Growing octree resets all data. /// </summary> private void Reformat(float newMinValue) { if (root.size() < newMinValue * 2f) { root = new OctreeContainer <T>(root.min, root.min + new Vector3(newMinValue * 2, newMinValue * 2, newMinValue * 2), MinSize); numComponents = 9; numVoxels = 8; numNonNullVoxels = 1; volume = root.volume(); nonNullVolume = root.volume() / 8f; } else { MetadataChange change = new MetadataChange(); for (int i = 0; i < 8; i++) { change += root.children[i].Reformat(newMinValue); } updateMetadata(change); } }
/// <summary> /// Constructor. Creates null-value Voxel of defaultSize around point as root of Octree. /// <summary> public Octree(Vector3 point, float myMinSize, float myDefaultSize) { minSize = myMinSize; defaultSize = myDefaultSize; float buffer1 = 0.2f * defaultSize; float buffer2 = defaultSize - buffer1; Vector3 min = new Vector3(point.x - buffer1, point.y - buffer1, point.z - buffer1); Vector3 max = new Vector3(point.x + buffer2, point.y + buffer2, point.z + buffer2); root = new OctreeContainer <T>(min, max, MinSize); numComponents = 9; numVoxels = 8; numNonNullVoxels = 0; volume = root.volume(); nonNullVolume = 0; }
/// <summary> /// Splits Voxel into 8 smaller Voxels, returns new Octree Container. /// <summary> public OctreeContainer <T> split(out MetadataChange change) { OctreeContainer <T> replacement = new OctreeContainer <T>(min, max, minSize); /// add original point to new OctreeContainer int childNum = replacement.whichChild(point); var voxBounds = replacement.childBounds(childNum); replacement.setChild(childNum, new Voxel <T>(voxBounds["min"], voxBounds["max"], minSize, point, value)); change = new MetadataChange(dComponents: 8, dVoxels: 7, dNonNullVolume: -0.875 * replacement.volume()); return(replacement); }