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; }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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; } } } } }
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; } } } } } } }