diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-05-03 17:10:37 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-05-03 17:11:07 +0300 |
commit | d8b43a806642b29857cbcf84621323bbb881f665 (patch) | |
tree | 5360c85c3fd7ff5dcd6c56fe7402efc7381ab885 /source/blender | |
parent | a06b0d29aa01bcc0fa74d685fa74cee1467dbad8 (diff) |
Depsgraph: Make sure evaluated pose channels are pointing to evaluated bones
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_armature.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 9 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 5 |
3 files changed, 15 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h index 2ecab73ac79..b8d9e5a9af9 100644 --- a/source/blender/blenkernel/BKE_armature.h +++ b/source/blender/blenkernel/BKE_armature.h @@ -99,6 +99,7 @@ float distfactor_to_bone(const float vec[3], const float b1[3], const float b2[3 void BKE_armature_where_is(struct bArmature *arm); void BKE_armature_where_is_bone(struct Bone *bone, struct Bone *prevbone, const bool use_recursion); void BKE_pose_clear_pointers(struct bPose *pose); +void BKE_pose_remap_bone_pointers(struct bArmature *armature, struct bPose *pose); void BKE_pose_rebuild(struct Object *ob, struct bArmature *arm); void BKE_pose_where_is(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob); void BKE_pose_where_is_bone(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, bool do_extra); diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 2ded32b3ec9..63846b31c33 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -1943,6 +1943,15 @@ void BKE_pose_clear_pointers(bPose *pose) } } +void BKE_pose_remap_bone_pointers(bArmature *armature, bPose *pose) +{ + GHash *bone_hash = BKE_armature_bone_from_name_map(armature); + for (bPoseChannel *pchan = pose->chanbase.first; pchan; pchan = pchan->next) { + pchan->bone = BLI_ghash_lookup(bone_hash, pchan->name); + } + BLI_ghash_free(bone_hash, NULL, NULL); +} + /* only after leave editmode, duplicating, validating older files, library syncing */ /* NOTE: pose->flag is set for it */ void BKE_pose_rebuild(Object *ob, bArmature *arm) diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc index 99c24506a7b..81303095c65 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc @@ -81,6 +81,7 @@ extern "C" { #include "BKE_action.h" #include "BKE_animsys.h" +#include "BKE_armature.h" #include "BKE_editmesh.h" #include "BKE_library_query.h" #include "BKE_object.h" @@ -419,6 +420,10 @@ void update_special_pointers(const Depsgraph *depsgraph, BLI_assert(object_cow->derivedFinal == NULL); BLI_assert(object_cow->derivedDeform == NULL); object_cow->mode = object_orig->mode; + if (object_cow->type == OB_ARMATURE) { + BKE_pose_remap_bone_pointers((bArmature *)object_cow->data, + object_cow->pose); + } break; } case ID_ME: |