geng_draw2d/
segment.rs

1use super::*;
2
3pub struct Segment {
4    pub transform: mat3<f32>,
5    pub vertices: Vec<ColoredVertex>,
6}
7
8impl Segment {
9    pub fn new(segment: batbox_lapp::Segment<f32>, width: f32, color: Rgba<f32>) -> Self {
10        Self::new_gradient(
11            ColoredVertex {
12                a_pos: segment.0,
13                a_color: color,
14            },
15            ColoredVertex {
16                a_pos: segment.1,
17                a_color: color,
18            },
19            width,
20        )
21    }
22
23    pub fn new_gradient(start: ColoredVertex, end: ColoredVertex, width: f32) -> Self {
24        let half_width = width / 2.0;
25        let mut vertices = Vec::with_capacity(4);
26        let normal = (end.a_pos - start.a_pos).normalize_or_zero().rotate_90();
27        vertices.push(ColoredVertex {
28            a_pos: start.a_pos - normal * half_width,
29            a_color: start.a_color,
30        });
31        vertices.push(ColoredVertex {
32            a_pos: start.a_pos + normal * half_width,
33            a_color: start.a_color,
34        });
35        vertices.push(ColoredVertex {
36            a_pos: end.a_pos + normal * half_width,
37            a_color: end.a_color,
38        });
39        vertices.push(ColoredVertex {
40            a_pos: end.a_pos - normal * half_width,
41            a_color: end.a_color,
42        });
43        let (transform, vertices) = Polygon::normalize(vertices);
44        Self {
45            transform,
46            vertices,
47        }
48    }
49}
50
51impl Transform2d<f32> for Segment {
52    fn bounding_quad(&self) -> batbox_lapp::Quad<f32> {
53        batbox_lapp::Quad {
54            transform: self.transform,
55        }
56    }
57
58    fn apply_transform(&mut self, transform: mat3<f32>) {
59        self.transform = transform * self.transform;
60    }
61}
62
63impl Draw2d for Segment {
64    fn draw2d_transformed(
65        &self,
66        helper: &Helper,
67        framebuffer: &mut ugli::Framebuffer,
68        camera: &dyn AbstractCamera2d,
69        transform: mat3<f32>,
70    ) {
71        let framebuffer_size = framebuffer.size();
72        ugli::draw(
73            framebuffer,
74            &helper.color_program,
75            ugli::DrawMode::TriangleFan,
76            &ugli::VertexBuffer::new_dynamic(helper.ugli(), self.vertices.clone()),
77            (
78                ugli::uniforms! {
79                    u_color: Rgba::WHITE,
80                    u_framebuffer_size: framebuffer_size,
81                    u_model_matrix: transform * self.transform,
82                },
83                camera.uniforms(framebuffer_size.map(|x| x as f32)),
84            ),
85            ugli::DrawParameters {
86                blend_mode: Some(ugli::BlendMode::straight_alpha()),
87                ..Default::default()
88            },
89        );
90    }
91}