Handle cell size changing in the sprites class
This commit is contained in:
parent
9fa882b329
commit
93872f8319
@ -167,6 +167,7 @@ class CharGrid:
|
||||
self.original_bg = opts.background
|
||||
self.original_fg = opts.foreground
|
||||
self.cell_width, self.cell_height = set_font_family(opts.font_family, opts.font_size)
|
||||
self.sprites.do_layout(self.cell_width, self.cell_height)
|
||||
self.do_layout(self.width, self.height)
|
||||
|
||||
def resize_screen(self, w, h):
|
||||
@ -264,16 +265,17 @@ class CharGrid:
|
||||
|
||||
def render(self):
|
||||
' This is the only method in this class called in the UI thread (apart from __init__) '
|
||||
cell_data_changed = self.get_all_render_changes()
|
||||
if cell_data_changed:
|
||||
self.update_sprite_map()
|
||||
data = self.last_render_data
|
||||
|
||||
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
|
||||
if data.screen_geometry is None:
|
||||
return
|
||||
sg = data.screen_geometry
|
||||
self.render_cells(sg, data.sprite_layout)
|
||||
cell_data_changed = self.get_all_render_changes()
|
||||
with self.sprites:
|
||||
if cell_data_changed:
|
||||
self.update_sprite_map()
|
||||
data = self.last_render_data
|
||||
|
||||
if data.screen_geometry is None:
|
||||
return
|
||||
sg = data.screen_geometry
|
||||
self.render_cells(sg, data.sprite_layout)
|
||||
if not data.cursor.hidden:
|
||||
self.render_cursor(sg, data.cursor)
|
||||
|
||||
@ -311,8 +313,7 @@ class CharGrid:
|
||||
gl.glUniform1i(ul('sprites'), self.sprites.sampler_num)
|
||||
gl.glUniform1i(ul('sprite_map'), self.sprites.buffer_sampler_num)
|
||||
gl.glUniform2f(ul('sprite_layout'), *sprite_layout)
|
||||
with self.sprites:
|
||||
gl.glDrawArraysInstanced(gl.GL_TRIANGLE_FAN, 0, 4, sg.xnum * sg.ynum)
|
||||
gl.glDrawArraysInstanced(gl.GL_TRIANGLE_FAN, 0, 4, sg.xnum * sg.ynum)
|
||||
|
||||
def render_cursor(self, sg, cursor):
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ import OpenGL.GL as gl
|
||||
from OpenGL.GL.ARB.copy_image import glCopyImageSubData # only present in opengl core >= 4.3
|
||||
from OpenGL.GL.ARB.texture_storage import glTexStorage3D # only present in opengl core >= 4.2
|
||||
|
||||
from .fonts import render_cell, cell_size
|
||||
from .fonts import render_cell
|
||||
from .data_types import ITALIC_MASK, BOLD_MASK
|
||||
|
||||
GL_VERSION = (3, 3)
|
||||
@ -50,14 +50,22 @@ class Sprites:
|
||||
self.texture_id = self.buffer_id = self.buffer_texture_id = None
|
||||
self.last_num_of_layers = 1
|
||||
|
||||
def do_layout(self):
|
||||
def initialize(self):
|
||||
self.texture_unit = getattr(gl, 'GL_TEXTURE%d' % self.sampler_num)
|
||||
self.max_array_len = gl.glGetIntegerv(gl.GL_MAX_ARRAY_TEXTURE_LAYERS)
|
||||
self.max_texture_size = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE)
|
||||
self.cell_width, self.cell_height = cell_size()
|
||||
self.do_layout(getattr(self, 'cell_width', 1), getattr(self, 'cell_height', 1))
|
||||
|
||||
def do_layout(self, cell_width=1, cell_height=1):
|
||||
self.cell_width, self.cell_height = cell_width or 1, cell_height or 1
|
||||
self.first_cell_cache = {}
|
||||
self.second_cell_cache = {}
|
||||
self.xnum = max(1, self.max_texture_size // self.cell_width)
|
||||
self.max_y = max(1, self.max_texture_size // self.cell_height)
|
||||
self.ynum = 1
|
||||
if self.texture_id is not None:
|
||||
gl.glDeleteTextures([self.texture_id])
|
||||
self.texture_id = None
|
||||
|
||||
@property
|
||||
def layout(self):
|
||||
@ -65,7 +73,7 @@ class Sprites:
|
||||
|
||||
def realloc_texture(self):
|
||||
if self.texture_id is None:
|
||||
self.do_layout()
|
||||
self.initialize()
|
||||
tgt = gl.GL_TEXTURE_2D_ARRAY
|
||||
tex = gl.glGenTextures(1)
|
||||
gl.glBindTexture(tgt, tex)
|
||||
@ -87,13 +95,14 @@ class Sprites:
|
||||
self.texture_id = tex
|
||||
gl.glBindTexture(tgt, 0)
|
||||
|
||||
def add_sprite(self, buf):
|
||||
def ensure_state(self):
|
||||
if self.texture_id is None:
|
||||
self.realloc_texture()
|
||||
if self.buffer_id is None:
|
||||
self.buffer_id = gl.glGenBuffers(1)
|
||||
self.buffer_texture_id = gl.glGenTextures(1)
|
||||
self.buffer_texture_unit = getattr(gl, 'GL_TEXTURE%d' % self.buffer_sampler_num)
|
||||
|
||||
def add_sprite(self, buf):
|
||||
tgt = gl.GL_TEXTURE_2D_ARRAY
|
||||
gl.glBindTexture(tgt, self.texture_id)
|
||||
gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1)
|
||||
@ -146,6 +155,7 @@ class Sprites:
|
||||
return ans
|
||||
|
||||
def __enter__(self):
|
||||
self.ensure_state()
|
||||
gl.glActiveTexture(self.texture_unit)
|
||||
gl.glBindTexture(gl.GL_TEXTURE_2D_ARRAY, self.texture_id)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user