limelight_primitives/line/
mod.rs

1use crate::color::Color;
2use anyhow::Result;
3use limelight::{
4    attribute,
5    renderer::Drawable,
6    state::{
7        blending::{BlendFunction, BlendingFactorDest, BlendingFactorSrc},
8        StateDescriptor,
9    },
10    Buffer, BufferUsageHint, DrawMode, DummyBuffer, Program, Uniform,
11};
12
13#[attribute]
14pub struct Line {
15    pub start: [f32; 2],
16    pub end: [f32; 2],
17    pub width: f32,
18    pub color: Color,
19}
20
21pub struct LineLayer {
22    lines: Buffer<Line>,
23    program: Program<(), Line>,
24    transform: Uniform<[[f32; 4]; 4]>,
25}
26
27impl LineLayer {
28    pub fn new() -> Self {
29        Self::new_transform(Uniform::identity())
30    }
31    
32    pub fn new_transform(transform: Uniform<[[f32; 4]; 4]>) -> Self {
33        let program = Program::new(
34            include_str!("shader.vert"),
35            include_str!("shader.frag"),
36            DrawMode::TriangleStrip,
37        )
38        .with_state(StateDescriptor {
39            blend_func: Some(BlendFunction {
40                source_factor: BlendingFactorSrc::One,
41                dst_factor: BlendingFactorDest::OneMinusSrcAlpha,
42                ..Default::default()
43            }),
44            ..Default::default()
45        })
46        .with_uniform("u_transform", transform.clone());
47
48        LineLayer {
49            lines: Buffer::new_empty(BufferUsageHint::DynamicDraw),
50            program,
51            transform
52        }
53    }
54
55    pub fn transform(&self) -> Uniform<[[f32; 4]; 4]> {
56        self.transform.clone()
57    }
58
59    pub fn buffer(&self) -> Buffer<Line> {
60        self.lines.clone()
61    }
62}
63
64impl Drawable for LineLayer {
65    fn draw(&mut self, renderer: &mut limelight::Renderer) -> Result<()> {
66        renderer.render_instanced(&mut self.program, &DummyBuffer::new(4), &self.lines)?;
67
68        Ok(())
69    }
70}