Source code for yt_idv.scene_annotations.text

import numpy as np
import traitlets
from OpenGL import GL

from yt_idv.scene_annotations.base_annotation import SceneAnnotation
from yt_idv.scene_data.text_characters import TextCharacters

# This is drawn in part from
#  https://learnopengl.com/#!In-Practice/Text-Rendering


[docs]class TextAnnotation(SceneAnnotation): name = "text_annotation" data = traitlets.Instance(TextCharacters) text = traitlets.CUnicode() draw_instructions = traitlets.List() origin = traitlets.Tuple( traitlets.CFloat(), traitlets.CFloat(), default_value=(-1, -1) ) scale = traitlets.CFloat(1.0) @traitlets.observe("text") def _observe_text(self, change): text = change["new"] lines = text.split("\n") draw_instructions = [] y = 0 for line in reversed(lines): x = 0 dy = 0 for c in line: e = self.data.characters[c] draw_instructions.append((x, y, e.texture, e.vbo_offset)) dy = max(dy, e.vert_advance) x += e.hori_advance y += dy self.draw_instructions = draw_instructions def _set_uniforms(self, scene, shader_program): pass
[docs] def draw(self, scene, program): viewport = np.array(GL.glGetIntegerv(GL.GL_VIEWPORT), dtype="f4") program._set_uniform("viewport", viewport) each = self.data.vertex_array.each for x, y, tex, vbo_offset in self.draw_instructions: with tex.bind(0): program._set_uniform("x_offset", float(x)) program._set_uniform("y_offset", float(y)) program._set_uniform("x_origin", self.origin[0]) program._set_uniform("y_origin", self.origin[1]) program._set_uniform("scale", self.scale) GL.glDrawArrays(GL.GL_TRIANGLES, vbo_offset * each, each)