#2d-graphics #svg #graphics #tessellation #2d

lyon_tess2

An additional path tessellator for lyon using libtess2

9 releases (breaking)

0.17.1 Jan 4, 2021
0.16.0 Aug 3, 2020
0.15.0 Dec 26, 2019
0.14.0 Jul 22, 2019
0.10.0 Mar 1, 2018

#11 in #tessellation

38 downloads per month

MIT/Apache

1MB
30K SLoC

Alternative fill tessellation implementation using libtess2.

Lyon libtess2 wrapper

This crate provides an alternative path fill tessellator implemented as a wrapper of the libtess2 C library.

The goal of this crate is to provide an alternative tessellator for the potential cases where lyon_tessellation::FillTessellator is lacking in features or robustness, and have something to compare the latter against.

Comparison with lyon_tessellation::FillTessellator

Advantages:

  • Supports the NonZero fill rule.
  • More robust against precision errors when paths have many self intersections very close to each other.

Disadvantages:

  • About twice slower than lyon_tessellation's fill tessellator.
  • Does not support computing vertex normals.
  • Wrapper around a C library (as opposed to pure rust with no unsafe code).

API

In order to avoid any overhead, this crate introduces the FlattenedPath type which stores already-flattened paths in the memory layout expected by libtess2. Instead of working with a GeometryBuilder like the tessellators in lyon_tessellation, this tessellator uses a GeometryReceiver trait that corresponds to the way libtess2 exposes its output.

Example

extern crate lyon_tess2 as tess2;
use tess2::{FillTessellator, FillOptions};
use tess2::math::{Point, point};
use tess2::path::Path;
use tess2::path::builder::*;
use tess2::geometry_builder::*;

fn main() {
    // Create a simple path.
    let mut path_builder = Path::builder();
    path_builder.begin(point(0.0, 0.0));
    path_builder.line_to(point(1.0, 2.0));
    path_builder.line_to(point(2.0, 0.0));
    path_builder.line_to(point(1.0, 1.0));
    path_builder.end(true);
    let path = path_builder.build();

    // Create the destination vertex and index buffers.
    let mut buffers: VertexBuffers<Point, u16> = VertexBuffers::new();

    {
        // Create the tessellator.
        let mut tessellator = FillTessellator::new();

        // Compute the tessellation.
        let result = tessellator.tessellate(
            &path,
            &FillOptions::default(),
            &mut BuffersBuilder::new(&mut buffers, Positions)
        );
        assert!(result.is_ok());
    }
    println!("The generated vertices are: {:?}.", &buffers.vertices[..]);
    println!("The generated indices are: {:?}.", &buffers.indices[..]);

}

Dependencies

~1.5MB
~35K SLoC