Преглед изворни кода

Added check that client and library are compiled with the same defines (#604)

Jorrit Rouwe пре 2 година
родитељ
комит
b6c184a25d
3 измењених фајлова са 68 додато и 2 уклоњено
  1. 56 0
      Jolt/Core/Core.h
  2. 8 1
      Jolt/RegisterTypes.cpp
  3. 4 1
      Jolt/RegisterTypes.h

+ 56 - 0
Jolt/Core/Core.h

@@ -4,6 +4,62 @@
 
 #pragma once
 
+// Jolt library version
+#define JPH_VERSION_MAJOR 3
+#define JPH_VERSION_MINOR 0
+#define JPH_VERSION_PATCH 1
+
+// Determine which features the library was compiled with
+#ifdef JPH_DOUBLE_PRECISION
+	#define JPH_VERSION_FEATURE_BIT_1 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_1 0
+#endif
+#ifdef JPH_CROSS_PLATFORM_DETERMINISTIC
+	#define JPH_VERSION_FEATURE_BIT_2 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_2 0
+#endif
+#ifdef JPH_FLOATING_POINT_EXCEPTIONS_ENABLED
+	#define JPH_VERSION_FEATURE_BIT_3 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_3 0
+#endif
+#ifdef JPH_PROFILE_ENABLED
+	#define JPH_VERSION_FEATURE_BIT_4 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_4 0
+#endif
+#ifdef JPH_EXTERNAL_PROFILE
+	#define JPH_VERSION_FEATURE_BIT_5 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_5 0
+#endif
+#ifdef JPH_DEBUG_RENDERER
+	#define JPH_VERSION_FEATURE_BIT_6 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_6 0
+#endif
+#ifdef JPH_DISABLE_TEMP_ALLOCATOR
+	#define JPH_VERSION_FEATURE_BIT_7 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_7 0
+#endif
+#ifdef JPH_DISABLE_CUSTOM_ALLOCATOR
+	#define JPH_VERSION_FEATURE_BIT_8 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_8 0
+#endif
+#if defined(JPH_OBJECT_LAYER_BITS) && JPH_OBJECT_LAYER_BITS == 32
+	#define JPH_VERSION_FEATURE_BIT_9 1
+#else
+	#define JPH_VERSION_FEATURE_BIT_9 0
+#endif
+#define JPH_VERSION_FEATURES (uint64(JPH_VERSION_FEATURE_BIT_1) | (JPH_VERSION_FEATURE_BIT_2 << 1) | (JPH_VERSION_FEATURE_BIT_3 << 2) | (JPH_VERSION_FEATURE_BIT_4 << 3) | (JPH_VERSION_FEATURE_BIT_5 << 4) | (JPH_VERSION_FEATURE_BIT_6 << 5) | (JPH_VERSION_FEATURE_BIT_7 << 6) | (JPH_VERSION_FEATURE_BIT_8 << 7) | (JPH_VERSION_FEATURE_BIT_9 << 8))
+
+// Combine the version and features in a single ID
+#define JPH_VERSION_ID ((JPH_VERSION_FEATURES << 24) | (JPH_VERSION_MAJOR << 16) | (JPH_VERSION_MINOR << 8) | JPH_VERSION_PATCH)
+
 // Determine platform
 #if defined(JPH_PLATFORM_BLUE)
 	// Correct define already defined, this overrides everything else

+ 8 - 1
Jolt/RegisterTypes.cpp

@@ -66,8 +66,15 @@ JPH_DECLARE_RTTI_WITH_NAMESPACE_FOR_FACTORY(JPH_EXPORT, JPH, GroupFilterTable)
 
 JPH_NAMESPACE_BEGIN
 
-void RegisterTypes()
+void RegisterTypesInternal(uint64 inVersionID)
 {
+	// Version check
+	if (inVersionID != JPH_VERSION_ID)
+	{
+		JPH_ASSERT(false, "Version mismatch, make sure you compile the client code with the same Jolt version and compiler definitions!");
+		JPH_CRASH;
+	}
+
 #ifndef JPH_DISABLE_CUSTOM_ALLOCATOR
 	JPH_ASSERT(Allocate != nullptr && Free != nullptr && AlignedAllocate != nullptr && AlignedFree != nullptr, "Need to supply an allocator first or call RegisterDefaultAllocator()");
 #endif // !JPH_DISABLE_CUSTOM_ALLOCATOR

+ 4 - 1
Jolt/RegisterTypes.h

@@ -6,8 +6,11 @@
 
 JPH_NAMESPACE_BEGIN
 
+/// Internal helper function
+JPH_EXPORT extern void RegisterTypesInternal(uint64 inVersionID);
+
 /// Register all physics types with the factory
-JPH_EXPORT extern void RegisterTypes();
+inline void RegisterTypes() { RegisterTypesInternal(JPH_VERSION_ID); }
 
 /// Unregisters all types with the factory and cleans up the default material
 JPH_EXPORT extern void UnregisterTypes();