/// <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); }
/// <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); }
///// <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); }
public void AddEdgeBehaviour(Edge_Behaviour edgeBehaviour) { if (!this.edgeBehaviours.Contains(edgeBehaviour)) { this.edgeBehaviours.Add(edgeBehaviour); } }
/// <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); }
public void Awake() { edgeBehaviour = target as Edge_Behaviour; edge = edgeBehaviour.Edge; if (edge != null) { edgeBehaviour.transform.position = edge.GetMidPoint(); } //else // DestroyImmediate(edgeBehaviour.gameObject); }
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; } }
/// <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); }
/// <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); }
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); } } }
public void RemoveEdgeBehaviour(Edge_Behaviour edgeBehaviour) { //Debug.Log("Graphbehaviour RemoveEdge : " + edgeBehaviour.name); this.edgeBehaviours.Remove(edgeBehaviour); }
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); }