public CSGTree ToCSGTree(out HashSet<CSGNode> animatedNodes)
 {
     animatedNodes = new HashSet<CSGNode>();
     var tree = new CSGTree();
     tree.RootNode = RootNode.ToCSGNode(null, animatedNodes, false);
     return tree;
 }
 public static IEnumerable<CSGNode> FindChildBrushes(CSGTree tree)
 {
     return FindChildBrushes(tree.RootNode);
 }
        void UpdateMeshes(CSGTree tree, IEnumerable<CSGNode> updateNodes)
        {
            var modifiedMeshes = CSGCategorization.ProcessCSGNodes(tree.RootNode, updateNodes);

            foreach (var item in modifiedMeshes)
                validMeshes[item.Key] = item.Value;

            UpdateVertexBuffers(validMeshes);
        }
        void InitCSGTree()
        {
            csgTree = CSGUtility.LoadTree("import.xml", out instanceNodes);
            if (csgTree == null)
            {
                MessageBox.Show("Failed to load file");
                return;
            }

            instanceNodeTranslations = new List<Vector3>();
            if (instanceNodes != null &&
                instanceNodes.Count > 0)
            {
                foreach (var node in instanceNodes)
                    instanceNodeTranslations.Add(node.LocalTranslation);

                subInstanceBrushes = new HashSet<CSGNode>();
                foreach (var node in instanceNodes)
                {
                    foreach (var brush in CSGUtility.FindChildBrushes(node))
                        subInstanceBrushes.Add(brush);
                }

                allBrushes = (from node in
                                  CSGUtility.FindChildBrushes(csgTree)
                              where !subInstanceBrushes.Contains(node)
                              select node).ToList();
            } else
                allBrushes = CSGUtility.FindChildBrushes(csgTree).ToList();

            var updateNodes = new List<CSGNode>();
            updateNodes.AddRange(allBrushes);
            updateNodes.AddRange(instanceNodes);

            UpdateMeshes(csgTree, updateNodes);
        }