? user-config.py ? tools/Blender.pyc ? tools/__init__.pyc ? tools/bcolors.pyc ? tools/btools.pyc Index: source/blender/include/BIF_editdeform.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/include/BIF_editdeform.h,v retrieving revision 1.11 diff -u -r1.11 BIF_editdeform.h --- source/blender/include/BIF_editdeform.h 3 Sep 2006 12:16:13 -0000 1.11 +++ source/blender/include/BIF_editdeform.h 27 Feb 2007 00:15:30 -0000 @@ -46,7 +46,9 @@ void unique_vertexgroup_name (struct bDeformGroup *dg, struct Object *ob); struct bDeformGroup *add_defgroup_name (struct Object *ob, char *name); void add_defgroup (struct Object *ob); +void del_defgroup_in_object_mode ( Object *ob ); void del_defgroup (struct Object *ob); +void duplicate_defgroup ( struct Object *ob ); void assign_verts_defgroup (void); void remove_verts_defgroup (int allverts); void sel_verts_defgroup (int select); Index: source/blender/include/butspace.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/include/butspace.h,v retrieving revision 1.101 diff -u -r1.101 butspace.h --- source/blender/include/butspace.h 1 Jan 2007 08:32:11 -0000 1.101 +++ source/blender/include/butspace.h 27 Feb 2007 00:15:31 -0000 @@ -417,6 +417,7 @@ #define B_DESELVGROUP 2096 #define B_AUTOVGROUP 2097 #define B_LINKEDVGROUP 2098 +#define B_COPYVGROUP 2099 Index: source/blender/src/buttons_editing.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/buttons_editing.c,v retrieving revision 1.360 diff -u -r1.360 buttons_editing.c --- source/blender/src/buttons_editing.c 23 Feb 2007 20:06:17 -0000 1.360 +++ source/blender/src/buttons_editing.c 27 Feb 2007 00:16:01 -0000 @@ -3834,7 +3834,10 @@ allqueue(REDRAWOOPS, 0); break; case B_DELVGROUP: - del_defgroup (ob); + if ((G.obedit) && (G.obedit == ob)) + del_defgroup (ob); + else + del_defgroup_in_object_mode (ob); allqueue (REDRAWVIEW3D, 1); allqueue(REDRAWOOPS, 0); BIF_undo_push("Delete vertex group"); @@ -3865,6 +3868,11 @@ case B_LINKEDVGROUP: copy_linked_vgroup_channels(ob); break; + case B_COPYVGROUP: + duplicate_defgroup (ob); + scrarea_queue_winredraw (curarea); + allqueue (REDRAWOOPS, 0); + break; } } @@ -4377,9 +4385,15 @@ uiBlockEndAlign(block); } else { + uiBlockBeginAlign (block); + uiDefBut (block, BUT, B_NEWVGROUP, "New", 143, 90, 70, 21, 0, 0, 0, 0, 0, "Creates a new vertex group"); + uiDefBut (block, BUT, B_DELVGROUP, "Delete", 213, 90, 70, 21, 0, 0, 0, 0, 0, "Removes the current vertex group"); + uiDefBut (block, BUT, B_COPYVGROUP, "Copy Group", 143, 70, 140, 19, 0, 0, 0, 0, 0, "Copy Group of Vertex"); + uiBlockEndAlign (block); + ID *id= ob->data; if(id->us>1) - uiDefBut(block, BUT,B_LINKEDVGROUP, "Copy To Linked", 143,69,140,20, 0, 0, 0, 0, 0, "Creates identical vertex group names in other Objects using this Object-data"); + uiDefBut(block, BUT,B_LINKEDVGROUP, "Copy To Linked", 143,50,140,20, 0, 0, 0, 0, 0, "Creates identical vertex group names in other Objects using this Object-data"); } } Index: source/blender/src/editdeform.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/editdeform.c,v retrieving revision 1.38 diff -u -r1.38 editdeform.c --- source/blender/src/editdeform.c 23 Feb 2007 20:34:27 -0000 1.38 +++ source/blender/src/editdeform.c 27 Feb 2007 00:16:02 -0000 @@ -201,6 +201,97 @@ return defgroup; } +void duplicate_defgroup ( Object *ob ) +{ + bDeformGroup *dg, *cdg; + char name[32], s[32]; + MDeformWeight *org, *cpy; + MDeformVert *dvert; + Mesh *me; + int i, idg, icdg; + + if (ob->type != OB_MESH) + return; + + dg = BLI_findlink (&ob->defbase, (ob->actdef-1)); + if (!dg) + return; + + snprintf (name, 32, "%s_copy", dg->name); + while (get_named_vertexgroup (ob, name)) { + if ((strlen (name) + 6) > 32) { + error ("Error: the name for the new group is > 32 characters"); + return; + } + strcpy (s, name); + snprintf (name, 32, "%s_copy", s); + } + + cdg = copy_defgroup (dg); + strcpy (cdg->name, name); + BLI_addtail (&ob->defbase, cdg); + + idg = (ob->actdef-1); + ob->actdef = BLI_countlist (&ob->defbase); + icdg = (ob->actdef-1); + + me = get_mesh (ob); + if (!me->dvert) + return; + + for (i = 0; i < me->totvert; i++) { + dvert = me->dvert+i; + org = get_defweight (dvert, idg); + if (org) { + cpy = verify_defweight (dvert, icdg); + cpy->weight = org->weight; + } + } +} + +void del_defgroup_in_object_mode ( Object *ob ) +{ + bDeformGroup *dg; + MDeformVert *dvert; + Mesh *me; + int i, e; + + if ((!ob) || (ob->type != OB_MESH)) + return; + + dg = BLI_findlink (&ob->defbase, (ob->actdef-1)); + if (!dg) + return; + + me = get_mesh (ob); + if (me->dvert) { + for (i = 0; i < me->totvert; i++) { + dvert = me->dvert + i; + if (dvert) { + if (get_defweight (dvert, (ob->actdef-1))) + remove_vert_defgroup (ob, dg, i); + } + } + + for (i = 0; i < me->totvert; i++) { + dvert = me->dvert+i; + if (dvert) { + for (e = 0; e < dvert->totweight; e++) { + if (dvert->dw[e].def_nr > (ob->actdef-1)) + dvert->dw[e].def_nr--; + } + } + } + } + + /* Update the active deform index if necessary */ + if (ob->actdef == BLI_countlist(&ob->defbase)) + ob->actdef--; + + /* Remove the group */ + BLI_freelinkN (&ob->defbase, dg); +} + void del_defgroup (Object *ob) { bDeformGroup *defgroup;