63 lines
2.0 KiB
Crystal
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
|