funfriend/src/text_renderer.cr

63 lines
2.0 KiB
Crystal

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