loki_draw/opengl/
mod.rs

1use glam::{vec2, Vec2};
2
3use crate::drawer::{Drawer, ImageSource, RectBlueprint, TextBlueprint};
4use crate::rect::Rect;
5
6use self::image_renderer::ImageRenderer;
7use self::rect_renderer::RectRenderer;
8use self::text_renderer::TextRenderer;
9
10mod array_buffer;
11mod shader;
12mod texture;
13
14mod image_renderer;
15mod rect_renderer;
16mod text_renderer;
17
18pub struct OpenglDrawer {
19    pub dpi: f32,
20    pub rect: Rect,
21    pub alpha: f32,
22    pub viewport: Vec2,
23    rect_renderer: RectRenderer,
24    text_renderer: TextRenderer,
25    image_renderer: ImageRenderer,
26}
27
28impl OpenglDrawer {
29    pub fn new(width: u32, height: u32, dpi: f32) -> Self {
30        let (width, height) = (width as f32, height as f32);
31
32        Self {
33            dpi,
34            viewport: vec2(width, height),
35            rect: Rect::new(0., 0., width, height),
36            rect_renderer: RectRenderer::new().unwrap(),
37            text_renderer: TextRenderer::new(dpi).unwrap(),
38            image_renderer: ImageRenderer::new().unwrap(),
39            alpha: 1.0,
40        }
41    }
42}
43
44impl Drawer for OpenglDrawer {
45    #[doc(hidden)]
46    fn resize(&mut self, viewport: Vec2, dpi: f32) {
47        self.viewport = viewport;
48        self.rect.w = viewport.x;
49        self.rect.h = viewport.y;
50        self.dpi = dpi;
51
52        unsafe {
53            gl::Viewport(0, 0, viewport.x as i32, viewport.y as i32);
54        }
55    }
56
57    fn begin_frame(&mut self) {
58        self.text_renderer.begin_frame();
59    }
60
61    fn end_frame(&mut self) {
62        self.text_renderer.end_frame();
63    }
64
65    fn clear(&mut self) {
66        unsafe {
67            gl::ClearColor(0., 0., 0., 0.);
68            gl::Clear(gl::COLOR_BUFFER_BIT);
69        }
70    }
71
72    fn draw_rect(&mut self, spec: &RectBlueprint) {
73        self.rect_renderer.draw(self.viewport, spec);
74    }
75
76    fn draw_text(&mut self, spec: &TextBlueprint) {
77        self.text_renderer.draw(self.viewport, self.dpi, spec);
78    }
79
80    fn draw_image(&mut self, rect: &Rect, image: &ImageSource) {
81        self.image_renderer.draw(self.viewport, rect, image);
82    }
83}