limelight_primitives/line/
mod.rs1use 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}