init commit
This commit is contained in:
83
addons/nklbdev.importality/import/sprite_sheet.gd
Normal file
83
addons/nklbdev.importality/import/sprite_sheet.gd
Normal file
@@ -0,0 +1,83 @@
|
||||
@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
|
||||
Reference in New Issue
Block a user