Mesh: replace saacos with acosf for normal calculation

The clamped version of acos isn't needed as degenerate (nan) coordinates
result in zeroed vectors which don't need clamping.
This commit is contained in:
Campbell Barton 2021-08-13 15:36:49 +10:00
parent 8fa05efe0a
commit 41e6509818
Notes: blender-bot 2023-11-20 12:14:32 +01:00
Referenced by commit 4cadccebfa, Revert "Mesh: replace saacos with acosf for normal calculation"
3 changed files with 28 additions and 16 deletions

View File

@ -230,8 +230,10 @@ static void mesh_calc_normals_poly_and_vertex_accum_fn(
copy_v3_v3(edvec_next, edvec_end);
}
/* Calculate angle between the two poly edges incident on this vertex. */
const float fac = saacos(-dot_v3v3(edvec_prev, edvec_next));
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const float fac = acosf(-dot_v3v3(edvec_prev, edvec_next));
const float vnor_add[3] = {pnor[0] * fac, pnor[1] * fac, pnor[2] * fac};
add_v3_v3_atomic(vnors[ml[i_curr].v], vnor_add);
@ -1156,9 +1158,11 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, LoopSpli
// printf("\thandling edge %d / loop %d\n", mlfan_curr->e, mlfan_curr_index);
{
/* Code similar to accumulate_vertex_normals_poly_v3. */
/* Calculate angle between the two poly edges incident on this vertex. */
const float fac = saacos(dot_v3v3(vec_curr, vec_prev));
/* Code similar to #accumulate_vertex_normals_poly_v3. */
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const float fac = acosf(dot_v3v3(vec_curr, vec_prev));
/* Accumulate */
madd_v3_v3fl(lnor, polynors[mpfan_curr_index], fac);

View File

@ -5307,7 +5307,10 @@ void accumulate_vertex_normals_tri_v3(float n1[3],
for (i = 0; i < nverts; i++) {
const float *cur_edge = vdiffs[i];
const float fac = saacos(-dot_v3v3(cur_edge, prev_edge));
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const float fac = acosf(-dot_v3v3(cur_edge, prev_edge));
/* accumulate */
madd_v3_v3fl(vn[i], f_no, fac);
@ -5386,9 +5389,10 @@ void accumulate_vertex_normals_poly_v3(float **vertnos,
for (i = 0; i < nverts; i++) {
const float *cur_edge = vdiffs[i];
/* calculate angle between the two poly edges incident on
* this vertex */
const float fac = saacos(-dot_v3v3(cur_edge, prev_edge));
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const float fac = acosf(-dot_v3v3(cur_edge, prev_edge));
/* accumulate */
madd_v3_v3fl(vertnos[i], polyno, fac);

View File

@ -84,11 +84,13 @@ BLI_INLINE void bm_vert_calc_normals_accum_loop(const BMLoop *l_iter,
if ((l_iter->prev->e->v1 == l_iter->prev->v) ^ (l_iter->e->v1 == l_iter->v)) {
dotprod = -dotprod;
}
const float fac = saacos(-dotprod);
/* NAN detection, otherwise this is a degenerated case, ignore that vertex in this case. */
if (fac == fac) {
madd_v3_v3fl(v_no, f_no, fac);
}
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const float fac = acosf(-dotprod);
/* NAN values should never happen. */
BLI_assert(fac == fac);
madd_v3_v3fl(v_no, f_no, fac);
}
static void bm_vert_calc_normals_impl(BMVert *v)
@ -680,9 +682,11 @@ static int bm_mesh_loops_calc_normals_for_loop(BMesh *bm,
{
/* Code similar to accumulate_vertex_normals_poly_v3. */
/* Calculate angle between the two poly edges incident on this vertex. */
/* Calculate angle between the two poly edges incident on this vertex.
* NOTE: no need for #saacos here as the input has been sanitized,
* `nan` values in coordinates normalize to zero which works for `acosf`. */
const BMFace *f = lfan_pivot->f;
const float fac = saacos(dot_v3v3(vec_next, vec_curr));
const float fac = acosf(dot_v3v3(vec_next, vec_curr));
const float *no = fnos ? fnos[BM_elem_index_get(f)] : f->no;
/* Accumulate */
madd_v3_v3fl(lnor, no, fac);