StreamOverlay/addons/kenny_spritesheet_importer/import_plugin.gd
2026-02-23 18:38:03 -06:00

131 lines
4.1 KiB
GDScript

@tool
extends EditorImportPlugin
enum Presets { DEFAULT }
func _get_importer_name():
return "iseesharp83.kenney.spritesheet.importer"
func _get_visible_name():
return "Kenney Spritesheet"
func _get_recognized_extensions():
return ["png"]
func _get_priority():
return 0.5
func _get_import_order():
return 0
func _get_save_extension():
return "res"
func _get_resource_type():
return "Resource"
func _get_preset_count():
return Presets.size()
func _get_preset_name(preset_index):
match preset_index:
Presets.DEFAULT: return "Default"
func _get_import_options(path, preset_index):
var options := [
{
"name": "spritesheet_xml_file",
"default_value": path.replacen(".png", ".xml"),
"property_hint": PROPERTY_HINT_FILE,
"hint_string": "*.xml"
},
{
"name": "destination_folder",
"default_value": path.get_basename(),
"property_hint": PROPERTY_HINT_DIR
}]
match preset_index:
Presets.DEFAULT:
return options
_:
return []
func _get_option_visibility(path, option_name, options):
return true
func _import(source_file, save_path, options, platform_variants, gen_files):
var atlas = read_kenney_sprite_sheet(options.spritesheet_xml_file)
var folder = options.destination_folder
create_folder(folder)
var full_image = ImageTexture.create_from_image(Image.load_from_file(source_file))
if not full_image:
printerr("Failed to load image file: " + source_file)
return ERR_FILE_NOT_FOUND
create_atlas_textures(folder, full_image, atlas, gen_files)
return ResourceSaver.save(Resource.new(), "%s.%s" % [save_path, _get_save_extension()])
func create_folder(folder):
var dir := DirAccess.open("res://")
if not dir.dir_exists(folder):
if not dir.make_dir_recursive(folder) == OK:
printerr("Failed to create folder: " + folder)
func create_atlas_textures(folder, full_image, atlas, gen_files):
for sprite in atlas.sprites:
if not create_atlas_texture(folder, full_image, sprite, gen_files):
return false
return true
func create_atlas_texture(folder, full_image, sprite, gen_files):
var name = "%s/%s.%s" % [folder, sprite.name.get_basename(), "tres"]
var texture
if ResourceLoader.exists(name, "AtlasTexture"):
texture = ResourceLoader.load(name, "AtlasTexture")
else:
texture = AtlasTexture.new()
texture.atlas = full_image
texture.region = Rect2(sprite.x, sprite.y, sprite.width, sprite.height)
gen_files.push_back(name)
return save_resource(name, texture)
func save_resource(name, texture):
create_folder(name.get_base_dir())
var status = ResourceSaver.save(texture, name)
if status != OK:
printerr("Failed to save resource " + name)
return false
return true
func read_kenney_sprite_sheet(source_file):
var atlas = null
var sprites = []
var parser = XMLParser.new()
if OK == parser.open(source_file):
var read = parser.read()
if read == OK:
atlas = {}
atlas["sprites"] = sprites
while read != ERR_FILE_EOF:
if parser.get_node_type() == XMLParser.NODE_ELEMENT:
var node_name = parser.get_node_name()
match node_name:
"TextureAtlas":
var imagePath = parser.get_named_attribute_value("imagePath")
"SubTexture":
var sprite = {}
sprite['name'] = parser.get_named_attribute_value("name")
sprite['x'] = float(parser.get_named_attribute_value("x"))
sprite['y'] = float(parser.get_named_attribute_value("y"))
sprite['width'] = float(parser.get_named_attribute_value("width"))
sprite['height'] = float(parser.get_named_attribute_value("height"))
sprites.append(sprite)
read = parser.read()
return atlas