56 lines
1.7 KiB
Crystal
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
|