Beispiel #1
0
        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);
            }
        }