bool InitializeBrushMeshInstances() { var instances = brushMeshAsset ? brushMeshAsset.Instances : null; // TODO: figure out why this can happen (mess around with spiral stairs) // TODO: does this have anything to do with spiral stairs not updating all submeshes when being modified? if (instances != null && instances.Length != brushMeshAsset.SubMeshCount) { brushMeshAsset.UpdateInstances(); instances = brushMeshAsset ? brushMeshAsset.Instances : null; } var requiredNodeLength = RequiredNodeLength(instances); if (Nodes != null && Nodes.Length == requiredNodeLength) { if (Nodes.Length == 0) { var brush = (CSGTreeBrush)Nodes[0]; brush.BrushMesh = BrushMeshInstance.InvalidInstance; brush.Operation = CSGOperationType.Additive; } else if (Nodes.Length == 1) { var brush = (CSGTreeBrush)TopNode; brush.BrushMesh = brushMeshAsset.Instances[0]; brush.Operation = brushMeshAsset.SubMeshes[0].Operation; } else { for (int i = 0; i < instances.Length; i++) { var brush = (CSGTreeBrush)Nodes[i + 1]; brush.BrushMesh = brushMeshAsset.Instances[i]; brush.Operation = brushMeshAsset.SubMeshes[i].Operation; } } return(true); } else { bool needRebuild = Nodes != null && Nodes.Length != requiredNodeLength; if (Nodes.Length <= 1) { var brush = (CSGTreeBrush)TopNode; if (brush.BrushMesh != BrushMeshInstance.InvalidInstance) { brush.BrushMesh = BrushMeshInstance.InvalidInstance; brush.Operation = CSGOperationType.Additive; } } else { for (int i = 1; i < Nodes.Length; i++) { var brush = (CSGTreeBrush)Nodes[i]; if (brush.BrushMesh != BrushMeshInstance.InvalidInstance) { brush.BrushMesh = BrushMeshInstance.InvalidInstance; brush.Operation = CSGOperationType.Additive; } } } if (needRebuild) // if we don't do this, we'll end up creating nodes infinitely, when the node can't make a valid brushMesh { CSGNodeHierarchyManager.RebuildTreeNodes(this); } return(false); } }