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