예제 #1
0
        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();
        }
예제 #4
0
        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);
                }
            }
        }
예제 #5
0
        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();
        }
예제 #6
0
        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;
            }
        }
예제 #7
0
        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;
            }
        }