class Funfriend::TextRenderer getter text : String getter sheet : FontMan::BMSheet getter width : Int32 getter height : Int32 getter shader_program : Program getter vertex_array : VertexArray getter vertex_buffer : Buffer getter font_texture : Texture def initialize(text : String, sheet : FontMan::BMSheet, width : Int32, height : Int32) @text = text @sheet = sheet @width = width @height = height @shader_program = init_shaders @vertex_array, @vertex_buffer = init_buffers @font_texture = init_textures end def init_textures TextureMan.load_texture("assets/fonts/SpaceMono.png", { Texture::ParameterName::TextureWrapS => Texture::ParameterValue::ClampToBorder, Texture::ParameterName::TextureWrapT => Texture::ParameterValue::ClampToBorder, Texture::ParameterName::TextureMinFilter => Texture::ParameterValue::Linear, Texture::ParameterName::TextureMagFilter => Texture::ParameterValue::Linear })[:tex] end def init_buffers text_width, text_height = FontMan.text_width(text, sheet), sheet[:common][:line_height] FontMan.get_text_mesh(text, sheet, width // 2 - text_width // 2, height // 2 - text_height // 2, width, height) end def init_shaders vertex_shader_source = FileStorage.get("nop.vert").gets_to_end fragment_shader_source = FileStorage.get("bake_alpha.frag").gets_to_end vertex_shader = VertexShader.create(vertex_shader_source) fragment_shader = FragmentShader.create(fragment_shader_source) shaders = {vertex_shader, fragment_shader} return Program.create(shaders) end def render(dt : Float64) font_texture.bind(Texture::Target::Texture2D) do shader_program.use do |p| p.set_uniform("texture1", 0) vertex_array.bind do LibGL.draw_elements(LibGL::TRIANGLES, 6 * text.size, DataType::UnsignedInt, Pointer(Void).new(0)) end end end end def clean_up {vertex_array, vertex_buffer}.each { |v| v.delete } end end