[Bf-blender-cvs] [b8a792ddd26] blender2.8: Multi-Objects: POSE_OT_select_grouped > POSE_SEL_SAME_GROUP 1/3

Dalai Felinto noreply at git.blender.org
Fri Oct 19 20:48:28 CEST 2018


Commit: b8a792ddd26ab28c30528cb5faf7d6ba15821617
Author: Dalai Felinto
Date:   Fri Oct 19 11:53:48 2018 -0300
Branches: blender2.8
https://developer.blender.org/rBb8a792ddd26ab28c30528cb5faf7d6ba15821617

Multi-Objects: POSE_OT_select_grouped > POSE_SEL_SAME_GROUP 1/3

And disable the other options for now.

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

M	source/blender/editors/armature/pose_select.c

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

diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index 85b66c9ef46..551267ded54 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -672,61 +672,103 @@ typedef enum ePose_SelectSame_Mode {
 	POSE_SEL_SAME_KEYINGSET  = 2,
 } ePose_SelectSame_Mode;
 
-static bool pose_select_same_group(bContext *C, Object *ob, bool extend)
+static bool pose_select_same_group(bContext *C, bool extend)
 {
-	bArmature *arm = (ob) ? ob->data : NULL;
-	bPose *pose = (ob) ? ob->pose : NULL;
-	char *group_flags;
-	int numGroups = 0;
+	ViewLayer *view_layer = CTX_data_view_layer(C);
+	bool *group_flags_array;
+	bool *group_flags;
+	int groups_len = 0;
 	bool changed = false, tagged = false;
+	Object *ob_prev = NULL;
+	uint ob_index;
 
-	/* sanity checks */
-	if (ELEM(NULL, ob, pose, arm))
-		return 0;
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
+	for (ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *ob = BKE_object_pose_armature_get(objects[ob_index]);
+		bArmature *arm = (ob) ? ob->data : NULL;
+		bPose *pose = (ob) ? ob->pose : NULL;
+
+		/* Sanity checks. */
+		if (ELEM(NULL, ob, pose, arm)) {
+			continue;
+		}
 
-	/* count the number of groups */
-	numGroups = BLI_listbase_count(&pose->agroups);
-	if (numGroups == 0)
-		return 0;
+		ob->id.tag &= ~LIB_TAG_DOIT;
+		groups_len = MAX2(groups_len, BLI_listbase_count(&pose->agroups));
+	}
+
+	/* Nothing to do here. */
+	if (groups_len == 0) {
+		MEM_freeN(objects);
+		return false;
+	}
 
 	/* alloc a small array to keep track of the groups to use
 	 *  - each cell stores on/off state for whether group should be used
-	 *	- size is (numGroups + 1), since (index = 0) is used for no-group
+	 *	- size is (groups_len + 1), since (index = 0) is used for no-group
 	 */
-	group_flags = MEM_callocN(numGroups + 1, "pose_select_same_group");
+	groups_len++;
+	group_flags_array = MEM_callocN(objects_len * groups_len * sizeof(bool), "pose_select_same_group");
 
-	CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+	ob_index = -1;
+	ob_prev = NULL;
+	CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object, *ob)
 	{
+		if (ob != ob_prev) {
+			ob_index++;
+			group_flags = group_flags_array + (ob_index * groups_len);
+			ob_prev = ob;
+		}
+
 		/* keep track of group as group to use later? */
 		if (pchan->bone->flag & BONE_SELECTED) {
-			group_flags[pchan->agrp_index] = 1;
+			group_flags[pchan->agrp_index] = true;
 			tagged = true;
 		}
 
 		/* deselect all bones before selecting new ones? */
-		if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0)
+		if ((extend == false) && (pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
 			pchan->bone->flag &= ~BONE_SELECTED;
+		}
 	}
 	CTX_DATA_END;
 
 	/* small optimization: only loop through bones a second time if there are any groups tagged */
 	if (tagged) {
+		ob_index = -1;
+		ob_prev = NULL;
 		/* only if group matches (and is not selected or current bone) */
-		CTX_DATA_BEGIN (C, bPoseChannel *, pchan, visible_pose_bones)
+		CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, visible_pose_bones, Object *, ob)
 		{
+			if (ob != ob_prev) {
+				ob_index++;
+				group_flags = group_flags_array + (ob_index * groups_len);
+				ob_prev = ob;
+			}
+
 			if ((pchan->bone->flag & BONE_UNSELECTABLE) == 0) {
 				/* check if the group used by this bone is counted */
 				if (group_flags[pchan->agrp_index]) {
 					pchan->bone->flag |= BONE_SELECTED;
-					changed = true;
+					ob->id.tag |= LIB_TAG_DOIT;
 				}
 			}
 		}
 		CTX_DATA_END;
 	}
 
-	/* free temp info */
-	MEM_freeN(group_flags);
+	for (ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *ob = objects[ob_index];
+		if (ob->id.tag & LIB_TAG_DOIT) {
+			ED_pose_bone_select_tag_update(ob);
+			changed = true;
+		}
+	}
+
+	/* Cleanup. */
+	MEM_freeN(group_flags_array);
+	MEM_freeN(objects);
 
 	return changed;
 }
@@ -848,6 +890,11 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
 	const bool extend = RNA_boolean_get(op->ptr, "extend");
 	bool changed = false;
 
+	if (ELEM(type, POSE_SEL_SAME_LAYER, POSE_SEL_SAME_KEYINGSET)) {
+		BKE_report(op->reports, RPT_ERROR, "Mode not supported at the moment");
+		return OPERATOR_CANCELLED;
+	}
+
 	/* sanity check */
 	if (ob->pose == NULL)
 		return OPERATOR_CANCELLED;
@@ -859,7 +906,7 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
 			break;
 
 		case POSE_SEL_SAME_GROUP: /* group */
-			changed = pose_select_same_group(C, ob, extend);
+			changed = pose_select_same_group(C, extend);
 			break;
 
 		case POSE_SEL_SAME_KEYINGSET: /* Keying Set */
@@ -871,11 +918,6 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op)
 			break;
 	}
 
-	/* notifiers for updates */
-	if (changed) {
-		ED_pose_bone_select_tag_update(ob);
-	}
-
 	/* report done status */
 	if (changed)
 		return OPERATOR_FINISHED;



More information about the Bf-blender-cvs mailing list