solstice_2d/
d2.rs

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}