51 lines
1.5 KiB
GDScript
51 lines
1.5 KiB
GDScript
@tool
|
|
class_name BoneToFlatten
|
|
extends Resource
|
|
|
|
@export var bone_names: PackedStringArray = []
|
|
@export var amount_by_pitch_curve: Curve = Curve.new()
|
|
@export var amount_by_yaw_curve: Curve = Curve.new()
|
|
@export var consider_side: bool = false
|
|
@export var yaw_fraction: float = 1
|
|
|
|
@export_group("Position")
|
|
@export var do_position: bool = false
|
|
@export var position_x_amount: float
|
|
|
|
@export_group("Rotation")
|
|
@export var do_rotation: bool = false
|
|
@export var rotation_x_amount: float
|
|
@export var rotation_x_curve: Curve
|
|
@export var mirror_rot_x: bool = false
|
|
@export var consider_side_rot_x: bool = false
|
|
@export var rotation_y_amount: float
|
|
@export var rotation_y_curve: Curve
|
|
@export var mirror_rot_y: bool = false
|
|
@export var consider_side_rot_y: bool = false
|
|
@export var rotation_z_amount: float
|
|
@export var rotation_z_curve: Curve
|
|
@export var mirror_rot_z: bool = false
|
|
@export var consider_side_rot_z: bool = false
|
|
|
|
@export_group("Scale")
|
|
@export var do_scale: bool = false
|
|
|
|
|
|
func get_angle_normalized(angle: Vector3) -> Vector3:
|
|
var normalized := Vector3.ZERO
|
|
normalized.y = angle.y / (PI / yaw_fraction)
|
|
normalized.x = angle.x / (PI / 2)
|
|
return normalized
|
|
|
|
|
|
func get_amount(angle: Vector3) -> float:
|
|
if amount_by_pitch_curve == null or amount_by_yaw_curve == null:
|
|
return 0
|
|
|
|
var normalized := get_angle_normalized(angle)
|
|
var amount_by_yaw := amount_by_yaw_curve.sample(absf(normalized.y))
|
|
var amount := amount_by_pitch_curve.sample(absf(normalized.x)) * amount_by_yaw
|
|
if consider_side:
|
|
amount *= -signf(normalized.y)
|
|
return amount
|