void RecursivePartition(List <int> triangles, int depth, Node parent) { TrianglesExtents extents = GetTrianglesExtents(triangles); Vector3 extentsMagnitude = extents.HalfExtent(); Vector3 partitionNormal = Vector3.zero; if (extentsMagnitude.x >= extentsMagnitude.y && extentsMagnitude.x >= extentsMagnitude.z) { partitionNormal = Vector3.right; } else if (extentsMagnitude.y >= extentsMagnitude.x && extentsMagnitude.y >= extentsMagnitude.z) { partitionNormal = Vector3.up; } else { partitionNormal = Vector3.forward; } List <int> positiveTriangles; List <int> negativeTriangles; Split(triangles, extents.trianglesCenter, partitionNormal, out positiveTriangles, out negativeTriangles); parent.Set(extents); parent.positiveChild = new Node(); parent.negativeChild = new Node(); if (positiveTriangles.Count < triangles.Count && positiveTriangles.Count > maxTrianglesPerNode) { RecursivePartition(positiveTriangles, depth + 1, parent.positiveChild); } else { parent.positiveChild.triangles = positiveTriangles.ToArray(); parent.positiveChild.Set(GetTrianglesExtents(positiveTriangles)); } if (negativeTriangles.Count < triangles.Count && negativeTriangles.Count > maxTrianglesPerNode) { RecursivePartition(negativeTriangles, depth + 1, parent.negativeChild); } else { parent.negativeChild.triangles = negativeTriangles.ToArray(); parent.negativeChild.Set(GetTrianglesExtents(negativeTriangles)); } }
TrianglesExtents GetTrianglesExtents(IList <int> triangles) { TrianglesExtents extents = TrianglesExtents.max; for (int i = 0; i < triangles.Count; i++) { int triangle = triangles[i]; extents.trianglesCenter += (vertices[tris[triangle]] + vertices[tris[triangle + 1]] + vertices[tris[triangle + 2]]); extents.minExtent.x = Mathf.Min(extents.minExtent.x, vertices[tris[triangle]].x, vertices[tris[triangle + 1]].x, vertices[tris[triangle + 2]].x); extents.minExtent.y = Mathf.Min(extents.minExtent.y, vertices[tris[triangle]].y, vertices[tris[triangle + 1]].y, vertices[tris[triangle + 2]].y); extents.minExtent.z = Mathf.Min(extents.minExtent.z, vertices[tris[triangle]].z, vertices[tris[triangle + 1]].z, vertices[tris[triangle + 2]].z); extents.maxExtent.x = Mathf.Max(extents.maxExtent.x, vertices[tris[triangle]].x, vertices[tris[triangle + 1]].x, vertices[tris[triangle + 2]].x); extents.maxExtent.y = Mathf.Max(extents.maxExtent.y, vertices[tris[triangle]].y, vertices[tris[triangle + 1]].y, vertices[tris[triangle + 2]].y); extents.maxExtent.z = Mathf.Max(extents.maxExtent.z, vertices[tris[triangle]].z, vertices[tris[triangle + 1]].z, vertices[tris[triangle + 2]].z); } extents.trianglesCenter /= (triangles.Count * 3f); return(extents); }
public void Set(TrianglesExtents extents) { Set(extents.Center(), extents.HalfExtent()); }