[Bf-blender-cvs] [c9c6433a595] master: Fix T57923: Freeze in mesh vnors computation code with some degenerated geometry.

Bastien Montagne noreply at git.blender.org
Tue Nov 20 17:56:34 CET 2018


Commit: c9c6433a59549dbdf56298ae81a0b890639a6e0b
Author: Bastien Montagne
Date:   Tue Nov 20 17:52:21 2018 +0100
Branches: master
https://developer.blender.org/rBc9c6433a59549dbdf56298ae81a0b890639a6e0b

Fix T57923: Freeze in mesh vnors computation code with some degenerated geometry.

Fix first part of it, the freeze itself being caused by float NAN values
never comparing equal to anything, not even themselves.

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

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

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 95e667004fe..7a63fa3c64f 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -363,6 +363,8 @@ typedef struct BMVertsCalcNormalsData {
 
 static void mesh_verts_calc_normals_accum_cb(void *userdata, MempoolIterData *mp_f)
 {
+#define FLT_EQ_NONAN(_fa, _fb) (*((const uint32_t *)&_fa) == *((const uint32_t *)&_fb))
+
 	BMVertsCalcNormalsData *data = userdata;
 	BMFace *f = (BMFace *)mp_f;
 
@@ -405,7 +407,7 @@ static void mesh_verts_calc_normals_accum_cb(void *userdata, MempoolIterData *mp
 			 *   - v_no[0] was not FLT_MAX, i.e. it was not locked by another thread.
 			 */
 			const float vl = atomic_cas_float(&v_no[0], virtual_lock, FLT_MAX);
-			if (vl == virtual_lock && vl != FLT_MAX) {
+			if (FLT_EQ_NONAN(vl, virtual_lock) && vl != FLT_MAX) {
 				break;
 			}
 			virtual_lock = vl;
@@ -423,6 +425,8 @@ static void mesh_verts_calc_normals_accum_cb(void *userdata, MempoolIterData *mp
 		BLI_assert(virtual_lock == FLT_MAX);
 
 	} while ((l_iter = l_iter->next) != l_first);
+
+#undef FLT_EQ_NONAN
 }
 
 static void mesh_verts_calc_normals_normalize_cb(void *userdata, MempoolIterData *mp_v)



More information about the Bf-blender-cvs mailing list