示例#1
0
        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);
            }
        }
示例#2
0
            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);
            }
示例#3
0
        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);
        }