Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-08-13 08:36:49 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-08-13 08:39:39 +0300
commit41e650981861c2f18ab0548e18851d1d761066ff (patch)
treef739cc70e57289fbaa47ef11e863b2e3cae2d18c
parent8fa05efe0a19126b44cc283232e05e0e53d6db84 (diff)
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.
-rw-r--r--source/blender/blenkernel/intern/mesh_normals.cc14
-rw-r--r--source/blender/blenlib/intern/math_geom.c12
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_normals.c18
3 files changed, 28 insertions, 16 deletions
diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc
index 9a761c6fa11..aae50fa165e 100644
--- a/source/blender/blenkernel/intern/mesh_normals.cc
+++ b/source/blender/blenkernel/intern/mesh_normals.cc
@@ -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);
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 8afb6b5a2be..43f2e08cf69 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -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);
diff --git a/source/blender/bmesh/intern/bmesh_mesh_normals.c b/source/blender/bmesh/intern/bmesh_mesh_normals.c
index a5e41b74ee1..6a2cfdb056c 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_normals.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_normals.c
@@ -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);