Exemplo n.º 1
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePosition"></param>
    /// <param name="distance"></param>
    /// <returns></returns>
    public Edge_Behaviour GetEdgeInDistance(Node_Behaviour node, float distance)
    {
        Edge_Behaviour result = null;

        float   minDistance = float.MaxValue;
        Vector3 nearestPointOnEdge;

        foreach (Edge_Behaviour edgeBehaviour in edgeBehaviours)
        {
            Edge edge = edgeBehaviour.Edge;
            if (!node.Node.Edges.Contains(edge))
            {
                nearestPointOnEdge = MathUtils.GetMinDistancePointOnLine(
                    edge.From.Position,
                    edge.To.Position,
                    node.transform.position);

                float tmp = (node.transform.position - nearestPointOnEdge).sqrMagnitude;
                if (tmp < minDistance)
                {
                    minDistance = tmp;
                    result      = edgeBehaviour;
                }
            }
        }

        if (minDistance < distance && result != null)
        {
            return(result);
        }

        return(null);
    }
Exemplo n.º 2
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="from"></param>
    /// <param name="to"></param>
    /// <returns></returns>
    public Edge_Behaviour CreateEdgeBehaviour(Node_Behaviour from, Node_Behaviour to)
    {
        //Debug.Log("GraphBehaviour: Going to create EdgeBehaviour for From-Node " + from.node.Id + " and To-Node " + to.node.Id);
        if (from == null || to == null)
        {
            return(null);
        }

        Edge edge = this.graph.CreateEdge(from.Node, to.Node);

        if (edgesParent == null)
        {
            CheckParents();
        }

        //Debug.Log("GraphBehaviour: Create EdgeBehaviour for From-Node " + from.node.Id + " and To-Node " + to.node.Id);
        GameObject     edgeGO        = edgesParent.CreateChild(edge.Id);
        Edge_Behaviour edgeBehaviour = edgeGO.AddComponent <Edge_Behaviour>();

        edgeBehaviour.InitializeBehaviour(this, edge, from, to);

        AddEdgeBehaviour(edgeBehaviour);

        return(edgeBehaviour);
    }
Exemplo n.º 3
0
    ///// <summary>
    /////
    ///// </summary>
    ///// <param name="worldpoint"></param>
    ///// <param name="distance"></param>
    ///// <returns></returns>
    //public Edge_Behaviour GetEdgeInDistance(Vector3 worldpoint, float distance)
    //{
    //    Edge_Behaviour result = null;

    //    float minDistance = float.MaxValue;
    //    Vector3 nearestPointOnEdge;

    //    foreach (Edge_Behaviour edgeBehaviour in edgeBehaviours)
    //    {
    //        Edge edge = edgeBehaviour.Edge;

    //        nearestPointOnEdge = MathUtils.GetMinDistancePointOnLine(
    //            edge.From.Position,
    //            edge.To.Position,
    //            worldpoint);

    //        float tmp = (worldpoint - nearestPointOnEdge).magnitude;
    //        if (tmp < minDistance)
    //        {
    //            minDistance = tmp;
    //            result = edgeBehaviour;
    //        }
    //    }

    //    if (minDistance < distance && result != null)
    //        return result;

    //    return null;
    //}



    /// <summary>
    ///
    /// </summary>
    /// <param name="worldpoint"></param>
    /// <param name="distance"></param>
    /// <returns></returns>
    public Edge_Behaviour GetEdgeInScreenDistance(Vector3 worldpoint, float distance)
    {
        Edge_Behaviour result = null;

        float   minDistance = float.MaxValue;
        Vector3 nearestPointOnEdge;

        foreach (Edge_Behaviour edgeBehaviour in edgeBehaviours)
        {
            Edge edge = edgeBehaviour.Edge;

            nearestPointOnEdge = MathUtils.GetMinDistancePointOnLine(
                edge.From.Position,
                edge.To.Position,
                worldpoint);

            float tmp = (worldpoint - nearestPointOnEdge).magnitude;
            if (tmp < minDistance)
            {
                minDistance = tmp;
                result      = edgeBehaviour;
            }
        }

        if (minDistance < distance && result != null)
        {
            return(result);
        }

        return(null);
    }
Exemplo n.º 4
0
 public void AddEdgeBehaviour(Edge_Behaviour edgeBehaviour)
 {
     if (!this.edgeBehaviours.Contains(edgeBehaviour))
     {
         this.edgeBehaviours.Add(edgeBehaviour);
     }
 }
Exemplo n.º 5
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="edge"></param>
    /// <returns></returns>
    private Edge_Behaviour CreateEdgeBehaviour(Edge edge)
    {
        GameObject     edgeGO        = edgesParent.CreateChild(edge.Id);
        Edge_Behaviour edgeBehaviour = edgeGO.AddComponent <Edge_Behaviour>();

        edgeBehaviour.InitializeBehaviour(this, edge, GetNodeBehaviourByID(edge.From.Id), GetNodeBehaviourByID(edge.To.Id));

        AddEdgeBehaviour(edgeBehaviour);
        return(edgeBehaviour);
    }
Exemplo n.º 6
0
 public void Awake()
 {
     edgeBehaviour = target as Edge_Behaviour;
     edge          = edgeBehaviour.Edge;
     if (edge != null)
     {
         edgeBehaviour.transform.position = edge.GetMidPoint();
     }
     //else
     //  DestroyImmediate(edgeBehaviour.gameObject);
 }
Exemplo n.º 7
0
    public static void SnapToEdge(this Node selectedNode, Edge_Behaviour foundEdge, ref Vector3 pointOnEdge, ref float pointOnEdgeParameter, float treshold)
    {
        //Debug.Log("Snap selected Node(" + selectedNode.name + ") to Edge(" + foundEdge.name + ") at " + pointOnEdge);
        pointOnEdge = MathUtils.GetMinDistancePointOnLine(
            foundEdge.Edge.From.Position,
            foundEdge.Edge.To.Position,
            selectedNode.Position,
            out pointOnEdgeParameter);

        if ((pointOnEdge - selectedNode.Position).magnitude < treshold)
        {
            selectedNode.Position = pointOnEdge;
        }
    }
Exemplo n.º 8
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePosition"></param>
    /// <param name="distance"></param>
    /// <param name="pointOnEdge"></param>
    /// <param name="pointOnEdgeParameter"></param>
    /// <returns></returns>
    public Edge_Behaviour GetEdgeInDistanceWithPoint(Vector3 mousePosition, float distance, out Vector3 pointOnEdge, out float pointOnEdgeParameter)
    {
        Edge_Behaviour edgeBehaviour = GetEdgeInScreenDistance(mousePosition, distance);

        pointOnEdge          = Vector3.zero;
        pointOnEdgeParameter = float.NaN;

        if (edgeBehaviour != null)
        {
            pointOnEdge = MathUtils.GetMinDistancePointOnLine(
                edgeBehaviour.Edge.From.Position,
                edgeBehaviour.Edge.To.Position,
                mousePosition,
                out pointOnEdgeParameter);
        }

        return(edgeBehaviour);
    }
Exemplo n.º 9
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePosition"></param>
    /// <param name="distance"></param>
    /// <param name="pointOnEdge"></param>
    /// <param name="pointOnEdgeParameter"></param>
    /// <returns></returns>
    public Edge_Behaviour GetEdgeInDistanceWithPoint(Node_Behaviour node, float distance, out Vector3 pointOnEdge, out float pointOnEdgeParameter)
    {
        Edge_Behaviour edgeBehaviour = GetEdgeInDistance(node, distance);

        pointOnEdge          = Vector3.zero;
        pointOnEdgeParameter = float.NaN;

        if (edgeBehaviour != null)
        {
            pointOnEdge = MathUtils.GetMinDistancePointOnLine(
                edgeBehaviour.Edge.From.Position,
                edgeBehaviour.Edge.To.Position,
                node.transform.position,
                out pointOnEdgeParameter);
        }

        return(edgeBehaviour);
    }
Exemplo n.º 10
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);
            }
        }
    }
Exemplo n.º 11
0
 public void RemoveEdgeBehaviour(Edge_Behaviour edgeBehaviour)
 {
     //Debug.Log("Graphbehaviour RemoveEdge : " + edgeBehaviour.name);
     this.edgeBehaviours.Remove(edgeBehaviour);
 }
Exemplo n.º 12
0
    public void OnSceneGUI()
    {
        UnityEngine.Event currentEvent = UnityEngine.Event.current;

        //NodeUtils.DrawCircle(node.Position, 3f);

        // Delete the Node
        if (InputHelpers.Pressed(KeyCode.D))
        {
            nodeBehaviour.Node.Delete();
            return;
        }


        /*****************-  Position-Changes -************************************************************/
        // Update Positions for single or multi-select
        if (nodeBehaviour.transform.position != oldPosition)
        {
            oldPosition = nodeBehaviour.transform.position;

            foreach (Node_Behaviour go in nodeBehaviours)
            {
                NodeUtils.DrawAnglePieGizmo(go.Node);
                if (Event.current.control)
                {
                    go.transform.position = go.transform.position.SnapToGrid();
                    go.Node._position     = go.transform.position;
                }
                else
                {
                    go.Node._position = go.transform.position;
                }

                this.nodeBehaviour.GraphBehaviour.UpdateEdgeIntersections();
            }
            //// fire change-events


            foreach (Node_Behaviour go in nodeBehaviours)
            {
                //Debug.Log(go.name + "OnNodePosition Node2D_Editor");
                go.Node.OnNodeChanged();
            }
        }
        /*****************************************************************************************************/

        // Get the mousepointer on XZ-plane and draw a line
        Vector3 worldPoint = InputHelpers.GetXZPlaneCollisionInEditorFixedHeight(0f, currentEvent); //InputHelpers.GetXZPlaneCollisionInEditor(currentEvent);

        if (Event.current.control)
        {
            worldPoint = worldPoint.SnapToGrid();
        }

        Handles.color = Color.green;
        Handles.DrawLine(nodeBehaviour.transform.position, worldPoint);



        if (InputHelpers.ClickedLeft())
        {
            //if()

            // if another Node is within distance, connect the two nodes with a new edge
            Node_Behaviour foundNode = nodeBehaviour.GraphBehaviour.GetNodeInDistance(worldPoint, 1f);

            if (foundNode != null)
            {
                if (foundNode != nodeBehaviour)
                {
                    // Create a new EdgeBehaviour with the given nodes
                    Edge_Behaviour newEdgeBehaviour = nodeBehaviour.GraphBehaviour.CreateEdgeBehaviour(nodeBehaviour, foundNode);

                    foundNode.gameObject.SelectInEditor();

                    //newEdgeBehaviour.Edge.OnFromToChanged();
                    //}
                    //if (currentEvent.control || currentEvent.shift)
                    //{
                    //Node_Behaviour.combineWithLastSelectedNode = true;
                    //currentEvent.Use();
                }
            }
            else
            {
                Vector3        pointOnEdge;
                float          pointOnEdgeParameter;
                Edge_Behaviour foundEdge = nodeBehaviour.GraphBehaviour.GetEdgeInDistanceWithPoint(worldPoint, 1f, out pointOnEdge, out pointOnEdgeParameter);
                if (foundEdge != null)
                {
                    Debug.Log("Found Edge: " + foundEdge.name + "  hit at t = " + pointOnEdgeParameter + " at position " + pointOnEdge);

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

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

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

                    if (foundEdge.FromBehaviour != nodeBehaviour && foundEdge.ToBehaviour != nodeBehaviour)
                    {
                        // Create new Edge from the lastNode (this) to the new Node
                        Edge_Behaviour newEdgeBehaviour = nodeBehaviour.GraphBehaviour.CreateEdgeBehaviour(nodeBehaviour, newNodeBehaviour);
                        //Debug.Log("#############  Done creating a new Wall  ##################");
                    }

                    foundEdge.Edge.Delete();

                    newNodeBehaviour.Node.OnNodeChanged();
                    newNodeBehaviour.gameObject.SelectInEditor();
                }
                else //if (nodeBehaviour.GraphBehaviour != null)
                {
                    //Debug.Log("#############  Start creating a new Wall  ##################");
                    Node_Behaviour newNodeBehaviour = nodeBehaviour.GraphBehaviour.CreateNodeBehaviour(worldPoint);
                    Edge_Behaviour newEdgeBehaviour = nodeBehaviour.GraphBehaviour.CreateEdgeBehaviour(nodeBehaviour, newNodeBehaviour);
                    //Debug.Log("#############  Done creating a new Wall  ##################");

                    newNodeBehaviour.gameObject.SelectInEditor();

                    currentEvent.Use();
                }
            }
        }
        HandleUtility.Repaint();


        //if (InputHelpers.MouseUp())
        //{
        //    Debug.Log("RoomRecognition");
        //    ////this is sooooo NOT good....
        //    foreach (Wall wall in node.Graph.Iem.Prefab.Walls)
        //        wall.RoomRecognition();
        //}

        //if (GUI.changed)
        //    EditorUtility.SetDirty(nodeBehaviour);
    }