private void OnEnable() { titleContent = new GUIContent("Udon Graph"); graph = CreateInstance <UdonGraph>(); graphGUI = CreateInstance <UdonGraphGUI>(); graphGUI.graph = graph; Texture2D logoTexture = Resources.Load <Texture2D>(EditorGUIUtility.isProSkin ? "UdonLogoAlphaWhite" : "UdonLogoAlpha"); _udonLogo = new GUIStyle { normal = { background = logoTexture, textColor = Color.white }, fixedHeight = (int)(logoTexture.height * CONTENT_LOGO_SCALE), fixedWidth = (int)(logoTexture.width * CONTENT_LOGO_SCALE) }; // ReSharper disable once DelegateSubtraction Undo.undoRedoPerformed -= OnUndoRedo; //Remove old handler if present to prevent duplicates, doesn't cause errors if not present Undo.undoRedoPerformed += OnUndoRedo; }
public static void DrawWindow(UdonGraph graph, UdonGraphGUI graphGUI) { if (_instance == null) { _instance = CreateInstance <UdonNodeSearchMenu>(); } Rect rect = GUILayoutUtility.GetLastRect(); bool goodState = graphGUI.selection.Count == 0; if (goodState) { goodState = GUI.GetNameOfFocusedControl() != "NodeField"; } if (goodState && (KeyUpEvent(KeyCode.Space))) { GUI.UnfocusWindow(); } if (!GUILayout.Button("Add Node", EditorStyles.toolbarButton, GUILayout.Width(120)) && !(KeyUpEvent(KeyCode.Space) && goodState)) { return; } rect = RemapRectForPopup(rect); _instance.InitWindow(graph, graphGUI, rect); _instance.Repaint(); }
private void InitWindow(UdonGraph graph, UdonGraphGUI graphGUI, Rect rect) { _dropDownRect = rect; _graph = graph; _graphGUI = graphGUI; _styles = new Styles(); wantsMouseMove = true; if (NodeMenu.MenuName == null) { new Thread(() => { Thread.CurrentThread.IsBackground = true; NodeMenu.PopulateNodeMenu(); }).Start(); } _dropDownWidth = rect.width; ShowAsDropDown(rect, new Vector2(rect.width, DROPDOWN_HEIGHT)); Focus(); }
public void DoDraggedEdge() { if (_sDragSourceSlot != null) { EventType typeForControl = Event.current.GetTypeForControl(0); if (typeForControl != EventType.Repaint) { if (typeForControl == EventType.MouseDrag) { _sDropTarget = null; DontDrawEdge = null; Event.current.Use(); } } else { Assembly unityEngineAssembly = Assembly.GetAssembly(typeof(UnityEngine.GUI)); Type guiClipType = unityEngineAssembly.GetType("UnityEngine.GUIClip", true); FieldInfo propInfo = typeof(Slot).GetField( "m_Position", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (propInfo == null) { Debug.LogError("PropInfo m_Position is null!"); } Rect position = (Rect)propInfo.GetValue(_sDragSourceSlot); Vector2 end = Event.current.mousePosition; if (_sDropTarget != null) { Rect position2 = (Rect)propInfo.GetValue(_sDropTarget); object[] endArgs = { new Vector2(position2.x, position2.y + 9f) }; ParameterModifier endP = new ParameterModifier(1); endP[0] = true; ParameterModifier[] endMods = { endP }; MethodInfo endClipRect = guiClipType.GetMethod( "Clip", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy, Type.DefaultBinder, new Type[] { typeof(Vector2) }, endMods); end = (Vector2)endClipRect.Invoke(null, endArgs); } object[] startArgs = { new Vector2(position.xMax, position.y + 9f) }; ParameterModifier startP = new ParameterModifier(1); startP[0] = true; ParameterModifier[] startMods = { startP }; MethodInfo startClipRect = guiClipType.GetMethod( "Clip", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy, Type.DefaultBinder, new Type[] { typeof(Vector2) }, startMods); Vector2 start = (Vector2)startClipRect.Invoke(null, startArgs); Color edgeColor = Color.white; if (_sDragSourceSlot.dataType != null) { edgeColor = UdonGraphGUI.MapTypeToColor(_sDragSourceSlot.dataType); } DrawEdge(start, end, (Texture2D)Styles.selectedConnectionTexture.image, edgeColor, edgeStyle); } } }
public void DoEdges() { int num = 0; int num2 = 0; if (Event.current.type == EventType.Repaint) { foreach (Edge current in host.graph.edges) { if (current == DontDrawEdge || current == MoveEdge) { continue; } Texture2D tex = (Texture2D)Styles.connectionTexture.image; if (num < edgeSelection.Count && edgeSelection[num] == num2) { num++; tex = (Texture2D)Styles.selectedConnectionTexture.image; } // TODO: CLEAN-UP Color color; if (!current.toSlot.isFlowSlot && current.toSlot.dataType != null && current.toSlot.dataType.IsSubclassOf(typeof(UnityEngine.Object))) { color = EdgeGUI.kObjectTypeEdgeColor; } Color niceGrey = new Color(.85f, .85f, .85f); color = current.fromSlot.dataType != null?UdonGraphGUI.MapTypeToColor(current.fromSlot.dataType) : niceGrey; Color endColor = new Color(.85f, .85f, .85f); if (current.toSlot.dataType != null) { endColor = UdonGraphGUI.MapTypeToColor(current.toSlot.dataType); } DrawEdge(current, tex, color != endColor ? Color.Lerp(color, endColor, .5f) : color, edgeStyle); num2++; } } if (_sDragSourceSlot == null) { return; } if (Event.current.type != EventType.MouseUp) { return; } if (MoveEdge != null) { host.graph.RemoveEdge(MoveEdge); MoveEdge = null; } if (_sDropTarget != null) { return; } EndDragging(); Event.current.Use(); }
private void OnGUILogic() { _drawGraph = true; if (Selection.gameObjects.Count(g => g.GetComponent <UdonBehaviour>()) > 1) { _displayText = "Multi-object editing not supported"; _drawGraph = false; } else if (Selection.objects.Count(o => o != null && o is IUdonGraphDataProvider) > 1) // == typeof(UdonGraphProgramAsset) { _displayText = "Multi-object editing not supported"; _drawGraph = false; } IUdonGraphDataProvider udonGraphProgramAsset = (IUdonGraphDataProvider)Selection.objects.FirstOrDefault(g => g != null && g is IUdonGraphDataProvider); if (udonGraphProgramAsset == null) { GameObject behaviourObject = Selection.gameObjects.FirstOrDefault(g => g.GetComponent <UdonBehaviour>()); if (behaviourObject != null) { UdonBehaviour udonBehaviour; var udonBehaviours = behaviourObject.GetComponents <UdonBehaviour>(); if (udonBehaviours.Length == 1 || lastClickedProgramSource == null) { udonBehaviour = udonBehaviours[0]; } else { udonBehaviour = udonBehaviours.FirstOrDefault(u => u.programSource == lastClickedProgramSource); if (udonBehaviour == null) { // the last clicked graph is not available on this object, reset it lastClickedProgramSource = null; udonBehaviour = udonBehaviours[0]; } } AbstractUdonProgramSource programSource = udonBehaviour.programSource; if (programSource is IUdonGraphDataProvider asUdonGraphProgramAsset) { udonGraphProgramAsset = asUdonGraphProgramAsset; } } } if (graph == null) { graph = CreateInstance <UdonGraph>(); } if (udonGraphProgramAsset != null) { if (graphGUI == null) { graphGUI = CreateInstance <UdonGraphGUI>(); graphGUI.graph = graph; } if (graph == null) { graph = CreateInstance <UdonGraph>(); graphGUI.graph = graph; } if (graph.graphProgramAsset == udonGraphProgramAsset) { if (graph.data != null) { return; } } titleContent = new GUIContent($"Udon - {udonGraphProgramAsset}"); graph.data = new UdonGraphData(udonGraphProgramAsset.GetGraphData()); graph.graphProgramAsset = udonGraphProgramAsset; graph.Reload(); graphGUI.CenterGraph(); } else { if (graph.graphProgramAsset != null) { return; } _displayText = "Create an Udon Graph Asset to begin."; _drawGraph = false; } }
private void OnGUILogic() { _drawGraph = true; if (Selection.gameObjects.Count(g => g.GetComponent <UdonBehaviour>()) > 1) { _displayText = "Multi-object editing not supported"; _drawGraph = false; } else if (Selection.objects.Count(o => o != null && o is IUdonGraphDataProvider) > 1) // == typeof(UdonGraphProgramAsset) { _displayText = "Multi-object editing not supported"; _drawGraph = false; } IUdonGraphDataProvider udonGraphProgramAsset = (IUdonGraphDataProvider)Selection.objects.FirstOrDefault(g => g != null && g is IUdonGraphDataProvider); if (udonGraphProgramAsset == null) { GameObject behaviourObject = Selection.gameObjects.FirstOrDefault(g => g.GetComponent <UdonBehaviour>()); if (behaviourObject != null) { UdonBehaviour udonBehaviour = behaviourObject.GetComponent <UdonBehaviour>(); AbstractUdonProgramSource programSource = udonBehaviour.programSource; if (programSource is IUdonGraphDataProvider asUdonGraphProgramAsset) { udonGraphProgramAsset = asUdonGraphProgramAsset; } } } if (graph == null) { graph = CreateInstance <UdonGraph>(); } if (udonGraphProgramAsset != null) { if (graphGUI == null) { graphGUI = CreateInstance <UdonGraphGUI>(); graphGUI.graph = graph; } if (graph == null) { graph = CreateInstance <UdonGraph>(); graphGUI.graph = graph; } if (graph.graphProgramAsset == udonGraphProgramAsset) { if (graph.data != null) { return; } } graph.data = new UdonGraphData(udonGraphProgramAsset.GetGraphData()); graph.graphProgramAsset = udonGraphProgramAsset; graph.Reload(); graphGUI.CenterGraph(); } else { if (graph.graphProgramAsset != null) { return; } _displayText = "Create an Udon Graph Asset to begin."; _drawGraph = false; } }