[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60823] trunk/blender/source/blender/ editors: Project Pampa Request: Selecting groups in animation editors selects

Joshua Leung aligorith at gmail.com
Thu Oct 17 16:19:03 CEST 2013


Revision: 60823
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60823
Author:   aligorith
Date:     2013-10-17 14:19:03 +0000 (Thu, 17 Oct 2013)
Log Message:
-----------
Project Pampa Request: Selecting groups in animation editors selects
corresponding bones

Modified Paths:
--------------
    trunk/blender/source/blender/editors/animation/anim_channels_edit.c
    trunk/blender/source/blender/editors/armature/pose_select.c
    trunk/blender/source/blender/editors/include/ED_armature.h

Modified: trunk/blender/source/blender/editors/animation/anim_channels_edit.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2013-10-17 14:10:03 UTC (rev 60822)
+++ trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2013-10-17 14:19:03 UTC (rev 60823)
@@ -58,6 +58,7 @@
 #include "UI_view2d.h"
 
 #include "ED_anim_api.h"
+#include "ED_armature.h"
 #include "ED_keyframes_edit.h" // XXX move the select modes out of there!
 #include "ED_screen.h"
 
@@ -2441,6 +2442,30 @@
 		{
 			bActionGroup *agrp = (bActionGroup *)ale->data;
 			
+			Object *ob = NULL;
+			bPoseChannel *pchan = NULL;
+			
+			
+			/* Armatures-Specific Feature:
+			 * Since groups are used to collect F-Curves of the same Bone by default
+			 * (via Keying Sets) so that they can be managed better, we try to make
+			 * things here easier for animators by mapping group selection to bone
+			 * selection 
+			 */
+			if ((ale->id) && (GS(ale->id->name) == ID_OB)) {
+				 ob = (ID *)ale->id;
+				
+				if (ob->type == OB_ARMATURE) {
+					/* Assume for now that any group with corresponding name is what we want
+					 * (i.e. for an armature whose location is animated, things would break
+					 * if the user were to add a bone named "Location").
+					 *
+					 * TODO: check the first F-Curve or so to be sure...
+					 */
+					pchan = BKE_pose_channel_find_name(ob->pose, agrp->name);
+				}	
+			}
+			
 			/* select/deselect group */
 			if (selectmode == SELECT_INVERT) {
 				/* inverse selection status of this group only */
@@ -2452,6 +2477,7 @@
 				
 				/* deselect all other channels */
 				ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+				if (pchan) ED_pose_deselectall(ob, 0);
 				
 				/* only select channels in group and group itself */
 				for (fcu = agrp->channels.first; fcu && fcu->grp == agrp; fcu = fcu->next)
@@ -2461,14 +2487,20 @@
 			else {
 				/* select group by itself */
 				ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+				if (pchan) ED_pose_deselctall(ob, 0);
+				
 				agrp->flag |= AGRP_SELECTED;
 			}
 			
 			/* if group is selected now, make group the 'active' one in the visible list */
-			if (agrp->flag & AGRP_SELECTED)
+			if (agrp->flag & AGRP_SELECTED) {
 				ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, agrp, ANIMTYPE_GROUP);
-			else
+				if (pchan) ED_pose_bone_select(ob, pchan, true);
+			}
+			else {
 				ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, NULL, ANIMTYPE_GROUP);
+				if (pchan) ED_pose_bone_select(ob, pchan, false);
+			}
 				
 			notifierFlags |= (ND_ANIMCHAN | NA_SELECTED);
 			break;

Modified: trunk/blender/source/blender/editors/armature/pose_select.c
===================================================================
--- trunk/blender/source/blender/editors/armature/pose_select.c	2013-10-17 14:10:03 UTC (rev 60822)
+++ trunk/blender/source/blender/editors/armature/pose_select.c	2013-10-17 14:19:03 UTC (rev 60823)
@@ -64,6 +64,35 @@
 
 /* ***************** Pose Select Utilities ********************* */
 
+/* Utility method for changing the selection status of a bone */
+ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
+ {
+ 	/* sanity checks */
+ 	// XXX: actually, we can probably still get away with no object - at most we have no updates
+ 	if (ELEM4(NULL, ob, ob->pose, pchan, pchan->bone))
+ 		return;	
+ 	
+ 	/* can only change selection state if bone can be modified */	
+ 	if (PBONE_SELECTABLE(ob, pchan->bone)) {
+ 		bArmature *arm = ob->data;
+ 		
+ 		/* change selection state */
+ 		if (select)
+ 			pchan->bone->flag |= BONE_SELECTED;
+ 		else
+ 			pchan->bone->flag &= ~BONE_SELECTED;
+ 		
+ 		// TODO: select and activate corresponding vgroup?
+ 		
+ 		/* tag necessary depsgraph updates 
+ 		 * (see rna_Bone_select_update() in rna_armature.c for details)
+ 		 */
+ 		if (arm->flag & ARM_HAS_VIZ_DEPS) {
+			DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+		}
+ 	}
+ }
+
 /* called from editview.c, for mode-less pose selection */
 /* assumes scene obact and basact is still on old situation */
 int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, short hits,

Modified: trunk/blender/source/blender/editors/include/ED_armature.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_armature.h	2013-10-17 14:10:03 UTC (rev 60822)
+++ trunk/blender/source/blender/editors/include/ED_armature.h	2013-10-17 14:19:03 UTC (rev 60823)
@@ -168,6 +168,7 @@
 void ED_armature_exit_posemode(struct bContext *C, struct Base *base);
 void ED_armature_enter_posemode(struct bContext *C, struct Base *base);
 void ED_pose_deselectall(struct Object *ob, int test);
+void ED_pose_bone_select(struct Object *ob, struct bPoseChannel *pchan, bool select);
 void ED_pose_recalculate_paths(struct Scene *scene, struct Object *ob);
 struct Object *ED_pose_object_from_context(struct bContext *C);
 




More information about the Bf-blender-cvs mailing list