class Funfriend::TextRenderer getter text : String # TODO: merge into one? getter font : 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, @font : String, @sheet : FontMan::BMSheet, @width : Int32, @height : Int32) @shader_program = init_shaders @vertex_array, @vertex_buffer = init_buffers @font_texture = init_textures end def init_textures TextureMan.load_texture("#{font}.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 GL.shader("nop.frag", "nop.vert") end def render(dt : Float64) LibGL.enable(LibGL::BLEND) LibGL.blend_func(LibGL::SRC_ALPHA, LibGL::ONE_MINUS_SRC_ALPHA) 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