diff options
author | Ton Roosendaal <ton@blender.org> | 2007-03-16 14:29:40 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2007-03-16 14:29:40 +0300 |
commit | dc9a21f25b3661fac4c2e87cac63e764a46e0452 (patch) | |
tree | ca5e2688f756171ecefe33c7bf4b8993978c46ee /source/blender/src/editdeform.c | |
parent | 001939bd66f614012e5618c302c23417cb608acb (diff) |
Patch #6121 by Diego Borghetti
Create/delete vertex groups now is possible in Object mode too (using the
buttons in editbuttons).
Diffstat (limited to 'source/blender/src/editdeform.c')
-rw-r--r-- | source/blender/src/editdeform.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c index 4a3156153ec..9b4b69130b8 100644 --- a/source/blender/src/editdeform.c +++ b/source/blender/src/editdeform.c @@ -201,6 +201,97 @@ bDeformGroup *add_defgroup_name (Object *ob, char *name) 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; |