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}