Isosurface.ManifoldDC.OctreeNode.ClusterFace C# (CSharp) Method

ClusterFace() public static method

public static ClusterFace ( OctreeNode nodes, int direction, int &surface_index, List collected_vertices ) : void
nodes OctreeNode
direction int
surface_index int
collected_vertices List
return void
        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);
            }
        }