public OCTree Build(Vector3[] vertexArray, int[] indexArray) { var list = new List <OCTPoly>(); for (var i = 0; i < (indexArray.Length / 3); i++) { var a = vertexArray[indexArray[i * 3]]; var b = vertexArray[indexArray[(i * 3) + 1]]; var c = vertexArray[indexArray[(i * 3) + 2]]; list.Add(new OCTPoly(a, b, c)); } var polyList = list.ToArray(); var box = CalculateBounds(polyList); var center = ((box.Max + box.Min) * 0.5f); var extents = box.Max - center; if (MakeSquare) { var x = extents.X; if (extents.Y > x) { x = extents.Y; } if (extents.Z > x) { x = extents.Z; } extents.X = extents.Y = extents.Z = x; } extents += (extents * ExpandBoundsFactor); box.Min = center - extents; box.Max = center + extents; var node = new IntermediateOCTreeNode { Bounds = box }; RecursiveBuild(node, polyList, center, extents, 0); var tree = new OCTree { Root = node.Build(WeldDelta) }; return(tree); }
public OCTree Build(Vector3[] vertexArray, int[] indexArray) { var list = new List<OCTPoly>(); for (var i = 0; i < (indexArray.Length / 3); i++) { var a = vertexArray[indexArray[i * 3]]; var b = vertexArray[indexArray[(i * 3) + 1]]; var c = vertexArray[indexArray[(i * 3) + 2]]; list.Add(new OCTPoly(a, b, c)); } var polyList = list.ToArray(); var box = CalculateBounds(polyList); var center = ((box.Max + box.Min) * 0.5f); var extents = box.Max - center; if (MakeSquare) { var x = extents.X; if (extents.Y > x) { x = extents.Y; } if (extents.Z > x) { x = extents.Z; } extents.X = extents.Y = extents.Z = x; } extents += (extents * ExpandBoundsFactor); box.Min = center - extents; box.Max = center + extents; var node = new IntermediateOCTreeNode { Bounds = box }; RecursiveBuild(node, polyList, center, extents, 0); var tree = new OCTree { Root = node.Build(WeldDelta) }; return tree; }
private void RecursiveBuild(IntermediateOCTreeNode node, OCTPoly[] PolyList, Vector3 center, Vector3 extents, int depth) { var planeArray = new[] { MathExtensions.PlaneFromPointNormal(center + (planeOffsets[0] * extents), planeNormals[0]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[1] * extents), planeNormals[1]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[2] * extents), planeNormals[2]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[3] * extents), planeNormals[3]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[4] * extents), planeNormals[4]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[5] * extents), planeNormals[5]) }; var polyArray = new OCTPoly[PolyList.Length]; var index = 0; while (index < PolyList.Length) { polyArray[index] = new OCTPoly(PolyList[index]); index++; } for (var i = 0; i < planeArray.Length; i++) { var list = new List <OCTPoly>(); for (var j = 0; j < polyArray.Length; j++) { int num4; var newPolys = new OCTPoly[2]; Split(polyArray[j], planeArray[i], ref newPolys, out num4); index = 0; while (index < num4) { var plane = new Plane(newPolys[index].Verts[0], newPolys[index].Verts[1], newPolys[index].Verts[2]); if (!float.IsNaN(plane.Normal.X)) { list.Add(newPolys[index]); } index++; } } polyArray = new OCTPoly[list.Count]; index = 0; while (index < list.Count) { polyArray[index] = new OCTPoly(list[index]); index++; } } if ((polyArray.Length <= MaxPolygonsPerNode) || (depth >= MaxSubdivisions)) { node.Polys = new OCTPoly[polyArray.Length]; if (polyArray.Length > 0) { for (index = 0; index < polyArray.Length; index++) { node.Polys[index] = new OCTPoly(polyArray[index]); } } } else { node.Children = new IntermediateOCTreeNode[8]; for (index = 0; index < 8; index++) { node.Children[index] = new IntermediateOCTreeNode(); var vector = (extents * 0.5f); var vector2 = center + (nodeOffsets[index] * vector); node.Children[index].Bounds = new BoundingBox(vector2 - vector, vector2 + vector); RecursiveBuild(node.Children[index], PolyList, vector2, vector, depth + 1); } } }
private void RecursiveBuild(IntermediateOCTreeNode node, OCTPoly[] PolyList, Vector3 center, Vector3 extents, int depth) { var planeArray = new[] { MathExtensions.PlaneFromPointNormal(center + (planeOffsets[0] * extents), planeNormals[0]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[1] * extents), planeNormals[1]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[2] * extents), planeNormals[2]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[3] * extents), planeNormals[3]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[4] * extents), planeNormals[4]), MathExtensions.PlaneFromPointNormal(center + (planeOffsets[5] * extents), planeNormals[5]) }; var polyArray = new OCTPoly[PolyList.Length]; var index = 0; while (index < PolyList.Length) { polyArray[index] = new OCTPoly(PolyList[index]); index++; } for (var i = 0; i < planeArray.Length; i++) { var list = new List<OCTPoly>(); for (var j = 0; j < polyArray.Length; j++) { int num4; var newPolys = new OCTPoly[2]; Split(polyArray[j], planeArray[i], ref newPolys, out num4); index = 0; while (index < num4) { var plane = new Plane(newPolys[index].Verts[0], newPolys[index].Verts[1], newPolys[index].Verts[2]); if (!float.IsNaN(plane.Normal.X)) { list.Add(newPolys[index]); } index++; } } polyArray = new OCTPoly[list.Count]; index = 0; while (index < list.Count) { polyArray[index] = new OCTPoly(list[index]); index++; } } if ((polyArray.Length <= MaxPolygonsPerNode) || (depth >= MaxSubdivisions)) { node.Polys = new OCTPoly[polyArray.Length]; if (polyArray.Length > 0) { for (index = 0; index < polyArray.Length; index++) { node.Polys[index] = new OCTPoly(polyArray[index]); } } } else { node.Children = new IntermediateOCTreeNode[8]; for (index = 0; index < 8; index++) { node.Children[index] = new IntermediateOCTreeNode(); var vector = (extents * 0.5f); var vector2 = center + (nodeOffsets[index] * vector); node.Children[index].Bounds = new BoundingBox(vector2 - vector, vector2 + vector); RecursiveBuild(node.Children[index], PolyList, vector2, vector, depth + 1); } } }