make BoneFlattener a SkeletonModifier3D
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
@tool
|
||||
class_name BoneFlattener
|
||||
extends Node3D
|
||||
extends SkeletonModifier3D
|
||||
|
||||
@export var _skeleton: Skeleton3D
|
||||
@export var _bones_to_flatten: Array[BoneToFlatten] = []
|
||||
@export var _mirror_y_angle: float
|
||||
@export var _editor_preview: bool = false
|
||||
|
||||
@export_group("Bone names")
|
||||
@export var _head_bone_name: String = "Head"
|
||||
@export var _mouth_bone_name: String = "Mouth_base"
|
||||
@export_enum(" ") var _head_bone: String = "Head"
|
||||
@export_enum(" ") var _mouth_bone: String = "Mouth_base"
|
||||
|
||||
@export_group("Mouth")
|
||||
@export var _mouth_center_pos_z: float:
|
||||
@@ -71,30 +70,33 @@ extends Node3D
|
||||
@export var _mouth_front_yaw_curve: Curve
|
||||
@export var _mouth_hide_rot_y: float
|
||||
|
||||
var _mouth_bone: int
|
||||
var _head_bone: int
|
||||
var _bone_indices: Dictionary[String, int] = {}
|
||||
var _skeleton: Skeleton3D
|
||||
|
||||
var _angle: Vector3 = Vector3()
|
||||
|
||||
|
||||
func _validate_property(property: Dictionary) -> void:
|
||||
if property.name.ends_with("bone"):
|
||||
if _skeleton:
|
||||
property.hint = PROPERTY_HINT_ENUM
|
||||
property.hint_string = _skeleton.get_concatenated_bone_names()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_skeleton = get_skeleton()
|
||||
assert(_skeleton, str(self) + ": _skeleton missing!")
|
||||
_head_bone = _skeleton.find_bone(_head_bone_name)
|
||||
assert(_head_bone != -1, str(self) + ": _head_bone missing!")
|
||||
_mouth_bone = _skeleton.find_bone(_mouth_bone_name)
|
||||
assert(_mouth_bone != -1, str(self) + ": _mouth_bone missing!")
|
||||
assert(_skeleton.find_bone(_head_bone) != -1, str(self) + ": _head_bone missing!")
|
||||
assert(_skeleton.find_bone(_mouth_bone) != -1, str(self) + ": _mouth_bone missing!")
|
||||
|
||||
for bone_to_flatten in _bones_to_flatten:
|
||||
if bone_to_flatten == null:
|
||||
continue
|
||||
for bone_name in bone_to_flatten.bone_names:
|
||||
var bone_index := _skeleton.find_bone(bone_name)
|
||||
assert(bone_index != -1, bone_name + " missing!")
|
||||
_bone_indices[bone_name] = bone_index
|
||||
var bone_idx := _skeleton.find_bone(bone_name)
|
||||
assert(bone_idx != -1, bone_name + " missing!")
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
func _process_modification() -> void:
|
||||
if _skeleton == null or (Engine.is_editor_hint() and not _editor_preview):
|
||||
return
|
||||
|
||||
@@ -106,12 +108,12 @@ func _process(_delta: float) -> void:
|
||||
if bone_to_flatten == null:
|
||||
continue
|
||||
for bone_name in bone_to_flatten.bone_names:
|
||||
if not _bone_indices.has(bone_name):
|
||||
var bone_idx: int = _skeleton.find_bone(bone_name)
|
||||
if bone_idx == -1:
|
||||
continue
|
||||
var bone_index: int = _bone_indices[bone_name] as int
|
||||
_handle_position(bone_to_flatten, bone_index)
|
||||
_handle_rotation(bone_to_flatten, bone_index)
|
||||
_handle_scale(bone_to_flatten, bone_index)
|
||||
_handle_position(bone_to_flatten, bone_idx)
|
||||
_handle_rotation(bone_to_flatten, bone_idx)
|
||||
_handle_scale(bone_to_flatten, bone_idx)
|
||||
|
||||
|
||||
func mouth_pose(normalized: Vector3) -> Vector3:
|
||||
@@ -137,7 +139,8 @@ func _get_angle() -> void:
|
||||
else:
|
||||
camera = get_tree().root.get_viewport().get_camera_3d()
|
||||
|
||||
var head_transform := global_bone_transform(_head_bone)
|
||||
var head_bone_idx := _skeleton.find_bone(_head_bone)
|
||||
var head_transform := global_bone_transform(head_bone_idx)
|
||||
var head_transform_rotated := (
|
||||
head_transform
|
||||
. looking_at(
|
||||
@@ -162,7 +165,8 @@ func _handle_mouth() -> void:
|
||||
):
|
||||
return
|
||||
|
||||
var bone_transform := _skeleton.get_bone_rest(_mouth_bone)
|
||||
var mouth_bone_idx := _skeleton.find_bone(_mouth_bone)
|
||||
var bone_transform := _skeleton.get_bone_rest(mouth_bone_idx)
|
||||
var bone_rot := bone_transform.basis.get_euler()
|
||||
var bone_pos := bone_transform.origin
|
||||
var normalized := Vector3.ZERO
|
||||
@@ -173,7 +177,7 @@ func _handle_mouth() -> void:
|
||||
)
|
||||
|
||||
bone_pos += mouth_pose(normalized)
|
||||
_skeleton.set_bone_pose_position(_mouth_bone, bone_pos)
|
||||
_skeleton.set_bone_pose_position(mouth_bone_idx, bone_pos)
|
||||
|
||||
var corner_angle_value := ease(absf(normalized.y), 1) * signf(normalized.y)
|
||||
bone_rot.x += (
|
||||
@@ -210,7 +214,7 @@ func _handle_mouth() -> void:
|
||||
. get_euler()
|
||||
)
|
||||
|
||||
_skeleton.set_bone_pose_rotation(_mouth_bone, Quaternion.from_euler(bone_rot))
|
||||
_skeleton.set_bone_pose_rotation(mouth_bone_idx, Quaternion.from_euler(bone_rot))
|
||||
|
||||
var bone_scale := Vector3.ONE
|
||||
var scale_x_front := (
|
||||
@@ -228,7 +232,7 @@ func _handle_mouth() -> void:
|
||||
bone_scale.x *= -1
|
||||
if absf(_angle.y) > _mouth_hide_rot_y:
|
||||
bone_scale = Vector3.ZERO
|
||||
_skeleton.set_bone_pose_scale(_mouth_bone, bone_scale)
|
||||
_skeleton.set_bone_pose_scale(mouth_bone_idx, bone_scale)
|
||||
|
||||
|
||||
func _handle_position(bone_to_flatten: BoneToFlatten, bone: int) -> void:
|
||||
|
||||
Reference in New Issue
Block a user