limelight_primitives/circle/
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 Circle {
15    pub position: [f32; 2],
16    pub radius: f32,
17    pub color: Color,
18}
19
20pub struct CircleLayer {
21    circles: Buffer<Circle>,
22    program: Program<(), Circle>,
23    transform: Uniform<[[f32; 4]; 4]>,
24}
25
26impl CircleLayer {
27    pub fn new() -> Self {
28        Self::new_transform(Uniform::identity())
29    }
30    
31    pub fn new_transform(transform: Uniform<[[f32; 4]; 4]>) -> Self {
32        let program = Program::new(
33            include_str!("shader.vert"),
34            include_str!("shader.frag"),
35            DrawMode::TriangleStrip,
36        )
37        .with_state(StateDescriptor {
38            blend_func: Some(BlendFunction {
39                source_factor: BlendingFactorSrc::One,
40                dst_factor: BlendingFactorDest::OneMinusSrcAlpha,
41                ..Default::default()
42            }),
43            ..Default::default()
44        })
45        .with_uniform("u_transform", transform.clone());
46
47        CircleLayer {
48            circles: Buffer::new_empty(BufferUsageHint::DynamicDraw),
49            program,
50            transform,
51        }
52    }
53
54    pub fn buffer(&self) -> Buffer<Circle> {
55        self.circles.clone()
56    }
57
58    pub fn transform(&self) -> Uniform<[[f32; 4]; 4]> {
59        self.transform.clone()
60    }
61}
62
63impl Drawable for CircleLayer {
64    fn draw(&mut self, renderer: &mut limelight::Renderer) -> Result<()> {
65        renderer.render_instanced(&mut self.program, &DummyBuffer::new(4), &self.circles)?;
66
67        Ok(())
68    }
69}