[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58304] trunk/blender/source/blender/ editors: move ED_armature_edit_bone_select() into a more general utility function so view3d-select bone operators can use it and get matching selection behavior when entering editmode .

Campbell Barton ideasman42 at gmail.com
Tue Jul 16 03:49:21 CEST 2013


Revision: 58304
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58304
Author:   campbellbarton
Date:     2013-07-16 01:49:20 +0000 (Tue, 16 Jul 2013)
Log Message:
-----------
move ED_armature_edit_bone_select() into a more general utility function so view3d-select bone operators can use it and get matching selection behavior when entering editmode.
- specifically - write to the connected parents tipsel flag when setting the rootsel flag.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/armature/armature_select.c
    trunk/blender/source/blender/editors/armature/armature_utils.c
    trunk/blender/source/blender/editors/include/ED_armature.h
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c

Modified: trunk/blender/source/blender/editors/armature/armature_select.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_select.c	2013-07-16 01:34:35 UTC (rev 58303)
+++ trunk/blender/source/blender/editors/armature/armature_select.c	2013-07-16 01:49:20 UTC (rev 58304)
@@ -682,17 +682,7 @@
 	{0, NULL, 0, NULL, NULL}
 };
 
-/* could be used in more places */
-static void ED_armature_edit_bone_select(EditBone *ebone)
-{
-	BLI_assert((ebone->flag & BONE_UNSELECTABLE) == 0);
-	ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
 
-	if ((ebone->flag & BONE_CONNECTED) && (ebone->parent != NULL)) {
-		ebone->parent->flag |= BONE_TIPSEL;
-	}
-}
-
 static void select_similar_length(bArmature *arm, EditBone *ebone_act, const float thresh)
 {
 	EditBone *ebone;
@@ -706,7 +696,7 @@
 			if ((ebone->length >= len_min) &&
 			    (ebone->length <= len_max))
 			{
-				ED_armature_edit_bone_select(ebone);
+				ED_armature_ebone_select_set(ebone, true);
 			}
 		}
 	}
@@ -724,7 +714,7 @@
 			sub_v3_v3v3(dir, ebone->head, ebone->tail);
 
 			if (angle_v3v3(dir_act, dir) / (float)M_PI < thresh) {
-				ED_armature_edit_bone_select(ebone);
+				ED_armature_ebone_select_set(ebone, true);
 			}
 		}
 	}
@@ -737,7 +727,7 @@
 	for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
 		if (EBONE_SELECTABLE(arm, ebone)) {
 			if (ebone->layer & ebone_act->layer) {
-				ED_armature_edit_bone_select(ebone);
+				ED_armature_ebone_select_set(ebone, true);
 			}
 		}
 	}
@@ -760,8 +750,8 @@
 		if (EBONE_SELECTABLE(arm, ebone)) {
 			char prefix_other[MAX_VGROUP_NAME];
 			BKE_deform_split_prefix(ebone->name, prefix_other, body_tmp);
-			if (!strcmp(prefix_act, prefix_other)) {
-				ED_armature_edit_bone_select(ebone);
+			if (STREQ(prefix_act, prefix_other)) {
+				ED_armature_ebone_select_set(ebone, true);
 			}
 		}
 	}
@@ -784,8 +774,8 @@
 		if (EBONE_SELECTABLE(arm, ebone)) {
 			char suffix_other[MAX_VGROUP_NAME];
 			BKE_deform_split_suffix(ebone->name, body_tmp, suffix_other);
-			if (!strcmp(suffix_act, suffix_other)) {
-				ED_armature_edit_bone_select(ebone);
+			if (STREQ(suffix_act, suffix_other)) {
+				ED_armature_ebone_select_set(ebone, true);
 			}
 		}
 	}

Modified: trunk/blender/source/blender/editors/armature/armature_utils.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-16 01:34:35 UTC (rev 58303)
+++ trunk/blender/source/blender/editors/armature/armature_utils.c	2013-07-16 01:49:20 UTC (rev 58304)
@@ -704,3 +704,62 @@
 	// XXX solve getdata()
 	undo_editmode_push(C, name, get_armature_edit, free_undoBones, undoBones_to_editBones, editBones_to_undoBones, NULL);
 }
+
+/* *************************************************************** */
+/* Low level selection functions which hide connected-parent
+ * flag behavior which gets tricky to handle in selection operators.
+ * (no flushing in ED_armature_ebone_select.*, that should be explicit) */
+
+int ED_armature_ebone_selectflag_get(const EditBone *ebone)
+{
+	if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+		return ((ebone->flag & (BONE_SELECTED | BONE_TIPSEL)) |
+		        ((ebone->parent->flag & BONE_TIPSEL) ? BONE_ROOTSEL : 0));
+	}
+	else {
+		return (ebone->flag & (BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL));
+	}
+}
+
+void ED_armature_ebone_selectflag_set(EditBone *ebone, int flag)
+{
+	flag = flag & (BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
+
+	if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+		ebone->flag &= ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
+		ebone->parent->flag &= ~BONE_TIPSEL;
+
+		ebone->flag |= flag;
+		ebone->parent->flag |= (flag & BONE_ROOTSEL) ? BONE_TIPSEL : 0;
+	}
+	else {
+		ebone->flag &= ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
+		ebone->flag |= flag;
+	}
+}
+
+void ED_armature_ebone_selectflag_enable(EditBone *ebone, int flag)
+{
+	BLI_assert((flag & (BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL)) != 0);
+	ED_armature_ebone_selectflag_set(ebone, ebone->flag | flag);
+}
+
+void ED_armature_ebone_selectflag_disable(EditBone *ebone, int flag)
+{
+	BLI_assert((flag & (BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL)) != 0);
+	ED_armature_ebone_selectflag_set(ebone, ebone->flag & ~flag);
+}
+
+/* could be used in more places */
+void ED_armature_ebone_select_set(EditBone *ebone, bool select)
+{
+	int flag;
+	if (select) {
+		BLI_assert((ebone->flag & BONE_UNSELECTABLE) == 0);
+		flag = (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+	}
+	else {
+		flag = 0;
+	}
+	ED_armature_ebone_selectflag_set(ebone, flag);
+}

Modified: trunk/blender/source/blender/editors/include/ED_armature.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_armature.h	2013-07-16 01:34:35 UTC (rev 58303)
+++ trunk/blender/source/blender/editors/include/ED_armature.h	2013-07-16 01:49:20 UTC (rev 58304)
@@ -153,6 +153,13 @@
 
 void undo_push_armature(struct bContext *C, const char *name);
 
+/* low level selection functions which handle */
+int  ED_armature_ebone_selectflag_get(const EditBone *ebone);
+void ED_armature_ebone_selectflag_set(EditBone *ebone, const int flag);
+void ED_armature_ebone_select_set(EditBone *ebone, bool select);
+void ED_armature_ebone_selectflag_enable(EditBone *ebone, int flag);
+void ED_armature_ebone_selectflag_disable(EditBone *ebone, int flag);
+
 /* poseobject.c */
 void ED_armature_exit_posemode(struct bContext *C, struct Base *base);
 void ED_armature_enter_posemode(struct bContext *C, struct Base *base);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2013-07-16 01:34:35 UTC (rev 58303)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2013-07-16 01:49:20 UTC (rev 58304)
@@ -625,8 +625,8 @@
 			    BLI_lasso_is_point_inside(data->mcords, data->moves, x0, y0, INT_MAX))
 			{
 				is_point_done = true;
-				if (data->select) ebone->flag |=  BONE_ROOTSEL;
-				else              ebone->flag &= ~BONE_ROOTSEL;
+				if (data->select) ED_armature_ebone_selectflag_enable(ebone, BONE_ROOTSEL);
+				else              ED_armature_ebone_selectflag_disable(ebone, BONE_ROOTSEL);
 			}
 		}
 
@@ -637,8 +637,8 @@
 			    BLI_lasso_is_point_inside(data->mcords, data->moves, x1, y1, INT_MAX))
 			{
 				is_point_done = true;
-				if (data->select) ebone->flag |=  BONE_TIPSEL;
-				else              ebone->flag &= ~BONE_TIPSEL;
+				if (data->select) ED_armature_ebone_selectflag_enable(ebone, BONE_TIPSEL);
+				else              ED_armature_ebone_selectflag_disable(ebone, BONE_TIPSEL);
 			}
 		}
 
@@ -646,8 +646,7 @@
 		if ((is_point_done == false) && (points_proj_tot == 2) &&
 		    BLI_lasso_is_edge_inside(data->mcords, data->moves, x0, y0, x1, y1, INT_MAX))
 		{
-			if (data->select) ebone->flag |=  (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
-			else              ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+			ED_armature_ebone_select_set(ebone, data->select);
 			data->is_change = true;
 		}
 
@@ -1910,14 +1909,14 @@
 			if ((select == false) || ((ebone->flag & BONE_UNSELECTABLE) == 0)) {
 				if (index & BONESEL_TIP) {
 					ebone->flag |= BONE_DONE;
-					if (select) ebone->flag |= BONE_TIPSEL;
-					else ebone->flag &= ~BONE_TIPSEL;
+					if (select) ED_armature_ebone_selectflag_enable(ebone, BONE_TIPSEL);
+					else        ED_armature_ebone_selectflag_disable(ebone, BONE_TIPSEL);
 				}
 				
 				if (index & BONESEL_ROOT) {
 					ebone->flag |= BONE_DONE;
-					if (select) ebone->flag |= BONE_ROOTSEL;
-					else ebone->flag &= ~BONE_ROOTSEL;
+					if (select) ED_armature_ebone_selectflag_enable(ebone, BONE_ROOTSEL);
+					else        ED_armature_ebone_selectflag_disable(ebone, BONE_ROOTSEL);
 				}
 			}
 		}
@@ -1939,10 +1938,7 @@
 			if (index & BONESEL_BONE) {
 				if ((select == false) || ((ebone->flag & BONE_UNSELECTABLE) == 0)) {
 					if (!(ebone->flag & BONE_DONE)) {
-						if (select)
-							ebone->flag |= (BONE_ROOTSEL | BONE_TIPSEL | BONE_SELECTED);
-						else
-							ebone->flag &= ~(BONE_ROOTSEL | BONE_TIPSEL | BONE_SELECTED);
+						ED_armature_ebone_select_set(ebone, select);
 					}
 				}
 			}
@@ -2602,16 +2598,12 @@
 
 	if (len_squared_v2v2(data->mval_fl, screen_co) <= data->radius_squared) {
 		if (head) {
-			if (data->select)
-				ebone->flag |= BONE_ROOTSEL;
-			else 
-				ebone->flag &= ~BONE_ROOTSEL;
+			if (data->select) ED_armature_ebone_selectflag_enable(ebone, BONE_ROOTSEL);
+			else              ED_armature_ebone_selectflag_disable(ebone, BONE_ROOTSEL);
 		}
 		else {
-			if (data->select)
-				ebone->flag |= BONE_TIPSEL;
-			else 
-				ebone->flag &= ~BONE_TIPSEL;
+			if (data->select) ED_armature_ebone_selectflag_enable(ebone, BONE_TIPSEL);
+			else              ED_armature_ebone_selectflag_disable(ebone, BONE_TIPSEL);
 		}
 		return 1;
 	}
@@ -2652,8 +2644,7 @@
 		if ((is_point_done == false) && (points_proj_tot == 2) &&
 		    edge_inside_circle(data->mval_fl, data->radius, screen_co_a, screen_co_b))
 		{
-			if (data->select) ebone->flag |=  (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
-			else              ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+			ED_armature_ebone_select_set(ebone, data->select);
 			data->is_change = true;
 		}
 




More information about the Bf-blender-cvs mailing list