@bloomengine/engine 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/native/shared/build.rs +137 -6
  2. package/package.json +4 -11
  3. package/native/third_party/JoltPhysics/Build/Android/PerformanceTest/build.gradle +0 -51
  4. package/native/third_party/JoltPhysics/Build/Android/PerformanceTest/src/main/AndroidManifest.xml +0 -20
  5. package/native/third_party/JoltPhysics/Build/Android/PerformanceTest/src/main/cpp/CMakeLists.txt +0 -20
  6. package/native/third_party/JoltPhysics/Build/Android/UnitTests/build.gradle +0 -51
  7. package/native/third_party/JoltPhysics/Build/Android/UnitTests/src/main/AndroidManifest.xml +0 -20
  8. package/native/third_party/JoltPhysics/Build/Android/UnitTests/src/main/cpp/CMakeLists.txt +0 -20
  9. package/native/third_party/JoltPhysics/Build/Android/build.gradle +0 -17
  10. package/native/third_party/JoltPhysics/Build/Android/gradle/wrapper/gradle-wrapper.jar +0 -0
  11. package/native/third_party/JoltPhysics/Build/Android/gradle/wrapper/gradle-wrapper.properties +0 -5
  12. package/native/third_party/JoltPhysics/Build/Android/gradle.properties +0 -21
  13. package/native/third_party/JoltPhysics/Build/Android/gradlew +0 -185
  14. package/native/third_party/JoltPhysics/Build/Android/gradlew.bat +0 -89
  15. package/native/third_party/JoltPhysics/Build/Android/settings.gradle +0 -10
  16. package/native/third_party/JoltPhysics/Build/CMakeLists.txt +0 -449
  17. package/native/third_party/JoltPhysics/Build/README.md +0 -250
  18. package/native/third_party/JoltPhysics/Build/cmake_linux_clang_gcc.sh +0 -28
  19. package/native/third_party/JoltPhysics/Build/cmake_linux_emscripten.sh +0 -19
  20. package/native/third_party/JoltPhysics/Build/cmake_linux_mingw.sh +0 -19
  21. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl.bat +0 -3
  22. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_32bit.bat +0 -3
  23. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_arm.bat +0 -3
  24. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_arm_32bit.bat +0 -4
  25. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_cross_platform_deterministic.bat +0 -3
  26. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_double.bat +0 -3
  27. package/native/third_party/JoltPhysics/Build/cmake_vs2022_cl_no_object_stream.bat +0 -3
  28. package/native/third_party/JoltPhysics/Build/cmake_vs2022_clang.bat +0 -10
  29. package/native/third_party/JoltPhysics/Build/cmake_vs2022_clang_cross_platform_deterministic.bat +0 -10
  30. package/native/third_party/JoltPhysics/Build/cmake_vs2022_clang_double.bat +0 -10
  31. package/native/third_party/JoltPhysics/Build/cmake_vs2022_uwp.bat +0 -5
  32. package/native/third_party/JoltPhysics/Build/cmake_vs2022_uwp_arm.bat +0 -5
  33. package/native/third_party/JoltPhysics/Build/cmake_vs2026_cl.bat +0 -3
  34. package/native/third_party/JoltPhysics/Build/cmake_vs2026_cl_cross_platform_deterministic.bat +0 -3
  35. package/native/third_party/JoltPhysics/Build/cmake_vs2026_cl_double.bat +0 -3
  36. package/native/third_party/JoltPhysics/Build/cmake_vs2026_clang.bat +0 -10
  37. package/native/third_party/JoltPhysics/Build/cmake_vs2026_clang_cross_platform_deterministic.bat +0 -10
  38. package/native/third_party/JoltPhysics/Build/cmake_vs2026_clang_double.bat +0 -10
  39. package/native/third_party/JoltPhysics/Build/cmake_windows_mingw.sh +0 -19
  40. package/native/third_party/JoltPhysics/Build/cmake_xcode_ios.sh +0 -4
  41. package/native/third_party/JoltPhysics/Build/cmake_xcode_macos.sh +0 -4
  42. package/native/third_party/JoltPhysics/Build/iOS/JoltViewerInfo.plist +0 -34
  43. package/native/third_party/JoltPhysics/Build/iOS/SamplesInfo.plist +0 -34
  44. package/native/third_party/JoltPhysics/Build/iOS/UnitTestsInfo.plist +0 -34
  45. package/native/third_party/JoltPhysics/Build/macOS/icon.icns +0 -0
  46. package/native/third_party/JoltPhysics/Build/macos_install_vulkan_sdk.sh +0 -13
  47. package/native/third_party/JoltPhysics/Build/ubuntu24_install_vulkan_sdk.sh +0 -4
  48. package/native/third_party/JoltPhysics/Jolt/AABBTree/AABBTreeBuilder.cpp +0 -242
  49. package/native/third_party/JoltPhysics/Jolt/AABBTree/AABBTreeBuilder.h +0 -121
  50. package/native/third_party/JoltPhysics/Jolt/AABBTree/AABBTreeToBuffer.h +0 -296
  51. package/native/third_party/JoltPhysics/Jolt/AABBTree/NodeCodec/NodeCodecQuadTreeHalfFloat.h +0 -323
  52. package/native/third_party/JoltPhysics/Jolt/AABBTree/TriangleCodec/TriangleCodecIndexed8BitPackSOA4Flags.h +0 -555
  53. package/native/third_party/JoltPhysics/Jolt/ConfigurationString.h +0 -112
  54. package/native/third_party/JoltPhysics/Jolt/Core/ARMNeon.h +0 -94
  55. package/native/third_party/JoltPhysics/Jolt/Core/Array.h +0 -713
  56. package/native/third_party/JoltPhysics/Jolt/Core/Atomics.h +0 -44
  57. package/native/third_party/JoltPhysics/Jolt/Core/BinaryHeap.h +0 -96
  58. package/native/third_party/JoltPhysics/Jolt/Core/ByteBuffer.h +0 -74
  59. package/native/third_party/JoltPhysics/Jolt/Core/Color.cpp +0 -38
  60. package/native/third_party/JoltPhysics/Jolt/Core/Color.h +0 -98
  61. package/native/third_party/JoltPhysics/Jolt/Core/Core.h +0 -652
  62. package/native/third_party/JoltPhysics/Jolt/Core/FPControlWord.h +0 -143
  63. package/native/third_party/JoltPhysics/Jolt/Core/FPException.h +0 -96
  64. package/native/third_party/JoltPhysics/Jolt/Core/FPFlushDenormals.h +0 -43
  65. package/native/third_party/JoltPhysics/Jolt/Core/Factory.cpp +0 -92
  66. package/native/third_party/JoltPhysics/Jolt/Core/Factory.h +0 -54
  67. package/native/third_party/JoltPhysics/Jolt/Core/FixedSizeFreeList.h +0 -122
  68. package/native/third_party/JoltPhysics/Jolt/Core/FixedSizeFreeList.inl +0 -215
  69. package/native/third_party/JoltPhysics/Jolt/Core/HashCombine.h +0 -234
  70. package/native/third_party/JoltPhysics/Jolt/Core/HashTable.h +0 -876
  71. package/native/third_party/JoltPhysics/Jolt/Core/InsertionSort.h +0 -58
  72. package/native/third_party/JoltPhysics/Jolt/Core/IssueReporting.cpp +0 -27
  73. package/native/third_party/JoltPhysics/Jolt/Core/IssueReporting.h +0 -38
  74. package/native/third_party/JoltPhysics/Jolt/Core/JobSystem.h +0 -311
  75. package/native/third_party/JoltPhysics/Jolt/Core/JobSystem.inl +0 -56
  76. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemSingleThreaded.cpp +0 -65
  77. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemSingleThreaded.h +0 -62
  78. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemThreadPool.cpp +0 -364
  79. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemThreadPool.h +0 -101
  80. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemWithBarrier.cpp +0 -230
  81. package/native/third_party/JoltPhysics/Jolt/Core/JobSystemWithBarrier.h +0 -85
  82. package/native/third_party/JoltPhysics/Jolt/Core/LinearCurve.cpp +0 -51
  83. package/native/third_party/JoltPhysics/Jolt/Core/LinearCurve.h +0 -67
  84. package/native/third_party/JoltPhysics/Jolt/Core/LockFreeHashMap.h +0 -182
  85. package/native/third_party/JoltPhysics/Jolt/Core/LockFreeHashMap.inl +0 -351
  86. package/native/third_party/JoltPhysics/Jolt/Core/Memory.cpp +0 -85
  87. package/native/third_party/JoltPhysics/Jolt/Core/Memory.h +0 -85
  88. package/native/third_party/JoltPhysics/Jolt/Core/Mutex.h +0 -223
  89. package/native/third_party/JoltPhysics/Jolt/Core/MutexArray.h +0 -98
  90. package/native/third_party/JoltPhysics/Jolt/Core/NonCopyable.h +0 -18
  91. package/native/third_party/JoltPhysics/Jolt/Core/Profiler.cpp +0 -677
  92. package/native/third_party/JoltPhysics/Jolt/Core/Profiler.h +0 -301
  93. package/native/third_party/JoltPhysics/Jolt/Core/Profiler.inl +0 -90
  94. package/native/third_party/JoltPhysics/Jolt/Core/QuickSort.h +0 -137
  95. package/native/third_party/JoltPhysics/Jolt/Core/RTTI.cpp +0 -149
  96. package/native/third_party/JoltPhysics/Jolt/Core/RTTI.h +0 -436
  97. package/native/third_party/JoltPhysics/Jolt/Core/Reference.h +0 -244
  98. package/native/third_party/JoltPhysics/Jolt/Core/Result.h +0 -174
  99. package/native/third_party/JoltPhysics/Jolt/Core/STLAlignedAllocator.h +0 -72
  100. package/native/third_party/JoltPhysics/Jolt/Core/STLAllocator.h +0 -127
  101. package/native/third_party/JoltPhysics/Jolt/Core/STLLocalAllocator.h +0 -170
  102. package/native/third_party/JoltPhysics/Jolt/Core/STLTempAllocator.h +0 -80
  103. package/native/third_party/JoltPhysics/Jolt/Core/ScopeExit.h +0 -49
  104. package/native/third_party/JoltPhysics/Jolt/Core/Semaphore.cpp +0 -135
  105. package/native/third_party/JoltPhysics/Jolt/Core/Semaphore.h +0 -68
  106. package/native/third_party/JoltPhysics/Jolt/Core/StaticArray.h +0 -329
  107. package/native/third_party/JoltPhysics/Jolt/Core/StreamIn.h +0 -120
  108. package/native/third_party/JoltPhysics/Jolt/Core/StreamOut.h +0 -97
  109. package/native/third_party/JoltPhysics/Jolt/Core/StreamUtils.h +0 -168
  110. package/native/third_party/JoltPhysics/Jolt/Core/StreamWrapper.h +0 -53
  111. package/native/third_party/JoltPhysics/Jolt/Core/StridedPtr.h +0 -63
  112. package/native/third_party/JoltPhysics/Jolt/Core/StringTools.cpp +0 -101
  113. package/native/third_party/JoltPhysics/Jolt/Core/StringTools.h +0 -38
  114. package/native/third_party/JoltPhysics/Jolt/Core/TempAllocator.h +0 -209
  115. package/native/third_party/JoltPhysics/Jolt/Core/TickCounter.cpp +0 -37
  116. package/native/third_party/JoltPhysics/Jolt/Core/TickCounter.h +0 -58
  117. package/native/third_party/JoltPhysics/Jolt/Core/UnorderedMap.h +0 -80
  118. package/native/third_party/JoltPhysics/Jolt/Core/UnorderedSet.h +0 -32
  119. package/native/third_party/JoltPhysics/Jolt/Geometry/AABox.h +0 -313
  120. package/native/third_party/JoltPhysics/Jolt/Geometry/AABox4.h +0 -224
  121. package/native/third_party/JoltPhysics/Jolt/Geometry/ClipPoly.h +0 -200
  122. package/native/third_party/JoltPhysics/Jolt/Geometry/ClosestPoint.h +0 -498
  123. package/native/third_party/JoltPhysics/Jolt/Geometry/ConvexHullBuilder.cpp +0 -1467
  124. package/native/third_party/JoltPhysics/Jolt/Geometry/ConvexHullBuilder.h +0 -276
  125. package/native/third_party/JoltPhysics/Jolt/Geometry/ConvexHullBuilder2D.cpp +0 -335
  126. package/native/third_party/JoltPhysics/Jolt/Geometry/ConvexHullBuilder2D.h +0 -105
  127. package/native/third_party/JoltPhysics/Jolt/Geometry/ConvexSupport.h +0 -188
  128. package/native/third_party/JoltPhysics/Jolt/Geometry/EPAConvexHullBuilder.h +0 -845
  129. package/native/third_party/JoltPhysics/Jolt/Geometry/EPAPenetrationDepth.h +0 -557
  130. package/native/third_party/JoltPhysics/Jolt/Geometry/Ellipse.h +0 -77
  131. package/native/third_party/JoltPhysics/Jolt/Geometry/GJKClosestPoint.h +0 -945
  132. package/native/third_party/JoltPhysics/Jolt/Geometry/IndexedTriangle.h +0 -130
  133. package/native/third_party/JoltPhysics/Jolt/Geometry/Indexify.cpp +0 -222
  134. package/native/third_party/JoltPhysics/Jolt/Geometry/Indexify.h +0 -19
  135. package/native/third_party/JoltPhysics/Jolt/Geometry/MortonCode.h +0 -40
  136. package/native/third_party/JoltPhysics/Jolt/Geometry/OrientedBox.cpp +0 -178
  137. package/native/third_party/JoltPhysics/Jolt/Geometry/OrientedBox.h +0 -39
  138. package/native/third_party/JoltPhysics/Jolt/Geometry/Plane.h +0 -104
  139. package/native/third_party/JoltPhysics/Jolt/Geometry/RayAABox.h +0 -241
  140. package/native/third_party/JoltPhysics/Jolt/Geometry/RayCapsule.h +0 -37
  141. package/native/third_party/JoltPhysics/Jolt/Geometry/RayCylinder.h +0 -101
  142. package/native/third_party/JoltPhysics/Jolt/Geometry/RaySphere.h +0 -96
  143. package/native/third_party/JoltPhysics/Jolt/Geometry/RayTriangle.h +0 -158
  144. package/native/third_party/JoltPhysics/Jolt/Geometry/Sphere.h +0 -72
  145. package/native/third_party/JoltPhysics/Jolt/Geometry/Triangle.h +0 -34
  146. package/native/third_party/JoltPhysics/Jolt/Jolt.cmake +0 -703
  147. package/native/third_party/JoltPhysics/Jolt/Jolt.h +0 -16
  148. package/native/third_party/JoltPhysics/Jolt/Jolt.natvis +0 -116
  149. package/native/third_party/JoltPhysics/Jolt/Math/BVec16.h +0 -99
  150. package/native/third_party/JoltPhysics/Jolt/Math/BVec16.inl +0 -177
  151. package/native/third_party/JoltPhysics/Jolt/Math/DMat44.h +0 -158
  152. package/native/third_party/JoltPhysics/Jolt/Math/DMat44.inl +0 -310
  153. package/native/third_party/JoltPhysics/Jolt/Math/DVec3.h +0 -291
  154. package/native/third_party/JoltPhysics/Jolt/Math/DVec3.inl +0 -941
  155. package/native/third_party/JoltPhysics/Jolt/Math/Double3.h +0 -48
  156. package/native/third_party/JoltPhysics/Jolt/Math/DynMatrix.h +0 -31
  157. package/native/third_party/JoltPhysics/Jolt/Math/EigenValueSymmetric.h +0 -177
  158. package/native/third_party/JoltPhysics/Jolt/Math/FindRoot.h +0 -42
  159. package/native/third_party/JoltPhysics/Jolt/Math/Float2.h +0 -36
  160. package/native/third_party/JoltPhysics/Jolt/Math/Float3.h +0 -50
  161. package/native/third_party/JoltPhysics/Jolt/Math/Float4.h +0 -44
  162. package/native/third_party/JoltPhysics/Jolt/Math/GaussianElimination.h +0 -102
  163. package/native/third_party/JoltPhysics/Jolt/Math/HalfFloat.h +0 -208
  164. package/native/third_party/JoltPhysics/Jolt/Math/Mat44.h +0 -243
  165. package/native/third_party/JoltPhysics/Jolt/Math/Mat44.inl +0 -952
  166. package/native/third_party/JoltPhysics/Jolt/Math/Math.h +0 -208
  167. package/native/third_party/JoltPhysics/Jolt/Math/MathTypes.h +0 -32
  168. package/native/third_party/JoltPhysics/Jolt/Math/Matrix.h +0 -259
  169. package/native/third_party/JoltPhysics/Jolt/Math/Quat.h +0 -268
  170. package/native/third_party/JoltPhysics/Jolt/Math/Quat.inl +0 -406
  171. package/native/third_party/JoltPhysics/Jolt/Math/Real.h +0 -44
  172. package/native/third_party/JoltPhysics/Jolt/Math/Swizzle.h +0 -19
  173. package/native/third_party/JoltPhysics/Jolt/Math/Trigonometry.h +0 -79
  174. package/native/third_party/JoltPhysics/Jolt/Math/UVec4.h +0 -232
  175. package/native/third_party/JoltPhysics/Jolt/Math/UVec4.inl +0 -636
  176. package/native/third_party/JoltPhysics/Jolt/Math/Vec3.cpp +0 -71
  177. package/native/third_party/JoltPhysics/Jolt/Math/Vec3.h +0 -308
  178. package/native/third_party/JoltPhysics/Jolt/Math/Vec3.inl +0 -942
  179. package/native/third_party/JoltPhysics/Jolt/Math/Vec4.h +0 -320
  180. package/native/third_party/JoltPhysics/Jolt/Math/Vec4.inl +0 -1152
  181. package/native/third_party/JoltPhysics/Jolt/Math/Vector.h +0 -211
  182. package/native/third_party/JoltPhysics/Jolt/ObjectStream/GetPrimitiveTypeOfType.h +0 -54
  183. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStream.cpp +0 -38
  184. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStream.h +0 -337
  185. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamBinaryIn.cpp +0 -252
  186. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamBinaryIn.h +0 -57
  187. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamBinaryOut.cpp +0 -165
  188. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamBinaryOut.h +0 -57
  189. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamIn.cpp +0 -635
  190. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamIn.h +0 -148
  191. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamOut.cpp +0 -166
  192. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamOut.h +0 -101
  193. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamTextIn.cpp +0 -418
  194. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamTextIn.h +0 -55
  195. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamTextOut.cpp +0 -255
  196. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamTextOut.h +0 -62
  197. package/native/third_party/JoltPhysics/Jolt/ObjectStream/ObjectStreamTypes.h +0 -26
  198. package/native/third_party/JoltPhysics/Jolt/ObjectStream/SerializableAttribute.h +0 -111
  199. package/native/third_party/JoltPhysics/Jolt/ObjectStream/SerializableAttributeEnum.h +0 -67
  200. package/native/third_party/JoltPhysics/Jolt/ObjectStream/SerializableAttributeTyped.h +0 -60
  201. package/native/third_party/JoltPhysics/Jolt/ObjectStream/SerializableObject.cpp +0 -15
  202. package/native/third_party/JoltPhysics/Jolt/ObjectStream/SerializableObject.h +0 -170
  203. package/native/third_party/JoltPhysics/Jolt/ObjectStream/TypeDeclarations.cpp +0 -70
  204. package/native/third_party/JoltPhysics/Jolt/ObjectStream/TypeDeclarations.h +0 -45
  205. package/native/third_party/JoltPhysics/Jolt/Physics/Body/AllowedDOFs.h +0 -68
  206. package/native/third_party/JoltPhysics/Jolt/Physics/Body/Body.cpp +0 -426
  207. package/native/third_party/JoltPhysics/Jolt/Physics/Body/Body.h +0 -452
  208. package/native/third_party/JoltPhysics/Jolt/Physics/Body/Body.inl +0 -197
  209. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyAccess.h +0 -68
  210. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyActivationListener.h +0 -28
  211. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyCreationSettings.cpp +0 -234
  212. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyCreationSettings.h +0 -124
  213. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyFilter.h +0 -130
  214. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyID.h +0 -101
  215. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyInterface.cpp +0 -1099
  216. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyInterface.h +0 -324
  217. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyLock.h +0 -111
  218. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyLockInterface.h +0 -134
  219. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyLockMulti.h +0 -120
  220. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyManager.cpp +0 -1220
  221. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyManager.h +0 -403
  222. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyPair.h +0 -36
  223. package/native/third_party/JoltPhysics/Jolt/Physics/Body/BodyType.h +0 -19
  224. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MassProperties.cpp +0 -185
  225. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MassProperties.h +0 -58
  226. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MotionProperties.cpp +0 -92
  227. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MotionProperties.h +0 -308
  228. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MotionProperties.inl +0 -178
  229. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MotionQuality.h +0 -31
  230. package/native/third_party/JoltPhysics/Jolt/Physics/Body/MotionType.h +0 -17
  231. package/native/third_party/JoltPhysics/Jolt/Physics/Character/Character.cpp +0 -354
  232. package/native/third_party/JoltPhysics/Jolt/Physics/Character/Character.h +0 -159
  233. package/native/third_party/JoltPhysics/Jolt/Physics/Character/CharacterBase.cpp +0 -59
  234. package/native/third_party/JoltPhysics/Jolt/Physics/Character/CharacterBase.h +0 -157
  235. package/native/third_party/JoltPhysics/Jolt/Physics/Character/CharacterID.h +0 -98
  236. package/native/third_party/JoltPhysics/Jolt/Physics/Character/CharacterVirtual.cpp +0 -1933
  237. package/native/third_party/JoltPhysics/Jolt/Physics/Character/CharacterVirtual.h +0 -752
  238. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/AABoxCast.h +0 -20
  239. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ActiveEdgeMode.h +0 -17
  240. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ActiveEdges.h +0 -114
  241. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BackFaceMode.h +0 -16
  242. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhase.cpp +0 -16
  243. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhase.h +0 -109
  244. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseBruteForce.cpp +0 -313
  245. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseBruteForce.h +0 -38
  246. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h +0 -148
  247. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseLayerInterfaceMask.h +0 -92
  248. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseLayerInterfaceTable.h +0 -64
  249. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.cpp +0 -629
  250. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.h +0 -108
  251. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuery.h +0 -56
  252. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/ObjectVsBroadPhaseLayerFilterMask.h +0 -35
  253. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/ObjectVsBroadPhaseLayerFilterTable.h +0 -66
  254. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/QuadTree.cpp +0 -1768
  255. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/BroadPhase/QuadTree.h +0 -389
  256. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CastConvexVsTriangles.cpp +0 -107
  257. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CastConvexVsTriangles.h +0 -46
  258. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CastResult.h +0 -37
  259. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CastSphereVsTriangles.cpp +0 -223
  260. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CastSphereVsTriangles.h +0 -49
  261. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollectFacesMode.h +0 -16
  262. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideConvexVsTriangles.cpp +0 -155
  263. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideConvexVsTriangles.h +0 -56
  264. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollidePointResult.h +0 -25
  265. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideShape.h +0 -106
  266. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideShapeVsShapePerLeaf.h +0 -94
  267. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideSoftBodyVertexIterator.h +0 -110
  268. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideSoftBodyVerticesVsTriangles.h +0 -102
  269. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideSphereVsTriangles.cpp +0 -121
  270. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollideSphereVsTriangles.h +0 -50
  271. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionCollector.h +0 -109
  272. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionCollectorImpl.h +0 -219
  273. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionDispatch.cpp +0 -107
  274. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionDispatch.h +0 -97
  275. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionGroup.cpp +0 -35
  276. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/CollisionGroup.h +0 -97
  277. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ContactListener.h +0 -143
  278. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/EstimateCollisionResponse.cpp +0 -213
  279. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/EstimateCollisionResponse.h +0 -48
  280. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/GroupFilter.cpp +0 -32
  281. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/GroupFilter.h +0 -46
  282. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/GroupFilterTable.cpp +0 -38
  283. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/GroupFilterTable.h +0 -130
  284. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/InternalEdgeRemovingCollector.h +0 -279
  285. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ManifoldBetweenTwoFaces.cpp +0 -271
  286. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ManifoldBetweenTwoFaces.h +0 -44
  287. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/NarrowPhaseQuery.cpp +0 -448
  288. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/NarrowPhaseQuery.h +0 -77
  289. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/NarrowPhaseStats.cpp +0 -62
  290. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/NarrowPhaseStats.h +0 -110
  291. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ObjectLayer.h +0 -111
  292. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ObjectLayerPairFilterMask.h +0 -52
  293. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ObjectLayerPairFilterTable.h +0 -78
  294. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/PhysicsMaterial.cpp +0 -35
  295. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/PhysicsMaterial.h +0 -57
  296. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/PhysicsMaterialSimple.cpp +0 -38
  297. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/PhysicsMaterialSimple.h +0 -37
  298. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/RayCast.h +0 -87
  299. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/BoxShape.cpp +0 -318
  300. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/BoxShape.h +0 -115
  301. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CapsuleShape.cpp +0 -438
  302. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CapsuleShape.h +0 -129
  303. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CompoundShape.cpp +0 -433
  304. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CompoundShape.h +0 -354
  305. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CompoundShapeVisitors.h +0 -461
  306. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ConvexHullShape.cpp +0 -1311
  307. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ConvexHullShape.h +0 -202
  308. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ConvexShape.cpp +0 -566
  309. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ConvexShape.h +0 -150
  310. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CylinderShape.cpp +0 -418
  311. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/CylinderShape.h +0 -126
  312. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/DecoratedShape.cpp +0 -87
  313. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/DecoratedShape.h +0 -80
  314. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/EmptyShape.cpp +0 -64
  315. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/EmptyShape.h +0 -75
  316. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/GetTrianglesContext.h +0 -248
  317. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.cpp +0 -2754
  318. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/HeightFieldShape.h +0 -380
  319. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/MeshShape.cpp +0 -1305
  320. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/MeshShape.h +0 -228
  321. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/MutableCompoundShape.cpp +0 -596
  322. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/MutableCompoundShape.h +0 -176
  323. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/OffsetCenterOfMassShape.cpp +0 -217
  324. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/OffsetCenterOfMassShape.h +0 -140
  325. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/PlaneShape.cpp +0 -541
  326. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/PlaneShape.h +0 -147
  327. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/PolyhedronSubmergedVolumeCalculator.h +0 -319
  328. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/RotatedTranslatedShape.cpp +0 -333
  329. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/RotatedTranslatedShape.h +0 -161
  330. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ScaleHelpers.h +0 -83
  331. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ScaledShape.cpp +0 -238
  332. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/ScaledShape.h +0 -145
  333. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/Shape.cpp +0 -325
  334. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/Shape.h +0 -466
  335. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/SphereShape.cpp +0 -347
  336. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/SphereShape.h +0 -125
  337. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/StaticCompoundShape.cpp +0 -674
  338. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/StaticCompoundShape.h +0 -139
  339. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/SubShapeID.h +0 -138
  340. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/SubShapeIDPair.h +0 -65
  341. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TaperedCapsuleShape.cpp +0 -453
  342. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TaperedCapsuleShape.gliffy +0 -1
  343. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TaperedCapsuleShape.h +0 -135
  344. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TaperedCylinderShape.cpp +0 -691
  345. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TaperedCylinderShape.h +0 -132
  346. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TriangleShape.cpp +0 -430
  347. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/Shape/TriangleShape.h +0 -143
  348. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ShapeCast.h +0 -173
  349. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/ShapeFilter.h +0 -73
  350. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/SimShapeFilter.h +0 -40
  351. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/SimShapeFilterWrapper.h +0 -58
  352. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/SortReverseAndStore.h +0 -48
  353. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/TransformedShape.cpp +0 -180
  354. package/native/third_party/JoltPhysics/Jolt/Physics/Collision/TransformedShape.h +0 -194
  355. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/CalculateSolverSteps.h +0 -70
  356. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConeConstraint.cpp +0 -246
  357. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConeConstraint.h +0 -133
  358. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/Constraint.cpp +0 -73
  359. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/Constraint.h +0 -243
  360. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintManager.cpp +0 -289
  361. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintManager.h +0 -100
  362. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/AngleConstraintPart.h +0 -257
  363. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/AxisConstraintPart.h +0 -682
  364. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/DualAxisConstraintPart.h +0 -276
  365. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/GearConstraintPart.h +0 -195
  366. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/HingeRotationConstraintPart.h +0 -222
  367. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/IndependentAxisConstraintPart.h +0 -246
  368. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/PointConstraintPart.h +0 -239
  369. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/RackAndPinionConstraintPart.h +0 -196
  370. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h +0 -283
  371. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/RotationQuatConstraintPart.h +0 -246
  372. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/SpringPart.h +0 -169
  373. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ConstraintPart/SwingTwistConstraintPart.h +0 -597
  374. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ContactConstraintManager.cpp +0 -1804
  375. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/ContactConstraintManager.h +0 -524
  376. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/DistanceConstraint.cpp +0 -266
  377. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/DistanceConstraint.h +0 -120
  378. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/FixedConstraint.cpp +0 -215
  379. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/FixedConstraint.h +0 -96
  380. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/GearConstraint.cpp +0 -188
  381. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/GearConstraint.h +0 -116
  382. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/HingeConstraint.cpp +0 -443
  383. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/HingeConstraint.h +0 -205
  384. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/MotorSettings.cpp +0 -43
  385. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/MotorSettings.h +0 -66
  386. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraint.cpp +0 -458
  387. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraint.h +0 -191
  388. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraintPath.cpp +0 -85
  389. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraintPath.h +0 -76
  390. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraintPathHermite.cpp +0 -308
  391. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PathConstraintPathHermite.h +0 -54
  392. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PointConstraint.cpp +0 -157
  393. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PointConstraint.h +0 -94
  394. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PulleyConstraint.cpp +0 -253
  395. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/PulleyConstraint.h +0 -137
  396. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/RackAndPinionConstraint.cpp +0 -189
  397. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/RackAndPinionConstraint.h +0 -118
  398. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SixDOFConstraint.cpp +0 -900
  399. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SixDOFConstraint.h +0 -289
  400. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SliderConstraint.cpp +0 -501
  401. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SliderConstraint.h +0 -198
  402. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SpringSettings.cpp +0 -35
  403. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SpringSettings.h +0 -70
  404. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SwingTwistConstraint.cpp +0 -524
  405. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/SwingTwistConstraint.h +0 -197
  406. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/TwoBodyConstraint.cpp +0 -56
  407. package/native/third_party/JoltPhysics/Jolt/Physics/Constraints/TwoBodyConstraint.h +0 -65
  408. package/native/third_party/JoltPhysics/Jolt/Physics/DeterminismLog.cpp +0 -17
  409. package/native/third_party/JoltPhysics/Jolt/Physics/DeterminismLog.h +0 -159
  410. package/native/third_party/JoltPhysics/Jolt/Physics/EActivation.h +0 -16
  411. package/native/third_party/JoltPhysics/Jolt/Physics/EPhysicsUpdateError.h +0 -37
  412. package/native/third_party/JoltPhysics/Jolt/Physics/IslandBuilder.cpp +0 -492
  413. package/native/third_party/JoltPhysics/Jolt/Physics/IslandBuilder.h +0 -144
  414. package/native/third_party/JoltPhysics/Jolt/Physics/LargeIslandSplitter.cpp +0 -582
  415. package/native/third_party/JoltPhysics/Jolt/Physics/LargeIslandSplitter.h +0 -187
  416. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsLock.h +0 -169
  417. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsScene.cpp +0 -261
  418. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsScene.h +0 -104
  419. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsSettings.h +0 -125
  420. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsStepListener.h +0 -37
  421. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsSystem.cpp +0 -2915
  422. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsSystem.h +0 -391
  423. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsUpdateContext.cpp +0 -25
  424. package/native/third_party/JoltPhysics/Jolt/Physics/PhysicsUpdateContext.h +0 -176
  425. package/native/third_party/JoltPhysics/Jolt/Physics/Ragdoll/Ragdoll.cpp +0 -744
  426. package/native/third_party/JoltPhysics/Jolt/Physics/Ragdoll/Ragdoll.h +0 -245
  427. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyContactListener.h +0 -55
  428. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyCreationSettings.cpp +0 -128
  429. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyCreationSettings.h +0 -75
  430. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyManifold.h +0 -74
  431. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyMotionProperties.cpp +0 -1501
  432. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyMotionProperties.h +0 -333
  433. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyShape.cpp +0 -354
  434. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyShape.h +0 -73
  435. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodySharedSettings.cpp +0 -1487
  436. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodySharedSettings.h +0 -390
  437. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyUpdateContext.h +0 -63
  438. package/native/third_party/JoltPhysics/Jolt/Physics/SoftBody/SoftBodyVertex.h +0 -36
  439. package/native/third_party/JoltPhysics/Jolt/Physics/StateRecorder.h +0 -136
  440. package/native/third_party/JoltPhysics/Jolt/Physics/StateRecorderImpl.cpp +0 -90
  441. package/native/third_party/JoltPhysics/Jolt/Physics/StateRecorderImpl.h +0 -50
  442. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/MotorcycleController.cpp +0 -306
  443. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/MotorcycleController.h +0 -119
  444. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/TrackedVehicleController.cpp +0 -547
  445. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/TrackedVehicleController.h +0 -169
  446. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleAntiRollBar.cpp +0 -33
  447. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleAntiRollBar.h +0 -33
  448. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleCollisionTester.cpp +0 -376
  449. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleCollisionTester.h +0 -146
  450. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleConstraint.cpp +0 -703
  451. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleConstraint.h +0 -252
  452. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleController.cpp +0 -17
  453. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleController.h +0 -87
  454. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleDifferential.cpp +0 -81
  455. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleDifferential.h +0 -39
  456. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleEngine.cpp +0 -122
  457. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleEngine.h +0 -93
  458. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleTrack.cpp +0 -52
  459. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleTrack.h +0 -56
  460. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleTransmission.cpp +0 -159
  461. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/VehicleTransmission.h +0 -87
  462. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/Wheel.cpp +0 -93
  463. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/Wheel.h +0 -148
  464. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/WheeledVehicleController.cpp +0 -866
  465. package/native/third_party/JoltPhysics/Jolt/Physics/Vehicle/WheeledVehicleController.h +0 -205
  466. package/native/third_party/JoltPhysics/Jolt/RegisterTypes.cpp +0 -204
  467. package/native/third_party/JoltPhysics/Jolt/RegisterTypes.h +0 -29
  468. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRenderer.cpp +0 -1107
  469. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRenderer.h +0 -383
  470. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererPlayback.cpp +0 -168
  471. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererPlayback.h +0 -48
  472. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererRecorder.cpp +0 -158
  473. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererRecorder.h +0 -130
  474. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererSimple.cpp +0 -80
  475. package/native/third_party/JoltPhysics/Jolt/Renderer/DebugRendererSimple.h +0 -88
  476. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletalAnimation.cpp +0 -165
  477. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletalAnimation.h +0 -91
  478. package/native/third_party/JoltPhysics/Jolt/Skeleton/Skeleton.cpp +0 -82
  479. package/native/third_party/JoltPhysics/Jolt/Skeleton/Skeleton.h +0 -72
  480. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletonMapper.cpp +0 -237
  481. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletonMapper.h +0 -145
  482. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletonPose.cpp +0 -87
  483. package/native/third_party/JoltPhysics/Jolt/Skeleton/SkeletonPose.h +0 -82
  484. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitter.cpp +0 -73
  485. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitter.h +0 -84
  486. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterBinning.cpp +0 -139
  487. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterBinning.h +0 -52
  488. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterMean.cpp +0 -43
  489. package/native/third_party/JoltPhysics/Jolt/TriangleSplitter/TriangleSplitterMean.h +0 -28
  490. package/native/third_party/JoltPhysics/LICENSE +0 -7
  491. package/native/third_party/JoltPhysics/README.md +0 -173
  492. package/native/third_party/bloom_jolt/CMakeLists.txt +0 -87
  493. package/native/third_party/bloom_jolt/include/bloom_jolt.h +0 -519
  494. package/native/third_party/bloom_jolt/src/bloom_jolt.cpp +0 -1780
@@ -1,1780 +0,0 @@
1
- /*
2
- * bloom_jolt.cpp — Tier 1 implementation.
3
- *
4
- * Handle encoding:
5
- * bj_world → reinterpret_cast<WorldImpl *>
6
- * bj_shape → reinterpret_cast<const Shape *> (intrusive refcounted)
7
- * bj_body → (BodyID.GetIndexAndSequenceNumber() + 1) — shift by 1
8
- * so Jolt's valid id 0 doesn't collide with BJ_INVALID==0.
9
- * bj_constraint → reinterpret_cast<Constraint *> (intrusive refcounted)
10
- *
11
- * Thread safety: the contact listener is invoked from Jolt job threads.
12
- * We push events into a mutex-guarded queue; user code drains on the main
13
- * thread via bj_world_pop_contacts.
14
- */
15
-
16
- #include "bloom_jolt.h"
17
-
18
- #include <Jolt/Jolt.h>
19
- #include <Jolt/RegisterTypes.h>
20
- #include <Jolt/Core/Factory.h>
21
- #include <Jolt/Core/TempAllocator.h>
22
- #include <Jolt/Core/JobSystemThreadPool.h>
23
- #include <Jolt/Physics/PhysicsSettings.h>
24
- #include <Jolt/Physics/PhysicsSystem.h>
25
- #include <Jolt/Physics/Body/Body.h>
26
- #include <Jolt/Physics/Body/BodyCreationSettings.h>
27
- #include <Jolt/Physics/Body/BodyID.h>
28
- #include <Jolt/Physics/Body/BodyInterface.h>
29
- #include <Jolt/Physics/Body/BodyLock.h>
30
- #include <Jolt/Physics/Body/BodyLockMulti.h>
31
- #include <Jolt/Physics/Body/MotionType.h>
32
- #include <Jolt/Physics/Body/MotionQuality.h>
33
- #include <Jolt/Physics/Body/AllowedDOFs.h>
34
- #include <Jolt/Physics/EActivation.h>
35
- #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>
36
- #include <Jolt/Physics/Collision/ObjectLayer.h>
37
- #include <Jolt/Physics/Collision/RayCast.h>
38
- #include <Jolt/Physics/Collision/ShapeCast.h>
39
- #include <Jolt/Physics/Collision/CastResult.h>
40
- #include <Jolt/Physics/Collision/CollisionCollectorImpl.h>
41
- #include <Jolt/Physics/Collision/CollidePointResult.h>
42
- #include <Jolt/Physics/Collision/CollideShape.h>
43
- #include <Jolt/Physics/Collision/ContactListener.h>
44
- #include <Jolt/Physics/Collision/NarrowPhaseQuery.h>
45
- #include <Jolt/Physics/Collision/ShapeFilter.h>
46
- #include <Jolt/Physics/Collision/Shape/BoxShape.h>
47
- #include <Jolt/Physics/Collision/Shape/SphereShape.h>
48
- #include <Jolt/Physics/Collision/Shape/CapsuleShape.h>
49
- #include <Jolt/Physics/Collision/Shape/CylinderShape.h>
50
- #include <Jolt/Physics/Collision/Shape/ConvexHullShape.h>
51
- #include <Jolt/Physics/Collision/Shape/MeshShape.h>
52
- #include <Jolt/Physics/Collision/Shape/HeightFieldShape.h>
53
- #include <Jolt/Physics/Collision/Shape/StaticCompoundShape.h>
54
- #include <Jolt/Physics/Collision/Shape/ScaledShape.h>
55
- #include <Jolt/Physics/Collision/Shape/OffsetCenterOfMassShape.h>
56
- #include <Jolt/Physics/Constraints/Constraint.h>
57
- #include <Jolt/Physics/Constraints/FixedConstraint.h>
58
- #include <Jolt/Physics/Constraints/PointConstraint.h>
59
- #include <Jolt/Physics/Constraints/HingeConstraint.h>
60
- #include <Jolt/Physics/Constraints/SliderConstraint.h>
61
- #include <Jolt/Physics/Constraints/DistanceConstraint.h>
62
- #include <Jolt/Physics/Constraints/SixDOFConstraint.h>
63
- #include <Jolt/Physics/Character/CharacterVirtual.h>
64
- #include <Jolt/Physics/SoftBody/SoftBodyCreationSettings.h>
65
- #include <Jolt/Physics/SoftBody/SoftBodySharedSettings.h>
66
- #include <Jolt/Physics/SoftBody/SoftBodyMotionProperties.h>
67
- #include <Jolt/Physics/Vehicle/VehicleConstraint.h>
68
- #include <Jolt/Physics/Vehicle/WheeledVehicleController.h>
69
- #include <Jolt/Physics/Vehicle/VehicleCollisionTester.h>
70
- #include <Jolt/Physics/Vehicle/VehicleDifferential.h>
71
-
72
- #include <algorithm>
73
- #include <atomic>
74
- #include <cstring>
75
- #include <mutex>
76
- #include <thread>
77
- #include <vector>
78
-
79
- using namespace JPH;
80
-
81
- /* ================================================================== */
82
- /* Anonymous namespace: helper types */
83
- /* ================================================================== */
84
-
85
- namespace {
86
-
87
- std::atomic<int> g_init_refcount{0};
88
-
89
- /* ---- Broadphase layers ---- */
90
- enum : uint8_t {
91
- BP_NON_MOVING = 0,
92
- BP_MOVING = 1,
93
- BP_COUNT = 2
94
- };
95
-
96
- class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface {
97
- public:
98
- JPH::uint GetNumBroadPhaseLayers() const override { return BP_COUNT; }
99
- BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer layer) const override {
100
- return layer == (ObjectLayer)BJ_LAYER_NON_MOVING
101
- ? BroadPhaseLayer(BP_NON_MOVING)
102
- : BroadPhaseLayer(BP_MOVING);
103
- }
104
- #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
105
- const char *GetBroadPhaseLayerName(BroadPhaseLayer layer) const override {
106
- switch ((BroadPhaseLayer::Type)layer) {
107
- case (BroadPhaseLayer::Type)BP_NON_MOVING: return "NON_MOVING";
108
- case (BroadPhaseLayer::Type)BP_MOVING: return "MOVING";
109
- default: return "INVALID";
110
- }
111
- }
112
- #endif
113
- };
114
-
115
- class ObjectVsBPFilter final : public ObjectVsBroadPhaseLayerFilter {
116
- public:
117
- bool ShouldCollide(ObjectLayer object, BroadPhaseLayer broad) const override {
118
- if (object == (ObjectLayer)BJ_LAYER_NON_MOVING) {
119
- return broad == BroadPhaseLayer(BP_MOVING);
120
- }
121
- return true;
122
- }
123
- };
124
-
125
- class ObjectLayerPairFilterMatrix final : public ObjectLayerPairFilter {
126
- public:
127
- ObjectLayerPairFilterMatrix() {
128
- std::memset(m_matrix, 0xFF, sizeof(m_matrix));
129
- set(BJ_LAYER_NON_MOVING, BJ_LAYER_NON_MOVING, false);
130
- }
131
- bool ShouldCollide(ObjectLayer a, ObjectLayer b) const override {
132
- if (a >= BJ_MAX_OBJECT_LAYERS || b >= BJ_MAX_OBJECT_LAYERS) return false;
133
- return (m_matrix[a] & (uint16_t(1) << b)) != 0;
134
- }
135
- void set(uint32_t a, uint32_t b, bool collides) {
136
- if (a >= BJ_MAX_OBJECT_LAYERS || b >= BJ_MAX_OBJECT_LAYERS) return;
137
- if (collides) {
138
- m_matrix[a] |= uint16_t(1) << b;
139
- m_matrix[b] |= uint16_t(1) << a;
140
- } else {
141
- m_matrix[a] &= ~(uint16_t(1) << b);
142
- m_matrix[b] &= ~(uint16_t(1) << a);
143
- }
144
- }
145
- bool get(uint32_t a, uint32_t b) const {
146
- if (a >= BJ_MAX_OBJECT_LAYERS || b >= BJ_MAX_OBJECT_LAYERS) return false;
147
- return (m_matrix[a] & (uint16_t(1) << b)) != 0;
148
- }
149
- private:
150
- uint16_t m_matrix[BJ_MAX_OBJECT_LAYERS];
151
- };
152
-
153
- /* ---- Filter for queries that respect a caller-provided layer mask ---- */
154
-
155
- class LayerMaskObjectFilter final : public ObjectLayerFilter {
156
- public:
157
- explicit LayerMaskObjectFilter(uint32_t mask) : m_mask(mask) {}
158
- bool ShouldCollide(ObjectLayer layer) const override {
159
- if (layer >= 32) return true; /* layers 16-31 not yet partitioned; pass through */
160
- return (m_mask & (uint32_t(1) << layer)) != 0;
161
- }
162
- private:
163
- uint32_t m_mask;
164
- };
165
-
166
- class LayerMaskBPFilter final : public BroadPhaseLayerFilter {
167
- public:
168
- explicit LayerMaskBPFilter(uint32_t mask) : m_mask(mask) {}
169
- bool ShouldCollide(BroadPhaseLayer layer) const override {
170
- /* BP_NON_MOVING contains object layer 0; BP_MOVING contains object layers 1..15. */
171
- uint8_t bp = (BroadPhaseLayer::Type)layer;
172
- if (bp == BP_NON_MOVING) return (m_mask & 0x1u) != 0;
173
- if (bp == BP_MOVING) return (m_mask & 0xFFFEu) != 0;
174
- return true;
175
- }
176
- private:
177
- uint32_t m_mask;
178
- };
179
-
180
- /* ---- Contact listener → drainable event queue ---- */
181
-
182
- struct WorldImpl; /* forward */
183
-
184
- class ContactQueue final : public ContactListener {
185
- public:
186
- void OnContactAdded(const Body &body1, const Body &body2,
187
- const ContactManifold &manifold,
188
- ContactSettings &settings) override
189
- {
190
- push(BJ_CONTACT_ADDED, body1, body2, &manifold, &settings);
191
- }
192
- void OnContactPersisted(const Body &body1, const Body &body2,
193
- const ContactManifold &manifold,
194
- ContactSettings &settings) override
195
- {
196
- push(BJ_CONTACT_PERSISTED, body1, body2, &manifold, &settings);
197
- }
198
- void OnContactRemoved(const SubShapeIDPair &pair) override
199
- {
200
- bj_contact c{};
201
- c.event = BJ_CONTACT_REMOVED;
202
- c.body_a = encode_body_id(pair.GetBody1ID());
203
- c.body_b = encode_body_id(pair.GetBody2ID());
204
- std::lock_guard<std::mutex> lock(m_mutex);
205
- m_events.push_back(c);
206
- }
207
-
208
- uint32_t count() {
209
- std::lock_guard<std::mutex> lock(m_mutex);
210
- return (uint32_t)m_events.size();
211
- }
212
-
213
- uint32_t drain(bj_contact *out, uint32_t max_out) {
214
- if (!out || max_out == 0) return 0;
215
- std::lock_guard<std::mutex> lock(m_mutex);
216
- uint32_t n = std::min<uint32_t>(max_out, (uint32_t)m_events.size());
217
- for (uint32_t i = 0; i < n; ++i) out[i] = m_events[i];
218
- m_events.erase(m_events.begin(), m_events.begin() + n);
219
- return n;
220
- }
221
-
222
- void clear() {
223
- std::lock_guard<std::mutex> lock(m_mutex);
224
- m_events.clear();
225
- }
226
-
227
- private:
228
- static bj_vec3 from_vec3(Vec3 v) { return { v.GetX(), v.GetY(), v.GetZ() }; }
229
- static bj_body encode_body_id(BodyID id) {
230
- uint32_t raw = id.GetIndexAndSequenceNumber();
231
- return raw == BodyID::cInvalidBodyID ? BJ_INVALID : (bj_body)(uint64_t(raw) + 1u);
232
- }
233
- void push(bj_contact_event ev, const Body &b1, const Body &b2,
234
- const ContactManifold *m, const ContactSettings *s)
235
- {
236
- bj_contact c{};
237
- c.event = ev;
238
- c.body_a = encode_body_id(b1.GetID());
239
- c.body_b = encode_body_id(b2.GetID());
240
- if (m) {
241
- Vec3 base(m->mBaseOffset.GetX(), m->mBaseOffset.GetY(), m->mBaseOffset.GetZ());
242
- Vec3 p1 = m->mRelativeContactPointsOn1.empty()
243
- ? base
244
- : base + m->mRelativeContactPointsOn1[0];
245
- Vec3 p2 = m->mRelativeContactPointsOn2.empty()
246
- ? base
247
- : base + m->mRelativeContactPointsOn2[0];
248
- c.point_a = from_vec3(p1);
249
- c.point_b = from_vec3(p2);
250
- c.normal = from_vec3(m->mWorldSpaceNormal);
251
- c.penetration_depth = m->mPenetrationDepth;
252
- }
253
- if (s) {
254
- c.combined_friction = s->mCombinedFriction;
255
- c.combined_restitution = s->mCombinedRestitution;
256
- }
257
- std::lock_guard<std::mutex> lock(m_mutex);
258
- m_events.push_back(c);
259
- }
260
-
261
- std::mutex m_mutex;
262
- std::vector<bj_contact> m_events;
263
- };
264
-
265
- /* ---- World ---- */
266
-
267
- struct WorldImpl {
268
- TempAllocatorImpl *temp_alloc = nullptr;
269
- JobSystemThreadPool *jobs = nullptr;
270
- BPLayerInterfaceImpl bp_layer_interface;
271
- ObjectVsBPFilter object_vs_bp_filter;
272
- ObjectLayerPairFilterMatrix layer_pair_filter;
273
- PhysicsSystem system;
274
- ContactQueue contacts;
275
- };
276
-
277
- /* ---- Encode / decode ---- */
278
-
279
- inline WorldImpl *as_world(bj_world w) { return reinterpret_cast<WorldImpl *>(w); }
280
- inline bj_world as_handle(WorldImpl *w) { return reinterpret_cast<bj_world>(w); }
281
-
282
- inline bj_body encode_body_id(BodyID id) {
283
- uint32_t raw = id.GetIndexAndSequenceNumber();
284
- return raw == BodyID::cInvalidBodyID ? BJ_INVALID : (bj_body)(uint64_t(raw) + 1u);
285
- }
286
- inline BodyID decode_body_id(bj_body b) {
287
- if (b == BJ_INVALID) return BodyID();
288
- return BodyID((uint32_t)(b - 1u));
289
- }
290
-
291
- inline bj_shape encode_shape(const Shape *s) {
292
- if (!s) return BJ_INVALID;
293
- s->AddRef(); /* handle owns one ref */
294
- return reinterpret_cast<bj_shape>(s);
295
- }
296
- inline const Shape *decode_shape(bj_shape h) {
297
- return reinterpret_cast<const Shape *>(h);
298
- }
299
-
300
- inline bj_constraint encode_constraint(Constraint *c) {
301
- if (!c) return BJ_INVALID;
302
- c->AddRef();
303
- return reinterpret_cast<bj_constraint>(c);
304
- }
305
- inline Constraint *decode_constraint(bj_constraint h) {
306
- return reinterpret_cast<Constraint *>(h);
307
- }
308
-
309
- /* ---- Vec3/Quat conversion ---- */
310
-
311
- inline Vec3 to_jph(bj_vec3 v) { return Vec3(v.x, v.y, v.z); }
312
- inline Quat to_jph(bj_quat q) { return Quat(q.x, q.y, q.z, q.w); }
313
- inline bj_vec3 from_jph(Vec3 v) { return { v.GetX(), v.GetY(), v.GetZ() }; }
314
- inline bj_quat from_jph(Quat q) { return { q.GetX(), q.GetY(), q.GetZ(), q.GetW() }; }
315
- /* In single-precision builds RVec3 == Vec3, so to_jph/from_jph cover both. */
316
-
317
- inline EMotionType to_motion(bj_motion_type t) {
318
- switch (t) {
319
- case BJ_MOTION_STATIC: return EMotionType::Static;
320
- case BJ_MOTION_KINEMATIC: return EMotionType::Kinematic;
321
- case BJ_MOTION_DYNAMIC: return EMotionType::Dynamic;
322
- }
323
- return EMotionType::Dynamic;
324
- }
325
- inline bj_motion_type from_motion(EMotionType t) {
326
- switch (t) {
327
- case EMotionType::Static: return BJ_MOTION_STATIC;
328
- case EMotionType::Kinematic: return BJ_MOTION_KINEMATIC;
329
- case EMotionType::Dynamic: return BJ_MOTION_DYNAMIC;
330
- }
331
- return BJ_MOTION_DYNAMIC;
332
- }
333
- inline EActivation to_activation(bj_activation a) {
334
- return a == BJ_ACTIVATE ? EActivation::Activate : EActivation::DontActivate;
335
- }
336
-
337
- /* Run `build` under a multi-body write lock and add the resulting constraint
338
- * to the world. If body_b is BJ_INVALID, the world-fixed body is used. */
339
- template <typename Build>
340
- bj_constraint make_constraint(WorldImpl *w, const bj_constraint_anchors *a, Build &&build) {
341
- BodyID id1 = decode_body_id(a->body_a);
342
- BodyID id2 = (a->body_b != BJ_INVALID) ? decode_body_id(a->body_b) : BodyID();
343
- BodyID ids[2] = { id1, id2 };
344
- const int count = (a->body_b != BJ_INVALID) ? 2 : 1;
345
- BodyLockMultiWrite lock(w->system.GetBodyLockInterface(), ids, count);
346
- Body *b1 = lock.GetBody(0);
347
- Body *b2 = (count == 2) ? lock.GetBody(1) : &Body::sFixedToWorld;
348
- if (!b1 || !b2) return BJ_INVALID;
349
- TwoBodyConstraint *c = build(*b1, *b2);
350
- if (!c) return BJ_INVALID;
351
- w->system.AddConstraint(c);
352
- return encode_constraint(c);
353
- }
354
-
355
- } /* anonymous namespace */
356
-
357
- /* ================================================================== */
358
- /* IMPLEMENTATIONS */
359
- /* ================================================================== */
360
-
361
- extern "C" {
362
-
363
- /* ---- Global ---- */
364
-
365
- bj_result bj_global_init(void) {
366
- if (g_init_refcount.fetch_add(1) == 0) {
367
- RegisterDefaultAllocator();
368
- Factory::sInstance = new Factory();
369
- RegisterTypes();
370
- }
371
- return BJ_OK;
372
- }
373
-
374
- void bj_global_shutdown(void) {
375
- int prev = g_init_refcount.fetch_sub(1);
376
- if (prev == 1) {
377
- UnregisterTypes();
378
- delete Factory::sInstance;
379
- Factory::sInstance = nullptr;
380
- }
381
- }
382
-
383
- const char *bj_version_string(void) {
384
- return "Jolt 5.5.0 / bloom_jolt 0.1";
385
- }
386
-
387
- /* ---- World ---- */
388
-
389
- bj_world bj_world_create(const bj_world_desc *desc) {
390
- if (!desc) return BJ_INVALID;
391
- if (g_init_refcount.load() == 0) return BJ_INVALID;
392
-
393
- const uint32_t max_bodies =
394
- desc->max_bodies ? desc->max_bodies : 65536u;
395
- const uint32_t max_body_pairs =
396
- desc->max_body_pairs ? desc->max_body_pairs : 65536u;
397
- const uint32_t max_contact_constraints =
398
- desc->max_contact_constraints ? desc->max_contact_constraints : 10240u;
399
- const int num_threads = desc->num_threads
400
- ? (int)desc->num_threads
401
- : std::max(1, (int)std::thread::hardware_concurrency() - 1);
402
- const uint32_t temp_alloc_bytes =
403
- desc->temp_allocator_bytes ? desc->temp_allocator_bytes : (10u * 1024u * 1024u);
404
-
405
- auto *w = new WorldImpl();
406
- w->temp_alloc = new TempAllocatorImpl(temp_alloc_bytes);
407
- w->jobs = new JobSystemThreadPool(cMaxPhysicsJobs, cMaxPhysicsBarriers, num_threads);
408
-
409
- w->system.Init(
410
- max_bodies, /*numBodyMutexes=*/0,
411
- max_body_pairs, max_contact_constraints,
412
- w->bp_layer_interface, w->object_vs_bp_filter, w->layer_pair_filter
413
- );
414
- w->system.SetGravity(to_jph(desc->gravity));
415
- w->system.SetContactListener(&w->contacts);
416
- return as_handle(w);
417
- }
418
-
419
- void bj_world_destroy(bj_world world) {
420
- WorldImpl *w = as_world(world);
421
- if (!w) return;
422
- delete w->jobs;
423
- delete w->temp_alloc;
424
- delete w;
425
- }
426
-
427
- void bj_world_set_gravity(bj_world world, bj_vec3 gravity) {
428
- if (auto *w = as_world(world)) w->system.SetGravity(to_jph(gravity));
429
- }
430
-
431
- void bj_world_get_gravity(bj_world world, bj_vec3 *out) {
432
- if (!out) return;
433
- if (auto *w = as_world(world)) *out = from_jph(w->system.GetGravity());
434
- else *out = { 0.0f, 0.0f, 0.0f };
435
- }
436
-
437
- void bj_world_optimize_broadphase(bj_world world) {
438
- if (auto *w = as_world(world)) w->system.OptimizeBroadPhase();
439
- }
440
-
441
- bj_result bj_world_step(bj_world world, float delta_time, uint32_t collision_steps) {
442
- WorldImpl *w = as_world(world);
443
- if (!w) return BJ_ERR_INVALID_HANDLE;
444
- const int steps = collision_steps ? (int)collision_steps : 1;
445
- EPhysicsUpdateError err = w->system.Update(delta_time, steps, w->temp_alloc, w->jobs);
446
- return err == EPhysicsUpdateError::None ? BJ_OK : BJ_ERR_OUT_OF_MEMORY;
447
- }
448
-
449
- void bj_world_set_layer_collides(bj_world world, uint32_t a, uint32_t b, uint8_t collides) {
450
- if (auto *w = as_world(world)) w->layer_pair_filter.set(a, b, collides != 0);
451
- }
452
-
453
- uint8_t bj_world_get_layer_collides(bj_world world, uint32_t a, uint32_t b) {
454
- if (auto *w = as_world(world)) return w->layer_pair_filter.get(a, b) ? 1 : 0;
455
- return 0;
456
- }
457
-
458
- uint32_t bj_world_body_count(bj_world world) {
459
- if (auto *w = as_world(world)) return w->system.GetNumBodies();
460
- return 0;
461
- }
462
-
463
- uint32_t bj_world_active_body_count(bj_world world) {
464
- if (auto *w = as_world(world)) return w->system.GetNumActiveBodies(EBodyType::RigidBody);
465
- return 0;
466
- }
467
-
468
- /* ================================================================== */
469
- /* Shapes */
470
- /* ================================================================== */
471
-
472
- bj_shape bj_shape_box(bj_vec3 half_extents, float convex_radius) {
473
- BoxShapeSettings settings(to_jph(half_extents), convex_radius);
474
- auto result = settings.Create();
475
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
476
- }
477
-
478
- bj_shape bj_shape_sphere(float radius) {
479
- SphereShapeSettings settings(radius);
480
- auto result = settings.Create();
481
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
482
- }
483
-
484
- bj_shape bj_shape_capsule(float half_height, float radius) {
485
- CapsuleShapeSettings settings(half_height, radius);
486
- auto result = settings.Create();
487
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
488
- }
489
-
490
- bj_shape bj_shape_cylinder(float half_height, float radius, float convex_radius) {
491
- CylinderShapeSettings settings(half_height, radius, convex_radius);
492
- auto result = settings.Create();
493
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
494
- }
495
-
496
- bj_shape bj_shape_convex_hull(const bj_vec3 *points, uint32_t count, float convex_radius) {
497
- if (!points || count < 3) return BJ_INVALID;
498
- Array<Vec3> pts;
499
- pts.reserve(count);
500
- for (uint32_t i = 0; i < count; ++i) pts.push_back(to_jph(points[i]));
501
- ConvexHullShapeSettings settings(pts, convex_radius);
502
- auto result = settings.Create();
503
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
504
- }
505
-
506
- bj_shape bj_shape_mesh(const bj_vec3 *vertices, uint32_t vertex_count,
507
- const uint32_t *indices, uint32_t triangle_count)
508
- {
509
- if (!vertices || !indices || vertex_count == 0 || triangle_count == 0) return BJ_INVALID;
510
- VertexList v_list;
511
- v_list.reserve(vertex_count);
512
- for (uint32_t i = 0; i < vertex_count; ++i) {
513
- v_list.push_back(Float3(vertices[i].x, vertices[i].y, vertices[i].z));
514
- }
515
- IndexedTriangleList t_list;
516
- t_list.reserve(triangle_count);
517
- for (uint32_t i = 0; i < triangle_count; ++i) {
518
- t_list.push_back(IndexedTriangle(indices[i*3+0], indices[i*3+1], indices[i*3+2], 0));
519
- }
520
- MeshShapeSettings settings(std::move(v_list), std::move(t_list));
521
- settings.Sanitize();
522
- auto result = settings.Create();
523
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
524
- }
525
-
526
- bj_shape bj_shape_heightfield(const float *samples, uint32_t sample_count,
527
- bj_vec3 offset, bj_vec3 scale, uint32_t block_size)
528
- {
529
- if (!samples || sample_count < 2) return BJ_INVALID;
530
- HeightFieldShapeSettings settings(
531
- samples,
532
- to_jph(offset),
533
- to_jph(scale),
534
- sample_count
535
- );
536
- settings.mBlockSize = block_size ? block_size : 4u;
537
- auto result = settings.Create();
538
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
539
- }
540
-
541
- bj_shape bj_shape_compound_static(const bj_shape *shapes,
542
- const bj_transform *local_transforms,
543
- uint32_t count)
544
- {
545
- if (!shapes || !local_transforms || count == 0) return BJ_INVALID;
546
- StaticCompoundShapeSettings settings;
547
- for (uint32_t i = 0; i < count; ++i) {
548
- const Shape *child = decode_shape(shapes[i]);
549
- if (!child) return BJ_INVALID;
550
- settings.AddShape(
551
- to_jph(local_transforms[i].position),
552
- to_jph(local_transforms[i].rotation),
553
- child
554
- );
555
- }
556
- /* StaticCompoundShape::Create needs a temp allocator + job system for parallel BVH build.
557
- * For simplicity we use the default (nullptr = single-threaded build). */
558
- auto result = settings.Create();
559
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
560
- }
561
-
562
- bj_shape bj_shape_scaled(bj_shape base, bj_vec3 scale) {
563
- const Shape *inner = decode_shape(base);
564
- if (!inner) return BJ_INVALID;
565
- ScaledShapeSettings settings(inner, to_jph(scale));
566
- auto result = settings.Create();
567
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
568
- }
569
-
570
- bj_shape bj_shape_offset_com(bj_shape base, bj_vec3 offset) {
571
- const Shape *inner = decode_shape(base);
572
- if (!inner) return BJ_INVALID;
573
- OffsetCenterOfMassShapeSettings settings(to_jph(offset), inner);
574
- auto result = settings.Create();
575
- return result.IsValid() ? encode_shape(result.Get().GetPtr()) : BJ_INVALID;
576
- }
577
-
578
- void bj_shape_add_ref(bj_shape h) { if (auto *s = decode_shape(h)) s->AddRef(); }
579
- void bj_shape_release(bj_shape h) { if (auto *s = decode_shape(h)) s->Release(); }
580
-
581
- void bj_shape_get_local_bounds(bj_shape h, bj_vec3 *out_min, bj_vec3 *out_max) {
582
- if (auto *s = decode_shape(h)) {
583
- AABox b = s->GetLocalBounds();
584
- if (out_min) *out_min = from_jph(b.mMin);
585
- if (out_max) *out_max = from_jph(b.mMax);
586
- } else {
587
- if (out_min) *out_min = { 0, 0, 0 };
588
- if (out_max) *out_max = { 0, 0, 0 };
589
- }
590
- }
591
-
592
- float bj_shape_get_volume(bj_shape h) {
593
- if (auto *s = decode_shape(h)) return s->GetVolume();
594
- return 0.0f;
595
- }
596
-
597
- /* ================================================================== */
598
- /* Bodies */
599
- /* ================================================================== */
600
-
601
- bj_body bj_body_create(bj_world world, bj_shape shape, const bj_body_desc *desc) {
602
- WorldImpl *w = as_world(world);
603
- if (!w || !desc) return BJ_INVALID;
604
- const Shape *s = decode_shape(shape);
605
- if (!s) return BJ_INVALID;
606
-
607
- BodyCreationSettings settings(
608
- s,
609
- to_jph(desc->position),
610
- to_jph(desc->rotation),
611
- to_motion(desc->motion_type),
612
- (ObjectLayer)desc->object_layer
613
- );
614
- settings.mLinearVelocity = to_jph(desc->linear_velocity);
615
- settings.mAngularVelocity = to_jph(desc->angular_velocity);
616
- settings.mGravityFactor = desc->gravity_factor;
617
- settings.mLinearDamping = desc->linear_damping;
618
- settings.mAngularDamping = desc->angular_damping;
619
- settings.mFriction = desc->friction;
620
- settings.mRestitution = desc->restitution;
621
- settings.mIsSensor = desc->is_sensor != 0;
622
- settings.mAllowSleeping = desc->allow_sleeping != 0;
623
- settings.mMotionQuality =
624
- desc->use_ccd ? EMotionQuality::LinearCast : EMotionQuality::Discrete;
625
- settings.mUserData = desc->user_data;
626
-
627
- if (desc->mass_override > 0.0f) {
628
- settings.mOverrideMassProperties = EOverrideMassProperties::MassAndInertiaProvided;
629
- settings.mMassPropertiesOverride.mMass = desc->mass_override;
630
- Vec3 inertia_diag = to_jph(desc->inertia_diag_override);
631
- if (inertia_diag.LengthSq() > 0.0f) {
632
- settings.mMassPropertiesOverride.mInertia =
633
- Mat44::sScale(inertia_diag);
634
- } else {
635
- /* Auto-compute inertia from shape but scale by the mass ratio. */
636
- settings.mOverrideMassProperties =
637
- EOverrideMassProperties::CalculateInertia;
638
- settings.mMassPropertiesOverride.mMass = desc->mass_override;
639
- }
640
- }
641
-
642
- BodyInterface &bi = w->system.GetBodyInterface();
643
- EActivation act = desc->start_awake ? EActivation::Activate : EActivation::DontActivate;
644
- BodyID id = bi.CreateAndAddBody(settings, act);
645
- return encode_body_id(id);
646
- }
647
-
648
- void bj_body_destroy(bj_world world, bj_body body) {
649
- WorldImpl *w = as_world(world);
650
- if (!w || body == BJ_INVALID) return;
651
- BodyInterface &bi = w->system.GetBodyInterface();
652
- BodyID id = decode_body_id(body);
653
- if (bi.IsAdded(id)) bi.RemoveBody(id);
654
- bi.DestroyBody(id);
655
- }
656
-
657
- void bj_body_activate(bj_world world, bj_body body) {
658
- WorldImpl *w = as_world(world);
659
- if (!w || body == BJ_INVALID) return;
660
- w->system.GetBodyInterface().ActivateBody(decode_body_id(body));
661
- }
662
-
663
- void bj_body_deactivate(bj_world world, bj_body body) {
664
- WorldImpl *w = as_world(world);
665
- if (!w || body == BJ_INVALID) return;
666
- w->system.GetBodyInterface().DeactivateBody(decode_body_id(body));
667
- }
668
-
669
- uint8_t bj_body_is_active(bj_world world, bj_body body) {
670
- WorldImpl *w = as_world(world);
671
- if (!w || body == BJ_INVALID) return 0;
672
- return w->system.GetBodyInterface().IsActive(decode_body_id(body)) ? 1 : 0;
673
- }
674
-
675
- uint8_t bj_body_is_valid(bj_world world, bj_body body) {
676
- WorldImpl *w = as_world(world);
677
- if (!w || body == BJ_INVALID) return 0;
678
- return w->system.GetBodyInterface().IsAdded(decode_body_id(body)) ? 1 : 0;
679
- }
680
-
681
- void bj_body_get_transform(bj_world world, bj_body body, bj_transform *out) {
682
- if (!out) return;
683
- WorldImpl *w = as_world(world);
684
- if (!w || body == BJ_INVALID) {
685
- *out = { { 0, 0, 0 }, { 0, 0, 0, 1 } };
686
- return;
687
- }
688
- RVec3 p;
689
- Quat q;
690
- w->system.GetBodyInterface().GetPositionAndRotation(decode_body_id(body), p, q);
691
- out->position = from_jph(p);
692
- out->rotation = from_jph(q);
693
- }
694
-
695
- void bj_body_set_transform(bj_world world, bj_body body, const bj_transform *xform, bj_activation act) {
696
- WorldImpl *w = as_world(world);
697
- if (!w || !xform || body == BJ_INVALID) return;
698
- w->system.GetBodyInterface().SetPositionAndRotation(
699
- decode_body_id(body),
700
- to_jph(xform->position),
701
- to_jph(xform->rotation),
702
- to_activation(act)
703
- );
704
- }
705
-
706
- void bj_body_get_position(bj_world world, bj_body body, bj_vec3 *out) {
707
- if (!out) return;
708
- WorldImpl *w = as_world(world);
709
- if (!w || body == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
710
- *out = from_jph(w->system.GetBodyInterface().GetPosition(decode_body_id(body)));
711
- }
712
-
713
- void bj_body_get_rotation(bj_world world, bj_body body, bj_quat *out) {
714
- if (!out) return;
715
- WorldImpl *w = as_world(world);
716
- if (!w || body == BJ_INVALID) { *out = { 0, 0, 0, 1 }; return; }
717
- *out = from_jph(w->system.GetBodyInterface().GetRotation(decode_body_id(body)));
718
- }
719
-
720
- void bj_body_set_position(bj_world world, bj_body body, bj_vec3 pos, bj_activation act) {
721
- WorldImpl *w = as_world(world);
722
- if (!w || body == BJ_INVALID) return;
723
- w->system.GetBodyInterface().SetPosition(decode_body_id(body), to_jph(pos), to_activation(act));
724
- }
725
-
726
- void bj_body_set_rotation(bj_world world, bj_body body, bj_quat rot, bj_activation act) {
727
- WorldImpl *w = as_world(world);
728
- if (!w || body == BJ_INVALID) return;
729
- w->system.GetBodyInterface().SetRotation(decode_body_id(body), to_jph(rot), to_activation(act));
730
- }
731
-
732
- void bj_body_move_kinematic(bj_world world, bj_body body, const bj_transform *target, float dt) {
733
- WorldImpl *w = as_world(world);
734
- if (!w || !target || body == BJ_INVALID || dt <= 0.0f) return;
735
- w->system.GetBodyInterface().MoveKinematic(
736
- decode_body_id(body), to_jph(target->position), to_jph(target->rotation), dt
737
- );
738
- }
739
-
740
- void bj_body_get_linear_velocity(bj_world world, bj_body body, bj_vec3 *out) {
741
- if (!out) return;
742
- WorldImpl *w = as_world(world);
743
- if (!w || body == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
744
- *out = from_jph(w->system.GetBodyInterface().GetLinearVelocity(decode_body_id(body)));
745
- }
746
-
747
- void bj_body_get_angular_velocity(bj_world world, bj_body body, bj_vec3 *out) {
748
- if (!out) return;
749
- WorldImpl *w = as_world(world);
750
- if (!w || body == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
751
- *out = from_jph(w->system.GetBodyInterface().GetAngularVelocity(decode_body_id(body)));
752
- }
753
-
754
- void bj_body_set_linear_velocity(bj_world world, bj_body body, bj_vec3 v) {
755
- WorldImpl *w = as_world(world);
756
- if (!w || body == BJ_INVALID) return;
757
- w->system.GetBodyInterface().SetLinearVelocity(decode_body_id(body), to_jph(v));
758
- }
759
-
760
- void bj_body_set_angular_velocity(bj_world world, bj_body body, bj_vec3 v) {
761
- WorldImpl *w = as_world(world);
762
- if (!w || body == BJ_INVALID) return;
763
- w->system.GetBodyInterface().SetAngularVelocity(decode_body_id(body), to_jph(v));
764
- }
765
-
766
- void bj_body_get_point_velocity(bj_world world, bj_body body, bj_vec3 world_point, bj_vec3 *out) {
767
- if (!out) return;
768
- WorldImpl *w = as_world(world);
769
- if (!w || body == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
770
- *out = from_jph(w->system.GetBodyInterface().GetPointVelocity(decode_body_id(body), to_jph(world_point)));
771
- }
772
-
773
- void bj_body_add_force(bj_world world, bj_body body, bj_vec3 f) {
774
- WorldImpl *w = as_world(world);
775
- if (!w || body == BJ_INVALID) return;
776
- w->system.GetBodyInterface().AddForce(decode_body_id(body), to_jph(f));
777
- }
778
-
779
- void bj_body_add_impulse(bj_world world, bj_body body, bj_vec3 i) {
780
- WorldImpl *w = as_world(world);
781
- if (!w || body == BJ_INVALID) return;
782
- w->system.GetBodyInterface().AddImpulse(decode_body_id(body), to_jph(i));
783
- }
784
-
785
- void bj_body_add_torque(bj_world world, bj_body body, bj_vec3 t) {
786
- WorldImpl *w = as_world(world);
787
- if (!w || body == BJ_INVALID) return;
788
- w->system.GetBodyInterface().AddTorque(decode_body_id(body), to_jph(t));
789
- }
790
-
791
- void bj_body_add_angular_impulse(bj_world world, bj_body body, bj_vec3 i) {
792
- WorldImpl *w = as_world(world);
793
- if (!w || body == BJ_INVALID) return;
794
- w->system.GetBodyInterface().AddAngularImpulse(decode_body_id(body), to_jph(i));
795
- }
796
-
797
- void bj_body_add_force_at(bj_world world, bj_body body, bj_vec3 f, bj_vec3 p) {
798
- WorldImpl *w = as_world(world);
799
- if (!w || body == BJ_INVALID) return;
800
- w->system.GetBodyInterface().AddForce(decode_body_id(body), to_jph(f), to_jph(p));
801
- }
802
-
803
- void bj_body_add_impulse_at(bj_world world, bj_body body, bj_vec3 i, bj_vec3 p) {
804
- WorldImpl *w = as_world(world);
805
- if (!w || body == BJ_INVALID) return;
806
- w->system.GetBodyInterface().AddImpulse(decode_body_id(body), to_jph(i), to_jph(p));
807
- }
808
-
809
- void bj_body_set_friction(bj_world world, bj_body body, float f) {
810
- WorldImpl *w = as_world(world);
811
- if (!w || body == BJ_INVALID) return;
812
- w->system.GetBodyInterface().SetFriction(decode_body_id(body), f);
813
- }
814
-
815
- void bj_body_set_restitution(bj_world world, bj_body body, float r) {
816
- WorldImpl *w = as_world(world);
817
- if (!w || body == BJ_INVALID) return;
818
- w->system.GetBodyInterface().SetRestitution(decode_body_id(body), r);
819
- }
820
-
821
- void bj_body_set_linear_damping(bj_world world, bj_body body, float d) {
822
- WorldImpl *w = as_world(world);
823
- if (!w || body == BJ_INVALID) return;
824
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
825
- if (lock.Succeeded()) {
826
- if (MotionProperties *mp = lock.GetBody().GetMotionPropertiesUnchecked()) {
827
- mp->SetLinearDamping(d);
828
- }
829
- }
830
- }
831
-
832
- void bj_body_set_angular_damping(bj_world world, bj_body body, float d) {
833
- WorldImpl *w = as_world(world);
834
- if (!w || body == BJ_INVALID) return;
835
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
836
- if (lock.Succeeded()) {
837
- if (MotionProperties *mp = lock.GetBody().GetMotionPropertiesUnchecked()) {
838
- mp->SetAngularDamping(d);
839
- }
840
- }
841
- }
842
-
843
- void bj_body_set_gravity_factor(bj_world world, bj_body body, float factor) {
844
- WorldImpl *w = as_world(world);
845
- if (!w || body == BJ_INVALID) return;
846
- w->system.GetBodyInterface().SetGravityFactor(decode_body_id(body), factor);
847
- }
848
-
849
- void bj_body_set_ccd(bj_world world, bj_body body, uint8_t enabled) {
850
- WorldImpl *w = as_world(world);
851
- if (!w || body == BJ_INVALID) return;
852
- w->system.GetBodyInterface().SetMotionQuality(
853
- decode_body_id(body),
854
- enabled ? EMotionQuality::LinearCast : EMotionQuality::Discrete
855
- );
856
- }
857
-
858
- void bj_body_set_motion_type(bj_world world, bj_body body, bj_motion_type t, bj_activation act) {
859
- WorldImpl *w = as_world(world);
860
- if (!w || body == BJ_INVALID) return;
861
- w->system.GetBodyInterface().SetMotionType(decode_body_id(body), to_motion(t), to_activation(act));
862
- }
863
-
864
- void bj_body_set_object_layer(bj_world world, bj_body body, uint32_t layer) {
865
- WorldImpl *w = as_world(world);
866
- if (!w || body == BJ_INVALID) return;
867
- w->system.GetBodyInterface().SetObjectLayer(decode_body_id(body), (ObjectLayer)layer);
868
- }
869
-
870
- void bj_body_set_is_sensor(bj_world world, bj_body body, uint8_t enabled) {
871
- WorldImpl *w = as_world(world);
872
- if (!w || body == BJ_INVALID) return;
873
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
874
- if (lock.Succeeded()) lock.GetBody().SetIsSensor(enabled != 0);
875
- }
876
-
877
- void bj_body_set_allow_sleeping(bj_world world, bj_body body, uint8_t enabled) {
878
- WorldImpl *w = as_world(world);
879
- if (!w || body == BJ_INVALID) return;
880
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
881
- if (lock.Succeeded()) lock.GetBody().SetAllowSleeping(enabled != 0);
882
- }
883
-
884
- void bj_body_set_shape(bj_world world, bj_body body, bj_shape shape, uint8_t update_mass, bj_activation act) {
885
- WorldImpl *w = as_world(world);
886
- if (!w || body == BJ_INVALID) return;
887
- const Shape *s = decode_shape(shape);
888
- if (!s) return;
889
- w->system.GetBodyInterface().SetShape(decode_body_id(body), s, update_mass != 0, to_activation(act));
890
- }
891
-
892
- void bj_body_lock_rotation_axes(bj_world world, bj_body body, uint8_t lx, uint8_t ly, uint8_t lz) {
893
- WorldImpl *w = as_world(world);
894
- if (!w || body == BJ_INVALID) return;
895
- /* AllowedDOFs: bit 0-2 = translation X/Y/Z, bit 3-5 = rotation X/Y/Z. */
896
- uint8_t dofs = (uint8_t)EAllowedDOFs::All;
897
- if (lx) dofs &= ~(uint8_t)EAllowedDOFs::RotationX;
898
- if (ly) dofs &= ~(uint8_t)EAllowedDOFs::RotationY;
899
- if (lz) dofs &= ~(uint8_t)EAllowedDOFs::RotationZ;
900
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
901
- if (lock.Succeeded()) {
902
- if (MotionProperties *mp = lock.GetBody().GetMotionPropertiesUnchecked()) {
903
- /* Note: we preserve translation DOFs — lock_translation_axes is separate. */
904
- EAllowedDOFs existing = mp->GetAllowedDOFs();
905
- uint8_t trans_bits = (uint8_t)existing & 0x07u;
906
- mp->SetInverseInertia(
907
- mp->GetInverseInertiaDiagonal(),
908
- mp->GetInertiaRotation()
909
- ); /* keep inertia; Jolt has no direct AllowedDOFs setter post-create */
910
- /* Fall-back: zero the inverse inertia on locked axes. */
911
- Vec3 inv = mp->GetInverseInertiaDiagonal();
912
- if (lx) inv.SetX(0.0f);
913
- if (ly) inv.SetY(0.0f);
914
- if (lz) inv.SetZ(0.0f);
915
- mp->SetInverseInertia(inv, mp->GetInertiaRotation());
916
- (void)trans_bits;
917
- (void)dofs;
918
- }
919
- }
920
- }
921
-
922
- void bj_body_lock_translation_axes(bj_world world, bj_body body, uint8_t lx, uint8_t ly, uint8_t lz) {
923
- WorldImpl *w = as_world(world);
924
- if (!w || body == BJ_INVALID) return;
925
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(body));
926
- if (lock.Succeeded()) {
927
- if (MotionProperties *mp = lock.GetBody().GetMotionPropertiesUnchecked()) {
928
- /* Zero the inverse mass on locked translation axes via a motion-type-like hack:
929
- * we cannot change AllowedDOFs post-create in 5.5, so we clamp velocity each step.
930
- * For now we simply zero the current linear velocity component; full fidelity
931
- * requires re-creating the body. Tier 2 will add a proper API. */
932
- Vec3 v = lock.GetBody().GetLinearVelocity();
933
- if (lx) v.SetX(0.0f);
934
- if (ly) v.SetY(0.0f);
935
- if (lz) v.SetZ(0.0f);
936
- lock.GetBody().SetLinearVelocity(v);
937
- }
938
- }
939
- }
940
-
941
- float bj_body_get_mass(bj_world world, bj_body body) {
942
- WorldImpl *w = as_world(world);
943
- if (!w || body == BJ_INVALID) return 0.0f;
944
- BodyLockRead lock(w->system.GetBodyLockInterface(), decode_body_id(body));
945
- if (!lock.Succeeded()) return 0.0f;
946
- const MotionProperties *mp = lock.GetBody().GetMotionPropertiesUnchecked();
947
- if (!mp) return 0.0f;
948
- float inv = mp->GetInverseMass();
949
- return inv > 0.0f ? 1.0f / inv : 0.0f;
950
- }
951
-
952
- float bj_body_get_friction(bj_world world, bj_body body) {
953
- WorldImpl *w = as_world(world);
954
- if (!w || body == BJ_INVALID) return 0.0f;
955
- return w->system.GetBodyInterface().GetFriction(decode_body_id(body));
956
- }
957
-
958
- float bj_body_get_restitution(bj_world world, bj_body body) {
959
- WorldImpl *w = as_world(world);
960
- if (!w || body == BJ_INVALID) return 0.0f;
961
- return w->system.GetBodyInterface().GetRestitution(decode_body_id(body));
962
- }
963
-
964
- uint32_t bj_body_get_object_layer(bj_world world, bj_body body) {
965
- WorldImpl *w = as_world(world);
966
- if (!w || body == BJ_INVALID) return 0;
967
- return (uint32_t)w->system.GetBodyInterface().GetObjectLayer(decode_body_id(body));
968
- }
969
-
970
- void bj_body_set_user_data(bj_world world, bj_body body, uint64_t user_data) {
971
- WorldImpl *w = as_world(world);
972
- if (!w || body == BJ_INVALID) return;
973
- w->system.GetBodyInterface().SetUserData(decode_body_id(body), user_data);
974
- }
975
-
976
- uint64_t bj_body_get_user_data(bj_world world, bj_body body) {
977
- WorldImpl *w = as_world(world);
978
- if (!w || body == BJ_INVALID) return 0;
979
- return w->system.GetBodyInterface().GetUserData(decode_body_id(body));
980
- }
981
-
982
- uint32_t bj_world_sync_transforms(bj_world world, const bj_body *bodies, uint32_t count, bj_transform *out) {
983
- WorldImpl *w = as_world(world);
984
- if (!w || !bodies || !out || count == 0) return 0;
985
- const BodyLockInterface &lock_if = w->system.GetBodyLockInterface();
986
- uint32_t valid = 0;
987
- for (uint32_t i = 0; i < count; ++i) {
988
- out[i] = { { 0, 0, 0 }, { 0, 0, 0, 1 } };
989
- if (bodies[i] == BJ_INVALID) continue;
990
- BodyLockRead lock(lock_if, decode_body_id(bodies[i]));
991
- if (!lock.Succeeded()) continue;
992
- RVec3 p = lock.GetBody().GetPosition();
993
- Quat q = lock.GetBody().GetRotation();
994
- out[i].position = from_jph(p);
995
- out[i].rotation = from_jph(q);
996
- ++valid;
997
- }
998
- return valid;
999
- }
1000
-
1001
- /* ================================================================== */
1002
- /* Queries */
1003
- /* ================================================================== */
1004
-
1005
- uint8_t bj_query_raycast_closest(bj_world world,
1006
- bj_vec3 origin, bj_vec3 direction, float max_distance,
1007
- uint32_t layer_mask, bj_ray_hit *out_hit)
1008
- {
1009
- WorldImpl *w = as_world(world);
1010
- if (!w || !out_hit) return 0;
1011
-
1012
- Vec3 dir = to_jph(direction);
1013
- if (dir.LengthSq() == 0.0f) return 0;
1014
- dir = dir.Normalized() * max_distance;
1015
-
1016
- RRayCast ray(to_jph(origin), dir);
1017
- RayCastResult hit;
1018
- LayerMaskBPFilter bp_filter(layer_mask);
1019
- LayerMaskObjectFilter obj_filter(layer_mask);
1020
-
1021
- bool any = w->system.GetNarrowPhaseQuery().CastRay(ray, hit, bp_filter, obj_filter);
1022
- if (!any) return 0;
1023
-
1024
- Vec3 point = Vec3(ray.mOrigin) + ray.mDirection * hit.mFraction;
1025
- out_hit->body = encode_body_id(hit.mBodyID);
1026
- out_hit->point = from_jph(point);
1027
- /* Compute normal via body lock */
1028
- {
1029
- BodyLockRead lock(w->system.GetBodyLockInterface(), hit.mBodyID);
1030
- if (lock.Succeeded()) {
1031
- Vec3 n = lock.GetBody().GetWorldSpaceSurfaceNormal(hit.mSubShapeID2, RVec3(point));
1032
- out_hit->normal = from_jph(n);
1033
- } else {
1034
- out_hit->normal = { 0.0f, 1.0f, 0.0f };
1035
- }
1036
- }
1037
- out_hit->fraction = hit.mFraction;
1038
- out_hit->sub_shape_id = hit.mSubShapeID2.GetValue();
1039
- return 1;
1040
- }
1041
-
1042
- uint32_t bj_query_raycast_all(bj_world world,
1043
- bj_vec3 origin, bj_vec3 direction, float max_distance,
1044
- uint32_t layer_mask,
1045
- bj_ray_hit *out_hits, uint32_t max_hits)
1046
- {
1047
- WorldImpl *w = as_world(world);
1048
- if (!w || !out_hits || max_hits == 0) return 0;
1049
-
1050
- Vec3 dir = to_jph(direction);
1051
- if (dir.LengthSq() == 0.0f) return 0;
1052
- dir = dir.Normalized() * max_distance;
1053
-
1054
- RRayCast ray(to_jph(origin), dir);
1055
- RayCastSettings settings;
1056
- settings.mBackFaceModeTriangles = EBackFaceMode::CollideWithBackFaces;
1057
- AllHitCollisionCollector<CastRayCollector> collector;
1058
- LayerMaskBPFilter bp_filter(layer_mask);
1059
- LayerMaskObjectFilter obj_filter(layer_mask);
1060
-
1061
- w->system.GetNarrowPhaseQuery().CastRay(ray, settings, collector, bp_filter, obj_filter);
1062
- collector.Sort();
1063
-
1064
- uint32_t n = std::min<uint32_t>(max_hits, (uint32_t)collector.mHits.size());
1065
- for (uint32_t i = 0; i < n; ++i) {
1066
- const RayCastResult &h = collector.mHits[i];
1067
- Vec3 point = Vec3(ray.mOrigin) + ray.mDirection * h.mFraction;
1068
- out_hits[i].body = encode_body_id(h.mBodyID);
1069
- out_hits[i].point = from_jph(point);
1070
- BodyLockRead lock(w->system.GetBodyLockInterface(), h.mBodyID);
1071
- if (lock.Succeeded()) {
1072
- Vec3 nrm = lock.GetBody().GetWorldSpaceSurfaceNormal(h.mSubShapeID2, RVec3(point));
1073
- out_hits[i].normal = from_jph(nrm);
1074
- } else {
1075
- out_hits[i].normal = { 0, 1, 0 };
1076
- }
1077
- out_hits[i].fraction = h.mFraction;
1078
- out_hits[i].sub_shape_id = h.mSubShapeID2.GetValue();
1079
- }
1080
- return n;
1081
- }
1082
-
1083
- uint8_t bj_query_shape_cast_closest(bj_world world, bj_shape shape,
1084
- const bj_transform *start, bj_vec3 direction,
1085
- uint32_t layer_mask, bj_ray_hit *out_hit)
1086
- {
1087
- WorldImpl *w = as_world(world);
1088
- if (!w || !start || !out_hit) return 0;
1089
- const Shape *s = decode_shape(shape);
1090
- if (!s) return 0;
1091
-
1092
- RShapeCast cast = RShapeCast::sFromWorldTransform(
1093
- s, Vec3::sOne(),
1094
- RMat44::sRotationTranslation(to_jph(start->rotation), to_jph(start->position)),
1095
- to_jph(direction)
1096
- );
1097
- ClosestHitCollisionCollector<CastShapeCollector> collector;
1098
- ShapeCastSettings settings;
1099
- LayerMaskBPFilter bp_filter(layer_mask);
1100
- LayerMaskObjectFilter obj_filter(layer_mask);
1101
-
1102
- w->system.GetNarrowPhaseQuery().CastShape(cast, settings, cast.mCenterOfMassStart.GetTranslation(), collector, bp_filter, obj_filter);
1103
- if (!collector.HadHit()) return 0;
1104
-
1105
- const ShapeCastResult &h = collector.mHit;
1106
- out_hit->body = encode_body_id(h.mBodyID2);
1107
- out_hit->point = from_jph(h.mContactPointOn2);
1108
- out_hit->normal = from_jph(-h.mPenetrationAxis.Normalized());
1109
- out_hit->fraction = h.mFraction;
1110
- out_hit->sub_shape_id = h.mSubShapeID2.GetValue();
1111
- return 1;
1112
- }
1113
-
1114
- namespace {
1115
- class BodyCollector final : public CollideShapeBodyCollector {
1116
- public:
1117
- BodyCollector(bj_body *out, uint32_t max_out) : m_out(out), m_max(max_out) {}
1118
- void AddHit(const BodyID &id) override {
1119
- if (m_count < m_max) {
1120
- m_out[m_count++] = encode_body_id(id);
1121
- }
1122
- }
1123
- uint32_t count() const { return m_count; }
1124
- private:
1125
- bj_body *m_out;
1126
- uint32_t m_max;
1127
- uint32_t m_count = 0;
1128
- };
1129
- } /* namespace */
1130
-
1131
- uint32_t bj_query_overlap_sphere(bj_world world, bj_vec3 center, float radius,
1132
- uint32_t layer_mask, bj_body *out_bodies, uint32_t max_results)
1133
- {
1134
- WorldImpl *w = as_world(world);
1135
- if (!w || !out_bodies || max_results == 0) return 0;
1136
- BodyCollector collector(out_bodies, max_results);
1137
- LayerMaskBPFilter bp_filter(layer_mask);
1138
- LayerMaskObjectFilter obj_filter(layer_mask);
1139
- w->system.GetBroadPhaseQuery().CollideSphere(to_jph(center), radius, collector, bp_filter, obj_filter);
1140
- return collector.count();
1141
- }
1142
-
1143
- uint32_t bj_query_overlap_box(bj_world world, const bj_transform *xform, bj_vec3 half_extents,
1144
- uint32_t layer_mask, bj_body *out_bodies, uint32_t max_results)
1145
- {
1146
- WorldImpl *w = as_world(world);
1147
- if (!w || !xform || !out_bodies || max_results == 0) return 0;
1148
- /* Approximate by AABB around the rotated box. */
1149
- Vec3 he = to_jph(half_extents);
1150
- Mat44 rot = Mat44::sRotation(to_jph(xform->rotation));
1151
- Vec3 r0 = rot * Vec3(he.GetX(), 0, 0);
1152
- Vec3 r1 = rot * Vec3(0, he.GetY(), 0);
1153
- Vec3 r2 = rot * Vec3(0, 0, he.GetZ());
1154
- Vec3 extent = r0.Abs() + r1.Abs() + r2.Abs();
1155
- AABox box(to_jph(xform->position) - extent, to_jph(xform->position) + extent);
1156
- BodyCollector collector(out_bodies, max_results);
1157
- LayerMaskBPFilter bp_filter(layer_mask);
1158
- LayerMaskObjectFilter obj_filter(layer_mask);
1159
- w->system.GetBroadPhaseQuery().CollideAABox(box, collector, bp_filter, obj_filter);
1160
- return collector.count();
1161
- }
1162
-
1163
- uint32_t bj_query_overlap_point(bj_world world, bj_vec3 point,
1164
- uint32_t layer_mask, bj_body *out_bodies, uint32_t max_results)
1165
- {
1166
- WorldImpl *w = as_world(world);
1167
- if (!w || !out_bodies || max_results == 0) return 0;
1168
- BodyCollector collector(out_bodies, max_results);
1169
- LayerMaskBPFilter bp_filter(layer_mask);
1170
- LayerMaskObjectFilter obj_filter(layer_mask);
1171
- w->system.GetBroadPhaseQuery().CollidePoint(to_jph(point), collector, bp_filter, obj_filter);
1172
- return collector.count();
1173
- }
1174
-
1175
- /* ================================================================== */
1176
- /* Constraints */
1177
- /* ================================================================== */
1178
-
1179
- bj_constraint bj_constraint_fixed(bj_world world, const bj_constraint_anchors *a) {
1180
- WorldImpl *w = as_world(world);
1181
- if (!w || !a) return BJ_INVALID;
1182
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1183
- FixedConstraintSettings s;
1184
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1185
- s.mPoint1 = to_jph(a->anchor_a);
1186
- s.mPoint2 = to_jph(a->anchor_b);
1187
- s.mAutoDetectPoint = false;
1188
- return s.Create(b1, b2);
1189
- });
1190
- }
1191
-
1192
- bj_constraint bj_constraint_point(bj_world world, const bj_constraint_anchors *a) {
1193
- WorldImpl *w = as_world(world);
1194
- if (!w || !a) return BJ_INVALID;
1195
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1196
- PointConstraintSettings s;
1197
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1198
- s.mPoint1 = to_jph(a->anchor_a);
1199
- s.mPoint2 = to_jph(a->anchor_b);
1200
- return s.Create(b1, b2);
1201
- });
1202
- }
1203
-
1204
- bj_constraint bj_constraint_hinge(bj_world world, const bj_constraint_anchors *a,
1205
- bj_vec3 axis, float limit_min, float limit_max)
1206
- {
1207
- WorldImpl *w = as_world(world);
1208
- if (!w || !a) return BJ_INVALID;
1209
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1210
- HingeConstraintSettings s;
1211
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1212
- s.mPoint1 = to_jph(a->anchor_a);
1213
- s.mPoint2 = to_jph(a->anchor_b);
1214
- Vec3 ax = to_jph(axis);
1215
- s.mHingeAxis1 = ax;
1216
- s.mHingeAxis2 = ax;
1217
- Vec3 perp = ax.GetNormalizedPerpendicular();
1218
- s.mNormalAxis1 = perp;
1219
- s.mNormalAxis2 = perp;
1220
- if (limit_min < limit_max) {
1221
- s.mLimitsMin = limit_min;
1222
- s.mLimitsMax = limit_max;
1223
- }
1224
- return s.Create(b1, b2);
1225
- });
1226
- }
1227
-
1228
- bj_constraint bj_constraint_slider(bj_world world, const bj_constraint_anchors *a,
1229
- bj_vec3 axis, float limit_min, float limit_max)
1230
- {
1231
- WorldImpl *w = as_world(world);
1232
- if (!w || !a) return BJ_INVALID;
1233
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1234
- SliderConstraintSettings s;
1235
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1236
- s.mPoint1 = to_jph(a->anchor_a);
1237
- s.mPoint2 = to_jph(a->anchor_b);
1238
- Vec3 ax = to_jph(axis).Normalized();
1239
- s.mSliderAxis1 = ax;
1240
- s.mSliderAxis2 = ax;
1241
- Vec3 perp = ax.GetNormalizedPerpendicular();
1242
- s.mNormalAxis1 = perp;
1243
- s.mNormalAxis2 = perp;
1244
- if (limit_min < limit_max) {
1245
- s.mLimitsMin = limit_min;
1246
- s.mLimitsMax = limit_max;
1247
- }
1248
- return s.Create(b1, b2);
1249
- });
1250
- }
1251
-
1252
- bj_constraint bj_constraint_distance(bj_world world, const bj_constraint_anchors *a,
1253
- float min_distance, float max_distance)
1254
- {
1255
- WorldImpl *w = as_world(world);
1256
- if (!w || !a) return BJ_INVALID;
1257
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1258
- DistanceConstraintSettings s;
1259
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1260
- s.mPoint1 = to_jph(a->anchor_a);
1261
- s.mPoint2 = to_jph(a->anchor_b);
1262
- s.mMinDistance = min_distance;
1263
- s.mMaxDistance = max_distance;
1264
- return s.Create(b1, b2);
1265
- });
1266
- }
1267
-
1268
- bj_constraint bj_constraint_six_dof(bj_world world, const bj_constraint_anchors *a,
1269
- const float *trans_limits, const float *rot_limits)
1270
- {
1271
- WorldImpl *w = as_world(world);
1272
- if (!w || !a) return BJ_INVALID;
1273
- return make_constraint(w, a, [&](Body &b1, Body &b2) -> TwoBodyConstraint * {
1274
- SixDOFConstraintSettings s;
1275
- s.mSpace = a->use_world_space ? EConstraintSpace::WorldSpace : EConstraintSpace::LocalToBodyCOM;
1276
- s.mPosition1 = to_jph(a->anchor_a);
1277
- s.mPosition2 = to_jph(a->anchor_b);
1278
- s.mAxisX1 = s.mAxisX2 = Vec3(1, 0, 0);
1279
- s.mAxisY1 = s.mAxisY2 = Vec3(0, 1, 0);
1280
- if (trans_limits) {
1281
- using EAxis = SixDOFConstraintSettings::EAxis;
1282
- EAxis axes[3] = { EAxis::TranslationX, EAxis::TranslationY, EAxis::TranslationZ };
1283
- for (int i = 0; i < 3; ++i) {
1284
- float lo = trans_limits[i*2 + 0], hi = trans_limits[i*2 + 1];
1285
- if (lo >= hi) { s.MakeFixedAxis(axes[i]); }
1286
- else { s.SetLimitedAxis(axes[i], lo, hi); }
1287
- }
1288
- }
1289
- if (rot_limits) {
1290
- using EAxis = SixDOFConstraintSettings::EAxis;
1291
- EAxis axes[3] = { EAxis::RotationX, EAxis::RotationY, EAxis::RotationZ };
1292
- for (int i = 0; i < 3; ++i) {
1293
- float lo = rot_limits[i*2 + 0], hi = rot_limits[i*2 + 1];
1294
- if (lo >= hi) { s.MakeFixedAxis(axes[i]); }
1295
- else { s.SetLimitedAxis(axes[i], lo, hi); }
1296
- }
1297
- }
1298
- return s.Create(b1, b2);
1299
- });
1300
- }
1301
-
1302
- void bj_constraint_destroy(bj_world world, bj_constraint c) {
1303
- WorldImpl *w = as_world(world);
1304
- if (!w || c == BJ_INVALID) return;
1305
- Constraint *cp = decode_constraint(c);
1306
- w->system.RemoveConstraint(cp);
1307
- cp->Release(); /* release our handle's ref */
1308
- }
1309
-
1310
- void bj_constraint_set_enabled(bj_world world, bj_constraint c, uint8_t enabled) {
1311
- (void)world;
1312
- if (c == BJ_INVALID) return;
1313
- decode_constraint(c)->SetEnabled(enabled != 0);
1314
- }
1315
-
1316
- /* ================================================================== */
1317
- /* Contact events */
1318
- /* ================================================================== */
1319
-
1320
- uint32_t bj_world_contact_count(bj_world world) {
1321
- WorldImpl *w = as_world(world);
1322
- return w ? w->contacts.count() : 0;
1323
- }
1324
-
1325
- uint32_t bj_world_pop_contacts(bj_world world, bj_contact *out, uint32_t max_out) {
1326
- WorldImpl *w = as_world(world);
1327
- return w ? w->contacts.drain(out, max_out) : 0;
1328
- }
1329
-
1330
- void bj_world_clear_contacts(bj_world world) {
1331
- if (auto *w = as_world(world)) w->contacts.clear();
1332
- }
1333
-
1334
- /* ================================================================== */
1335
- /* Character controller (CharacterVirtual) */
1336
- /* ================================================================== */
1337
- /* CharacterVirtual doesn't store its own layer so we wrap it in a */
1338
- /* CharacterEntry that retains both the object + its configured layer. */
1339
-
1340
- namespace {
1341
- struct CharacterEntry {
1342
- Ref<CharacterVirtual> character;
1343
- ObjectLayer layer;
1344
- };
1345
- } /* namespace */
1346
-
1347
- static inline CharacterEntry *decode_character(bj_character h) {
1348
- return reinterpret_cast<CharacterEntry *>(h);
1349
- }
1350
-
1351
- bj_character bj_character_create(bj_world world, bj_shape shape, const bj_character_desc *desc,
1352
- bj_vec3 position, bj_quat rotation)
1353
- {
1354
- WorldImpl *w = as_world(world);
1355
- if (!w || !desc) return BJ_INVALID;
1356
- const Shape *s = decode_shape(shape);
1357
- if (!s) return BJ_INVALID;
1358
-
1359
- Ref<CharacterVirtualSettings> settings = new CharacterVirtualSettings();
1360
- settings->mShape = s;
1361
- settings->mMaxSlopeAngle = desc->max_slope_angle;
1362
- settings->mCharacterPadding = desc->character_padding;
1363
- settings->mPenetrationRecoverySpeed = desc->penetration_recovery_speed;
1364
- settings->mPredictiveContactDistance = desc->predictive_contact_distance;
1365
- settings->mMaxStrength = desc->max_strength;
1366
- settings->mMass = desc->mass;
1367
- settings->mUp = to_jph(desc->up);
1368
- /* Supporting-volume plane points up through feet; matches Jolt samples. */
1369
- settings->mSupportingVolume = Plane(to_jph(desc->up), -0.3f);
1370
-
1371
- CharacterVirtual *c = new CharacterVirtual(
1372
- settings,
1373
- to_jph(position), to_jph(rotation),
1374
- /*user_data=*/0,
1375
- &w->system
1376
- );
1377
- auto *entry = new CharacterEntry();
1378
- entry->character = c; /* Ref<> AddRefs internally */
1379
- entry->layer = (ObjectLayer)desc->object_layer;
1380
- return reinterpret_cast<bj_character>(entry);
1381
- }
1382
-
1383
- void bj_character_destroy(bj_world /*world*/, bj_character h) {
1384
- if (h == BJ_INVALID) return;
1385
- delete decode_character(h); /* Ref<> drops + deletes character */
1386
- }
1387
-
1388
- void bj_character_update(bj_world world, bj_character h, float delta_time, bj_vec3 gravity) {
1389
- WorldImpl *w = as_world(world);
1390
- if (!w || h == BJ_INVALID) return;
1391
- CharacterEntry *e = decode_character(h);
1392
-
1393
- /* Jolt's ExtendedUpdate uses `gravity` only for slope/direction decisions —
1394
- * it does NOT integrate gravity into velocity. We do that here so the FFI
1395
- * matches player intuition ("set move direction, update handles falling"). */
1396
- Vec3 v = e->character->GetLinearVelocity();
1397
- v += to_jph(gravity) * delta_time;
1398
- e->character->SetLinearVelocity(v);
1399
-
1400
- CharacterVirtual::ExtendedUpdateSettings settings; /* Jolt defaults */
1401
- BodyFilter body_filter;
1402
- ShapeFilter shape_filter;
1403
- e->character->ExtendedUpdate(
1404
- delta_time, to_jph(gravity),
1405
- settings,
1406
- w->system.GetDefaultBroadPhaseLayerFilter(e->layer),
1407
- w->system.GetDefaultLayerFilter(e->layer),
1408
- body_filter, shape_filter,
1409
- *w->temp_alloc
1410
- );
1411
- }
1412
-
1413
- void bj_character_get_position(bj_world /*world*/, bj_character h, bj_vec3 *out) {
1414
- if (!out) return;
1415
- if (h == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
1416
- *out = from_jph(decode_character(h)->character->GetPosition());
1417
- }
1418
- void bj_character_get_rotation(bj_world /*world*/, bj_character h, bj_quat *out) {
1419
- if (!out) return;
1420
- if (h == BJ_INVALID) { *out = { 0, 0, 0, 1 }; return; }
1421
- *out = from_jph(decode_character(h)->character->GetRotation());
1422
- }
1423
- void bj_character_set_position(bj_world /*world*/, bj_character h, bj_vec3 p) {
1424
- if (h == BJ_INVALID) return;
1425
- decode_character(h)->character->SetPosition(to_jph(p));
1426
- }
1427
- void bj_character_set_rotation(bj_world /*world*/, bj_character h, bj_quat q) {
1428
- if (h == BJ_INVALID) return;
1429
- decode_character(h)->character->SetRotation(to_jph(q));
1430
- }
1431
-
1432
- void bj_character_get_linear_velocity(bj_world /*world*/, bj_character h, bj_vec3 *out) {
1433
- if (!out) return;
1434
- if (h == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
1435
- *out = from_jph(decode_character(h)->character->GetLinearVelocity());
1436
- }
1437
- void bj_character_set_linear_velocity(bj_world /*world*/, bj_character h, bj_vec3 v) {
1438
- if (h == BJ_INVALID) return;
1439
- decode_character(h)->character->SetLinearVelocity(to_jph(v));
1440
- }
1441
-
1442
- bj_ground_state bj_character_get_ground_state(bj_world /*world*/, bj_character h) {
1443
- if (h == BJ_INVALID) return BJ_GROUND_IN_AIR;
1444
- switch (decode_character(h)->character->GetGroundState()) {
1445
- case CharacterBase::EGroundState::OnGround: return BJ_GROUND_ON_GROUND;
1446
- case CharacterBase::EGroundState::OnSteepGround: return BJ_GROUND_ON_STEEP;
1447
- case CharacterBase::EGroundState::NotSupported: return BJ_GROUND_NOT_SUPPORTED;
1448
- case CharacterBase::EGroundState::InAir: return BJ_GROUND_IN_AIR;
1449
- }
1450
- return BJ_GROUND_IN_AIR;
1451
- }
1452
- void bj_character_get_ground_normal(bj_world /*world*/, bj_character h, bj_vec3 *out) {
1453
- if (!out) return;
1454
- if (h == BJ_INVALID) { *out = { 0, 1, 0 }; return; }
1455
- *out = from_jph(decode_character(h)->character->GetGroundNormal());
1456
- }
1457
- void bj_character_get_ground_position(bj_world /*world*/, bj_character h, bj_vec3 *out) {
1458
- if (!out) return;
1459
- if (h == BJ_INVALID) { *out = { 0, 0, 0 }; return; }
1460
- *out = from_jph(decode_character(h)->character->GetGroundPosition());
1461
- }
1462
- bj_body bj_character_get_ground_body(bj_world /*world*/, bj_character h) {
1463
- if (h == BJ_INVALID) return BJ_INVALID;
1464
- return encode_body_id(decode_character(h)->character->GetGroundBodyID());
1465
- }
1466
-
1467
- /* ================================================================== */
1468
- /* Wheeled vehicles */
1469
- /* ================================================================== */
1470
- /* A VehicleEntry owns the chassis body + the VehicleConstraint + its */
1471
- /* collision tester. Jolt's constraint stores a bare pointer to the */
1472
- /* tester; it must outlive the constraint — that's why we wrap both. */
1473
-
1474
- namespace {
1475
- struct VehicleEntry {
1476
- BodyID chassis_id;
1477
- Ref<VehicleConstraint> constraint;
1478
- Ref<VehicleCollisionTesterRay> tester;
1479
- };
1480
- } /* namespace */
1481
-
1482
- static inline VehicleEntry *decode_vehicle(bj_vehicle h) {
1483
- return reinterpret_cast<VehicleEntry *>(h);
1484
- }
1485
-
1486
- bj_vehicle bj_vehicle_create(bj_world world, bj_shape chassis_shape,
1487
- const bj_vehicle_desc *desc,
1488
- bj_vec3 position, bj_quat rotation)
1489
- {
1490
- WorldImpl *w = as_world(world);
1491
- if (!w || !desc) return BJ_INVALID;
1492
- const Shape *shape = decode_shape(chassis_shape);
1493
- if (!shape) return BJ_INVALID;
1494
-
1495
- BodyInterface &bi = w->system.GetBodyInterface();
1496
-
1497
- /* Create the chassis body — a regular dynamic body the vehicle constraint
1498
- * drives via wheel forces. */
1499
- BodyCreationSettings chassis_settings(
1500
- shape,
1501
- to_jph(position), to_jph(rotation),
1502
- EMotionType::Dynamic, (ObjectLayer)desc->object_layer
1503
- );
1504
- chassis_settings.mOverrideMassProperties = EOverrideMassProperties::CalculateInertia;
1505
- chassis_settings.mMassPropertiesOverride.mMass = 1500.0f; /* typical car mass */
1506
- BodyID chassis_id = bi.CreateAndAddBody(chassis_settings, EActivation::Activate);
1507
-
1508
- /* Vehicle constraint settings. */
1509
- VehicleConstraintSettings vcs;
1510
- vcs.mUp = to_jph(desc->up);
1511
- vcs.mForward = to_jph(desc->forward);
1512
- vcs.mMaxPitchRollAngle = desc->max_pitch_roll_angle;
1513
-
1514
- /* Four wheels — indices 0..3 matching bj_vehicle_desc::wheel_positions.
1515
- * Front wheels steer; rear wheels drive. */
1516
- for (int i = 0; i < 4; ++i) {
1517
- auto *wheel = new WheelSettingsWV();
1518
- wheel->mPosition = to_jph(desc->wheel_positions[i]);
1519
- wheel->mRadius = desc->wheel_radius;
1520
- wheel->mWidth = desc->wheel_width;
1521
- wheel->mSuspensionMinLength = desc->suspension_min_length;
1522
- wheel->mSuspensionMaxLength = desc->suspension_max_length;
1523
- wheel->mMaxSteerAngle = (i < 2) ? desc->max_steer_angle : 0.0f;
1524
- wheel->mMaxBrakeTorque = desc->max_brake_torque;
1525
- wheel->mMaxHandBrakeTorque = (i >= 2) ? desc->max_handbrake_torque : 0.0f;
1526
- vcs.mWheels.push_back(wheel);
1527
- }
1528
-
1529
- /* Wheeled controller: one engine, automatic transmission defaults,
1530
- * one differential driving the rear axle. */
1531
- auto *controller = new WheeledVehicleControllerSettings();
1532
- controller->mEngine.mMaxTorque = desc->engine_max_torque;
1533
- VehicleDifferentialSettings diff;
1534
- diff.mLeftWheel = 2; /* rear-left */
1535
- diff.mRightWheel = 3; /* rear-right */
1536
- controller->mDifferentials.push_back(diff);
1537
- vcs.mController = controller;
1538
-
1539
- /* Ray collision tester — one ray per wheel. Use non-moving layer for the
1540
- * ground it collides against; for multi-layer setups, expose it later. */
1541
- Ref<VehicleCollisionTesterRay> tester = new VehicleCollisionTesterRay(
1542
- (ObjectLayer)BJ_LAYER_NON_MOVING,
1543
- to_jph(desc->up)
1544
- );
1545
-
1546
- /* Create the constraint against the (locked) chassis body. */
1547
- VehicleConstraint *constraint = nullptr;
1548
- {
1549
- BodyLockWrite lock(w->system.GetBodyLockInterface(), chassis_id);
1550
- if (!lock.Succeeded()) {
1551
- bi.RemoveBody(chassis_id);
1552
- bi.DestroyBody(chassis_id);
1553
- return BJ_INVALID;
1554
- }
1555
- constraint = new VehicleConstraint(lock.GetBody(), vcs);
1556
- }
1557
- constraint->SetVehicleCollisionTester(tester);
1558
-
1559
- w->system.AddConstraint(constraint);
1560
- /* Crucial: register as step-listener so the vehicle updates each physics step. */
1561
- w->system.AddStepListener(constraint);
1562
-
1563
- auto *entry = new VehicleEntry();
1564
- entry->chassis_id = chassis_id;
1565
- entry->constraint = constraint;
1566
- entry->tester = tester;
1567
- return reinterpret_cast<bj_vehicle>(entry);
1568
- }
1569
-
1570
- void bj_vehicle_destroy(bj_world world, bj_vehicle h) {
1571
- WorldImpl *w = as_world(world);
1572
- if (!w || h == BJ_INVALID) return;
1573
- VehicleEntry *e = decode_vehicle(h);
1574
- w->system.RemoveStepListener(e->constraint);
1575
- w->system.RemoveConstraint(e->constraint);
1576
- BodyInterface &bi = w->system.GetBodyInterface();
1577
- if (bi.IsAdded(e->chassis_id)) bi.RemoveBody(e->chassis_id);
1578
- bi.DestroyBody(e->chassis_id);
1579
- delete e; /* Ref<> drops constraint + tester */
1580
- }
1581
-
1582
- bj_body bj_vehicle_get_chassis(bj_world /*world*/, bj_vehicle h) {
1583
- if (h == BJ_INVALID) return BJ_INVALID;
1584
- return encode_body_id(decode_vehicle(h)->chassis_id);
1585
- }
1586
-
1587
- void bj_vehicle_set_input(bj_world world, bj_vehicle h,
1588
- float forward, float right, float brake, float handbrake)
1589
- {
1590
- WorldImpl *w = as_world(world);
1591
- if (!w || h == BJ_INVALID) return;
1592
- VehicleEntry *e = decode_vehicle(h);
1593
- auto *ctrl = static_cast<WheeledVehicleController *>(e->constraint->GetController());
1594
- ctrl->SetDriverInput(forward, right, brake, handbrake);
1595
- /* Wake the chassis body so throttle/brake take effect even after it's slept
1596
- * on the suspension. Without this a car that came to rest ignores input. */
1597
- if (forward != 0.0f || brake != 0.0f || handbrake != 0.0f || right != 0.0f) {
1598
- w->system.GetBodyInterface().ActivateBody(e->chassis_id);
1599
- }
1600
- }
1601
-
1602
- float bj_vehicle_get_wheel_transform(bj_world world, bj_vehicle h,
1603
- uint32_t wheel_index, uint32_t axis)
1604
- {
1605
- WorldImpl *w = as_world(world);
1606
- if (!w || h == BJ_INVALID || wheel_index >= 4) return 0.0f;
1607
- VehicleEntry *e = decode_vehicle(h);
1608
- /* GetWheelWorldTransform needs wheel-local up + right axes. Jolt uses
1609
- * the wheel's mWheelUp (default = chassis up) and mWheelForward for
1610
- * orientation. Right-handed: we pick X as the wheel rotation axis. */
1611
- Mat44 xform = e->constraint->GetWheelWorldTransform(
1612
- wheel_index, Vec3::sAxisY(), Vec3::sAxisX()
1613
- );
1614
- if (axis < 3) {
1615
- Vec3 pos = xform.GetTranslation();
1616
- switch (axis) {
1617
- case 0: return pos.GetX();
1618
- case 1: return pos.GetY();
1619
- default: return pos.GetZ();
1620
- }
1621
- } else if (axis < 7) {
1622
- Quat rot = xform.GetQuaternion();
1623
- switch (axis - 3) {
1624
- case 0: return rot.GetX();
1625
- case 1: return rot.GetY();
1626
- case 2: return rot.GetZ();
1627
- default: return rot.GetW();
1628
- }
1629
- }
1630
- return 0.0f;
1631
- }
1632
-
1633
- float bj_vehicle_get_engine_rpm(bj_world /*world*/, bj_vehicle h) {
1634
- if (h == BJ_INVALID) return 0.0f;
1635
- VehicleEntry *e = decode_vehicle(h);
1636
- auto *ctrl = static_cast<WheeledVehicleController *>(e->constraint->GetController());
1637
- return ctrl->GetEngine().GetCurrentRPM();
1638
- }
1639
-
1640
- float bj_vehicle_get_wheel_angular_velocity(bj_world /*world*/, bj_vehicle h, uint32_t idx) {
1641
- if (h == BJ_INVALID || idx >= 4) return 0.0f;
1642
- VehicleEntry *e = decode_vehicle(h);
1643
- const WheelWV *wheel = static_cast<const WheelWV *>(e->constraint->GetWheel(idx));
1644
- return wheel ? wheel->GetAngularVelocity() : 0.0f;
1645
- }
1646
-
1647
- /* ================================================================== */
1648
- /* Soft bodies */
1649
- /* ================================================================== */
1650
-
1651
- bj_body bj_soft_body_create(
1652
- bj_world world,
1653
- const float *vertex_data, uint32_t vertex_count,
1654
- const uint32_t *indices, uint32_t triangle_count,
1655
- bj_vec3 position, bj_quat rotation,
1656
- uint32_t object_layer,
1657
- float edge_compliance, float gravity_factor, float linear_damping, float pressure)
1658
- {
1659
- WorldImpl *w = as_world(world);
1660
- if (!w || !vertex_data || !indices || vertex_count < 3 || triangle_count == 0) return BJ_INVALID;
1661
-
1662
- Ref<SoftBodySharedSettings> shared = new SoftBodySharedSettings();
1663
-
1664
- for (uint32_t i = 0; i < vertex_count; ++i) {
1665
- SoftBodySharedSettings::Vertex v;
1666
- v.mPosition = Float3(
1667
- vertex_data[i * 4 + 0],
1668
- vertex_data[i * 4 + 1],
1669
- vertex_data[i * 4 + 2]
1670
- );
1671
- v.mVelocity = Float3(0.0f, 0.0f, 0.0f);
1672
- v.mInvMass = vertex_data[i * 4 + 3];
1673
- shared->mVertices.push_back(v);
1674
- }
1675
- for (uint32_t i = 0; i < triangle_count; ++i) {
1676
- SoftBodySharedSettings::Face f(indices[i * 3 + 0], indices[i * 3 + 1], indices[i * 3 + 2], 0);
1677
- shared->AddFace(f);
1678
- }
1679
- /* Auto-generate edge + shear + bend constraints from the triangle topology. */
1680
- SoftBodySharedSettings::VertexAttributes attrs;
1681
- attrs.mCompliance = edge_compliance;
1682
- attrs.mShearCompliance = edge_compliance;
1683
- attrs.mBendCompliance = edge_compliance;
1684
- attrs.mLRAType = SoftBodySharedSettings::ELRAType::None;
1685
- shared->CreateConstraints(&attrs, 1, SoftBodySharedSettings::EBendType::Distance);
1686
- shared->Optimize();
1687
-
1688
- SoftBodyCreationSettings bcs(
1689
- shared.GetPtr(),
1690
- to_jph(position), to_jph(rotation),
1691
- (ObjectLayer)object_layer
1692
- );
1693
- bcs.mGravityFactor = gravity_factor;
1694
- bcs.mLinearDamping = linear_damping;
1695
- bcs.mPressure = pressure;
1696
- bcs.mUpdatePosition = true;
1697
-
1698
- BodyID id = w->system.GetBodyInterface().CreateAndAddSoftBody(bcs, EActivation::Activate);
1699
- return encode_body_id(id);
1700
- }
1701
-
1702
- static const SoftBodyMotionProperties *get_soft_mp(WorldImpl *w, bj_body h) {
1703
- if (!w || h == BJ_INVALID) return nullptr;
1704
- BodyLockRead lock(w->system.GetBodyLockInterface(), decode_body_id(h));
1705
- if (!lock.Succeeded()) return nullptr;
1706
- const Body &body = lock.GetBody();
1707
- if (!body.IsSoftBody()) return nullptr;
1708
- return static_cast<const SoftBodyMotionProperties *>(body.GetMotionPropertiesUnchecked());
1709
- }
1710
-
1711
- uint32_t bj_soft_body_vertex_count(bj_world world, bj_body h) {
1712
- WorldImpl *w = as_world(world);
1713
- const SoftBodyMotionProperties *mp = get_soft_mp(w, h);
1714
- return mp ? (uint32_t)mp->GetVertices().size() : 0;
1715
- }
1716
-
1717
- void bj_soft_body_get_vertex(bj_world world, bj_body h, uint32_t idx, bj_vec3 *out) {
1718
- if (!out) return;
1719
- *out = { 0.0f, 0.0f, 0.0f };
1720
- WorldImpl *w = as_world(world);
1721
- if (!w || h == BJ_INVALID) return;
1722
- BodyLockRead lock(w->system.GetBodyLockInterface(), decode_body_id(h));
1723
- if (!lock.Succeeded()) return;
1724
- const Body &body = lock.GetBody();
1725
- if (!body.IsSoftBody()) return;
1726
- const auto *mp = static_cast<const SoftBodyMotionProperties *>(body.GetMotionPropertiesUnchecked());
1727
- if (!mp || idx >= mp->GetVertices().size()) return;
1728
- /* SoftBody vertex positions are stored in body-local space; transform to world. */
1729
- Vec3 local = mp->GetVertex(idx).mPosition;
1730
- RMat44 xform = body.GetWorldTransform();
1731
- Vec3 world_pos = Vec3(xform * RVec3(local));
1732
- *out = from_jph(world_pos);
1733
- }
1734
-
1735
- void bj_soft_body_set_vertex(bj_world world, bj_body h, uint32_t idx, bj_vec3 position) {
1736
- WorldImpl *w = as_world(world);
1737
- if (!w || h == BJ_INVALID) return;
1738
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(h));
1739
- if (!lock.Succeeded()) return;
1740
- Body &body = lock.GetBody();
1741
- if (!body.IsSoftBody()) return;
1742
- auto *mp = static_cast<SoftBodyMotionProperties *>(body.GetMotionPropertiesUnchecked());
1743
- if (!mp || idx >= mp->GetVertices().size()) return;
1744
- RMat44 xform = body.GetWorldTransform();
1745
- RMat44 inv = xform.Inversed();
1746
- Vec3 local = Vec3(inv * RVec3(to_jph(position)));
1747
- mp->GetVertex(idx).mPosition = local;
1748
- }
1749
-
1750
- void bj_soft_body_set_vertex_inv_mass(bj_world world, bj_body h, uint32_t idx, float inv_mass) {
1751
- WorldImpl *w = as_world(world);
1752
- if (!w || h == BJ_INVALID) return;
1753
- BodyLockWrite lock(w->system.GetBodyLockInterface(), decode_body_id(h));
1754
- if (!lock.Succeeded()) return;
1755
- Body &body = lock.GetBody();
1756
- if (!body.IsSoftBody()) return;
1757
- auto *mp = static_cast<SoftBodyMotionProperties *>(body.GetMotionPropertiesUnchecked());
1758
- if (!mp || idx >= mp->GetVertices().size()) return;
1759
- mp->GetVertex(idx).mInvMass = inv_mass;
1760
- }
1761
-
1762
- void bj_character_set_shape(bj_world world, bj_character h, bj_shape shape) {
1763
- WorldImpl *w = as_world(world);
1764
- if (!w || h == BJ_INVALID) return;
1765
- const Shape *s = decode_shape(shape);
1766
- if (!s) return;
1767
- CharacterEntry *e = decode_character(h);
1768
- BodyFilter body_filter;
1769
- ShapeFilter shape_filter;
1770
- e->character->SetShape(
1771
- s,
1772
- /*max_penetration_depth=*/FLT_MAX,
1773
- w->system.GetDefaultBroadPhaseLayerFilter(e->layer),
1774
- w->system.GetDefaultLayerFilter(e->layer),
1775
- body_filter, shape_filter,
1776
- *w->temp_alloc
1777
- );
1778
- }
1779
-
1780
- } /* extern "C" */