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}