|
1 | | -from demosys.resources import shaders |
2 | | -from .base import BaseText |
| 1 | +import numpy |
3 | 2 |
|
| 3 | +import moderngl |
| 4 | +from demosys.opengl import FBO, VAO |
| 5 | +from demosys import resources |
4 | 6 |
|
5 | | -class TextRenderer2D(BaseText): |
| 7 | +from .writer2d import TextWriter2D |
6 | 8 |
|
7 | | - def __init__(self, area, size=0.1, text=""): |
| 9 | + |
| 10 | +def on_load(): |
| 11 | + resources.shaders.get('demosys/text/view_renderer_texture.glsl', create=True) |
| 12 | + |
| 13 | + |
| 14 | +resources.on_load(on_load, priority=100) |
| 15 | + |
| 16 | + |
| 17 | +class TextRenderer2D(TextWriter2D): |
| 18 | + |
| 19 | + def __init__(self, area, text_lines=None, texture_height=64): |
8 | 20 | """ |
9 | 21 | :param area: (x, y) Text area size (number of characters) |
10 | 22 | :param size: Text size |
11 | 23 | :param text: Initial text |
12 | 24 | """ |
13 | | - super().__init__(text) |
14 | | - self.area = area |
15 | | - self.size = size |
16 | | - self._text = text |
| 25 | + self._texture_height = texture_height |
| 26 | + self._texture_width = 0 |
| 27 | + |
| 28 | + self._quad = self._create_vao() |
| 29 | + self._quad_shader = resources.shaders.get('demosys/text/view_renderer_texture.glsl', create=True) |
| 30 | + self._fbo = None |
| 31 | + super().__init__(area, text_lines=text_lines) |
| 32 | + |
| 33 | + def _post_load(self): |
| 34 | + print("TextRenderer2D._post_load") |
| 35 | + super()._post_load() |
| 36 | + self._texture_width = int( |
| 37 | + round(self._meta.char_aspect_wh * self._texture_height * self.area[0] / self.area[1], 0) |
| 38 | + ) |
17 | 39 |
|
18 | | - self.fbo = None |
19 | | - self.vao = None |
20 | | - self.shader = shaders.get('demosys/text/textwriter.glsl', create=True) |
| 40 | + self.aspect_ratio = self._texture_width / self._texture_height |
| 41 | + self._fbo = FBO.create((self._texture_width, self._texture_height)) |
21 | 42 |
|
22 | 43 | @property |
23 | | - def text(self): |
24 | | - return self._text |
| 44 | + def texture(self): |
| 45 | + return self._fbo.color_buffers[0] |
| 46 | + |
| 47 | + def render(self): |
| 48 | + self._fbo.clear() |
| 49 | + with self._fbo: |
| 50 | + super().draw((0.0, 0.0), size=2.0 / self.area[1]) |
| 51 | + |
| 52 | + def draw(self, pos, size=1.0): |
| 53 | + self._fbo.color_buffers[0].use(location=0) |
| 54 | + self._quad_shader.uniform("texture0", 0) |
| 55 | + self._quad_shader.uniform("yscale", self._texture_height / self._texture_width) |
| 56 | + self._quad_shader.uniform("pos", pos) |
| 57 | + self._quad_shader.uniform("size", size) |
| 58 | + self._quad.draw(self._quad_shader) |
25 | 59 |
|
26 | | - @text.setter |
27 | | - def text(self, value): |
28 | | - self._text = value |
| 60 | + def _create_vao(self): |
| 61 | + data = numpy.array([ |
| 62 | + 0.0, -2.0, 0.0, 0.0, 0.0, |
| 63 | + 0.0, 0.0, 0.0, 0.0, 1.0, |
| 64 | + 2.0, 0.0, 0.0, 1.0, 1.0, |
| 65 | + 0.0, -2.0, 0.0, 0.0, 0.0, |
| 66 | + 2.0, 0.0, 0.0, 1.0, 1.0, |
| 67 | + 2.0, -2.0, 0.0, 1.0, 0.0, |
| 68 | + ], dtype=numpy.float32) |
29 | 69 |
|
30 | | - def draw(self): |
31 | | - pass |
| 70 | + vao = VAO("textrenderer", mode=moderngl.TRIANGLES) |
| 71 | + vao.buffer(data, '3f 2f', ['in_position', 'in_uv']) |
| 72 | + return vao |
0 commit comments