Revert "Mesh: replace saacos with acosf for normal calculation"
This reverts commit 41e6509818
.
This broke "CubeMaskFirst" test.
Any value even slightly outside the [-1.0..1.0] range
caused the result to be nan, which can happen when calculating
the dot-product between two unit length vectors.
This commit is contained in:
parent
b9486c39bc
commit
4cadccebfa
|
@ -230,10 +230,8 @@ 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.
|
||||
* 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));
|
||||
/* Calculate angle between the two poly edges incident on this vertex. */
|
||||
const float fac = saacos(-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);
|
||||
|
@ -1158,11 +1156,9 @@ 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.
|
||||
* 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));
|
||||
/* 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));
|
||||
/* Accumulate */
|
||||
madd_v3_v3fl(lnor, polynors[mpfan_curr_index], fac);
|
||||
|
||||
|
|
|
@ -5307,10 +5307,7 @@ void accumulate_vertex_normals_tri_v3(float n1[3],
|
|||
|
||||
for (i = 0; i < nverts; i++) {
|
||||
const float *cur_edge = vdiffs[i];
|
||||
/* 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));
|
||||
const float fac = saacos(-dot_v3v3(cur_edge, prev_edge));
|
||||
|
||||
/* accumulate */
|
||||
madd_v3_v3fl(vn[i], f_no, fac);
|
||||
|
@ -5389,10 +5386,9 @@ 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.
|
||||
* 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));
|
||||
/* calculate angle between the two poly edges incident on
|
||||
* this vertex */
|
||||
const float fac = saacos(-dot_v3v3(cur_edge, prev_edge));
|
||||
|
||||
/* accumulate */
|
||||
madd_v3_v3fl(vertnos[i], polyno, fac);
|
||||
|
|
|
@ -84,13 +84,11 @@ 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;
|
||||
}
|
||||
/* 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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
static void bm_vert_calc_normals_impl(BMVert *v)
|
||||
|
@ -682,11 +680,9 @@ 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.
|
||||
* NOTE: no need for #saacos here as the input has been sanitized,
|
||||
* `nan` values in coordinates normalize to zero which works for `acosf`. */
|
||||
/* Calculate angle between the two poly edges incident on this vertex. */
|
||||
const BMFace *f = lfan_pivot->f;
|
||||
const float fac = acosf(dot_v3v3(vec_next, vec_curr));
|
||||
const float fac = saacos(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);
|
||||
|
|
Loading…
Reference in New Issue