diff options
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 8 |
2 files changed, 17 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index af5a20e97b4..cee796c4cab 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -380,29 +380,31 @@ static void contarget_get_mesh_mat(Object *ob, const char *substring, float mat[ if (dm) { MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); int numVerts = dm->getNumVerts(dm); - int i, count = 0; + int i; float co[3], nor[3]; /* check that dvert is a valid pointers (just in case) */ if (dvert) { MDeformVert *dv = dvert; + float weightsum = 0.0f; + /* get the average of all verts with that are in the vertex-group */ for (i = 0; i < numVerts; i++, dv++) { MDeformWeight *dw = defvert_find_index(dv, defgroup); - if (dw && dw->weight != 0.0f) { + + if (dw && dw->weight > 0.0f) { dm->getVertCo(dm, i, co); dm->getVertNo(dm, i, nor); - add_v3_v3(vec, co); - add_v3_v3(normal, nor); - count++; - + madd_v3_v3fl(vec, co, dw->weight); + madd_v3_v3fl(normal, nor, dw->weight); + weightsum += dw->weight; } } /* calculate averages of normal and coordinates */ - if (count > 0) { - mul_v3_fl(vec, 1.0f / count); - mul_v3_fl(normal, 1.0f / count); + if (weightsum > 0) { + mul_v3_fl(vec, 1.0f / weightsum); + mul_v3_fl(normal, 1.0f / weightsum); } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 879d1895513..75000ec440b 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -239,12 +239,16 @@ static void layerInterp_mdeformvert(void **sources, const float *weights, for (j = 0; j < source->totweight; ++j) { MDeformWeight *dw = &source->dw[j]; + float weight = dw->weight * interp_weight; + + if (weight == 0.0f) + continue; for (node = dest_dw; node; node = node->next) { MDeformWeight *tmp_dw = (MDeformWeight *)node->link; if (tmp_dw->def_nr == dw->def_nr) { - tmp_dw->weight += dw->weight * interp_weight; + tmp_dw->weight += weight; break; } } @@ -254,7 +258,7 @@ static void layerInterp_mdeformvert(void **sources, const float *weights, MDeformWeight *tmp_dw = MEM_callocN(sizeof(*tmp_dw), "layerInterp_mdeformvert tmp_dw"); tmp_dw->def_nr = dw->def_nr; - tmp_dw->weight = dw->weight * interp_weight; + tmp_dw->weight = weight; BLI_linklist_prepend(&dest_dw, tmp_dw); totweight++; } |