1mod canvas;
2mod shapes;
3pub mod text;
4mod transforms;
5mod vertex;
6
7pub use canvas::Canvas;
8pub use glyph_brush::FontId;
9pub use shapes::*;
10pub use transforms::*;
11pub use vertex::{Point, Vertex2D};
12
13use super::{
14 Color, Command, Draw, DrawList, DrawState, Geometry, GeometryVariants, LineState, LineVertex,
15 Projection,
16};
17use solstice::texture::Texture;
18
19impl<'a, G> Draw<crate::Vertex2D, G> for DrawList<'a>
20where
21 G: crate::GeometryKind<'a, crate::Vertex2D> + 'a,
22{
23 fn draw(&mut self, geometry: G) {
24 self.push_draw(
25 GeometryVariants::D2(geometry.into()),
26 self.color,
27 self.transform,
28 None,
29 );
30 }
31
32 fn draw_with_transform<TX>(&mut self, geometry: G, transform: TX)
33 where
34 TX: Into<mint::ColumnMatrix4<f32>>,
35 {
36 self.push_draw(
37 GeometryVariants::D2(geometry.into()),
38 self.color,
39 transform.into(),
40 None,
41 );
42 }
43
44 fn draw_with_color<C: Into<Color>>(&mut self, geometry: G, color: C) {
45 self.push_draw(
46 GeometryVariants::D2(geometry.into()),
47 color.into(),
48 self.transform,
49 None,
50 );
51 }
52
53 fn draw_with_color_and_transform<C, TX>(&mut self, geometry: G, color: C, transform: TX)
54 where
55 C: Into<Color>,
56 TX: Into<mint::ColumnMatrix4<f32>>,
57 {
58 self.push_draw(
59 GeometryVariants::D2(geometry.into()),
60 color.into(),
61 transform.into(),
62 None,
63 );
64 }
65
66 fn image<T: Texture>(&mut self, geometry: G, texture: T) {
67 self.push_draw(
68 GeometryVariants::D2(geometry.into()),
69 self.color,
70 self.transform,
71 Some(texture.into()),
72 );
73 }
74
75 fn image_with_color<T, C>(&mut self, geometry: G, texture: T, color: C)
76 where
77 T: Texture,
78 C: Into<Color>,
79 {
80 self.push_draw(
81 GeometryVariants::D2(geometry.into()),
82 color.into(),
83 self.transform,
84 Some(texture.into()),
85 );
86 }
87
88 fn image_with_transform<T, TX>(&mut self, geometry: G, texture: T, transform: TX)
89 where
90 T: Texture,
91 TX: Into<mint::ColumnMatrix4<f32>>,
92 {
93 self.push_draw(
94 GeometryVariants::D2(geometry.into()),
95 self.color,
96 transform.into(),
97 Some(texture.into()),
98 );
99 }
100
101 fn image_with_color_and_transform<T, C, TX>(
102 &mut self,
103 geometry: G,
104 texture: T,
105 color: C,
106 transform: TX,
107 ) where
108 T: Texture,
109 C: Into<Color>,
110 TX: Into<mint::ColumnMatrix4<f32>>,
111 {
112 self.push_draw(
113 GeometryVariants::D2(geometry.into()),
114 color.into(),
115 transform.into(),
116 Some(texture.into()),
117 );
118 }
119}
120impl<'a, G> crate::Stroke<crate::Vertex2D, G> for DrawList<'a>
121where
122 G: Into<Geometry<'a, crate::Vertex2D>>,
123{
124 fn stroke(&mut self, geometry: G) {
125 self.stroke_with_color_and_transform(geometry, self.color, self.transform)
126 }
127
128 fn stroke_with_transform<TX>(&mut self, geometry: G, transform: TX)
129 where
130 TX: Into<mint::ColumnMatrix4<f32>>,
131 {
132 self.stroke_with_color_and_transform(geometry, self.color, transform)
133 }
134
135 fn stroke_with_color<C: Into<Color>>(&mut self, geometry: G, color: C) {
136 self.stroke_with_color_and_transform(geometry, color, self.transform)
137 }
138
139 fn stroke_with_color_and_transform<C, TX>(&mut self, geometry: G, color: C, transform: TX)
140 where
141 C: Into<Color>,
142 TX: Into<mint::ColumnMatrix4<f32>>,
143 {
144 let crate::Geometry { vertices, .. } = geometry.into();
145 self.commands.push(Command::Line(DrawState {
146 data: LineState {
147 geometry: vertices
148 .iter()
149 .map(|v: &Vertex2D| LineVertex {
150 position: [v.position[0], v.position[1], 0.],
151 width: self.line_width,
152 color: [1., 1., 1., 1.],
153 })
154 .collect::<Vec<_>>()
155 .into(),
156 is_loop: true,
157 depth_buffer: false,
158 },
159 transform: transform.into(),
160 camera: self.camera,
161 projection_mode: self
162 .projection_mode
163 .unwrap_or(Projection::Orthographic(None)),
164 color: color.into(),
165 texture: None,
166 target: self.target.clone(),
167 shader: self.shader.clone(),
168 }))
169 }
170}
171
172pub trait SimpleConvexGeometry: std::fmt::Debug {
173 type Vertices: Iterator<Item = Vertex2D>;
174 fn vertices(&self) -> Self::Vertices;
175 fn vertex_count(&self) -> usize;
176}
177
178macro_rules! impl_array_simple_convex_geom {
179 ($ty:ty, $count:expr) => {
180 impl SimpleConvexGeometry for [$ty; $count] {
181 type Vertices = std::iter::Map<std::array::IntoIter<$ty, $count>, fn($ty) -> Vertex2D>;
182
183 fn vertices(&self) -> Self::Vertices {
184 IntoIterator::into_iter(*self).map(Into::into)
185 }
186
187 fn vertex_count(&self) -> usize {
188 self.len()
189 }
190 }
191
192 impl SimpleConvexGeometry for &[$ty; $count] {
193 type Vertices = std::iter::Map<std::array::IntoIter<$ty, $count>, fn($ty) -> Vertex2D>;
194
195 fn vertices(&self) -> Self::Vertices {
196 IntoIterator::into_iter(**self).map(Into::into)
197 }
198
199 fn vertex_count(&self) -> usize {
200 self.len()
201 }
202 }
203 };
204}
205
206macro_rules! impl_32_array_simple_convex_geom {
207 ($ty:ty) => {
208 impl_array_simple_convex_geom!($ty, 1);
209 impl_array_simple_convex_geom!($ty, 2);
210 impl_array_simple_convex_geom!($ty, 3);
211 impl_array_simple_convex_geom!($ty, 4);
212 impl_array_simple_convex_geom!($ty, 5);
213 impl_array_simple_convex_geom!($ty, 6);
214 impl_array_simple_convex_geom!($ty, 7);
215 impl_array_simple_convex_geom!($ty, 8);
216 impl_array_simple_convex_geom!($ty, 9);
217 impl_array_simple_convex_geom!($ty, 10);
218 impl_array_simple_convex_geom!($ty, 11);
219 impl_array_simple_convex_geom!($ty, 12);
220 impl_array_simple_convex_geom!($ty, 13);
221 impl_array_simple_convex_geom!($ty, 14);
222 impl_array_simple_convex_geom!($ty, 15);
223 impl_array_simple_convex_geom!($ty, 16);
224 impl_array_simple_convex_geom!($ty, 17);
225 impl_array_simple_convex_geom!($ty, 18);
226 impl_array_simple_convex_geom!($ty, 19);
227 impl_array_simple_convex_geom!($ty, 20);
228 impl_array_simple_convex_geom!($ty, 21);
229 impl_array_simple_convex_geom!($ty, 22);
230 impl_array_simple_convex_geom!($ty, 23);
231 impl_array_simple_convex_geom!($ty, 24);
232 impl_array_simple_convex_geom!($ty, 25);
233 impl_array_simple_convex_geom!($ty, 26);
234 impl_array_simple_convex_geom!($ty, 27);
235 impl_array_simple_convex_geom!($ty, 28);
236 impl_array_simple_convex_geom!($ty, 29);
237 impl_array_simple_convex_geom!($ty, 30);
238 impl_array_simple_convex_geom!($ty, 31);
239 impl_array_simple_convex_geom!($ty, 32);
240 };
241}
242
243impl_32_array_simple_convex_geom!((f32, f32));
244impl_32_array_simple_convex_geom!((f64, f64));
245impl_32_array_simple_convex_geom!(Point);
246
247impl<'a> SimpleConvexGeometry for &'a [Vertex2D] {
248 type Vertices = std::iter::Copied<std::slice::Iter<'a, Vertex2D>>;
249
250 fn vertices(&self) -> Self::Vertices {
251 self.into_iter().copied()
252 }
253
254 fn vertex_count(&self) -> usize {
255 self.len()
256 }
257}
258
259impl<'a> SimpleConvexGeometry for &'a [Point] {
260 type Vertices = std::iter::Map<std::slice::Iter<'a, Point>, fn(&'a Point) -> Vertex2D>;
261
262 fn vertices(&self) -> Self::Vertices {
263 self.iter().map(|p| (*p).into())
264 }
265
266 fn vertex_count(&self) -> usize {
267 self.len()
268 }
269}
270
271impl<'a> SimpleConvexGeometry for Vec<Point> {
272 type Vertices = std::iter::Map<std::vec::IntoIter<Point>, fn(Point) -> Vertex2D>;
273
274 fn vertices(&self) -> Self::Vertices {
275 self.clone().into_iter().map(Into::into)
276 }
277
278 fn vertex_count(&self) -> usize {
279 self.len()
280 }
281}
282
283impl<'a> SimpleConvexGeometry for &'a [(f32, f32)] {
284 type Vertices =
285 std::iter::Map<std::slice::Iter<'a, (f32, f32)>, fn(&'a (f32, f32)) -> Vertex2D>;
286
287 fn vertices(&self) -> Self::Vertices {
288 self.iter().map(|p| (*p).into())
289 }
290
291 fn vertex_count(&self) -> usize {
292 self.len()
293 }
294}
295
296impl<'a> SimpleConvexGeometry for &'a [(f64, f64)] {
297 type Vertices =
298 std::iter::Map<std::slice::Iter<'a, (f64, f64)>, fn(&'a (f64, f64)) -> Vertex2D>;
299
300 fn vertices(&self) -> Self::Vertices {
301 self.iter().map(|p| (*p).into())
302 }
303
304 fn vertex_count(&self) -> usize {
305 self.len()
306 }
307}