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}