///////////////////////////////////////// public MeshRayTestOptimized(Vector3F[] vertices, int[] indices) { this.vertices = vertices; this.indices = indices; if (vertices.Length != 0 && indices.Length != 0) { var bounds = Bounds.Cleared; foreach (var vertex in vertices) { bounds.Add(vertex); } var initSettings = new OctreeContainer.InitSettings(); initSettings.InitialOctreeBounds = bounds; initSettings.OctreeBoundsRebuildExpand = Vector3.Zero; initSettings.MinNodeSize = bounds.GetSize() / 50; octreeContainer = new OctreeContainer(initSettings); for (int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++) { var vertex0 = vertices[indices[nTriangle * 3 + 0]]; var vertex1 = vertices[indices[nTriangle * 3 + 1]]; var vertex2 = vertices[indices[nTriangle * 3 + 2]]; var triangleBounds = new Bounds(vertex0); triangleBounds.Add(vertex1); triangleBounds.Add(vertex2); octreeContainer.AddObject(triangleBounds, 1); } } }
void ObjectsInSpace_DestroyOctree() { if (octree != null) { for (int n = 0; n < octreeObjects.Count; n++) { var obj = octreeObjects[n]; if (obj != null) { obj.sceneOctreeIndex = -1; } } octreeObjects.Clear(); octree.Dispose(); octree = null; } }
void ObjectsInSpace_CreateOctree() { if (octree != null) { Log.Fatal("Component_Scene: ObjectsInSpace_CreateOctree: sceneOctree != null."); } //create octree var settings = new OctreeContainer.InitSettings(); settings.InitialOctreeBounds = CalculateTotalBoundsOfObjectsInSpace(true); settings.AmountOfObjectsOutsideOctreeBoundsToRebuld = OctreeObjectCountOutsideOctreeToRebuld; settings.OctreeBoundsRebuildExpand = OctreeBoundsRebuildExpand; settings.MinNodeSize = OctreeMinNodeSize; settings.ObjectCountThresholdToCreateChildNodes = OctreeObjectCountToCreateChildNodes; settings.MaxNodeCount = OctreeMaxNodeCount; octree = new OctreeContainer(settings); //update objects foreach (var obj in GetComponents <Component_ObjectInSpace>(false, true, true)) { ObjectsInSpace_ObjectUpdate(obj); } }
public void Dispose() { octreeContainer?.Dispose(); octreeContainer = null; }