private static bool TryConnect(ushort node1, ConnectionPoint cpoint) { NetNode netNode1 = NetAccess.GetNode(node1); NetNode netNode2 = NetAccess.GetNode(cpoint.Node); Vector3 differenceVector = netNode2.m_position - netNode1.m_position; //Debug.Log("TryConnect: " + node1 + ", " + cpoint.Node + ", dist: " + differenceVector.magnitude); // 1) Check max distance if (differenceVector.magnitude > MAX_NODE_DISTANCE) { return(false); } ushort segment1 = NetAccess.GetFirstSegment(netNode1); //ushort segment2 = NetAccess.GetFirstSegment(netNode2); NetSegment netSegment1 = NetAccess.GetSegment(segment1); //NetSegment netSegment2 = NetAccess.GetSegment(segment2); // 2) Check if both segments are roads if (!((netSegment1.Info.m_hasForwardVehicleLanes || netSegment1.Info.m_hasBackwardVehicleLanes) && (cpoint.NetInfo.m_hasForwardVehicleLanes || cpoint.NetInfo.m_hasBackwardVehicleLanes))) { //Debug.Log("Not roads!"); return(false); } // 3) Check max angle (if segments are too close we skip this as it won't give good data) Vector3 direction1 = netSegment1.GetDirection(node1); Vector3 direction2 = cpoint.Direction; float angle1 = Vector3.Angle(direction1, -differenceVector); float angle2 = Vector3.Angle(direction2, -differenceVector); if (differenceVector.magnitude > MIN_SEGMENT_LENGTH) { if (angle1 > MAX_ANGLE || angle2 > MAX_ANGLE) { //Debug.Log("Angle too big: " + angle1 + " " + angle2); return(false); } } // 4) Check if directions of one-way roads match (if so connect) if (NetAccess.IsOneWay(netSegment1.Info) && cpoint.NetInfo) { if (SegmentDirectionBool(netSegment1, node1) ^ cpoint.DirectionBool) { Connect(node1, cpoint.Node, -netSegment1.GetDirection(node1), cpoint.Direction, cpoint.NetInfo, !cpoint.DirectionBool); return(true); } else { return(false); // We won't connect one-way roads whose directions don't match } } // 5) We will favor roads with same NetIfno (if so connect) if (netSegment1.Info == cpoint.NetInfo) { Connect(node1, cpoint.Node, -netSegment1.GetDirection(node1), cpoint.Direction, cpoint.NetInfo, !cpoint.DirectionBool); return(true); } // 6) Lastly we set smaller max distance and angle and try again if (differenceVector.magnitude < (MAX_NODE_DISTANCE * 3 / 4) && angle1 < MAX_ANGLE / 2 && angle2 < MAX_ANGLE / 2) { Connect(node1, cpoint.Node, -netSegment1.GetDirection(node1), cpoint.Direction, cpoint.NetInfo, !cpoint.DirectionBool); return(true); } return(false); }