diff --git a/kitty/develop_gl.py b/kitty/develop_gl.py index 21d70ed76..20645efc5 100644 --- a/kitty/develop_gl.py +++ b/kitty/develop_gl.py @@ -6,7 +6,7 @@ import glfw import OpenGL.GL as gl import sys -from kitty.shaders import ShaderProgram, GL_VERSION +from kitty.shaders import ShaderProgram, GL_VERSION, Sprites from kitty.fonts import set_font_family, cell_size textured_shaders = ( @@ -52,13 +52,34 @@ def gl_get_unicode(k): return ans +def calculate_vertices(cell_width, cell_height, screen_width, screen_height): + xnum = screen_width // cell_width + ynum = screen_height // cell_height + vertices = (gl.GLfloat * (xnum * ynum * 12))() + dx, dy = 2 * cell_width / screen_width, 2 * cell_height / screen_height + xmargin = (screen_width - (xnum * cell_width)) / screen_width + ymargin = (screen_height - (ynum * cell_height)) / screen_height + xstart = -1 + xmargin + ystart = 1 - ymargin + vmap = {} + for r in range(ynum): + aoff = r * xnum * 12 + top = ystart - r * dy + for c in range(xnum): + left = xstart + c * dx + off = aoff + c * 12 + vertices[off:off + 12] = vmap[(r, c)] = rectangle_vertices(left=left, top=top, right=left + dx, bottom=top - dy) + return vertices, xnum, ynum, vmap + + class Renderer: def __init__(self, w, h): self.w, self.h = w, h self.program = ShaderProgram(*textured_shaders) + self.sprites = Sprites() chars = '0123456789' - sprite_vecs = (s[0] for s in self.program.sprites.positions_for(((x, False, False) for x in chars))) + sprite_vecs = (s[0] for s in self.sprites.positions_for(((x, False, False) for x in chars))) self.sprite_map = {i: v for i, v in enumerate(sprite_vecs)} self.do_layout() @@ -70,24 +91,12 @@ class Renderer: def do_layout(self): # Divide into cells cell_width, cell_height = cell_size() - xnum = self.w // cell_width - ynum = self.h // cell_height - vertices = (gl.GLfloat * (xnum * ynum * 12))() + vertices, xnum, ynum = calculate_vertices(cell_width, cell_height, self.w, self.h)[:3] uv = (gl.GLfloat * (xnum * ynum * 18))() num = 0 - dx, dy = 2 * cell_width / self.w, 2 * cell_height / self.h - xmargin = (self.w - (xnum * cell_width)) / self.w - ymargin = (self.h - (ynum * cell_height)) / self.h - xstart = -1 + xmargin - ystart = 1 - ymargin for r in range(ynum): - aoff = r * xnum * 12 uoff = r * xnum * 18 - top = ystart - r * dy for c in range(xnum): - left = xstart + c * dx - off = aoff + c * 12 - vertices[off:off + 12] = rectangle_vertices(left=left, top=top, right=left + dx, bottom=top - dy) sprite_pos = self.sprite_map[num % 10] off = uoff + c * 18 uv[off:off + 18] = rectangle_uv(*sprite_pos) @@ -98,7 +107,9 @@ class Renderer: self.num_vertices = len(vertices) // 2 def render(self): - with self.program: + with self.program, self.sprites: + gl.glUniform1i(self.program.uniform_location('sprites'), self.sprites.sampler_num) + gl.glUniform3f(self.program.uniform_location('sprite_scale'), self.sprites.xnum, self.sprites.ynum, 1) gl.glDrawArrays(gl.GL_TRIANGLES, 0, self.num_vertices) diff --git a/kitty/shaders.py b/kitty/shaders.py index 6e6b11625..40e7fc6f0 100644 --- a/kitty/shaders.py +++ b/kitty/shaders.py @@ -140,7 +140,6 @@ class ShaderProgram: gl.glDeleteShader(frag_id) self.vao_id = gl.glGenVertexArrays(1) self.attribute_buffers = {} - self.sprites = Sprites() def __hash__(self) -> int: return self.program_id @@ -179,15 +178,11 @@ class ShaderProgram: def __enter__(self): gl.glUseProgram(self.program_id) gl.glBindVertexArray(self.vao_id) - gl.glUniform1i(self.uniform_location('sprites'), self.sprites.sampler_num) - gl.glUniform3f(self.uniform_location('sprite_scale'), self.sprites.xnum, self.sprites.ynum, 1) - self.sprites.__enter__() self.is_active = True def __exit__(self, *args): gl.glBindVertexArray(0) gl.glUseProgram(0) - self.sprites.__exit__(*args) self.is_active = False def set_attribute_data(self, attribute_name, data, items_per_attribute_value=2, divisor=None, normalize=False):