Merge pull request #35460 from ericrybick/35409-skeleton-does-not-return-to-original-pose-when-ik-playback-is-stopped

Fix bone pose override not being reset when IK animation is stopped
This commit is contained in:
Rémi Verschelde 2020-01-23 14:38:04 +01:00 committed by GitHub
commit efea348fe8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 0 deletions

View File

@ -329,6 +329,17 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove
}
}
void FabrikInverseKinematic::reset(Task *p_task) {
ChainItem *ci(&p_task->chain.chain_root);
while (ci) {
p_task->skeleton->set_bone_global_pose_override(ci->bone, Transform(), 0);
if (!ci->children.empty())
ci = &ci->children.write[0];
else
ci = NULL;
}
}
void SkeletonIK::_validate_property(PropertyInfo &property) const {
if (property.name == "root_bone" || property.name == "tip_bone") {
@ -531,6 +542,8 @@ void SkeletonIK::start(bool p_one_time) {
void SkeletonIK::stop() {
set_process_internal(false);
if (task)
FabrikInverseKinematic::reset(task);
}
Transform SkeletonIK::_get_target_transform() {

View File

@ -139,6 +139,7 @@ public:
static void set_goal(Task *p_task, const Transform &p_goal);
static void make_goal(Task *p_task, const Transform &p_inverse_transf, real_t blending_delta);
static void solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position);
static void reset(Task *p_task);
};
class SkeletonIK : public Node {