public static void ClusterFace(OctreeNode[] nodes, int direction, ref int surface_index, List<Vertex> collected_vertices)
{
if (nodes[0] == null || nodes[1] == null)
return;
if (nodes[0].type != NodeType.Leaf || nodes[1].type != NodeType.Leaf)
{
for (int i = 0; i < 4; i++)
{
OctreeNode[] face_nodes = new OctreeNode[2];
for (int j = 0; j < 2; j++)
{
if (nodes[j] == null)
continue;
if (nodes[j].type != NodeType.Internal)
face_nodes[j] = nodes[j];
else
face_nodes[j] = nodes[j].children[Utilities.TFaceProcFaceMask[direction, i, j]];
}
ClusterFace(face_nodes, Utilities.TFaceProcFaceMask[direction, i, 2], ref surface_index, collected_vertices);
}
}
int[,] orders =
{
{ 0, 0, 1, 1 },
{ 0, 1, 0, 1 },
};
for (int i = 0; i < 4; i++)
{
OctreeNode[] edge_nodes = new OctreeNode[4];
for (int j = 0; j < 4; j++)
{
if (nodes[orders[Utilities.TFaceProcEdgeMask[direction, i, 0], j]] == null)
continue;
if (nodes[orders[Utilities.TFaceProcEdgeMask[direction, i, 0], j]].type != NodeType.Internal)
edge_nodes[j] = nodes[orders[Utilities.TFaceProcEdgeMask[direction, i, 0], j]];
else
edge_nodes[j] = nodes[orders[Utilities.TFaceProcEdgeMask[direction, i, 0], j]].children[Utilities.TFaceProcEdgeMask[direction, i, 1 + j]];
}
ClusterEdge(edge_nodes, Utilities.TFaceProcEdgeMask[direction, i, 5], ref surface_index, collected_vertices);
}
}