fix [#33489] Scaling normals with Alt (maintains shell thickness) producing wrong result.

not exactly a bug - zero area faces from a cancelled extrude gave issues - but this is a common use case, so make it work by only using selected faces when calculating the vertex shell thickness.
This commit is contained in:
Campbell Barton
2012-12-12 14:34:21 +00:00
parent bee7c20a97
commit 96cad133f7

View File

@@ -1879,6 +1879,40 @@ static void get_edge_center(float cent_r[3], BMVert *eve)
}
}
/* local version of #BM_vert_calc_shell_factor which only
* uses selected faces */
static float bm_vert_calc_shell_factor_selected(BMVert *v)
{
BMIter iter;
BMLoop *l;
float accum_shell = 0.0f;
float accum_angle = 0.0f;
int tot_sel = 0, tot = 0;
BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
if (BM_elem_flag_test(l->f, BM_ELEM_SELECT)) { /* <-- only difference to BM_vert_calc_shell_factor! */
const float face_angle = BM_loop_calc_face_angle(l);
accum_shell += shell_angle_to_dist(angle_normalized_v3v3(v->no, l->f->no)) * face_angle;
accum_angle += face_angle;
tot_sel++;
}
tot++;
}
if (accum_angle != 0.0f) {
return accum_shell / accum_angle;
}
else {
if (tot != 0 && tot_sel == 0) {
/* none selected, so use all */
return BM_vert_calc_shell_factor(v);
}
else {
return 1.0f;
}
}
}
/* way to overwrite what data is edited with transform */
static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx,
BMEditMesh *em, BMVert *eve, float *bweight)
@@ -1927,7 +1961,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx
}
else if (t->mode == TFM_SHRINKFATTEN) {
td->ext = tx;
tx->isize[0] = BM_vert_calc_shell_factor(eve);
tx->isize[0] = bm_vert_calc_shell_factor_selected(eve);
}
}