Commit: c71e160c022abf0cc8425970e31c09ded15763a2
Author: Bastien Montagne
Date:   Thu Jun 8 14:02:49 2017 +0200
Branches: master
https://developer.blender.org/rBc71e160c022abf0cc8425970e31c09ded15763a2

Fix T51733: 3d print toolbox checks report false positives.

Colinear vertices in a same face would not be handled correctly.

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

M       source/blender/bmesh/intern/bmesh_queries.c

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

diff --git a/source/blender/bmesh/intern/bmesh_queries.c 
b/source/blender/bmesh/intern/bmesh_queries.c
index a774f278c98..f5c14304ea3 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -1515,16 +1515,30 @@ float BM_loop_calc_face_angle(const BMLoop *l)
  */
 void BM_loop_calc_face_normal(const BMLoop *l, float r_normal[3])
 {
-       if (normal_tri_v3(r_normal,
-                         l->prev->v->co,
-                         l->v->co,
-                         l->next->v->co) != 0.0f)
-       {
-               /* pass */
+#define FEPSILON 1e-5f
+
+       /* Note: we cannot use result of normal_tri_v3 here to detect colinear 
vectors (vertex on a straight line)
+        * from zero value, because it does not normalize both vectors before 
making crossproduct.
+        * Instead of adding two costly normalize computations, just check 
ourselves for colinear case. */
+       /* Note: FEPSILON might need some finer tweaking at some point? Seems 
to be working OK for now though. */
+       float v1[3], v2[3], v_tmp[3];
+       sub_v3_v3v3(v1, l->prev->v->co, l->v->co);
+       sub_v3_v3v3(v2, l->next->v->co, l->v->co);
+
+       const float fac = (v2[0] == 0.0f) ? ((v2[1] == 0.0f) ? ((v2[2] == 0.0f) 
? 0.0f : v1[2] / v2[2]) : v1[1] / v2[1]) : v1[0] / v2[0];
+
+       mul_v3_v3fl(v_tmp, v2, fac);
+       sub_v3_v3(v_tmp, v1);
+       if (fac != 0.0f && !is_zero_v3(v1) && len_manhattan_v3(v_tmp) > 
FEPSILON) {
+               /* Not co-linear, we can compute crossproduct and normalize it 
into normal. */
+               cross_v3_v3v3(r_normal, v1, v2);
+               normalize_v3(r_normal);
        }
        else {
                copy_v3_v3(r_normal, l->f->no);
        }
+
+#undef FEPSILON
 }
 
 /**

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to