mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-26 18:22:09 +02:00
A spot of refactoring
This commit is contained in:
@@ -6,7 +6,7 @@ import glfw
|
|||||||
import OpenGL.GL as gl
|
import OpenGL.GL as gl
|
||||||
import sys
|
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
|
from kitty.fonts import set_font_family, cell_size
|
||||||
|
|
||||||
textured_shaders = (
|
textured_shaders = (
|
||||||
@@ -52,13 +52,34 @@ def gl_get_unicode(k):
|
|||||||
return ans
|
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:
|
class Renderer:
|
||||||
|
|
||||||
def __init__(self, w, h):
|
def __init__(self, w, h):
|
||||||
self.w, self.h = w, h
|
self.w, self.h = w, h
|
||||||
self.program = ShaderProgram(*textured_shaders)
|
self.program = ShaderProgram(*textured_shaders)
|
||||||
|
self.sprites = Sprites()
|
||||||
chars = '0123456789'
|
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.sprite_map = {i: v for i, v in enumerate(sprite_vecs)}
|
||||||
self.do_layout()
|
self.do_layout()
|
||||||
|
|
||||||
@@ -70,24 +91,12 @@ class Renderer:
|
|||||||
def do_layout(self):
|
def do_layout(self):
|
||||||
# Divide into cells
|
# Divide into cells
|
||||||
cell_width, cell_height = cell_size()
|
cell_width, cell_height = cell_size()
|
||||||
xnum = self.w // cell_width
|
vertices, xnum, ynum = calculate_vertices(cell_width, cell_height, self.w, self.h)[:3]
|
||||||
ynum = self.h // cell_height
|
|
||||||
vertices = (gl.GLfloat * (xnum * ynum * 12))()
|
|
||||||
uv = (gl.GLfloat * (xnum * ynum * 18))()
|
uv = (gl.GLfloat * (xnum * ynum * 18))()
|
||||||
num = 0
|
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):
|
for r in range(ynum):
|
||||||
aoff = r * xnum * 12
|
|
||||||
uoff = r * xnum * 18
|
uoff = r * xnum * 18
|
||||||
top = ystart - r * dy
|
|
||||||
for c in range(xnum):
|
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]
|
sprite_pos = self.sprite_map[num % 10]
|
||||||
off = uoff + c * 18
|
off = uoff + c * 18
|
||||||
uv[off:off + 18] = rectangle_uv(*sprite_pos)
|
uv[off:off + 18] = rectangle_uv(*sprite_pos)
|
||||||
@@ -98,7 +107,9 @@ class Renderer:
|
|||||||
self.num_vertices = len(vertices) // 2
|
self.num_vertices = len(vertices) // 2
|
||||||
|
|
||||||
def render(self):
|
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)
|
gl.glDrawArrays(gl.GL_TRIANGLES, 0, self.num_vertices)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -140,7 +140,6 @@ class ShaderProgram:
|
|||||||
gl.glDeleteShader(frag_id)
|
gl.glDeleteShader(frag_id)
|
||||||
self.vao_id = gl.glGenVertexArrays(1)
|
self.vao_id = gl.glGenVertexArrays(1)
|
||||||
self.attribute_buffers = {}
|
self.attribute_buffers = {}
|
||||||
self.sprites = Sprites()
|
|
||||||
|
|
||||||
def __hash__(self) -> int:
|
def __hash__(self) -> int:
|
||||||
return self.program_id
|
return self.program_id
|
||||||
@@ -179,15 +178,11 @@ class ShaderProgram:
|
|||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
gl.glUseProgram(self.program_id)
|
gl.glUseProgram(self.program_id)
|
||||||
gl.glBindVertexArray(self.vao_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
|
self.is_active = True
|
||||||
|
|
||||||
def __exit__(self, *args):
|
def __exit__(self, *args):
|
||||||
gl.glBindVertexArray(0)
|
gl.glBindVertexArray(0)
|
||||||
gl.glUseProgram(0)
|
gl.glUseProgram(0)
|
||||||
self.sprites.__exit__(*args)
|
|
||||||
self.is_active = False
|
self.is_active = False
|
||||||
|
|
||||||
def set_attribute_data(self, attribute_name, data, items_per_attribute_value=2, divisor=None, normalize=False):
|
def set_attribute_data(self, attribute_name, data, items_per_attribute_value=2, divisor=None, normalize=False):
|
||||||
|
|||||||
Reference in New Issue
Block a user