[Bf-blender-cvs] [d8b43a80664] blender2.8: Depsgraph: Make sure evaluated pose channels are pointing to evaluated bones

Sergey Sharybin noreply at git.blender.org
Thu May 3 16:12:21 CEST 2018


Commit: d8b43a806642b29857cbcf84621323bbb881f665
Author: Sergey Sharybin
Date:   Thu May 3 16:10:37 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd8b43a806642b29857cbcf84621323bbb881f665

Depsgraph: Make sure evaluated pose channels are pointing to evaluated bones

===================================================================

M	source/blender/blenkernel/BKE_armature.h
M	source/blender/blenkernel/intern/armature.c
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc

===================================================================

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:



More information about the Bf-blender-cvs mailing list