funfriend/src/text_renderer.cr

56 lines
1.7 KiB
Crystal

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