It’s pretty much the same but each glyph property is its own function now.
Dirty example loading a BMFont xml file:
extends Node
@onready var label: Label = $Label
func _ready() -> void:
var font = FontFile.new()
var font_image = preload("res://assets/bmfont/Unnamed.png").get_image()
var font_size_vector = Vector2i.ZERO
var xml = XMLParser.new()
xml.open("res://assets/bmfont/Unnamed.xml")
while xml.read() != ERR_FILE_EOF:
if xml.get_node_name() == "info":
for i in xml.get_attribute_count():
var attr = xml.get_attribute_name(i)
if attr == "size":
font_size_vector.x = int(xml.get_attribute_value(i))
if xml.get_node_name() == "char":
var uvs = Rect2i()
var advance: int
var offset = Vector2i.ZERO
var glyph_idx: int
var page: int = 0
for i in xml.get_attribute_count():
var attr = xml.get_attribute_name(i)
var value = int(xml.get_attribute_value(i))
match attr:
"id": glyph_idx = value
"x": uvs.position.x = value
"y": uvs.position.y = value
"width": uvs.size.x = value
"height": uvs.size.y = value
"xoffset": offset.x = value
"yoffset": offset.y = value
"xadvance": advance = value
"page": page = value
font.set_glyph_advance(0, font_size_vector.x, glyph_idx, Vector2(advance, 0))
font.set_glyph_offset(0, font_size_vector, glyph_idx, offset)
font.set_glyph_size(0, font_size_vector, glyph_idx, uvs.size)
font.set_glyph_texture_idx(0, font_size_vector, glyph_idx, page)
font.set_glyph_uv_rect(0, font_size_vector, glyph_idx, uvs)
font.set_texture_image(0, font_size_vector, 0, font_image)
label.add_theme_font_override(&"font", font)
label.add_theme_font_size_override(&"font_size", font_size_vector.x)
label.text = "Hello world"
Yes, the size parameter in these methods isn’t refering to the texture size or the glyph size but to the font size. It’s a Vector2i where x is the font size and y a variant like the outline. You should keep y at 0 in your case. In the example I posted above it’s the font_size_vector variable.