Files
EphemeralEchoes/addons/nklbdev.importality/import/sprite_frames.gd
2025-04-26 10:41:46 -05:00

65 lines
2.6 KiB
GDScript

@tool
extends "_.gd"
func _init() -> void: super("SpriteFrames", "SpriteFrames", "res")
func import(
res_source_file_path: String,
atlas: Texture2D,
sprite_sheet: _Common.SpriteSheetInfo,
animation_library: _Common.AnimationLibraryInfo,
options: Dictionary,
save_path: String
) -> ImportResult:
var result: ImportResult = ImportResult.new()
var sprite_frames: SpriteFrames = SpriteFrames.new()
for animation_name in sprite_frames.get_animation_names():
sprite_frames.remove_animation(animation_name)
var filter_clip_enabled: bool = options[_Options.ATLAS_TEXTURES_REGION_FILTER_CLIP_ENABLED]
var atlas_textures: Array[AtlasTexture]
var empty_atlas_texture: AtlasTexture
for animation in animation_library.animations:
sprite_frames.add_animation(animation.name)
sprite_frames.set_animation_loop(animation.name, animation.repeat_count == 0)
sprite_frames.set_animation_speed(animation.name, 1)
var previous_texture: Texture2D
for frame in animation.get_flatten_frames():
var atlas_texture: AtlasTexture
if frame.sprite.region.has_area():
var region: Rect2 = frame.sprite.region
var margin: Rect2 = Rect2(
frame.sprite.offset,
sprite_sheet.source_image_size - frame.sprite.region.size)
var equivalent_atlas_textures: Array = atlas_textures.filter(
func(t: AtlasTexture) -> bool: return t.margin == margin and t.region == region)
if not equivalent_atlas_textures.is_empty():
atlas_texture = equivalent_atlas_textures.front()
if atlas_texture == null:
atlas_texture = AtlasTexture.new()
atlas_texture.filter_clip = filter_clip_enabled
atlas_texture.atlas = atlas
atlas_texture.region = region
atlas_texture.margin = margin
atlas_textures.push_back(atlas_texture)
else:
if empty_atlas_texture == null:
empty_atlas_texture = AtlasTexture.new()
empty_atlas_texture.filter_clip = filter_clip_enabled
empty_atlas_texture.atlas = atlas
empty_atlas_texture.region = Rect2(0, 0, 1, 1)
empty_atlas_texture.margin = Rect2(2, 2, 0, 0)
atlas_texture = empty_atlas_texture
if atlas_texture == previous_texture:
var last_frame_index: int = sprite_frames.get_frame_count(animation.name) - 1
sprite_frames.set_frame(animation.name, last_frame_index, atlas_texture,
sprite_frames.get_frame_duration(animation.name, last_frame_index) + frame.duration)
continue
sprite_frames.add_frame(animation.name, atlas_texture, frame.duration)
previous_texture = atlas_texture
result.success(sprite_frames,
ResourceSaver.FLAG_COMPRESS | ResourceSaver.FLAG_BUNDLE_RESOURCES)
return result