limelight_primitives/rect/
mod.rs

1use anyhow::Result;
2use limelight::{
3    attribute,
4    renderer::Drawable,
5    state::{
6        blending::{BlendFunction, BlendingFactorDest, BlendingFactorSrc},
7        StateDescriptor,
8    },
9    Buffer, BufferUsageHint, DrawMode, DummyBuffer, Program, Uniform,
10};
11
12use crate::color::Color;
13
14#[attribute]
15pub struct Rect {
16    pub upper_left: [f32; 2],
17    pub lower_right: [f32; 2],
18    pub color: Color,
19}
20
21pub struct RectLayer {
22    rects: Buffer<Rect>,
23    program: Program<(), Rect>,
24    transform: Uniform<[[f32; 4]; 4]>
25}
26
27impl RectLayer {
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        RectLayer {
49            rects: 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<Rect> {
60        self.rects.clone()
61    }
62}
63
64impl Drawable for RectLayer {
65    fn draw(&mut self, renderer: &mut limelight::Renderer) -> Result<()> {
66        renderer.render_instanced(&mut self.program, &DummyBuffer::new(4), &self.rects)?;
67
68        Ok(())
69    }
70}