Browse Source

Fixed -DVec3::sZero() to be the same across platforms (#1121)

Jorrit Rouwe 1 year ago
parent
commit
09fbedbf96
2 changed files with 21 additions and 2 deletions
  1. 11 2
      Jolt/Math/DVec3.inl
  2. 10 0
      UnitTests/Math/DVec3Tests.cpp

+ 11 - 2
Jolt/Math/DVec3.inl

@@ -610,9 +610,18 @@ DVec3 DVec3::operator - () const
 	__m128d zero = _mm_setzero_pd();
 	__m128d zero = _mm_setzero_pd();
 	return DVec3({ _mm_sub_pd(zero, mValue.mLow), _mm_sub_pd(zero, mValue.mHigh) });
 	return DVec3({ _mm_sub_pd(zero, mValue.mLow), _mm_sub_pd(zero, mValue.mHigh) });
 #elif defined(JPH_USE_NEON)
 #elif defined(JPH_USE_NEON)
-	return DVec3({ vnegq_f64(mValue.val[0]), vnegq_f64(mValue.val[1]) });
+	#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
+		float64x2_t zero = vdupq_n_f64(0);
+		return DVec3({ vsubq_f64(zero, mValue.val[0]), vsubq_f64(zero, mValue.val[1]) });
+	#else
+		return DVec3({ vnegq_f64(mValue.val[0]), vnegq_f64(mValue.val[1]) });
+	#endif
 #else
 #else
-	return DVec3(-mF64[0], -mF64[1], -mF64[2]);
+	#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
+		return DVec3(0.0 - mF64[0], 0.0 - mF64[1], 0.0 - mF64[2]);
+	#else
+		return DVec3(-mF64[0], -mF64[1], -mF64[2]);
+	#endif
 #endif
 #endif
 }
 }
 
 

+ 10 - 0
UnitTests/Math/DVec3Tests.cpp

@@ -172,6 +172,16 @@ TEST_SUITE("DVec3Tests")
 	{
 	{
 		CHECK(-DVec3(1, 2, 3) == DVec3(-1, -2, -3));
 		CHECK(-DVec3(1, 2, 3) == DVec3(-1, -2, -3));
 
 
+		DVec3 neg_zero = -DVec3::sZero();
+		CHECK(neg_zero == DVec3::sZero());
+
+	#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
+		// When cross platform deterministic, we want to make sure that -0 is represented as 0
+		CHECK(BitCast<uint64>(neg_zero.GetX()) == 0);
+		CHECK(BitCast<uint64>(neg_zero.GetY()) == 0);
+		CHECK(BitCast<uint64>(neg_zero.GetZ()) == 0);
+	#endif // JPH_CROSS_PLATFORM_DETERMINISTIC
+
 		CHECK(DVec3(1, 2, 3) + Vec3(4, 5, 6) == DVec3(5, 7, 9));
 		CHECK(DVec3(1, 2, 3) + Vec3(4, 5, 6) == DVec3(5, 7, 9));
 		CHECK(DVec3(1, 2, 3) - Vec3(6, 5, 4) == DVec3(-5, -3, -1));
 		CHECK(DVec3(1, 2, 3) - Vec3(6, 5, 4) == DVec3(-5, -3, -1));