limelight_primitives/circle/
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 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}