Example #1
0
        static ChiselBrushMaterial FindBrushMaterialBySurfaceIndex(CSGTreeNode node, CSGTreeBrush brush, int surfaceID)
        {
            if (!node.Valid)
            {
                return(null);
            }

            if (surfaceID < 0)
            {
                return(null);
            }

            s_TempBrushMaterials.Clear();
            if (!GetAllMaterials(node, brush, s_TempBrushMaterials))
            {
                return(null);
            }

            if (surfaceID >= s_TempBrushMaterials.Count)
            {
                return(null);
            }

            var brushMaterial = s_TempBrushMaterials[surfaceID];

            s_TempBrushMaterials.Clear();
            return(brushMaterial);
        }
        public void GenerateAllTreeNodes()
        {
            var instanceID         = GetInstanceID();
            var instances          = brushContainerAsset ? brushContainerAsset.Instances : null;
            var requiredNodeLength = RequiredNodeLength(instances);

            if (requiredNodeLength == 0)
            {
                Nodes    = new CSGTreeNode[1];
                Nodes[0] = CSGTreeBrush.Create(userID: instanceID, localTransformation: TopTransformation, operation: operation);
            }
            else
            if (requiredNodeLength == 1)
            {
                Nodes    = new CSGTreeNode[1];
                Nodes[0] = CSGTreeBrush.Create(userID: instanceID, localTransformation: TopTransformation, operation: operation);
            }
            else
            {
                Nodes = new CSGTreeNode[requiredNodeLength];
                var children = new CSGTreeNode[requiredNodeLength - 1];
                for (int i = 0; i < requiredNodeLength - 1; i++)
                {
                    children[i] = CSGTreeBrush.Create(userID: instanceID);
                }

                Nodes[0] = CSGTreeBranch.Create(instanceID, operation, children);
                for (int i = 1; i < Nodes.Length; i++)
                {
                    Nodes[i] = children[i - 1];
                }
            }
            Nodes[0].Operation           = operation;
            Nodes[0].LocalTransformation = TopTransformation;
        }
Example #3
0
        public static void ExpectInvalidTree(ref CSGTree model)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(model.NodeID).Type;

            Assert.AreEqual(false, model.Valid);
            Assert.AreEqual(0, model.UserID);
            Assert.AreEqual(CSGNodeType.None, type);
        }
Example #4
0
        public static void ExpectInvalidBranch(ref CSGTreeBranch operation)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(operation.NodeID).Type;

            Assert.AreEqual(false, operation.Valid);
            Assert.AreEqual(0, operation.UserID);
            Assert.AreEqual(CSGNodeType.None, type);
        }
Example #5
0
        public static void ExpectInvalidBrush(ref CSGTreeBrush brush)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(brush.NodeID).Type;

            Assert.AreEqual(false, brush.Valid);
            Assert.AreEqual(0, brush.UserID);
            Assert.AreEqual(CSGNodeType.None, type);
        }
Example #6
0
        public static void ExpectValidTreeWithUserID(ref CSGTree model, int userID)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(model.NodeID).Type;

            Assert.AreEqual(true, model.Valid);
            Assert.AreNotEqual(0, model.NodeID);
            Assert.AreEqual(userID, model.UserID);
            Assert.AreEqual(CSGNodeType.Tree, type);
        }
Example #7
0
        public static void ExpectValidBranchWithUserID(ref CSGTreeBranch operation, int userID)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(operation.NodeID).Type;

            Assert.AreEqual(true, operation.Valid);
            Assert.AreNotEqual(0, operation.NodeID);
            Assert.AreEqual(userID, operation.UserID);
            Assert.AreEqual(CSGNodeType.Branch, type);
        }
Example #8
0
        public static void ExpectValidBrushWithUserID(ref CSGTreeBrush brush, int userID)
        {
            CSGNodeType type = CSGTreeNode.Encapsulate(brush.NodeID).Type;

            Assert.AreEqual(true, brush.Valid);
            Assert.AreNotEqual(0, brush.NodeID);
            Assert.AreEqual(userID, brush.UserID);
            Assert.AreEqual(CSGNodeType.Brush, type);
        }
Example #9
0
        static bool GetAllSurfaces(ChiselNode chiselNode, CSGTreeNode node, CSGTreeBrush?findBrush, List <SurfaceReference> surfaces)
        {
            switch (node.Type)
            {
            case CSGNodeType.Brush:  return(GetAllSurfaces(chiselNode, (CSGTreeBrush)node, findBrush, surfaces));

            case CSGNodeType.Branch: return(GetAllSurfaces(chiselNode, (CSGTreeBranch)node, findBrush, surfaces));
            }
            return(false);
        }
Example #10
0
        static CSGTreeNode[] ChildrenToArray(CSGTreeNode node)
        {
            var children = new CSGTreeNode[node.Count];

            for (int i = 0; i < node.Count; i++)
            {
                children[i] = node[i];
            }
            return(children);
        }
Example #11
0
        static bool FindSurfaceReference(ChiselNode chiselNode, CSGTreeNode node, CSGTreeBrush findBrush, int surfaceID, out SurfaceReference surfaceReference)
        {
            surfaceReference = null;
            switch (node.Type)
            {
            case CSGNodeType.Branch: return(FindSurfaceReference(chiselNode, (CSGTreeBranch)node, findBrush, surfaceID, out surfaceReference));

            case CSGNodeType.Brush:  return(FindSurfaceReference(chiselNode, (CSGTreeBrush)node, findBrush, surfaceID, out surfaceReference));

            default: return(false);
            }
        }
        static string NameForCoreNode(CSGTreeNode coreNode)
        {
            var userID = coreNode.UserID;
            var nodeID = coreNode.NodeID;
            var obj    = (userID != 0) ? EditorUtility.InstanceIDToObject(userID) : null;

            if (obj == null)
            {
                return(string.Format("<unknown> [{0}:{1}]", (nodeID - 1), userID));
            }
            return(obj.name + string.Format(" [{0}:{1}]", (nodeID - 1), userID));
        }
        static string NameForTreeNode(CSGTreeNode coreNode)
        {
            var    userID = coreNode.UserID;
            var    nodeID = coreNode.NodeID;
            var    obj    = (userID != 0) ? EditorUtility.InstanceIDToObject(userID) : null;
            string name;

            if (obj == null)
            {
                name = "<unknown>";
            }
            else
            {
                name = obj.name;
            }
            return(string.Format("{0} [{1}:{2}:{3}]", name, (nodeID - 1), userID, coreNode.Type));
        }
Example #14
0
        static string NameForTreeNode(CSGTreeNode treeNode)
        {
            var    userID = treeNode.UserID;
            var    obj    = (userID != 0) ? EditorUtility.InstanceIDToObject(userID) : null;
            string name;

            if (obj == null)
            {
                name = "<unknown>";
            }
            else
            {
                name = obj.name;
            }
            if (treeNode.Type == CSGNodeType.Brush)
            {
                var brush = (CSGTreeBrush)treeNode;
                if (treeNode.Valid)
                {
                    return($"{name} [{treeNode}:{userID}:{brush.BrushMesh.BrushMeshID}]");
                }
                else
                {
                    return($"{name} [{treeNode}:{userID}:{brush.BrushMesh.BrushMeshID}] (INVALID)");
                }
            }
            else
            {
                if (treeNode.Valid)
                {
                    return($"{name} [{treeNode}:{userID}]");
                }
                else
                {
                    return($"{name} [{treeNode}:{userID}] (INVALID)");
                }
            }
        }
        void OnGUI()
        {
            if (styles == null)
            {
                UpdateStyles();
            }

            var selectedInstanceIDs = new HashSet <int>();

            foreach (var instanceID in Selection.instanceIDs)
            {
                var obj = EditorUtility.InstanceIDToObject(instanceID);
                var go  = obj as GameObject;
                if (go != null)
                {
                    foreach (var no in go.GetComponents <ChiselNode>())
                    {
                        var instanceID_ = no.GetInstanceID();
                        selectedInstanceIDs.Add(instanceID_);
                    }
                }
            }

            float kItemHeight = EditorGUIUtility.singleLineHeight;

            var allNodes        = CSGManager.AllTreeNodes;
            var allRootNodeList = new List <CSGTreeNode>();

            for (int i = 0; i < allNodes.Length; i++)
            {
                if (allNodes[i].Type != CSGNodeType.Tree &&
                    (allNodes[i].Tree.Valid || allNodes[i].Parent.Valid))
                {
                    continue;
                }

                allRootNodeList.Add(allNodes[i]);
            }

            var allRootNodes = allRootNodeList.ToArray();

            var totalCount = GetVisibleItems(allRootNodes, ref openNodes);

            var itemArea = position;

            itemArea.x       = 0;
            itemArea.y       = 0;
            itemArea.height -= 200;

            var totalRect = position;

            totalRect.x      = 0;
            totalRect.y      = 0;
            totalRect.width  = position.width - kScrollWidth;
            totalRect.height = (totalCount * kItemHeight) + (2 * kPadding);

            var itemRect = position;

            itemRect.x      = 0;
            itemRect.y      = kPadding;
            itemRect.height = kItemHeight;

            m_ScrollPos = GUI.BeginScrollView(itemArea, m_ScrollPos, totalRect);
            {
                Rect visibleArea = itemArea;
                visibleArea.x += m_ScrollPos.x;
                visibleArea.y += m_ScrollPos.y;

                AddFoldOuts(ref itemRect, ref visibleArea, allRootNodes, selectedInstanceIDs, ref openNodes);
            }
            GUI.EndScrollView();
            if (selectedInstanceIDs.Count == 1)
            {
                var instanceID = selectedInstanceIDs.First();
                var obj        = EditorUtility.InstanceIDToObject(instanceID) as ChiselNode;
                if (obj)
                {
                    var brush     = obj as ChiselBrush;
                    var operation = obj as ChiselOperation;
                    var model     = obj as ChiselModel;
                    int nodeID    = CSGTreeNode.InvalidNode.NodeID;
                    if (brush)
                    {
                        nodeID = brush.TopNode.NodeID;
                    }
                    else if (operation)
                    {
                        nodeID = operation.Node.NodeID;
                    }
                    else if (model)
                    {
                        nodeID = model.Node.NodeID;
                    }
                    else
                    {
                        for (int n = 0; n < allNodes.Length; n++)
                        {
                            if (allNodes[n].UserID == instanceID)
                            {
                                nodeID = allNodes[n].NodeID;
                                break;
                            }
                        }
                    }

                    if (nodeID != CSGTreeNode.InvalidNode.NodeID)
                    {
                        var labelArea = itemArea;
                        labelArea.x      = 0;
                        labelArea.y      = labelArea.height;
                        labelArea.height = kItemHeight;
                        CSGTreeNode node = CSGTreeNode.Encapsulate(nodeID);
                        GUI.Label(labelArea, "NodeID: " + (nodeID - 1)); labelArea.y      += kItemHeight;
                        GUI.Label(labelArea, "UserID: " + node.UserID); labelArea.y       += kItemHeight;
                        GUI.Label(labelArea, "Operation: " + node.Operation); labelArea.y += kItemHeight;
                        GUI.Label(labelArea, "Valid: " + node.Valid); labelArea.y         += kItemHeight;
                        GUI.Label(labelArea, "NodeType: " + node.Type); labelArea.y       += kItemHeight;
                        GUI.Label(labelArea, "ChildCount: " + node.Count); labelArea.y    += kItemHeight;
                        if (node.Type != CSGNodeType.Tree)
                        {
                            GUI.Label(labelArea, "Parent: " + (node.Parent.NodeID - 1) + " valid: " + node.Parent.Valid); labelArea.y += kItemHeight;
                            GUI.Label(labelArea, "Model: " + (node.Tree.NodeID - 1) + " valid: " + node.Tree.Valid); labelArea.y      += kItemHeight;
                        }
                        if (node.Type == CSGNodeType.Brush)
                        {
                            var treeBrush         = (CSGTreeBrush)node;
                            var brushMeshInstance = treeBrush.BrushMesh;
                            GUI.Label(labelArea, "BrushMeshInstance: " + brushMeshInstance.BrushMeshID + " valid: " + brushMeshInstance.Valid); labelArea.y += kItemHeight;
                        }
                    }
                }
            }
        }
Example #16
0
        void OnGUI()
        {
            if (styles == null)
            {
                UpdateStyles();
            }

            var selectedInstanceIDs = new HashSet <int>();

            foreach (var instanceID in Selection.instanceIDs)
            {
                var obj = EditorUtility.InstanceIDToObject(instanceID);
                var go  = obj as GameObject;
                if (go != null)
                {
                    foreach (var no in go.GetComponents <ChiselNode>())
                    {
                        var instanceID_ = no.GetInstanceID();
                        selectedInstanceIDs.Add(instanceID_);
                    }
                }
            }

            float kItemHeight = EditorGUIUtility.singleLineHeight;

            using (var allTreeNodes = new NativeList <CSGTreeNode>(Allocator.Temp))
            {
                CompactHierarchyManager.GetAllTreeNodes(allTreeNodes);

                using (var allTrees = new NativeList <CSGTree>(Allocator.Temp))
                {
                    CompactHierarchyManager.GetAllTrees(allTrees);
                    var allRootNodeList = new List <CSGTreeNode>();
                    for (int i = 0; i < allTrees.Length; i++)
                    {
                        allRootNodeList.Add(allTrees[i]);
                    }

                    var allRootNodes = allRootNodeList.ToArray();

                    var totalCount = GetVisibleItems(allRootNodes, ref openNodes);

                    var itemArea = position;
                    itemArea.x       = 0;
                    itemArea.y       = 0;
                    itemArea.height -= 200;

                    var totalRect = position;
                    totalRect.x      = 0;
                    totalRect.y      = 0;
                    totalRect.width  = position.width - kScrollWidth;
                    totalRect.height = (totalCount * kItemHeight) + (2 * kPadding);

                    var itemRect = position;
                    itemRect.x      = 0;
                    itemRect.y      = kPadding;
                    itemRect.height = kItemHeight;

                    m_ScrollPos = GUI.BeginScrollView(itemArea, m_ScrollPos, totalRect);
                    {
                        Rect visibleArea = itemArea;
                        visibleArea.x += m_ScrollPos.x;
                        visibleArea.y += m_ScrollPos.y;

                        AddFoldOuts(ref itemRect, ref visibleArea, allRootNodes, selectedInstanceIDs, ref openNodes);
                    }
                    GUI.EndScrollView();
                    if (selectedInstanceIDs.Count == 1)
                    {
                        var instanceID = selectedInstanceIDs.First();
                        var obj        = EditorUtility.InstanceIDToObject(instanceID) as ChiselNode;
                        if (obj)
                        {
                            var         brush     = obj as ChiselBrushComponent;
                            var         composite = obj as ChiselComposite;
                            var         model     = obj as ChiselModel;
                            CSGTreeNode node      = CSGTreeNode.Invalid;
                            if (brush)
                            {
                                node = brush.TopTreeNode;
                            }
                            else if (composite)
                            {
                                node = composite.Node;
                            }
                            else if (model)
                            {
                                node = model.Node;
                            }
                            else
                            {
                                for (int n = 0; n < allTreeNodes.Length; n++)
                                {
                                    if (allTreeNodes[n].UserID == instanceID)
                                    {
                                        node = allTreeNodes[n];
                                        break;
                                    }
                                }
                            }

                            if (node != CSGTreeNode.Invalid)
                            {
                                var labelArea = itemArea;
                                labelArea.x      = 0;
                                labelArea.y      = labelArea.height;
                                labelArea.height = kItemHeight;
                                GUI.Label(labelArea, $"Node: {node}"); labelArea.y                += kItemHeight;
                                GUI.Label(labelArea, $"UserID: {node.UserID}"); labelArea.y       += kItemHeight;
                                GUI.Label(labelArea, $"Operation: {node.Operation}"); labelArea.y += kItemHeight;
                                GUI.Label(labelArea, $"Valid: {node.Valid}"); labelArea.y         += kItemHeight;
                                GUI.Label(labelArea, $"NodeType: {node.Type}"); labelArea.y       += kItemHeight;
                                GUI.Label(labelArea, $"ChildCount: {node.Count}"); labelArea.y    += kItemHeight;
                                if (node.Type != CSGNodeType.Tree)
                                {
                                    GUI.Label(labelArea, $"Parent: {node.Parent} valid: {node.Parent.Valid}"); labelArea.y += kItemHeight;
                                    GUI.Label(labelArea, $"Model: {node.Tree} valid: {node.Tree.Valid}"); labelArea.y      += kItemHeight;
                                }
                                if (node.Type == CSGNodeType.Brush)
                                {
                                    var treeBrush         = (CSGTreeBrush)node;
                                    var brushMeshInstance = treeBrush.BrushMesh;
                                    GUI.Label(labelArea, $"BrushMeshInstance: {brushMeshInstance.BrushMeshID} valid: {brushMeshInstance.Valid}"); labelArea.y += kItemHeight;
                                }
                            }
                        }
                    }
                }
            }
        }