solstice_2d/
d3.rs

1mod shapes;
2mod transform;
3
4pub use shapes::*;
5pub use transform::*;
6
7use super::{
8    Color, Command, Draw, DrawList, DrawState, Geometry, GeometryVariants, LineState, LineVertex,
9    Projection,
10};
11use bytemuck::{Pod, Zeroable};
12use solstice::texture::Texture;
13
14#[repr(C)]
15#[derive(Zeroable, Pod, Debug, PartialEq, Copy, Clone, solstice::vertex::Vertex)]
16pub struct Vertex3D {
17    pub position: [f32; 3],
18    pub uv: [f32; 2],
19    pub color: [f32; 4],
20    pub normal: [f32; 3],
21}
22
23impl From<Vec<Vertex3D>> for Geometry<'_, Vertex3D> {
24    fn from(vertices: Vec<Vertex3D>) -> Self {
25        Self::new::<_, Vec<u32>>(vertices, None)
26    }
27}
28
29impl<'a> From<&'a [Vertex3D]> for Geometry<'a, Vertex3D> {
30    fn from(vertices: &'a [Vertex3D]) -> Self {
31        Self::new::<_, Vec<u32>>(vertices, None)
32    }
33}
34
35impl<'a, G> Draw<Vertex3D, G> for DrawList<'a>
36where
37    G: crate::GeometryKind<'a, Vertex3D> + 'a,
38{
39    fn draw(&mut self, geometry: G) {
40        self.push_draw(
41            GeometryVariants::D3(geometry.into()),
42            self.color,
43            self.transform,
44            None,
45        );
46    }
47
48    fn draw_with_transform<TX>(&mut self, geometry: G, transform: TX)
49    where
50        TX: Into<mint::ColumnMatrix4<f32>>,
51    {
52        self.push_draw(
53            GeometryVariants::D3(geometry.into()),
54            self.color,
55            transform.into(),
56            None,
57        );
58    }
59
60    fn draw_with_color<C: Into<Color>>(&mut self, geometry: G, color: C) {
61        self.push_draw(
62            GeometryVariants::D3(geometry.into()),
63            color.into(),
64            self.transform,
65            None,
66        );
67    }
68
69    fn draw_with_color_and_transform<C, TX>(&mut self, geometry: G, color: C, transform: TX)
70    where
71        C: Into<Color>,
72        TX: Into<mint::ColumnMatrix4<f32>>,
73    {
74        self.push_draw(
75            GeometryVariants::D3(geometry.into()),
76            color.into(),
77            transform.into(),
78            None,
79        );
80    }
81
82    fn image<T: Texture>(&mut self, geometry: G, texture: T) {
83        self.push_draw(
84            GeometryVariants::D3(geometry.into()),
85            self.color,
86            self.transform,
87            Some(texture.into()),
88        );
89    }
90
91    fn image_with_color<T, C>(&mut self, geometry: G, texture: T, color: C)
92    where
93        T: Texture,
94        C: Into<Color>,
95    {
96        self.push_draw(
97            GeometryVariants::D3(geometry.into()),
98            color.into(),
99            self.transform,
100            Some(texture.into()),
101        );
102    }
103
104    fn image_with_transform<T, TX>(&mut self, geometry: G, texture: T, transform: TX)
105    where
106        T: Texture,
107        TX: Into<mint::ColumnMatrix4<f32>>,
108    {
109        self.push_draw(
110            GeometryVariants::D3(geometry.into()),
111            self.color,
112            transform.into(),
113            Some(texture.into()),
114        );
115    }
116
117    fn image_with_color_and_transform<T, C, TX>(
118        &mut self,
119        geometry: G,
120        texture: T,
121        color: C,
122        transform: TX,
123    ) where
124        T: Texture,
125        C: Into<Color>,
126        TX: Into<mint::ColumnMatrix4<f32>>,
127    {
128        self.push_draw(
129            GeometryVariants::D3(geometry.into()),
130            color.into(),
131            transform.into(),
132            Some(texture.into()),
133        );
134    }
135}
136impl<'a, G> crate::Stroke<crate::Vertex3D, G> for DrawList<'a>
137where
138    G: Into<Geometry<'a, crate::Vertex3D>>,
139{
140    fn stroke(&mut self, geometry: G) {
141        self.stroke_with_color_and_transform(geometry, self.color, self.transform)
142    }
143
144    fn stroke_with_transform<TX>(&mut self, geometry: G, transform: TX)
145    where
146        TX: Into<mint::ColumnMatrix4<f32>>,
147    {
148        self.stroke_with_color_and_transform(geometry, self.color, transform)
149    }
150
151    fn stroke_with_color<C: Into<Color>>(&mut self, geometry: G, color: C) {
152        self.stroke_with_color_and_transform(geometry, color, self.transform)
153    }
154
155    fn stroke_with_color_and_transform<C, TX>(&mut self, geometry: G, color: C, transform: TX)
156    where
157        C: Into<Color>,
158        TX: Into<mint::ColumnMatrix4<f32>>,
159    {
160        let crate::Geometry { vertices, .. } = geometry.into();
161        self.commands.push(Command::Line(DrawState {
162            data: LineState {
163                geometry: vertices
164                    .iter()
165                    .map(|v: &Vertex3D| LineVertex {
166                        position: v.position,
167                        width: self.line_width,
168                        color: [1., 1., 1., 1.],
169                    })
170                    .collect::<Vec<_>>()
171                    .into(),
172                is_loop: true,
173                depth_buffer: false,
174            },
175            transform: transform.into(),
176            camera: self.camera,
177            projection_mode: self
178                .projection_mode
179                .unwrap_or(Projection::Perspective(None)),
180            color: color.into(),
181            texture: None,
182            target: self.target.clone(),
183            shader: self.shader.clone(),
184        }))
185    }
186}