From 6bc3f4746bc5325d8e1ff54469ebb6929bf3bdb2 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 15 Aug 2005 16:12:50 +0000 Subject: A nice character modeling time-saver: In WeightPaint mode, pose-mode armatures now allow selecting Bones, but without making the Armature object active. Selecting a Bone then results in selecting the associated vertexgroup. :) Little quirk; all armatures with posemode then draw selectable... --- source/blender/include/BIF_editarmature.h | 2 +- source/blender/include/BIF_editdeform.h | 2 ++ source/blender/src/drawarmature.c | 8 ++++++-- source/blender/src/editarmature.c | 13 ++++++++++--- source/blender/src/editdeform.c | 14 ++++++++++++++ source/blender/src/editview.c | 8 +++++++- 6 files changed, 40 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/include/BIF_editarmature.h b/source/blender/include/BIF_editarmature.h index ae5acf30715..73807dab5dc 100644 --- a/source/blender/include/BIF_editarmature.h +++ b/source/blender/include/BIF_editarmature.h @@ -98,7 +98,7 @@ void clear_bone_parent(void); void make_editArmature(void); void make_trans_bones (char mode); -void do_pose_selectbuffer(struct Base *base, unsigned int *buffer, short hits); +int do_pose_selectbuffer(struct Base *base, unsigned int *buffer, short hits); void mouse_armature(void); void remake_editArmature(void); diff --git a/source/blender/include/BIF_editdeform.h b/source/blender/include/BIF_editdeform.h index e50de0b5bec..5444f5a39fb 100644 --- a/source/blender/include/BIF_editdeform.h +++ b/source/blender/include/BIF_editdeform.h @@ -59,6 +59,8 @@ void remove_vert_defgroup (struct Object *ob, struct bDeformGroup *dg, int vertnum); void create_dverts(Mesh *me); +void vertexgroup_select_by_name(struct Object *ob, char *name); + extern void object_apply_deform(struct Object *ob); #endif diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c index 407dabc8aaf..aa2a01d37c3 100644 --- a/source/blender/src/drawarmature.c +++ b/source/blender/src/drawarmature.c @@ -984,8 +984,12 @@ void draw_armature(Base *base, int dt) if(G.f & G_PICKSEL) { if(ob->flag & OB_POSEMODE) arm->flag |= ARM_POSEMODE; } - else if(ob==OBACT && (ob->flag & OB_POSEMODE)) arm->flag |= ARM_POSEMODE; - + else if(ob->flag & OB_POSEMODE) { + if(ob==OBACT) + arm->flag |= ARM_POSEMODE; + else if(G.f & G_WEIGHTPAINT) + arm->flag |= ARM_POSEMODE; + } draw_pose_channels(base, dt); arm->flag &= ~ARM_POSEMODE; } diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index 7c6036b313e..9db631cc3f7 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -1700,12 +1700,12 @@ static int clear_active_flag(Object *ob, Bone *bone, void *data) /* called from editview.c, for mode-less pose selection */ -void do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) +int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) { Object *ob= base->object; Bone *nearBone; - if (!ob || !ob->pose) return; + if (!ob || !ob->pose) return 0; nearBone= get_bone_from_selectbuffer(base, buffer, hits, 1); @@ -1738,6 +1738,13 @@ void do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) } } + /* in weightpaint we select the associated vertex group too */ + if(G.f & G_WEIGHTPAINT) { + if(nearBone->flag & BONE_ACTIVE) { + vertexgroup_select_by_name(OBACT, nearBone->name); + } + } + allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWACTION, 0); allqueue(REDRAWIPO, 0); /* To force action ipo update */ @@ -1746,7 +1753,7 @@ void do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits) allqueue(REDRAWOOPS, 0); } -// rightmouse_transform(); + return nearBone!=NULL; } diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c index 1dfce2ba879..f600c8e5537 100644 --- a/source/blender/src/editdeform.c +++ b/source/blender/src/editdeform.c @@ -602,6 +602,20 @@ void unique_vertexgroup_name (bDeformGroup *dg, Object *ob) } } +void vertexgroup_select_by_name(Object *ob, char *name) +{ + bDeformGroup *curdef; + int actdef= 1; + + if(ob==NULL || ob->type!=OB_MESH) return; + for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++){ + if (!strcmp(curdef->name, name)) { + ob->actdef= actdef; + } + } +} + + /* ******************* other deform edit stuff ********** */ void object_apply_deform(Object *ob) diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index 0710a1e8703..d70cf34140a 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -1266,7 +1266,13 @@ void mouse_select(void) } if(has_bones && basact) { - do_pose_selectbuffer(basact, buffer, hits); + if( do_pose_selectbuffer(basact, buffer, hits) ) { // bone found + + /* in weightpaint, we use selected bone to select vertexgroup, so no switch to new active object */ + if(G.f & G_WEIGHTPAINT) { + basact= NULL; + } + } } } } -- cgit v1.2.3