batrix/scripts/effects/bone_to_flatten.gd
2025-02-27 01:57:20 +10:00

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