145 lines
4.4 KiB
GDScript3
145 lines
4.4 KiB
GDScript3
|
extends Panel
|
||
|
|
||
|
var config_path = "res://config/animation/frames_config.json"
|
||
|
|
||
|
@export var scan_path = "res://asset/art/characters/"
|
||
|
|
||
|
@onready var config_edit := %ConfigEdit
|
||
|
@onready var save_btn := %SaveButton
|
||
|
@onready var exec_btn := %ExecButton
|
||
|
@onready var frames_display_grid := %FramesDisplayGrid
|
||
|
|
||
|
# 0.png
|
||
|
# 12.png
|
||
|
# 11.png.import
|
||
|
# 31 - 副本.png.import
|
||
|
var regex = RegEx.create_from_string("^.*(\\d+)\\.png$")
|
||
|
# {
|
||
|
# "dirs": {},
|
||
|
# "mapping": {},
|
||
|
# }
|
||
|
var original_config: JSON
|
||
|
|
||
|
var displayer = preload("res://config/animation/frames_display_card.tscn")
|
||
|
|
||
|
|
||
|
func _update_display():
|
||
|
config_edit.set_text(JSON.stringify(original_config.data, " "))
|
||
|
|
||
|
|
||
|
func _ready() -> void:
|
||
|
# remove cache and reload config
|
||
|
original_config = ResourceLoader.load(
|
||
|
config_path, "JSON", ResourceLoader.CacheMode.CACHE_MODE_IGNORE
|
||
|
)
|
||
|
original_config.resource_path = config_path
|
||
|
_validate_json()
|
||
|
# scan files
|
||
|
_scan()
|
||
|
_display_cards()
|
||
|
ResourceSaver.save(original_config)
|
||
|
ResourceUtils.remove_editor_cache("frames_config")
|
||
|
_update_display()
|
||
|
|
||
|
|
||
|
func _validate_json():
|
||
|
# first_frame_mapping
|
||
|
if !original_config.data.has("first_frame_mapping"):
|
||
|
original_config.data["first_frame_mapping"] = {}
|
||
|
# mirror_mapping
|
||
|
if !original_config.data.has("mirror_mapping"):
|
||
|
original_config.data["mirror_mapping"] = {}
|
||
|
if !original_config.data.has("dirs"):
|
||
|
original_config.data["dirs"] = {}
|
||
|
if !original_config.data.has("mapping"):
|
||
|
original_config.data["mapping"] = {}
|
||
|
if !original_config.data.has("frames_per_second"):
|
||
|
original_config.data["frames_per_second"] = {}
|
||
|
|
||
|
|
||
|
func _scan():
|
||
|
var dir = DirAccess.open(scan_path)
|
||
|
if !dir:
|
||
|
printerr("Failed to open directory:", scan_path)
|
||
|
return
|
||
|
var dirs = {}
|
||
|
for sub_dir in dir.get_directories():
|
||
|
var sub_path = scan_path + sub_dir
|
||
|
var frames = _scan_subdir_frames(sub_path)
|
||
|
if frames.size() > 0:
|
||
|
print("Found frames in:", sub_dir)
|
||
|
# Add to the config
|
||
|
var ids = frames.keys()
|
||
|
ids.sort_custom(func(a, b): return int(a) < int(b))
|
||
|
dirs[sub_dir] = {
|
||
|
"path": sub_path,
|
||
|
"frames": frames,
|
||
|
"ids": ids,
|
||
|
}
|
||
|
else:
|
||
|
print("No frames found in:", sub_dir)
|
||
|
original_config.data["dirs"] = dirs
|
||
|
|
||
|
|
||
|
func _scan_subdir_frames(path: String) -> Dictionary:
|
||
|
var subdir = DirAccess.open(path)
|
||
|
if !subdir:
|
||
|
printerr("Failed to open subdir:", path)
|
||
|
return {}
|
||
|
var frames := {}
|
||
|
# print(path, subdir.get_files())
|
||
|
for file in subdir.get_files():
|
||
|
var regex_match := regex.search(file) as RegExMatch
|
||
|
# print('file:', file,' regex:', regex_match)
|
||
|
if regex_match:
|
||
|
var frame_id = int(regex_match.get_string(1))
|
||
|
frames[str(frame_id)] = path + "/" + file
|
||
|
return frames
|
||
|
|
||
|
|
||
|
func _display_cards():
|
||
|
# clear frames_display_grid
|
||
|
for child in frames_display_grid.get_children():
|
||
|
child.queue_free()
|
||
|
# add cards
|
||
|
var mapping = {}
|
||
|
var frames_per_second = {}
|
||
|
var mirror_mapping = {}
|
||
|
var first_frame_mapping = {}
|
||
|
for frames_name in original_config.data.dirs.keys():
|
||
|
var card = displayer.instantiate()
|
||
|
card.frames_config = original_config
|
||
|
card.frame_dir_name = frames_name
|
||
|
#mapping[frames_name] = original_config.data['mapping'][frames_name]
|
||
|
#frames_per_second[frames_name] = original_config.data['frames_per_second'][frames_name]
|
||
|
if original_config.data["mapping"].has(frames_name):
|
||
|
mapping[frames_name] = original_config.data["mapping"][frames_name]
|
||
|
else:
|
||
|
mapping[frames_name] = frames_name
|
||
|
# frames_per_second
|
||
|
if original_config.data["frames_per_second"].has(frames_name):
|
||
|
frames_per_second[frames_name] = original_config.data["frames_per_second"][frames_name]
|
||
|
else:
|
||
|
frames_per_second[frames_name] = 6
|
||
|
# mirror_mapping
|
||
|
if original_config.data["mirror_mapping"].has(frames_name):
|
||
|
mirror_mapping[frames_name] = original_config.data["mirror_mapping"][frames_name]
|
||
|
else:
|
||
|
mirror_mapping[frames_name] = ""
|
||
|
# first_frame_mapping
|
||
|
if original_config.data["first_frame_mapping"].has(frames_name):
|
||
|
first_frame_mapping[frames_name] = (
|
||
|
original_config.data["first_frame_mapping"][frames_name]
|
||
|
)
|
||
|
else:
|
||
|
first_frame_mapping[frames_name] = ""
|
||
|
card.mapping_name = mapping[frames_name]
|
||
|
card.frames_per_sec = frames_per_second[frames_name]
|
||
|
card.mirror_mapping = mirror_mapping[frames_name]
|
||
|
card.first_frame_mapping = first_frame_mapping[frames_name]
|
||
|
frames_display_grid.add_child(card)
|
||
|
original_config.data.mapping = mapping
|
||
|
original_config.data.frames_per_second = frames_per_second
|
||
|
original_config.data.mirror_mapping = mirror_mapping
|
||
|
original_config.data.first_frame_mapping = first_frame_mapping
|