Merge pull request #113055 from TokageItLab/tbik-mutable-fix

Fix mutable bone axes process in TwoBoneIK3D
This commit is contained in:
Thaddeus Crews
2025-11-24 10:21:28 -06:00

View File

@ -587,12 +587,7 @@ void TwoBoneIK3D::_init_joints(Skeleton3D *p_skeleton, int p_index) {
if (setting->root_bone.bone == -1 || setting->middle_bone.bone == -1 || !setting->is_end_valid()) {
return;
}
setting->mid_joint_solver_info = memnew(IKModifier3DSolverInfo);
setting->root_joint_solver_info = memnew(IKModifier3DSolverInfo);
_update_bone_axis(p_skeleton, p_index);
setting->init_current_joint_rotations(p_skeleton);
setting->simulation_dirty = false;
}
@ -616,9 +611,15 @@ void TwoBoneIK3D::_clear_joints(int p_index) {
void TwoBoneIK3D::_update_bone_axis(Skeleton3D *p_skeleton, int p_index) {
TwoBoneIK3DSetting *setting = tb_settings[p_index];
if (!setting || !setting->mid_joint_solver_info || !setting->root_joint_solver_info) {
if (!setting) {
return;
}
if (!setting->mid_joint_solver_info) {
setting->mid_joint_solver_info = memnew(IKModifier3DSolverInfo);
}
if (!setting->root_joint_solver_info) {
setting->root_joint_solver_info = memnew(IKModifier3DSolverInfo);
}
#ifdef TOOLS_ENABLED
Vector3 old_mv = setting->mid_joint_solver_info->forward_vector;
float old_ml = setting->mid_joint_solver_info->length;
@ -645,7 +646,6 @@ void TwoBoneIK3D::_update_bone_axis(Skeleton3D *p_skeleton, int p_index) {
global_rest_origin = orig;
if (!axis.is_zero_approx()) {
setting->mid_pos = p_skeleton->get_bone_global_pose(setting->middle_bone.bone).origin;
setting->mid_joint_solver_info = memnew(IKModifier3DSolverInfo);
setting->mid_joint_solver_info->forward_vector = p_skeleton->get_bone_global_rest(setting->middle_bone.bone).basis.get_rotation_quaternion().xform_inv(axis).normalized();
setting->mid_joint_solver_info->length = axis.length();
} else {
@ -656,10 +656,8 @@ void TwoBoneIK3D::_update_bone_axis(Skeleton3D *p_skeleton, int p_index) {
// Root bone.
orig = _get_bone_global_rest(p_skeleton, setting->root_bone.bone, setting->root_bone.bone).origin;
axis = global_rest_origin - orig;
global_rest_origin = orig;
if (!axis.is_zero_approx()) {
setting->root_pos = p_skeleton->get_bone_global_pose(setting->root_bone.bone).origin;
setting->root_joint_solver_info = memnew(IKModifier3DSolverInfo);
setting->root_joint_solver_info->forward_vector = p_skeleton->get_bone_global_rest(setting->root_bone.bone).basis.get_rotation_quaternion().xform_inv(axis).normalized();
setting->root_joint_solver_info->length = axis.length();
} else {
@ -667,6 +665,8 @@ void TwoBoneIK3D::_update_bone_axis(Skeleton3D *p_skeleton, int p_index) {
return;
}
setting->init_current_joint_rotations(p_skeleton);
double total_length = setting->root_joint_solver_info->length + setting->mid_joint_solver_info->length;
setting->cached_length_sq = total_length * total_length;
#ifdef TOOLS_ENABLED
@ -733,7 +733,8 @@ Transform3D TwoBoneIK3D::_get_bone_global_rest(Skeleton3D *p_skeleton, int p_bon
if (!mutable_bone_axes) {
return p_skeleton->get_bone_global_rest(p_bone);
}
Transform3D tr = Transform3D(p_skeleton->get_bone_rest(p_root).basis, p_skeleton->get_bone_pose(p_root).origin);
Transform3D tr = p_skeleton->get_bone_global_rest(p_root);
tr.origin = tr.origin - p_skeleton->get_bone_rest(p_root).origin + p_skeleton->get_bone_pose(p_root).origin;
LocalVector<int> path;
for (int bone = p_bone; bone != p_root && bone != -1; bone = p_skeleton->get_bone_parent(bone)) {
path.push_back(bone);