static void SetOutlineCoords(Triangle triangle, int coordIdx, ProjectedEdge e1, ProjectedEdge e2) { var mode = (e1.NeedsToBeClipped || (e2?.NeedsToBeClipped ?? false)) ? RoundEdgeData.EdgeCombineMode.Intersection : RoundEdgeData.EdgeCombineMode.Union; if (e2 == null && mode == RoundEdgeData.EdgeCombineMode.Intersection) { mode = RoundEdgeData.EdgeCombineMode.Union; } //if (e2 == null && mode == RoundEdgeData.EdgeCombineMode.Union) // mode = RoundEdgeData.EdgeCombineMode.Intersection; e1.AdjustValues(); if (e2 != null) { e2.AdjustValues(); } for (int i = 0; i < 3; i++) { var uv1 = e1.UVs[i]; var uv2 = e2 != null ? e2.UVs[i] : RoundEdgeData.EmptyCoord; triangle.Indices[i].RoundEdgeData.SetCoordsPair(coordIdx, uv2, uv1, mode); } }
public ProjectedEdge ProjectTriangle(Triangle triangle, Vector3 vertex) { var plane = new Plane(vertex, triangle.Normal); var edgeP1 = plane.ProjectPoint2D(Direction, P1); var edgeP2 = plane.ProjectPoint2D(Direction, P2); var edge = new ProjectedEdge() { PlanarEdge = this, TargetVertex = vertex, P1 = plane.ProjectPoint2D(Direction, triangle.V1.Position), P2 = plane.ProjectPoint2D(Direction, triangle.V2.Position), P3 = plane.ProjectPoint2D(Direction, triangle.V3.Position), MinX = Math.Min(edgeP1.X, edgeP2.X), MaxX = Math.Max(edgeP1.X, edgeP2.X), }; if (OrigEdge != null)//prevents errors from temp objects { edge.ValidateValues(); } return(edge); }
static ProjectedEdge CreateClippingEdge(ProjectedEdge baseEdge, Vector3 edgeEnd, Plane facePlane) { var triangle = baseEdge.PlanarEdge.Face; var oppVert = baseEdge.PlanarEdge.GetOppositeVertex(edgeEnd); var outlineDir = (edgeEnd - oppVert).Normalized(); var interEdge = new HardEdge( edgeEnd, edgeEnd + baseEdge.PlanarEdge.OutlineDirection, facePlane.Normal, outlineDir); interEdge.CorrectOrder(); var planarEndEdge = new PlanarEdge(interEdge, triangle, facePlane); var interProjected = planarEndEdge.ProjectTriangle(triangle, edgeEnd); interProjected.NeedsToBeClipped = true; baseEdge.CombineWith = interProjected; interProjected.CombineWith = baseEdge; return(interProjected); }