Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-06-04 23:37:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-04 23:37:18 +0400
commitc630435b3cb95a476b528f2c0f9f70c846a6c00b (patch)
tree60e11e4d94de3ef7f7a7c1661bba208f729759a3 /source
parentd1e78aa75da6c3b23af86d6a5609966470e49ad2 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/bmesh/operators/bmo_fill_grid.c14
-rw-r--r--source/blender/editors/object/object_vgroup.c76
2 files changed, 50 insertions, 40 deletions
diff --git a/source/blender/bmesh/operators/bmo_fill_grid.c b/source/blender/bmesh/operators/bmo_fill_grid.c
index 3d865f70ccb..7d4b780baf5 100644
--- a/source/blender/bmesh/operators/bmo_fill_grid.c
+++ b/source/blender/bmesh/operators/bmo_fill_grid.c
@@ -64,15 +64,15 @@ static void quad_edges_to_normal(
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];
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index e094cbc882b..5329ec732be 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -2408,10 +2408,11 @@ static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg)
/* 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 @@ static void vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformG
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) {
- ED_vgroup_data_create(&me->id);
- }
+ if (me->dvert) {
+ MVert *mv;
+ int i;
- 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 @@ static void vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformG
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 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
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 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
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 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
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 @@ static void vgroup_assign_verts(Object *ob, const float weight)
/* 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 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
{
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);