/// <summary> /// Finds point on edge given mouse ray. /// </summary> private Vector3 FindClosestPointOnEdge(MeshUtils.Edge edge) { var ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); return(ShapeUtils.ShortestDistanceSegmentSegment(ray.origin, ray.GetPoint(500f), edge.Start, edge.End).PointOnSegment2); }
/// <summary> /// Finds closest triangle edge given ray and valid raycast result. The /// Result.ClosestEdge field will be updated. /// </summary> /// <param name="ray">Ray in world coordinate system.</param> /// <param name="result">Reference to valid result.</param> private static void FindClosestEdge(Ray ray, ref Result result) { var rayStart = ray.origin; var rayEnd = ray.GetPoint(5000.0f); var d1 = ShapeUtils.ShortestDistanceSegmentSegment(rayStart, rayEnd, result.Triangle.Vertex1, result.Triangle.Vertex2); var d2 = ShapeUtils.ShortestDistanceSegmentSegment(rayStart, rayEnd, result.Triangle.Vertex2, result.Triangle.Vertex3); var d3 = ShapeUtils.ShortestDistanceSegmentSegment(rayStart, rayEnd, result.Triangle.Vertex3, result.Triangle.Vertex1); result.ClosestEdge = d1.Distance < d2.Distance && d1.Distance < d3.Distance ? new Edge() { Start = result.Triangle.Vertex1, End = result.Triangle.Vertex2, Normal = result.Triangle.Normal, Type = Edge.EdgeType.Triangle } : d2.Distance < d1.Distance && d2.Distance < d3.Distance ? new Edge() { Start = result.Triangle.Vertex2, End = result.Triangle.Vertex3, Normal = result.Triangle.Normal, Type = Edge.EdgeType.Triangle } : new Edge() { Start = result.Triangle.Vertex3, End = result.Triangle.Vertex1, Normal = result.Triangle.Normal, Type = Edge.EdgeType.Triangle }; }