[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57239] trunk/blender/source/blender: fix own error with removing vertex weights not checking for non-existing weights .
Campbell Barton
ideasman42 at gmail.com
Tue Jun 4 21:37:18 CEST 2013
Revision: 57239
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57239
Author: campbellbarton
Date: 2013-06-04 19:37:18 +0000 (Tue, 04 Jun 2013)
Log Message:
-----------
fix own error with removing vertex weights not checking for non-existing weights.
however this exposed some other odd behavior.
removing a vertex group would add one if not found but only for meshes, not lattices.
now just skip removal if not found.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c
trunk/blender/source/blender/editors/object/object_vgroup.c
Modified: trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c 2013-06-04 18:21:11 UTC (rev 57238)
+++ trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c 2013-06-04 19:37:18 UTC (rev 57239)
@@ -64,15 +64,15 @@
static void quad_verts_to_barycentric_tri(
float tri[3][3],
- float co_a[3],
- float co_b[3],
+ const float co_a[3],
+ const float co_b[3],
- float co_a_next[3],
- float co_b_next[3],
+ const float co_a_next[3],
+ const float co_b_next[3],
- float co_a_prev[3],
- float co_b_prev[3],
- bool is_flip
+ const float co_a_prev[3],
+ const float co_b_prev[3],
+ const bool is_flip
)
{
float no[3];
Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2013-06-04 18:21:11 UTC (rev 57238)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2013-06-04 19:37:18 UTC (rev 57239)
@@ -2408,10 +2408,11 @@
/* only in editmode */
/* removes from active defgroup, if allverts==0 only selected vertices */
-static void vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformGroup *dg)
+static bool vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformGroup *dg)
{
MDeformVert *dv;
const int def_nr = BLI_findindex(&ob->defbase, dg);
+ bool change = false;
if (ob->type == OB_MESH) {
Mesh *me = ob->data;
@@ -2420,34 +2421,36 @@
BMEditMesh *em = me->edit_btmesh;
const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- BMVert *eve;
- BMIter iter;
+ if (cd_dvert_offset != -1) {
+ BMVert *eve;
+ BMIter iter;
- BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
- if (dv && dv->dw && (allverts || BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
- MDeformWeight *dw = defvert_find_index(dv, def_nr);
- defvert_remove_group(dv, dw); /* dw can be NULL */
+ if (dv && dv->dw && (allverts || BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
+ MDeformWeight *dw = defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ change = true;
+ }
}
}
}
else {
- MVert *mv;
- int i;
+ if (me->dvert) {
+ MVert *mv;
+ int i;
- if (!me->dvert) {
- ED_vgroup_data_create(&me->id);
- }
+ mv = me->mvert;
+ dv = me->dvert;
- mv = me->mvert;
- dv = me->dvert;
-
- for (i = 0; i < me->totvert; i++, mv++, dv++) {
- if (mv->flag & SELECT) {
- if (dv->dw && (allverts || (mv->flag & SELECT))) {
- MDeformWeight *dw = defvert_find_index(dv, def_nr);
- defvert_remove_group(dv, dw); /* dw can be NULL */
+ for (i = 0; i < me->totvert; i++, mv++, dv++) {
+ if (mv->flag & SELECT) {
+ if (dv->dw && (allverts || (mv->flag & SELECT))) {
+ MDeformWeight *dw = defvert_find_index(dv, def_nr);
+ defvert_remove_group(dv, dw); /* dw can be NULL */
+ change = true;
+ }
}
}
}
@@ -2468,10 +2471,13 @@
dw = defvert_find_index(dv, def_nr);
defvert_remove_group(dv, dw); /* dw can be NULL */
+ change = true;
}
}
}
}
+
+ return change;
}
static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
@@ -2482,10 +2488,11 @@
assert(dg_index > -1);
/* Make sure that no verts are using this group */
- vgroup_active_remove_verts(ob, true, dg);
-
+ if (vgroup_active_remove_verts(ob, true, dg) == false) {
+ /* do nothing */
+ }
/* Make sure that any verts with higher indices are adjusted accordingly */
- if (ob->type == OB_MESH) {
+ else if (ob->type == OB_MESH) {
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
@@ -2493,7 +2500,7 @@
BMIter iter;
BMVert *eve;
MDeformVert *dvert;
-
+
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
@@ -2508,7 +2515,7 @@
BPoint *bp;
MDeformVert *dvert = lt->dvert;
int a, tot;
-
+
if (dvert) {
tot = lt->pntsu * lt->pntsv * lt->pntsw;
for (a = 0, bp = lt->def; a < tot; a++, bp++, dvert++) {
@@ -2691,16 +2698,18 @@
/* only in editmode */
/* removes from all defgroup, if allverts==0 only selected vertices */
-static void vgroup_remove_verts(Object *ob, int allverts)
+static bool vgroup_remove_verts(Object *ob, int allverts)
{
+ bool change = false;
/* To prevent code redundancy, we just use vgroup_active_remove_verts, but that
* only operates on the active vgroup. So we iterate through all groups, by changing
* active group index
*/
bDeformGroup *dg;
for (dg = ob->defbase.first; dg; dg = dg->next) {
- vgroup_active_remove_verts(ob, allverts, dg);
+ change |= vgroup_active_remove_verts(ob, allverts, dg);
}
+ return change;
}
/********************** vertex group operators *********************/
@@ -2840,16 +2849,17 @@
{
Object *ob = ED_object_context(C);
- if (RNA_boolean_get(op->ptr, "all"))
- vgroup_remove_verts(ob, 0);
+ if (RNA_boolean_get(op->ptr, "all")) {
+ if (vgroup_remove_verts(ob, 0) == false) {
+ return OPERATOR_CANCELLED;
+ }
+ }
else {
bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef - 1);
- if (dg == NULL) {
+ if ((dg == NULL) || (vgroup_active_remove_verts(ob, false, dg) == false)) {
return OPERATOR_CANCELLED;
}
-
- vgroup_active_remove_verts(ob, false, dg);
}
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
More information about the Bf-blender-cvs
mailing list