84 lines
2.7 KiB
GDScript
84 lines
2.7 KiB
GDScript
@tool
|
|
extends "_.gd"
|
|
|
|
const __ANIMATION_MERGE_EQUAL_CONSEQUENT_FRAMES_OPTION: StringName = "animation/merge_equal_sonsequent_frames"
|
|
const __ANIMATION_FLATTEN_REPETITION_OPTION: StringName = "animation/flatten_repetition"
|
|
|
|
func _init() -> void: super("Sprite sheet (JSON)", "JSON", "res", [
|
|
_Options.create_option(__ANIMATION_MERGE_EQUAL_CONSEQUENT_FRAMES_OPTION, true,
|
|
PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT),
|
|
_Options.create_option(__ANIMATION_FLATTEN_REPETITION_OPTION, true,
|
|
PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT),
|
|
])
|
|
|
|
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 unique_indixes_by_sprites: Dictionary
|
|
var unique_sprite_index: int = 0
|
|
var sprites: Array[Dictionary]
|
|
for sprite in sprite_sheet.sprites:
|
|
if not unique_indixes_by_sprites.has(sprite):
|
|
unique_indixes_by_sprites[sprite] = unique_sprite_index
|
|
sprites.push_back({
|
|
region = sprite.region,
|
|
offset = sprite.offset
|
|
})
|
|
unique_sprite_index += 1
|
|
|
|
var flatten_animation_repetition: bool = options[__ANIMATION_FLATTEN_REPETITION_OPTION]
|
|
var merge_equal_consequent_frames: bool = options[__ANIMATION_MERGE_EQUAL_CONSEQUENT_FRAMES_OPTION]
|
|
var animations: Array[Dictionary]
|
|
for animation in animation_library.animations:
|
|
var frames_data: Array[Dictionary]
|
|
var frames: Array[_Common.FrameInfo] = \
|
|
animation.get_flatten_frames() \
|
|
if flatten_animation_repetition else \
|
|
animation.frames
|
|
var previous_sprite_index: int = -1
|
|
for frame in frames:
|
|
var sprite_index: int = unique_indixes_by_sprites[frame.sprite]
|
|
if merge_equal_consequent_frames and sprite_index == previous_sprite_index:
|
|
frames_data.back().duration += frame.duration
|
|
else:
|
|
frames_data.push_back({
|
|
sprite_index = sprite_index,
|
|
duration = frame.duration,
|
|
})
|
|
previous_sprite_index = sprite_index
|
|
animations.push_back({
|
|
name = animation.name,
|
|
direction =
|
|
_Common.AnimationDirection.FORWARD
|
|
if flatten_animation_repetition else
|
|
animation.direction,
|
|
repeat_count =
|
|
mini(1, animation.repeat_count)
|
|
if flatten_animation_repetition else
|
|
animation.repeat_count,
|
|
frames = frames_data,
|
|
})
|
|
|
|
var json: JSON = JSON.new()
|
|
json.data = {
|
|
sprite_sheet = {
|
|
atlas = atlas,
|
|
source_image_size = sprite_sheet.source_image_size,
|
|
sprites = sprites,
|
|
},
|
|
animation_library = {
|
|
animations = animations,
|
|
autoplay_index = animation_library.autoplay_index,
|
|
},
|
|
}
|
|
json.get_parsed_text()
|
|
result.success(json, ResourceSaver.FLAG_COMPRESS)
|
|
return result
|