Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-01-26 20:07:47 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-01-26 20:07:47 +0300
commit246bcf48ade22aefd06cb9e5c0dbd4e0f5e68f3c (patch)
treed52d6a4846e80c7a37d95417c978dbe55a4b2789 /source/blender/editors/space_view3d/view3d_buttons.c
parente308fe9632b990ab2616d5ecc8402c945e15de3d (diff)
weight panel editing now supports mirroring
- use mirror when the option is enabled in editmode. - fliped group names are used when they exist. - only the setting that is edited will be applied to the mirrored verts group. - copy value is applied to all mirrored verts of the selection. - normalize normalizes all vgroups and mirrors. utility functions defvert_sync and defvert_sync_mapped, similar to defvert_copy but does not remove existing groups and optionally creates groups as needed. defvert_sync_mapped uses a an int array for mapping the flipped values.
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_buttons.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c83
1 files changed, 72 insertions, 11 deletions
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 674f6d23eab..4adb2b3af26 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -477,11 +477,10 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
// ED_undo_push(C, "Transform properties");
}
}
-
-#define B_VGRP_PNL_EDIT 1
-#define B_VGRP_PNL_COPY 2
-#define B_VGRP_PNL_NORMALIZE 3
-#define B_VGRP_PNL_COPY_SINGLE 100 /* or greater */
+#define B_VGRP_PNL_COPY 1
+#define B_VGRP_PNL_NORMALIZE 2
+#define B_VGRP_PNL_EDIT_SINGLE 8 /* or greater */
+#define B_VGRP_PNL_COPY_SINGLE 16384 /* or greater */
static void act_vert_def(Object *ob, EditVert **eve, MDeformVert **dvert)
{
@@ -503,6 +502,49 @@ static void act_vert_def(Object *ob, EditVert **eve, MDeformVert **dvert)
*dvert= NULL;
}
+static void editvert_mirror_update(Object *ob, EditVert *eve, int def_nr)
+{
+ Mesh *me= ob->data;
+ EditMesh *em = BKE_mesh_get_editmesh(me);
+ EditVert *eve_mirr;
+
+ eve_mirr= editmesh_get_x_mirror_vert(ob, em, eve->co);
+
+ if(eve_mirr && eve_mirr != eve) {
+ MDeformVert *dvert_src= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ MDeformVert *dvert_dst= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
+ if(dvert_dst) {
+ if(def_nr == -1) {
+ /* all vgroups, add groups where neded */
+
+ int *flip_map= defgroup_flip_map(ob, 1);
+ defvert_sync_mapped(dvert_dst, dvert_src, flip_map, 1);
+ MEM_freeN(flip_map);
+ }
+ else {
+ /* single vgroup */
+ MDeformWeight *dw= defvert_verify_index(dvert_dst, defgroup_flip_index(ob, def_nr, 1));
+ if(dw) {
+ dw->weight= defvert_find_weight(dvert_src, def_nr);
+ }
+ }
+ }
+ }
+}
+
+static void vgroup_adjust_active(Object *ob, int def_nr)
+{
+ EditVert *eve_act;
+ MDeformVert *dvert_act;
+
+ act_vert_def(ob, &eve_act, &dvert_act);
+
+ if(dvert_act) {
+ if(((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve_act, def_nr);
+ }
+}
+
static void vgroup_copy_active_to_sel(Object *ob)
{
EditVert *eve_act;
@@ -522,8 +564,13 @@ static void vgroup_copy_active_to_sel(Object *ob)
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->f & SELECT && eve != eve_act) {
dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- if(dvert)
+ if(dvert) {
defvert_copy(dvert, dvert_act);
+
+ if(me->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve, -1);
+
+ }
}
}
}
@@ -565,12 +612,20 @@ static void vgroup_copy_active_to_sel_single(Object *ob, int def_nr)
for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
if(def_nr == dw->def_nr) {
dw->weight= act_weight;
+
+ if(me->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve, -1);
+
break;
}
}
}
}
}
+
+ if(me->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve_act, -1);
+
}
}
@@ -585,6 +640,12 @@ static void vgroup_normalize_active(Object *ob)
return;
defvert_normalize(dvert_act);
+
+ if(((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve_act, -1);
+
+
+
}
static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
@@ -592,10 +653,7 @@ static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
- if(event==B_VGRP_PNL_EDIT) {
- /* nothing */
- }
- else if(event==B_VGRP_PNL_NORMALIZE) {
+ if(event==B_VGRP_PNL_NORMALIZE) {
vgroup_normalize_active(ob);
}
else if(event == B_VGRP_PNL_COPY) {
@@ -604,6 +662,9 @@ static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
else if(event >= B_VGRP_PNL_COPY_SINGLE) {
vgroup_copy_active_to_sel_single(ob, event - B_VGRP_PNL_COPY_SINGLE);
}
+ else if(event >= B_VGRP_PNL_EDIT_SINGLE) {
+ vgroup_adjust_active(ob, event - B_VGRP_PNL_EDIT_SINGLE);
+ }
// todo
// if(((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
@@ -654,7 +715,7 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
for (i=0; i<dvert->totweight; i++){
dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
if(dg) {
- uiDefButF(block, NUM, B_VGRP_PNL_EDIT, dg->name, 0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
+ uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dvert->dw[i].def_nr, dg->name, 0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, 0, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
yco -= 20;
}