internal void TessellateOutline(float strokeWidth, [CanBeNull] StrokeStyle strokeStyle, [CanBeNull] Matrix3x2?transform, float flatteningTolerance, [NotNull] TessellationSink sink) { throw new NotImplementedException(); }
public void Tessellate([CanBeNull] Matrix3x2?transform, float flatteningTolerance, [NotNull] TessellationSink sink) { if (!_isUpdateRequired && _triangles != null) { sink.AddTriangles(_triangles); sink.Close(); return; } var figures = _figures; if (figures == null || figures.Length == 0) { return; } var tess = new Tess(); for (var i = 0; i < figures.Length; ++i) { var contour = CreateContourFromFigure(transform, flatteningTolerance, figures[i]); tess.AddContour(contour); } WindingRule winding; switch (FillMode) { case FillMode.Alternate: winding = WindingRule.EvenOdd; break; case FillMode.Winding: winding = WindingRule.Positive; break; default: throw new ArgumentOutOfRangeException(); } tess.Tessellate(winding, ElementType.Polygons, 3); var indices = tess.Elements; var vertices = tess.Vertices; var triangles = new Triangle[indices.Length / 3]; var c = 0; for (var i = 0; i < indices.Length; i += 3) { var pos1 = vertices[indices[i]].Position; var pos2 = vertices[indices[i + 1]].Position; var pos3 = vertices[indices[i + 2]].Position; var triangle = new Triangle { Point1 = new Vector2(pos1.X, pos1.Y), Point2 = new Vector2(pos2.X, pos2.Y), Point3 = new Vector2(pos3.X, pos3.Y) }; triangles[c] = triangle; ++c; } _triangles = triangles; sink.AddTriangles(triangles); sink.Close(); _isUpdateRequired = false; }
public void Tessellate([CanBeNull] Matrix3x2?transform, [NotNull] TessellationSink sink) { Tessellate(transform, DefaultFlatteningTolerance, sink); }
public void Tessellate(float flatteningTolerance, [NotNull] TessellationSink sink) { Tessellate(null, flatteningTolerance, sink); }
public void Tessellate([NotNull] TessellationSink sink) { Tessellate(null, DefaultFlatteningTolerance, sink); }