[Bf-blender-cvs] [4cadccebfac] master: Revert "Mesh: replace saacos with acosf for normal calculation"

Campbell Barton noreply at git.blender.org
Fri Aug 13 11:45:55 CEST 2021


Commit: 4cadccebfacfa8533ba06403960e8b1218da61f5
Author: Campbell Barton
Date:   Fri Aug 13 19:38:19 2021 +1000
Branches: master
https://developer.blender.org/rB4cadccebfacfa8533ba06403960e8b1218da61f5

Revert "Mesh: replace saacos with acosf for normal calculation"

This reverts commit 41e650981861c2f18ab0548e18851d1d761066ff.

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.

===================================================================

M	source/blender/blenkernel/intern/mesh_normals.cc
M	source/blender/blenlib/intern/math_geom.c
M	source/blender/bmesh/intern/bmesh_mesh_normals.c

===================================================================

diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc
index aae50fa165e..9a761c6fa11 100644
--- a/source/blender/blenkernel/intern/mesh_normals.cc
+++ b/source/blender/blenkernel/intern/mesh_normals.cc
@@ -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);
 
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 43f2e08cf69..8afb6b5a2be 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -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);
diff --git a/source/blender/bmesh/intern/bmesh_mesh_normals.c b/source/blender/bmesh/intern/bmesh_mesh_normals.c
index 6a2cfdb056c..a5e41b74ee1 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_normals.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_normals.c
@@ -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);



More information about the Bf-blender-cvs mailing list