return count;
}
+// Jason
+Bone* get_other_selected_bone(Object *ob) {
+ Bone *bone;
+ int i;
+ bone = get_indexed_bone(ob, 0);
+ for(i = 0; bone;){
+ if(bone->flag & BONE_SELECTED) {
+ return bone;
+ }
+ i++;
+ bone = get_indexed_bone(ob, i);
+ }
+ return NULL;
+}
/* 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, short extend)
{
Object *ob= base->object;
Bone *nearBone;
-
+ // Jason
+ Bone *new_act_bone;
+
if (!ob || !ob->pose) return 0;
nearBone= get_bone_from_selectbuffer(scene, base, buffer, hits, 1);
-
+
/* if the bone cannot be affected, don't do anything */
if ((nearBone) && !(nearBone->flag & BONE_UNSELECTABLE)) {
bArmature *arm= ob->data;
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
- if (!(extend) || (base != scene->basact)) {
- ED_pose_deselectall(ob, 0);
- nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
- arm->act_bone= nearBone;
-
+ /* Jason was here, I'm doing a select for multibone painting */
+ if ((base != scene->basact)) {//if (!(extend) || (base != scene->basact)) {
+ /* Jason was here */
+ /* only deselect all if they aren't using 'shift' */
+ if(!extend) {
+ ED_pose_deselectall(ob, 0);
+ nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ arm->act_bone= nearBone;
+ ED_vgroup_select_by_name(OBACT, nearBone->name);
+ }
+ else {
+ // Jason deselect this bone specifically if it is selected already
+ if (nearBone->flag & BONE_SELECTED) {
+ nearBone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ if(nearBone == arm->act_bone) {
+ // make a different bone the active one if it exists
+ new_act_bone = get_other_selected_bone(ob);
+ if(new_act_bone) {
+ new_act_bone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ arm->act_bone = new_act_bone;
+ ED_vgroup_select_by_name(OBACT, new_act_bone->name);
+ }
+ }
+ // or select the bone if they are using shift
+ } else {
+ nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ arm->act_bone= nearBone;
+ }
+ }
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
// XXX old cruft! use notifiers instead
//select_actionchannel_by_name(ob->action, nearBone->name, 1);
}
static int pose_de_select_all_exec(bContext *C, wmOperator *op)
{
int action = RNA_enum_get(op->ptr, "action");
+ //Jason
+ Object *ob = NULL;
+ Scene *scene= CTX_data_scene(C);
+ int multipaint = scene->toolsettings->multipaint;
if (action == SEL_TOGGLE) {
action= CTX_DATA_COUNT(C, selected_pose_bones) ? SEL_DESELECT : SEL_SELECT;
CTX_DATA_END;
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, NULL);
-
+ // Jason
+ if(multipaint) {
+ ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ }
+
return OPERATOR_FINISHED;
}