[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41431] trunk/blender: vertex group mirror
Campbell Barton
ideasman42 at gmail.com
Tue Nov 1 09:11:58 CET 2011
Revision: 41431
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41431
Author: campbellbarton
Date: 2011-11-01 08:11:55 +0000 (Tue, 01 Nov 2011)
Log Message:
-----------
vertex group mirror
- now works in vertex select + weight paint mode.
- added option not to mirror all vertex groups.
Modified Paths:
--------------
trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
trunk/blender/release/scripts/startup/bl_ui/space_view3d_toolbar.py
trunk/blender/source/blender/blenkernel/BKE_deform.h
trunk/blender/source/blender/blenkernel/intern/deform.c
trunk/blender/source/blender/editors/include/ED_mesh.h
trunk/blender/source/blender/editors/object/object_vgroup.c
Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-11-01 08:11:55 UTC (rev 41431)
@@ -1086,6 +1086,7 @@
layout.operator("object.vertex_group_normalize_all", text="Normalize All")
layout.operator("object.vertex_group_normalize", text="Normalize")
+ layout.operator("object.vertex_group_mirror", text="Mirror")
layout.operator("object.vertex_group_invert", text="Invert")
layout.operator("object.vertex_group_clean", text="Clean")
layout.operator("object.vertex_group_levels", text="Levels")
Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d_toolbar.py 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d_toolbar.py 2011-11-01 08:11:55 UTC (rev 41431)
@@ -1036,6 +1036,7 @@
col.active = ob.vertex_groups.active is not None
col.operator("object.vertex_group_normalize_all", text="Normalize All")
col.operator("object.vertex_group_normalize", text="Normalize")
+ col.operator("object.vertex_group_mirror", text="Mirror")
col.operator("object.vertex_group_invert", text="Invert")
col.operator("object.vertex_group_clean", text="Clean")
col.operator("object.vertex_group_levels", text="Levels")
Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h 2011-11-01 08:11:55 UTC (rev 41431)
@@ -45,6 +45,7 @@
struct bDeformGroup *defgroup_find_name(struct Object *ob, const char *name);
int defgroup_find_index(struct Object *ob, struct bDeformGroup *dg);
int *defgroup_flip_map(struct Object *ob, int *flip_map_len, int use_default);
+int *defgroup_flip_map_single(struct Object *ob, int *flip_map_len, int use_default, int defgroup);
int defgroup_flip_index(struct Object *ob, int index, int use_default);
int defgroup_name_index(struct Object *ob, const char *name);
void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c 2011-11-01 08:11:55 UTC (rev 41431)
@@ -257,17 +257,19 @@
/* note, must be freed */
int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
{
- bDeformGroup *dg;
int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
if(totdg==0) {
return NULL;
}
else {
+ bDeformGroup *dg;
char name[sizeof(dg->name)];
int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
- memset(map, -1, totdg * sizeof(int));
+ for (i=0; i < totdg; i++) {
+ map[i]= -1;
+ }
for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
if(map[i] == -1) { /* may be calculated previously */
@@ -276,7 +278,7 @@
if(use_default)
map[i]= i;
- flip_side_name(name, dg->name, 0);
+ flip_side_name(name, dg->name, FALSE);
if(strcmp(name, dg->name)) {
flip_num= defgroup_name_index(ob, name);
if(flip_num >= 0) {
@@ -290,6 +292,40 @@
}
}
+/* note, must be freed */
+int *defgroup_flip_map_single(Object *ob, int *flip_map_len, int use_default, int defgroup)
+{
+ int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
+
+ if(totdg==0) {
+ return NULL;
+ }
+ else {
+ bDeformGroup *dg;
+ char name[sizeof(dg->name)];
+ int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
+
+ for (i=0; i < totdg; i++) {
+ if (use_default) map[i]= i;
+ else map[i]= -1;
+ }
+
+ dg= BLI_findlink(&ob->defbase, defgroup);
+
+ flip_side_name(name, dg->name, FALSE);
+ if(strcmp(name, dg->name)) {
+ flip_num= defgroup_name_index(ob, name);
+
+ if(flip_num >= 0) {
+ map[defgroup]= flip_num;
+ map[flip_num]= defgroup;
+ }
+ }
+
+ return map;
+ }
+}
+
int defgroup_flip_index(Object *ob, int index, int use_default)
{
bDeformGroup *dg= BLI_findlink(&ob->defbase, index);
Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h 2011-11-01 08:11:55 UTC (rev 41431)
@@ -209,7 +209,7 @@
int ED_vgroup_data_create(struct ID *id);
int ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
int ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
-void ED_vgroup_mirror(struct Object *ob, const short mirror_weights, const short flip_vgroups);
+void ED_vgroup_mirror(struct Object *ob, const short mirror_weights, const short flip_vgroups, const short all_vgroups);
int ED_vgroup_object_is_edit_mode(struct Object *ob);
Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2011-11-01 06:45:36 UTC (rev 41430)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2011-11-01 08:11:55 UTC (rev 41431)
@@ -1527,14 +1527,32 @@
static void dvert_mirror_op(MDeformVert *dvert, MDeformVert *dvert_mirr,
const char sel, const char sel_mirr,
const int *flip_map, const int flip_map_len,
- const short mirror_weights, const short flip_vgroups)
+ const short mirror_weights, const short flip_vgroups,
+ const short all_vgroups, const int act_vgroup)
{
BLI_assert(sel || sel_mirr);
if(sel_mirr && sel) {
/* swap */
- if(mirror_weights)
- SWAP(MDeformVert, *dvert, *dvert_mirr);
+ if(mirror_weights) {
+ if (all_vgroups) {
+ SWAP(MDeformVert, *dvert, *dvert_mirr);
+ }
+ else {
+ MDeformWeight *dw= defvert_find_index(dvert, act_vgroup);
+ MDeformWeight *dw_mirr= defvert_find_index(dvert_mirr, act_vgroup);
+
+ if (dw || dw_mirr) {
+ if (dw_mirr == NULL)
+ dw_mirr= defvert_verify_index(dvert_mirr, act_vgroup);
+ if (dw == NULL)
+ dw= defvert_verify_index(dvert, act_vgroup);
+
+ SWAP(float, dw->weight, dw_mirr->weight);
+ }
+ }
+ }
+
if(flip_vgroups) {
defvert_flip(dvert, flip_map, flip_map_len);
defvert_flip(dvert_mirr, flip_map, flip_map_len);
@@ -1554,52 +1572,109 @@
}
}
-void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_vgroups)
+/* TODO, vgroup locking */
+/* TODO, face masking */
+void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_vgroups, const short all_vgroups)
{
-#define VGROUP_MIRR_OP dvert_mirror_op(dvert, dvert_mirr, sel, sel_mirr, flip_map, flip_map_len, mirror_weights, flip_vgroups)
+#define VGROUP_MIRR_OP \
+ dvert_mirror_op(dvert, dvert_mirr, \
+ sel, sel_mirr, \
+ flip_map, flip_map_len, \
+ mirror_weights, flip_vgroups, \
+ all_vgroups, act_vgroup \
+ )
+
EditVert *eve, *eve_mirr;
MDeformVert *dvert, *dvert_mirr;
short sel, sel_mirr;
int *flip_map, flip_map_len;
+ const int act_vgroup= ob->actdef > 0 ? ob->actdef-1 : 0;
if(mirror_weights==0 && flip_vgroups==0)
return;
- flip_map= defgroup_flip_map(ob, &flip_map_len, FALSE);
+ flip_map= all_vgroups ?
+ defgroup_flip_map(ob, &flip_map_len, FALSE) :
+ defgroup_flip_map_single(ob, &flip_map_len, FALSE, act_vgroup);
/* only the active group */
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
+ if (em) {
+ if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
+ MEM_freeN(flip_map);
+ return;
+ }
- if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
- MEM_freeN(flip_map);
- return;
+ EM_cache_x_mirror_vert(ob, em);
+
+ /* Go through the list of editverts and assign them */
+ for(eve=em->verts.first; eve; eve=eve->next){
+ if((eve_mirr=eve->tmp.v)) {
+ sel= eve->f & SELECT;
+ sel_mirr= eve_mirr->f & SELECT;
+
+ if((sel || sel_mirr) && (eve != eve_mirr)) {
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ dvert_mirr= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
+ if(dvert && dvert_mirr) {
+ VGROUP_MIRR_OP;
+ }
+ }
+
+ eve->tmp.v= eve_mirr->tmp.v= NULL;
+ }
+ }
+
+ BKE_mesh_end_editmesh(me, em);
}
+ else {
+ /* object mode / weight paint */
+ MVert *mv, *mv_mirr;
+ int vidx, vidx_mirr;
+ const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
- EM_cache_x_mirror_vert(ob, em);
+ if (me->dvert == NULL) {
+ MEM_freeN(flip_map);
+ return;
+ }
- /* Go through the list of editverts and assign them */
- for(eve=em->verts.first; eve; eve=eve->next){
- if((eve_mirr=eve->tmp.v)) {
- sel= eve->f & SELECT;
- sel_mirr= eve_mirr->f & SELECT;
+ if (!use_vert_sel) {
+ sel= sel_mirr= TRUE;
+ }
- if((sel || sel_mirr) && (eve != eve_mirr)) {
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- dvert_mirr= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
- if(dvert && dvert_mirr) {
+ /* tag verts we have used */
+ for(vidx= 0, mv= me->mvert; vidx < me->totvert; vidx++, mv++) {
+ mv->flag &= ~ME_VERT_TMP_TAG;
+ }
+
+ for(vidx= 0, mv= me->mvert; vidx < me->totvert; vidx++, mv++) {
+ if ( ((mv->flag & ME_VERT_TMP_TAG) == 0) &&
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list