diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-01-07 12:50:23 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-01-07 12:50:23 +0300 |
commit | 57a3cff3b890d93089a1b45c40bdc14d8101fb5e (patch) | |
tree | 32212f25dfe1dc064ee2d3d2dac747f415795f8d /source/blender/editors/object | |
parent | 41c00063dd43f1a653747129bdb29dcdb13818dd (diff) |
patch [#25440] Object.vertex_group fixin'
from Dan Eicher (dna)
From the tracker (with minor edits)
========================
cube = bpy.data.objects['Cube']
foo = cube.vertex_groups.new('foo')
foo.add([1,3,5,7], 1.0, 'ADD')
for i in range(len(cube.data.vertices)):
try:
weight = foo.weight(i)
print('vert: %i weight: %f' % (i, weight))
except:
pass
foo.remove([1,3])
cube.vertex_groups.remove(foo)
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index d95220fa379..410ad9394a3 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -68,6 +68,8 @@ /************************ Exported Functions **********************/ static void vgroup_remap_update_users(Object *ob, int *map); +static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *defgroup); +static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg); static Lattice *vgroup_edit_lattice(Object *ob) { @@ -79,6 +81,16 @@ static Lattice *vgroup_edit_lattice(Object *ob) return NULL; } +int ED_vgroup_object_is_edit_mode(Object *ob) +{ + if(ob->type == OB_MESH) + return (((Mesh*)ob->data)->edit_mesh != NULL); + else if(ob->type == OB_LATTICE) + return (((Lattice*)ob->data)->editlatt != NULL); + + return 0; +} + bDeformGroup *ED_vgroup_add_name(Object *ob, const char *name) { bDeformGroup *defgroup; @@ -103,6 +115,25 @@ bDeformGroup *ED_vgroup_add(Object *ob) return ED_vgroup_add_name(ob, "Group"); } +void ED_vgroup_delete(Object *ob, bDeformGroup *defgroup) +{ + bDeformGroup *dg = (bDeformGroup *)ob->defbase.first; + + while (dg) { + if (dg == defgroup) + break; + dg = dg->next; + } + + if (dg == NULL) + return; + + if(ED_vgroup_object_is_edit_mode(ob)) + vgroup_delete_edit_mode(ob, dg); + else + vgroup_delete_object_mode(ob, dg); +} + void ED_vgroup_data_create(ID *id) { /* create deform verts */ @@ -508,7 +539,7 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) } if(dvert==NULL) - return 0.0f; + return -1; dvert += vertnum; @@ -516,17 +547,17 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) if(dvert->dw[i].def_nr == def_nr) return dvert->dw[i].weight; - return 0.0f; + return -1; } float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum) { int def_nr; - if(!ob) return 0.0f; + if(!ob) return -1; def_nr = defgroup_find_index(ob, dg); - if(def_nr < 0) return 0.0f; + if(def_nr < 0) return -1; return get_vert_def_nr(ob, def_nr, vertnum); } @@ -1094,16 +1125,11 @@ static void vgroup_delete_update_users(Object *ob, int id) } -static void vgroup_delete_object_mode(Object *ob) +static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg) { - bDeformGroup *dg; MDeformVert *dvert, *dvert_array=NULL; int i, e, dvert_tot=0; - dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); - if(!dg) - return; - ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); if(dvert_array) { @@ -1199,18 +1225,13 @@ static void vgroup_active_remove_verts(Object *ob, int allverts) } } -static void vgroup_delete_edit_mode(Object *ob) +static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *defgroup) { - bDeformGroup *defgroup; int i; if(!ob->actdef) return; - defgroup = BLI_findlink(&ob->defbase, ob->actdef-1); - if(!defgroup) - return; - /* Make sure that no verts are using this group */ vgroup_active_remove_verts(ob, 1); @@ -1286,10 +1307,14 @@ static int vgroup_object_in_edit_mode(Object *ob) static void vgroup_delete(Object *ob) { + bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef-1); + if(!dg) + return; + if(vgroup_object_in_edit_mode(ob)) - vgroup_delete_edit_mode(ob); + vgroup_delete_edit_mode(ob, dg); else - vgroup_delete_object_mode(ob); + vgroup_delete_object_mode(ob, dg); } static void vgroup_delete_all(Object *ob) |