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 |
#9 in #tessellation
38 downloads per month
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