public static kDOPTreeCompact ToCompact(kDOPCollisionTriangle[] oldTriangles, Vector3[] vertices) { var rootBound = new kDOP { Min = new float[3], Max = new float[3] }; for (int i = 0; i < 3; i++) { rootBound.Max[i] = float.MaxValue; rootBound.Min[i] = -float.MaxValue; } if (oldTriangles.IsEmpty()) { return(new kDOPTreeCompact { RootBound = rootBound, Nodes = new kDOPCompact[0], Triangles = new kDOPCollisionTriangle[0] }); } var buildTriangles = new kDopBuildTriangle[oldTriangles.Length]; for (int i = 0; i < oldTriangles.Length; i++) { kDOPCollisionTriangle oldTri = oldTriangles[i]; buildTriangles[i] = new kDopBuildTriangle(oldTri, vertices[oldTri.Vertex1], vertices[oldTri.Vertex2], vertices[oldTri.Vertex3]); } int numNodes = 0; if (buildTriangles.Length > 5) { numNodes = 1; while ((buildTriangles.Length + numNodes - 1) / numNodes > 10) { numNodes *= 2; } numNodes = 2 * numNodes; } var nodes = new kDOPCompact[numNodes]; for (int i = 0; i < numNodes; i++) { nodes[i] = new kDOPCompact(); for (int j = 0; j < 3; j++) { nodes[i].Min[j] = 0; nodes[i].Max[j] = 0; } } rootBound.AddTriangles(buildTriangles, 0, buildTriangles.Length); if (numNodes > 1 && buildTriangles.Length > 1) { nodes[0].SplitTriangleList(0, 0, buildTriangles.Length, buildTriangles, rootBound, nodes); } return(new kDOPTreeCompact { RootBound = rootBound, Nodes = nodes, Triangles = buildTriangles.Select(tri => (kDOPCollisionTriangle)tri).ToArray() }); }
public static kDOPTreeCompact ToCompact(kDOPCollisionTriangle[] oldTriangles, Vector3[] vertices) { var rootBound = new kDopUnCompressedNode { Min = new float[3], Max = new float[3] }; for (int i = 0; i < 3; i++) { rootBound.Max[i] = float.MaxValue; rootBound.Min[i] = -float.MaxValue; } if (oldTriangles.IsEmpty()) { return(new kDOPTreeCompact { RootBound = rootBound, Nodes = new kDOPCompact[0], Triangles = new kDOPCollisionTriangle[0] }); } var buildTriangles = new kDopBuildTriangle[oldTriangles.Length]; for (int i = 0; i < oldTriangles.Length; i++) { kDOPCollisionTriangle oldTri = oldTriangles[i]; buildTriangles[i] = new kDopBuildTriangle(oldTri, vertices[oldTri.Vertex1], vertices[oldTri.Vertex2], vertices[oldTri.Vertex3]); } int numNodes = 0; if (buildTriangles.Length > 5) { numNodes = 1; while ((buildTriangles.Length + numNodes - 1) / numNodes > 10) { numNodes *= 2; } numNodes = 2 * numNodes; } var nodes = new kDopCompressedNode[numNodes]; for (int i = 0; i < numNodes; i++) { nodes[i].Min = new byte[3]; nodes[i].Max = new byte[3]; for (int j = 0; j < 3; j++) { nodes[i].Min[j] = 0; nodes[i].Max[j] = 0; } } Compact(buildTriangles.Length, buildTriangles, numNodes, nodes, ref rootBound); return(new kDOPTreeCompact { RootBound = rootBound, Nodes = nodes.Select(node => (kDOPCompact)node).ToArray(), Triangles = buildTriangles.Select(tri => (kDOPCollisionTriangle)tri).ToArray() }); }