gif importer 插件与导入工具

This commit is contained in:
cakipaul 2025-01-17 23:43:36 +08:00
parent d41940b19a
commit dd977bc946
14 changed files with 174 additions and 38 deletions

View File

@ -0,0 +1,74 @@
# Derived from https://github.com/jegor377/godot-gdgifexporter
@tool
extends EditorImportPlugin
func _can_import_threaded():
return false
func _get_priority():
return 100
func _get_import_order():
# 数字越小越提前
return ResourceImporter.IMPORT_ORDER_DEFAULT - 100
func _get_importer_name():
return "gif.animated.texture.plugin"
func _get_visible_name():
return "Sprite Frames (Thread Safe)"
func _get_recognized_extensions():
return ["gif"]
func _get_save_extension():
return "tres"
func _get_resource_type():
return "SpriteFrames"
func _get_preset_count():
return 0
func _get_preset_name(i):
return ""
func _get_import_options(_path, _i):
return []
func _get_option_visibility(path: String, option_name: StringName, options: Dictionary) -> bool:
return false
# 防止同时加载多个文件时卡死
static var MUTEX = Mutex.new()
func _import(source_file, save_path, options, platform_variants, gen_files):
if GifManager == null:
printerr("GifManager is not available!")
return FAILED
var file = FileAccess.open(source_file, FileAccess.READ)
var buffer = file.get_buffer(file.get_length())
file.close()
MUTEX.lock()
var frames = GifManager.sprite_frames_from_buffer(buffer, 0, 30)
var filename = save_path + "." + _get_save_extension()
var code = ResourceSaver.save(frames, filename)
# await get_tree().create_timer(0.1).timeout
MUTEX.unlock()
print_debug("Imported GIF frames: ", frames.get_frame_count("gif"), " from ", source_file)
return code

View File

@ -0,0 +1,7 @@
[plugin]
name="GIF Importer"
description="GifManger 的线程安全修正版本"
author="cakipaul"
version="1.0"
script="plugin.gd"

View File

@ -0,0 +1,23 @@
@tool
extends EditorPlugin
var import_sprite_frames_plugin
# var post_import_plugin
func _enter_tree():
if GifManager == null:
printerr(
"GifManager is not available, please make sure you have the gif-importer plugin installed."
)
import_sprite_frames_plugin = preload("importer_plugin.gd").new()
# post_import_plugin = preload("post_import.gd").new()
add_import_plugin(import_sprite_frames_plugin, true)
# add_scene_format_importer_plugin(post_import_plugin)
func _exit_tree():
remove_import_plugin(import_sprite_frames_plugin)
import_sprite_frames_plugin = null
# remove_scene_format_importer_plugin(post_import_plugin)
# post_import_plugin = null

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://bgfi4y5vrdv3" uid="uid://c365bkp2y53f3"
path="res://.godot/imported/【胖小孩背着残疾小孩】-侧面呼吸.gif-41cf8f62c31ce34b394d9506a4d3fb39.tres" path="res://.godot/imported/【胖小孩背着残疾小孩】-侧面呼吸.gif-41cf8f62c31ce34b394d9506a4d3fb39.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/【胖小孩背着残疾小孩】-侧面呼
[params] [params]
frames_per_second=30

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://cubcamrofhvtr" uid="uid://cqi3cn2mbebj"
path="res://.godot/imported/【胖小孩背着残疾小孩】-呼吸.gif-c79ab4a31a499090e54afdff7675adfe.tres" path="res://.godot/imported/【胖小孩背着残疾小孩】-呼吸.gif-c79ab4a31a499090e54afdff7675adfe.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/【胖小孩背着残疾小孩】-呼吸.gif-
[params] [params]
frames_per_second=30

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://77k8twghlrj6" uid="uid://deor6xh8ho3fh"
path="res://.godot/imported/【胖小孩背着残疾小孩】-正面呼吸.gif-9675740292b31deb89f7a836f70478f0.tres" path="res://.godot/imported/【胖小孩背着残疾小孩】-正面呼吸.gif-9675740292b31deb89f7a836f70478f0.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/【胖小孩背着残疾小孩】-正面呼
[params] [params]
frames_per_second=30

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://j15catnhfmwg" uid="uid://xk4fvx44lu7e"
path="res://.godot/imported/【胖小孩背着残疾小孩】-正面抖肩.gif-4259b71a0f04bca96bf0e07177319913.tres" path="res://.godot/imported/【胖小孩背着残疾小孩】-正面抖肩.gif-4259b71a0f04bca96bf0e07177319913.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/【胖小孩背着残疾小孩】-正面抖
[params] [params]
frames_per_second=30

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://p6158w0210vj" uid="uid://bivlhoec73pq"
path="res://.godot/imported/【胖小孩背着残疾小孩】-画画.gif-3b458561a577cef811ccd651b4b69272.tres" path="res://.godot/imported/【胖小孩背着残疾小孩】-画画.gif-3b458561a577cef811ccd651b4b69272.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/【胖小孩背着残疾小孩】-画画.gif-
[params] [params]
frames_per_second=30

View File

@ -1,8 +1,8 @@
[remap] [remap]
importer="import_gif_to_sprite_frames" importer="gif.animated.texture.plugin"
type="SpriteFrames" type="SpriteFrames"
uid="uid://doonfsppjqmj6" uid="uid://deniyxsdbrt1p"
path="res://.godot/imported/右1跑动男孩.gif-9079138d4476d9c9b2c631defe192e44.tres" path="res://.godot/imported/右1跑动男孩.gif-9079138d4476d9c9b2c631defe192e44.tres"
[deps] [deps]
@ -12,4 +12,3 @@ dest_files=["res://.godot/imported/右1跑动男孩.gif-9079138d4476d9c9b2c631de
[params] [params]
frames_per_second=30

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,15 +0,0 @@
[remap]
importer="import_gif_to_sprite_frames"
type="SpriteFrames"
uid="uid://5f7eir4l853i"
path="res://.godot/imported/右1跑动男孩ceshi.gif-fd8f8dadf4a76203a9d34f450056efd3.tres"
[deps]
source_file="res://asset/art/gif/右1跑动男孩ceshi.gif"
dest_files=["res://.godot/imported/右1跑动男孩ceshi.gif-fd8f8dadf4a76203a9d34f450056efd3.tres"]
[params]
frames_per_second=30

View File

@ -0,0 +1,41 @@
extends Control
var gif_path = "res://asset/art/gif/"
var sprite_frames = preload("res://config/animation/entity_sprite_frames.tres")
func _ready():
var gif_files = []
for file in DirAccess.open(gif_path).get_files():
if file.get_extension() == "gif":
gif_files.append(file)
for gif_file in gif_files:
var path = gif_path + gif_file
var frames = load(path) as SpriteFrames
if frames and frames.has_animation("gif"):
var animation_name = gif_file.get_basename()
var dir_name = gif_path + animation_name + "/"
if DirAccess.dir_exists_absolute(dir_name):
# 如果已经存在则跳过,避免重复导入
# 重新导入时需要删除文件夹
continue
DirAccess.make_dir_absolute(dir_name)
if not sprite_frames.has_animation(animation_name):
sprite_frames.add_animation(animation_name)
else:
sprite_frames.clear(animation_name)
sprite_frames.set_animation_loop(animation_name, frames.get_animation_loop("gif"))
sprite_frames.set_animation_speed(animation_name, frames.get_animation_speed("gif"))
for i in range(frames.get_frame_count("gif")):
var texture = frames.get_frame_texture("gif", i) as Texture2D
var image = texture.get_image()
# save image to dir
var image_path = dir_name + str(i) + ".png"
image.save_png(image_path)
var new_texture := ImageTexture.create_from_image(image)
# 设置资源路径sprite_frames 中便会保存引用路径而不是二进制数据
new_texture.resource_path = image_path
var duration = frames.get_frame_duration("gif", i)
sprite_frames.add_frame(animation_name, new_texture, duration)
print("Imported: ", animation_name, " frames: ", frames.get_frame_count("gif"))
ResourceSaver.save(sprite_frames)

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=2 format=3 uid="uid://b0a8yr25ujbgd"]
[ext_resource type="Script" path="res://config/animation/gif_importer.gd" id="1_4ckcb"]
[node name="GifImporter" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = 564.0
offset_bottom = 316.0
grow_horizontal = 2
grow_vertical = 2
scale = Vector2(0.5, 0.5)
script = ExtResource("1_4ckcb")

View File

@ -37,7 +37,6 @@ buses/default_bus_layout="res://config/default_bus_layout.tres"
[autoload] [autoload]
DebugMenu="*res://addons/debug_menu/debug_menu.tscn" DebugMenu="*res://addons/debug_menu/debug_menu.tscn"
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd" GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd"
ArchiveManager="*res://manager/archive_manager/archive_manager.gd" ArchiveManager="*res://manager/archive_manager/archive_manager.gd"
SceneManager="*res://manager/deploy/scene/scene_manager.gd" SceneManager="*res://manager/deploy/scene/scene_manager.gd"
@ -45,6 +44,7 @@ AudioManager="*res://manager/audio_manager/audio_manager.gd"
EventManager="*res://manager/event_manager/event_manager.gd" EventManager="*res://manager/event_manager/event_manager.gd"
CgManager="*res://manager/cg_manager/cg_manager.gd" CgManager="*res://manager/cg_manager/cg_manager.gd"
InputManager="res://manager/input/input_manager.gd" InputManager="res://manager/input/input_manager.gd"
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
[debug] [debug]
@ -69,7 +69,7 @@ window/stretch/mode="canvas_items"
[editor_plugins] [editor_plugins]
enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg", "res://addons/project-statistics/plugin.cfg") enabled=PackedStringArray("res://addons/debug_menu/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg", "res://addons/gif-importer/plugin.cfg", "res://addons/project-statistics/plugin.cfg")
[gui] [gui]
@ -83,9 +83,6 @@ gif.animated.texture.plugin={
"MipMaps": false "MipMaps": false
} }
import_gif_to_animated_texture={} import_gif_to_animated_texture={}
import_gif_to_sprite_frames={
"frames_per_second": 30
}
[input] [input]