예제 #1
0
 internal void TessellateOutline(float strokeWidth, [CanBeNull] StrokeStyle strokeStyle, [CanBeNull] Matrix3x2?transform, float flatteningTolerance, [NotNull] TessellationSink sink)
 {
     throw new NotImplementedException();
 }
예제 #2
0
        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;
        }
예제 #3
0
 public void Tessellate([CanBeNull] Matrix3x2?transform, [NotNull] TessellationSink sink)
 {
     Tessellate(transform, DefaultFlatteningTolerance, sink);
 }
예제 #4
0
 public void Tessellate(float flatteningTolerance, [NotNull] TessellationSink sink)
 {
     Tessellate(null, flatteningTolerance, sink);
 }
예제 #5
0
 public void Tessellate([NotNull] TessellationSink sink)
 {
     Tessellate(null, DefaultFlatteningTolerance, sink);
 }