This commit is contained in:
2026-10-02 15:42:34 +08:00
parent 698cb02c21
commit faf799837f
22 changed files with 759 additions and 302 deletions
+21 -17
View File
@@ -16,12 +16,13 @@ const VIEW_SIZE := 420
@onready var _width_slider: HSlider = %WidthSlider
@onready var _width_label: Label = %WidthLabel
@onready var _eraser_toggle: CheckButton = %EraserToggle
@onready var _name_edit: LineEdit = %NameEdit
var _rig: FaceRig
## 打开面板时的笔画层快照,取消时还原
var _snapshot: PackedByteArray
## 打开面板时用的是哪张预设,取消时一并还原(「自己画」会把底图换成空白)
var _preset_before: String = ""
## 打开面板时选中的表情 ID,取消时还原
var _expression_before: String = ""
## 左键是不是按着 —— 拖拽判定用这个,不看 motion 事件里的 button_mask
var _drawing := false
@@ -41,22 +42,20 @@ func _ready() -> void:
# ---------------- 对外接口 ----------------
## 打开面板并绑定到某个 FaceRig。
## blank_face 传了就从这张空白脸起手(「自己画」用)—— 快照仍然记的是改动之前的状态,
## 所以点「取消」能把底图和笔画一起还原。
func open(rig: FaceRig, blank_face: Texture2D = null) -> void:
## 打开面板并绑定到 FaceRig。start_blank = true 时先快照再清空,取消可完整还原。
func open(rig: FaceRig, start_blank: bool = false) -> void:
if rig == null or rig.painter == null:
push_warning("画脸面板没拿到可用的 FaceRig")
return
_rig = rig
_snapshot = rig.painter.snapshot()
_preset_before = rig.preset_path
if blank_face != null:
rig.set_preset(blank_face, blank_face.resource_path)
rig.clear_paint()
_expression_before = rig.selected_expression_id
if start_blank:
rig.select_blank(true)
_canvas_rect.texture = rig.painter.texture
# 画布只显示笔画层,底下得把底图一起摆出来 —— 不然玩家是在对着空气画
_preset_rect.texture = rig.material.get_shader_parameter("base_tex") as Texture2D
%SkinRect.color = rig.skin_color
_preset_rect.texture = rig.selected_expression_texture
_name_edit.text = ""
rig.painter.brush_color = _color_button.color
rig.painter.brush_width = _width_slider.value
rig.painter.erasing = _eraser_toggle.button_pressed
@@ -113,18 +112,23 @@ func _on_clear() -> void:
func _on_done() -> void:
if _rig != null:
_rig.save()
if _rig == null:
return
var saved := _rig.save_drawing_as_expression(_name_edit.text)
if saved.is_empty():
push_warning("表情保存失败,请检查本地磁盘空间和写入权限")
return
visible = false
finished.emit()
func _on_cancel() -> void:
if _rig != null:
if not _expression_before.is_empty():
_rig.select_expression(_expression_before, false)
else:
_rig.select_blank(false)
if _snapshot.size() > 0:
_rig.painter.restore(_snapshot)
# 底图也要还原 —— 「自己画」把它换成空白了,只还原笔画会留下一张白脸
if not _preset_before.is_empty() and ResourceLoader.exists(_preset_before):
_rig.set_preset(load(_preset_before), _preset_before)
visible = false
cancelled.emit()