// public Item(SubMesh subMesh) { this.subMesh = subMesh; subMesh.GetSomeGeometry(out positions, out indices); Bounds bounds = Bounds.Cleared; foreach (Vec3 pos in positions) { bounds.Add(pos); } bounds.Expand(bounds.GetSize() * .001f); OctreeContainer.InitSettings initSettings = new OctreeContainer.InitSettings(); initSettings.InitialOctreeBounds = bounds; initSettings.OctreeBoundsRebuildExpand = Vec3.Zero; initSettings.MinNodeSize = bounds.GetSize() / 50; octreeContainer = new OctreeContainer(initSettings); for (int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++) { Vec3 vertex0 = positions[indices[nTriangle * 3 + 0]]; Vec3 vertex1 = positions[indices[nTriangle * 3 + 1]]; Vec3 vertex2 = positions[indices[nTriangle * 3 + 2]]; Bounds triangleBounds = new Bounds(vertex0); triangleBounds.Add(vertex1); triangleBounds.Add(vertex2); int octreeIndex = octreeContainer.AddObject(triangleBounds, 1); } }
public void Dispose() { if (octreeContainer != null) { octreeContainer.Dispose(); octreeContainer = null; } }
/// <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); }
/// <summary> /// Grows Octree so current root is made child of new, larger root. /// Grows in direction of passed point, until point is within root. /// <summary> private void grow(Vector3 point) { while (!root.contains(point)) { int childNum = optimalChildNum(root, point); /// find growth direction var newRootBounds = root.parentBounds(childNum); OctreeContainer <T> newRoot = new OctreeContainer <T>(newRootBounds["min"], newRootBounds["max"], MinSize); newRoot.setChild(childNum, root); root = newRoot; numComponents += 8; numVoxels += 7; volume = root.volume(); } }
/// <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> /// 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); } }
public void Dispose() { if( octreeContainer != null ) { octreeContainer.Dispose(); octreeContainer = null; } }
// public Item( SubMesh subMesh ) { this.subMesh = subMesh; subMesh.GetSomeGeometry( out positions, out indices ); Bounds bounds = Bounds.Cleared; foreach( Vec3 pos in positions ) bounds.Add( pos ); bounds.Expand( bounds.GetSize() * .001f ); OctreeContainer.InitSettings initSettings = new OctreeContainer.InitSettings(); initSettings.InitialOctreeBounds = bounds; initSettings.OctreeBoundsRebuildExpand = Vec3.Zero; initSettings.MinNodeSize = bounds.GetSize() / 50; octreeContainer = new OctreeContainer( initSettings ); for( int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++ ) { Vec3 vertex0 = positions[ indices[ nTriangle * 3 + 0 ] ]; Vec3 vertex1 = positions[ indices[ nTriangle * 3 + 1 ] ]; Vec3 vertex2 = positions[ indices[ nTriangle * 3 + 2 ] ]; Bounds triangleBounds = new Bounds( vertex0 ); triangleBounds.Add( vertex1 ); triangleBounds.Add( vertex2 ); int octreeIndex = octreeContainer.AddObject( triangleBounds, 1 ); } }