119 lines
4.2 KiB
GDScript
119 lines
4.2 KiB
GDScript
@tool
|
|
extends Control
|
|
|
|
var _init_hint_label_text := ""
|
|
var _selected_animation_player : AnimationPlayer
|
|
var fps_number_input : EditorSpinSlider
|
|
|
|
func _enter_tree() -> void:
|
|
_init_hint_label_text = $%HintLabel.text
|
|
fps_number_input = _make_number_input("FPS", 60.0, 5.0, 120.0, "fps", 1.0)
|
|
%FpsInputContainer.add_child(fps_number_input)
|
|
|
|
|
|
func _on_export_as_png_button_pressed() -> void:
|
|
var selected_node := EditorInterface.get_selection().get_selected_nodes().pop_back()
|
|
Line2DGeneratorInspectorPlugin._on_export_png_button_pressed(selected_node)
|
|
|
|
|
|
func _on_export_as_baked_scene_button_pressed() -> void:
|
|
var selected_node := EditorInterface.get_selection().get_selected_nodes().pop_back()
|
|
Line2DGeneratorInspectorPlugin._show_exported_scene_dialog(
|
|
selected_node, Line2DGeneratorInspectorPlugin._export_baked_scene
|
|
)
|
|
|
|
|
|
func _on_export_as_3d_scene_button_pressed() -> void:
|
|
var selected_node := EditorInterface.get_selection().get_selected_nodes().pop_back()
|
|
Line2DGeneratorInspectorPlugin._show_exported_scene_dialog(
|
|
selected_node, Line2DGeneratorInspectorPlugin._export_3d_scene
|
|
)
|
|
|
|
|
|
func set_animation_player(animation_player : AnimationPlayer) -> void:
|
|
if not animation_player is AnimationPlayer:
|
|
%HintLabel.text = _init_hint_label_text
|
|
%HintLabel.show()
|
|
%SelectAnimationOptionButton.hide()
|
|
%CreateSpriteSheetButton.hide()
|
|
%FpsInputContainer.hide()
|
|
%ExportAsSpritesheetCheckButton.hide()
|
|
%StatusLabel.hide()
|
|
return
|
|
|
|
_selected_animation_player = animation_player
|
|
%HintLabel.hide()
|
|
%StatusLabel.text = ""
|
|
%SelectAnimationOptionButton.clear()
|
|
%SelectAnimationOptionButton.add_item(" - select animation -")
|
|
%SelectAnimationOptionButton.select(0)
|
|
%SelectAnimationOptionButton.set_item_disabled(0, true)
|
|
for anim_name in animation_player.get_animation_list():
|
|
if anim_name == "RESET":
|
|
continue
|
|
%SelectAnimationOptionButton.add_item(anim_name)
|
|
%SelectAnimationOptionButton.show()
|
|
%CreateSpriteSheetButton.show()
|
|
%FpsInputContainer.show()
|
|
%ExportAsSpritesheetCheckButton.show()
|
|
|
|
|
|
func _on_create_sprite_sheet_button_pressed() -> void:
|
|
if not _selected_animation_player is AnimationPlayer:
|
|
return
|
|
var dialog := EditorFileDialog.new()
|
|
var anim_name : String = %SelectAnimationOptionButton.get_item_text(%SelectAnimationOptionButton.get_selected_id())
|
|
dialog.add_filter("*.png", "PNG")
|
|
dialog.current_file = ("%s_%s" % [
|
|
EditorInterface.get_edited_scene_root().name,
|
|
anim_name
|
|
]).to_snake_case()
|
|
|
|
dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE
|
|
dialog.file_selected.connect(func(path): _on_animation_file_name_chosen(path, anim_name, dialog))
|
|
EditorInterface.get_base_control().add_child(dialog)
|
|
dialog.popup_centered(Vector2i(800, 400))
|
|
|
|
|
|
func _on_animation_file_name_chosen(file_path : String, anim_name : String, dialog : EditorFileDialog):
|
|
dialog.queue_free()
|
|
var fps := fps_number_input.value
|
|
%StatusLabel.show()
|
|
%CreateSpriteSheetButton.disabled = true
|
|
%CreateSpriteSheetButton.text = "Creating..."
|
|
|
|
var sprite_frames := await SVSSceneExporter.export_sprite_frames(
|
|
EditorInterface.get_edited_scene_root(), _selected_animation_player, anim_name, fps,
|
|
EditorInterface.get_base_control(), func(status_msg : String): %StatusLabel.text = status_msg
|
|
)
|
|
|
|
if %ExportAsSpritesheetCheckButton.button_pressed:
|
|
var im : Image = Image.create_empty(
|
|
sprite_frames[0].get_size().x * sprite_frames.size(),
|
|
sprite_frames[0].get_size().y, false, sprite_frames[0].get_format())
|
|
for idx in sprite_frames.size():
|
|
im.blit_rect(sprite_frames[idx],
|
|
Rect2i(Vector2i.ZERO, sprite_frames[idx].get_size()),
|
|
Vector2i(sprite_frames[0].get_size().x * idx, 0)
|
|
)
|
|
im.save_png(file_path)
|
|
else:
|
|
for idx in sprite_frames.size():
|
|
sprite_frames[idx].save_png(file_path.replacen(".png", "_%d.png" % idx))
|
|
|
|
%StatusLabel.text = "Exported %d frames" % sprite_frames.size()
|
|
%CreateSpriteSheetButton.disabled = false
|
|
%CreateSpriteSheetButton.text = "Create"
|
|
EditorInterface.get_resource_filesystem().scan()
|
|
|
|
|
|
func _make_number_input(lbl : String, value : float, min_value : float, max_value : float, suffix : String, step := 1.0) -> EditorSpinSlider:
|
|
var x_slider := EditorSpinSlider.new()
|
|
x_slider.value = value
|
|
x_slider.min_value = min_value
|
|
x_slider.max_value = max_value
|
|
x_slider.suffix = suffix
|
|
x_slider.label = lbl
|
|
x_slider.step = step
|
|
return x_slider
|