Skip to content

Commit fa87d73

Browse files
committed
Improve textwriter
1 parent fd18197 commit fa87d73

File tree

5 files changed

+118
-15
lines changed

5 files changed

+118
-15
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#version 330
2+
3+
#if defined VERTEX_SHADER
4+
5+
in vec3 in_position;
6+
in uint in_char_id;
7+
8+
uniform vec2 char_size;
9+
10+
out uint vs_char_id;
11+
12+
void main() {
13+
gl_Position = vec4(in_position + vec3(gl_InstanceID * char_size.x, 0.0, 0.0), 1.0);
14+
vs_char_id = in_char_id;
15+
}
16+
17+
#elif defined GEOMETRY_SHADER
18+
19+
layout (points) in;
20+
layout (triangle_strip, max_vertices = 4) out;
21+
22+
uniform mat4 m_proj;
23+
uniform vec2 text_pos;
24+
uniform vec2 char_size;
25+
26+
in uint vs_char_id[1];
27+
out vec2 uv;
28+
flat out uint gs_char_id;
29+
30+
void main() {
31+
vec3 pos = gl_in[0].gl_Position.xyz + vec3(text_pos, 0.0);
32+
33+
vec3 right = vec3(1.0, 0.0, 0.0) * char_size.x / 2.0;
34+
vec3 up = vec3(0.0, 1.0, 0.0) * char_size.y / 2.0;
35+
36+
// upper right
37+
uv = vec2(1.0, 1.0);
38+
gs_char_id = vs_char_id[0];
39+
gl_Position = m_proj * vec4(pos + (right + up), 1.0);
40+
EmitVertex();
41+
42+
// upper left
43+
uv = vec2(0.0, 1.0);
44+
gs_char_id = vs_char_id[0];
45+
gl_Position = m_proj * vec4(pos + (-right + up), 1.0);
46+
EmitVertex();
47+
48+
// lower right
49+
uv = vec2(1.0, 0.0);
50+
gs_char_id = vs_char_id[0];
51+
gl_Position = m_proj * vec4(pos + (right - up), 1.0);
52+
EmitVertex();
53+
54+
// lower left
55+
uv = vec2(0.0, 0.0);
56+
gs_char_id = vs_char_id[0];
57+
gl_Position = m_proj * vec4(pos + (-right - up), 1.0);
58+
EmitVertex();
59+
60+
EndPrimitive();
61+
}
62+
63+
#elif defined FRAGMENT_SHADER
64+
65+
out vec4 fragColor;
66+
uniform sampler2DArray font_texture;
67+
in vec2 uv;
68+
flat in uint gs_char_id;
69+
70+
void main()
71+
{
72+
fragColor = texture(font_texture, vec3(uv, gs_char_id));
73+
}
74+
#endif

demosys/text/resources/shaders/demosys/text/textwriter.glsl renamed to demosys/text/resources/shaders/demosys/text/textwriter3d.glsl

File renamed without changes.

demosys/text/writer2d.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
11
import numpy
2+
23
import moderngl
3-
from demosys.opengl import VAO
4+
from demosys.opengl import VAO, TextureArray
45
from demosys.resources import data, shaders, textures
5-
from demosys.opengl import TextureArray
6+
from pyrr import matrix44
67

78
from .base import BaseText, Meta
89

910

1011
class TextWriter2D(BaseText):
1112

12-
def __init__(self, area, size=0.1, text=""):
13+
def __init__(self, area, text="", aspect_ratio=1.0):
1314
"""
1415
:param area: (x, y) Text area size (number of characters)
1516
:param size: Text size
1617
:param text: Initial text
1718
"""
1819
super().__init__()
1920
self.area = area
20-
self.size = size
2121
self._text = text.encode('latin1')
2222

23+
self.projection_bytes = None
24+
self._aspect_ratio = 1.0
25+
self.aspect_ratio = aspect_ratio
26+
2327
self._vao = None
2428
self._texture = textures.get('demosys/text/VeraMono.png', cls=TextureArray, layers=190, create=True)
25-
self._shader = shaders.get('demosys/text/textwriter.glsl', create=True)
29+
self._shader = shaders.get('demosys/text/textwriter2d.glsl', create=True)
2630
self._config = data.get('demosys/text/meta.json', create=True)
2731

2832
data.on_loaded(self._post_load)
@@ -49,11 +53,36 @@ def text(self):
4953
def text(self, value):
5054
self._text = value
5155

52-
def draw(self, proj_matrix, view_matrix):
53-
# print(self._text, self._string_data)
56+
@property
57+
def aspect_ratio(self):
58+
return self._aspect_ratio
59+
60+
@aspect_ratio.setter
61+
def aspect_ratio(self, value):
62+
self._aspect_ratio = value
63+
self.projection_bytes = matrix44.create_orthogonal_projection_matrix(
64+
-self.aspect_ratio, # left
65+
self.aspect_ratio, # right
66+
-1.0, # bottom
67+
1.0, # top
68+
-100.0, # near
69+
100.0, # far
70+
dtype=numpy.float32,
71+
).tobytes()
72+
73+
def draw(self, pos, size=1.0):
74+
csize = (
75+
self._meta.character_width / self._meta.character_height * size,
76+
1.0 * size,
77+
)
78+
cpos = (
79+
pos[0] - self._aspect_ratio + csize[0] / 2,
80+
-pos[1] + 1.0 - csize[1] / 2,
81+
)
82+
5483
self._texture.use(location=0)
55-
self._shader.uniform("m_proj", proj_matrix.astype('f4').tobytes())
56-
self._shader.uniform("m_mv", view_matrix.astype('f4').tobytes())
84+
self._shader.uniform("m_proj", self.projection_bytes)
85+
self._shader.uniform("text_pos", cpos)
5786
self._shader.uniform("font_texture", 0)
58-
self._shader.uniform("char_size", (self._meta.character_width / self._meta.character_height, 1.0))
87+
self._shader.uniform("char_size", csize)
5988
self._vao.draw(self._shader, instances=len(self._string_data))

examples/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"aspect_ratio": 1.7777777777777777,
1515
"fullscreen": False,
1616
"resizable": True,
17-
"title": "demosys-py",
17+
"title": "Examples",
1818
"vsync": True,
1919
"cursor": True,
2020
}

examples/text/effect.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ def __init__(self):
1010
super().__init__()
1111
self.writer = TextWriter2D(
1212
(10, 1),
13-
text="Hello world! Hello world! Hello world!")
13+
aspect_ratio=self.window_aspect,
14+
text="Hello world! Hello world! Hello world!",
15+
)
1416

1517
def post_load(self):
1618
pass
1719

1820
@effect.bind_target
1921
def draw(self, time, frametime, target):
2022
self.ctx.disable(moderngl.CULL_FACE)
21-
m_proj = self.create_projection()
22-
# m_mv = matrix44.create_identity()
2323

24-
self.writer.draw(m_proj, self.sys_camera.view_matrix)
24+
self.writer.draw((0.02, 0.01), size=0.05)

0 commit comments

Comments
 (0)