Exemplo n.º 1
0
    public void OnSceneGUI()
    {
        if (edge != null && !edgeBehaviour.gameObject.IsDestroyed())
        {
            UnityEngine.Event currentEvent = UnityEngine.Event.current;

            // Just in case that the values are changed in the editor
            if ((edge.From != null) && (edge.To != null))
            {
                if (currentEvent.type != EventType.mouseDrag)
                {
                    Vector3 handlePosition = edge.Position;

                    Vector3 newPosition = edgeBehaviour.transform.position;
                    if (newPosition != handlePosition)
                    {
                        edge.Position = newPosition;
                        edgeBehaviour.transform.position = edge.Position;
                        this.edgeBehaviour.GraphBehaviour.UpdateEdgeIntersections();
                    }
                }
            }

            // Delete edge if D-Key is pressed
            if (InputHelpers.Pressed(KeyCode.D) && edgeBehaviour != null)
            {
                edgeBehaviour.Edge.Delete();
                return;
            }

            // Worked: but only for node/edge-layer  --> wall-endings have to be changed as well...
            // -->  maybe with teh graphEvent FromToChanged in the Wall
            //// Switch ends on DoubleClick
            //if (InputHelpers.DoubleLeftClick())
            //    edge.SwitchEnds();

            if (InputHelpers.DoubleLeftClicked())
            {
                // Get the mousepointer on XZ-plane and draw a line
                Vector3 worldPoint = InputHelpers.GetXZPlaneCollisionInEditor(currentEvent);


                float   pointOnEdgeParameter;
                Vector3 pointOnEdge = MathUtils.GetMinDistancePointOnLine(
                    edgeBehaviour.Edge.From.Position,
                    edgeBehaviour.Edge.To.Position,
                    worldPoint,
                    out pointOnEdgeParameter);


                // Create new Node at the cutting-point on the Edge
                Node_Behaviour newNodeBehaviour = edgeBehaviour.GraphBehaviour.CreateNodeBehaviour(pointOnEdge);

                // Create new Edge for first part
                Edge_Behaviour cutEdge1 = edgeBehaviour.GraphBehaviour.CreateEdgeBehaviour(edgeBehaviour.FromBehaviour, newNodeBehaviour);

                // Create new Edge for second part
                Edge_Behaviour cutEdge2 = edgeBehaviour.GraphBehaviour.CreateEdgeBehaviour(newNodeBehaviour, edgeBehaviour.ToBehaviour);


                //HandleUtility.Repaint();
                edgeBehaviour.Edge.Delete();
                Debug.Log("Deleted old Edge");

                newNodeBehaviour.Node.OnNodeChanged();
                Debug.Log("NewNode ChangedEvent");

                UnityEngine.Object[] objects = new UnityEngine.Object[1];
                objects[0]        = newNodeBehaviour.gameObject;
                Selection.objects = objects;
                Debug.Log("After selecting the new node");

                Undo.CreateSnapshot();
                Debug.Log("Create Snapshot");
                HandleUtility.Repaint();
                Debug.Log("Repaint");
                return;
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(edgeBehaviour);
            }
        }
    }