Browse Source

Made GJK deal with NaNs, this will no longer loop forever.

jorrit 3 years ago
parent
commit
0a48d2eaf6
1 changed files with 11 additions and 11 deletions
  1. 11 11
      Jolt/Geometry/GJKClosestPoint.h

+ 11 - 11
Jolt/Geometry/GJKClosestPoint.h

@@ -73,20 +73,20 @@ private:
 #endif
 #endif
 
 
 		float v_len_sq = v.LengthSq();
 		float v_len_sq = v.LengthSq();
-		if (v_len_sq >= inPrevVLenSq)
+		if (v_len_sq < inPrevVLenSq) // Note, comparison order important: If v_len_sq is NaN then this expression will be false so we will return false
 		{
 		{
-			// No better match found
-#ifdef JPH_GJK_DEBUG
-			Trace("New closer point is further away, failed to converge");
-#endif
-			return false;
+			// Return closest point
+			outV = v;
+			outVLenSq = v_len_sq;
+			outSet = set;
+			return true;
 		}
 		}
 
 
-		// Return closest point
-		outV = v;
-		outVLenSq = v_len_sq;
-		outSet = set;
-		return true;
+		// No better match found
+#ifdef JPH_GJK_DEBUG
+		Trace("New closer point is further away, failed to converge");
+#endif
+		return false;
 	}
 	}
 
 
 	// Get max(|Y_0|^2 .. |Y_n|^2)
 	// Get max(|Y_0|^2 .. |Y_n|^2)