65 lines
2.6 KiB
GDScript
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
|