1
This commit is contained in:
+21
-17
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user