/// <summary> /// Creates all child cells. /// </summary> /// <param name="parent">The current parent node.</param> /// <param name="cellLevelInHierarchy">The cell level within the current hierarchy.</param> private void CreateChildCells(CellTreeNode parent, int cellLevelInHierarchy) { if (cellLevelInHierarchy > this.NumberOfSubdivisions) { return; } int rowCount = (int)this.Subdivisions[(cellLevelInHierarchy - 1)].x; int columnCount = (int)this.Subdivisions[(cellLevelInHierarchy - 1)].y; float startX = parent.Center.x - (parent.Size.x / 2.0f); float width = parent.Size.x / rowCount; for (int row = 0; row < rowCount; ++row) { for (int column = 0; column < columnCount; ++column) { float xPos = startX + (row * width) + (width / 2.0f); CellTreeNode node = new CellTreeNode(this.idCounter++, (this.NumberOfSubdivisions == cellLevelInHierarchy) ? CellTreeNode.ENodeType.Leaf : CellTreeNode.ENodeType.Node, parent); if (this.YIsUpAxis) { float startY = parent.Center.y - (parent.Size.y / 2.0f); float height = parent.Size.y / columnCount; float yPos = startY + (column * height) + (height / 2.0f); node.Center = new Vector3(xPos, yPos, 0.0f); node.Size = new Vector3(width, height, 0.0f); node.TopLeft = new Vector3(xPos - (width / 2.0f), yPos - (height / 2.0f), 0.0f); node.BottomRight = new Vector3(xPos + (width / 2.0f), yPos + (height / 2.0f), 0.0f); } else { float startZ = parent.Center.z - (parent.Size.z / 2.0f); float depth = parent.Size.z / columnCount; float zPos = startZ + (column * depth) + (depth / 2.0f); node.Center = new Vector3(xPos, 0.0f, zPos); node.Size = new Vector3(width, 0.0f, depth); node.TopLeft = new Vector3(xPos - (width / 2.0f), 0.0f, zPos - (depth / 2.0f)); node.BottomRight = new Vector3(xPos + (width / 2.0f), 0.0f, zPos + (depth / 2.0f)); } parent.AddChild(node); this.CreateChildCells(node, (cellLevelInHierarchy + 1)); } } }