1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use crate::shape::{Shape, Vertex};
use rgx::{color::Rgba, core::Renderer, kit::ZDepth, math::Vector3};
mod lyon_builders;
#[derive(Default, Debug)]
pub struct ShapeBuilder {
zdepth: ZDepth,
vertices: Vec<Vertex>,
indicies: Vec<u16>,
pub default_color: [f32; 4],
}
impl ShapeBuilder {
pub fn new(zdepth: ZDepth, default_color: [f32; 4]) -> Self {
Self {
zdepth,
default_color,
..Default::default()
}
}
pub fn prepare(&self, renderer: &Renderer) -> Shape {
let verticies = renderer.device.create_buffer(&self.vertices);
let indicies = renderer.device.create_index(&self.indicies);
Shape {
index_count: self.indicies.len() as u32,
vertices: verticies,
indices: indicies,
}
}
pub fn fill(
&mut self,
path: &lyon::path::Path,
options: &lyon::tessellation::FillOptions,
) -> Result<(), lyon::tessellation::TessellationError> {
let mut tesselator = lyon::tessellation::FillTessellator::new();
let _ = tesselator.tessellate_with_ids(path.id_iter(), path, Some(path), options, self)?;
Ok(())
}
pub fn stroke(
&mut self,
path: &lyon::path::Path,
options: &lyon::tessellation::StrokeOptions,
) -> Result<(), lyon::tessellation::TessellationError> {
let mut tesselator = lyon::tessellation::StrokeTessellator::new();
let _ = tesselator.tessellate_with_ids(path.id_iter(), path, Some(path), options, self)?;
Ok(())
}
pub fn fill_circle(
&mut self,
center: lyon::math::Point,
radius: f32,
options: &lyon::tessellation::FillOptions,
) -> Result<(), lyon::tessellation::TessellationError> {
lyon::tessellation::basic_shapes::fill_circle(center, radius, options, self)?;
Ok(())
}
pub fn stroke_circle(
&mut self,
center: lyon::math::Point,
radius: f32,
options: &lyon::tessellation::StrokeOptions,
) -> Result<(), lyon::tessellation::TessellationError> {
lyon::tessellation::basic_shapes::stroke_circle(center, radius, options, self)?;
Ok(())
}
fn new_vertex(&mut self, point: lyon::math::Point, attributes: &[f32]) -> Vertex {
let attributes = if attributes.is_empty() {
&self.default_color
} else {
attributes
};
assert!(attributes.len() == 4, "Attributes should be RGBA");
Vertex {
color: Rgba {
r: attributes[0],
g: attributes[1],
b: attributes[2],
a: attributes[3],
}
.into(),
position: Vector3::new(point.x, point.y, self.zdepth.0),
}
}
fn add_vertex(
&mut self,
point: lyon::math::Point,
attributes: &[f32],
) -> Result<lyon::lyon_tessellation::VertexId, lyon::lyon_tessellation::GeometryBuilderError>
{
let vertex = self.new_vertex(point, attributes);
let new_id = lyon::tessellation::VertexId(self.vertices.len() as u32);
self.vertices.push(vertex);
if self.vertices.len() > u16::MAX as usize {
return Err(lyon::tessellation::GeometryBuilderError::TooManyVertices);
}
Ok(new_id)
}
}