[Bf-blender-cvs] [602f0bc2d47] blender2.8: Use macros for looping over pose bones

Campbell Barton noreply at git.blender.org
Wed Apr 18 18:56:42 CEST 2018


Commit: 602f0bc2d47d991672f7b79128f2ed677babb8da
Author: Campbell Barton
Date:   Wed Apr 18 18:32:32 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB602f0bc2d47d991672f7b79128f2ed677babb8da

Use macros for looping over pose bones

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

M	source/blender/blenkernel/BKE_action.h
M	source/blender/editors/screen/screen_context.c

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

diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index a203b76ea26..e42a37cd444 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -208,6 +208,22 @@ void BKE_pose_rest(struct bPose *pose);
 /* Tag pose for recalc. Also tag all related data to be recalc. */
 void BKE_pose_tag_recalc(struct Main *bmain, struct bPose *pose);
 
+/* context.selected_pose_bones */
+#define FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN(_ob, _pchan) \
+	for (bPoseChannel *_pchan = (_ob)->pose->chanbase.first; _pchan;  _pchan = _pchan->next) { \
+		if (PBONE_VISIBLE(((bArmature *)(_ob)->data), (_pchan)->bone) && ((_pchan)->bone->flag & BONE_SELECTED)) {
+#define FOREACH_PCHAN_SELECTED_IN_OBJECT_END \
+		} \
+	} ((void)0)
+/* context.visible_pose_bones */
+#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN(_ob, _pchan) \
+	for (bPoseChannel *_pchan = (_ob)->pose->chanbase.first; _pchan;  _pchan = _pchan->next) { \
+		if (PBONE_VISIBLE(((bArmature *)(_ob)->data), (_pchan)->bone)) {
+#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_END \
+		} \
+	} ((void)0)
+
+
 #ifdef __cplusplus
 };
 #endif
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index d51abee2b04..85087d58276 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -308,26 +308,17 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 	}
 	else if (CTX_data_equals(member, "visible_pose_bones")) {
 		Object *obpose = BKE_object_pose_armature_get(obact);
-		bArmature *arm = (obpose) ? obpose->data : NULL;
-		bPoseChannel *pchan;
-		
-		if (obpose && obpose->pose && arm) {
+		if (obpose && obpose->pose && obpose->data) {
 			if (obpose != obact) {
-				for (pchan = obpose->pose->chanbase.first; pchan; pchan = pchan->next) {
-					/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
-					if (PBONE_VISIBLE(arm, pchan->bone)) {
-						CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
-					}
-				}
+				FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN (obpose, pchan) {
+					CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
+				} FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
 			}
 			else if (obact->mode & OB_MODE_POSE) {
-				FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, obact->mode, ob_iter) {
-					for (pchan = ob_iter->pose->chanbase.first; pchan; pchan = pchan->next) {
-						/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
-						if (PBONE_VISIBLE(arm, pchan->bone)) {
-							CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
-						}
-					}
+				FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob_iter) {
+					FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN (ob_iter, pchan) {
+						CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
+					} FOREACH_PCHAN_VISIBLE_IN_OBJECT_END;
 				} FOREACH_OBJECT_IN_MODE_END;
 			}
 			CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
@@ -336,30 +327,17 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
 	}
 	else if (CTX_data_equals(member, "selected_pose_bones")) {
 		Object *obpose = BKE_object_pose_armature_get(obact);
-		bArmature *arm = (obpose) ? obpose->data : NULL;
-		bPoseChannel *pchan;
-		
-		if (obpose && obpose->pose && arm) {
+		if (obpose && obpose->pose && obpose->data) {
 			if (obpose != obact) {
-				/* TODO(de-duplicate!) */
-				for (pchan = obpose->pose->chanbase.first; pchan; pchan = pchan->next) {
-					/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
-					if (PBONE_VISIBLE(arm, pchan->bone)) {
-						if (pchan->bone->flag & BONE_SELECTED)
-							CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
-					}
-				}
+				FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (obpose, pchan) {
+					CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
+				} FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
 			}
 			else if (obact->mode & OB_MODE_POSE) {
-				/* TODO(de-duplicate!) */
 				FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob_iter) {
-					for (pchan = ob_iter->pose->chanbase.first; pchan; pchan = pchan->next) {
-						/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
-						if (PBONE_VISIBLE(arm, pchan->bone)) {
-							if (pchan->bone->flag & BONE_SELECTED)
-								CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
-						}
-					}
+					FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob_iter, pchan) {
+						CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
+					} FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
 				} FOREACH_OBJECT_IN_MODE_END;
 			}
 			CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);



More information about the Bf-blender-cvs mailing list