@babylonjs/core 8.3.0 → 8.4.0

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 (331) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Native/nativeInterfaces.d.ts +6 -7
  49. package/Engines/Native/nativeInterfaces.js.map +1 -1
  50. package/Engines/Processors/shaderCodeNode.js +2 -2
  51. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  52. package/Engines/abstractEngine.d.ts +1 -0
  53. package/Engines/abstractEngine.js +14 -8
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/constants.d.ts +27 -5
  56. package/Engines/constants.js +27 -5
  57. package/Engines/constants.js.map +1 -1
  58. package/Engines/engine.js +8 -8
  59. package/Engines/engine.js.map +1 -1
  60. package/Engines/nativeEngine.js +13 -27
  61. package/Engines/nativeEngine.js.map +1 -1
  62. package/Engines/webgpuEngine.js +6 -2
  63. package/Engines/webgpuEngine.js.map +1 -1
  64. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  65. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  67. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  69. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  70. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  71. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  72. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  73. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  75. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  76. package/FlowGraph/flowGraphBlock.js +3 -2
  77. package/FlowGraph/flowGraphBlock.js.map +1 -1
  78. package/FlowGraph/flowGraphCoordinator.js +10 -6
  79. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  80. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  81. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  82. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  83. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  85. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  86. package/Gamepads/gamepadManager.js +2 -2
  87. package/Gamepads/gamepadManager.js.map +1 -1
  88. package/Gizmos/axisDragGizmo.js +3 -2
  89. package/Gizmos/axisDragGizmo.js.map +1 -1
  90. package/Gizmos/axisScaleGizmo.js +6 -4
  91. package/Gizmos/axisScaleGizmo.js.map +1 -1
  92. package/Gizmos/boundingBoxGizmo.js +28 -26
  93. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  94. package/Gizmos/cameraGizmo.js +6 -3
  95. package/Gizmos/cameraGizmo.js.map +1 -1
  96. package/Gizmos/gizmo.js +11 -10
  97. package/Gizmos/gizmo.js.map +1 -1
  98. package/Gizmos/gizmoManager.js +16 -12
  99. package/Gizmos/gizmoManager.js.map +1 -1
  100. package/Gizmos/lightGizmo.js +3 -2
  101. package/Gizmos/lightGizmo.js.map +1 -1
  102. package/Gizmos/planeDragGizmo.js +3 -2
  103. package/Gizmos/planeDragGizmo.js.map +1 -1
  104. package/Gizmos/planeRotationGizmo.js +3 -2
  105. package/Gizmos/planeRotationGizmo.js.map +1 -1
  106. package/Gizmos/positionGizmo.js +41 -28
  107. package/Gizmos/positionGizmo.js.map +1 -1
  108. package/Gizmos/rotationGizmo.js +26 -18
  109. package/Gizmos/rotationGizmo.js.map +1 -1
  110. package/Gizmos/scaleGizmo.js +47 -32
  111. package/Gizmos/scaleGizmo.js.map +1 -1
  112. package/Layers/effectLayerSceneComponent.js +4 -4
  113. package/Layers/effectLayerSceneComponent.js.map +1 -1
  114. package/Layers/layerSceneComponent.js +4 -4
  115. package/Layers/layerSceneComponent.js.map +1 -1
  116. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  117. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  118. package/Lights/Shadows/shadowGenerator.js +3 -3
  119. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  120. package/Lights/light.js +4 -4
  121. package/Lights/light.js.map +1 -1
  122. package/Loading/Plugins/babylonFileLoader.js +54 -46
  123. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  124. package/Loading/loadingScreen.js +4 -3
  125. package/Loading/loadingScreen.js.map +1 -1
  126. package/Loading/sceneLoader.js +15 -12
  127. package/Loading/sceneLoader.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  129. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  131. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  133. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  135. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/customBlock.js +53 -43
  137. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  138. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  139. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  140. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  141. package/Materials/Node/nodeMaterial.d.ts +5 -0
  142. package/Materials/Node/nodeMaterial.js +33 -20
  143. package/Materials/Node/nodeMaterial.js.map +1 -1
  144. package/Materials/Node/nodeMaterialBlock.js +7 -4
  145. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  147. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  148. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  149. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  150. package/Materials/Node/nodeMaterialDefault.js +28 -0
  151. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  152. package/Materials/Textures/cubeTexture.js +3 -1
  153. package/Materials/Textures/cubeTexture.js.map +1 -1
  154. package/Materials/Textures/videoTexture.js +5 -4
  155. package/Materials/Textures/videoTexture.js.map +1 -1
  156. package/Materials/materialDefines.js +3 -1
  157. package/Materials/materialDefines.js.map +1 -1
  158. package/Materials/multiMaterial.js +3 -1
  159. package/Materials/multiMaterial.js.map +1 -1
  160. package/Materials/shaderMaterial.js +3 -2
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Meshes/Compression/dracoEncoder.js +2 -2
  163. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  164. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  165. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  166. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  167. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  168. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  169. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  170. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  171. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  172. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  173. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  174. package/Meshes/abstractMesh.js +2 -2
  175. package/Meshes/abstractMesh.js.map +1 -1
  176. package/Meshes/geodesicMesh.js +2 -2
  177. package/Meshes/geodesicMesh.js.map +1 -1
  178. package/Meshes/mesh.js +6 -6
  179. package/Meshes/mesh.js.map +1 -1
  180. package/Meshes/mesh.vertexData.functions.js +11 -10
  181. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  182. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  183. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  184. package/Meshes/meshSimplification.js +10 -10
  185. package/Meshes/meshSimplification.js.map +1 -1
  186. package/Meshes/meshUtils.js +6 -3
  187. package/Meshes/meshUtils.js.map +1 -1
  188. package/Meshes/polygonMesh.js +10 -10
  189. package/Meshes/polygonMesh.js.map +1 -1
  190. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  191. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  192. package/Misc/arrayTools.js +2 -2
  193. package/Misc/arrayTools.js.map +1 -1
  194. package/Misc/asyncLock.js +9 -9
  195. package/Misc/asyncLock.js.map +1 -1
  196. package/Misc/basis.js +4 -2
  197. package/Misc/basis.js.map +1 -1
  198. package/Misc/deepCopier.js +3 -2
  199. package/Misc/deepCopier.js.map +1 -1
  200. package/Misc/deepMerger.js +3 -2
  201. package/Misc/deepMerger.js.map +1 -1
  202. package/Misc/fileTools.js +4 -4
  203. package/Misc/fileTools.js.map +1 -1
  204. package/Misc/greasedLineTools.js +14 -13
  205. package/Misc/greasedLineTools.js.map +1 -1
  206. package/Misc/logger.js +3 -2
  207. package/Misc/logger.js.map +1 -1
  208. package/Misc/observable.extensions.js +4 -4
  209. package/Misc/observable.extensions.js.map +1 -1
  210. package/Misc/sceneSerializer.js +5 -4
  211. package/Misc/sceneSerializer.js.map +1 -1
  212. package/Misc/snapshotRenderingHelper.js +3 -1
  213. package/Misc/snapshotRenderingHelper.js.map +1 -1
  214. package/Misc/tags.js +2 -2
  215. package/Misc/tags.js.map +1 -1
  216. package/Misc/trajectoryClassifier.js +8 -8
  217. package/Misc/trajectoryClassifier.js.map +1 -1
  218. package/Particles/IParticleSystem.d.ts +1 -1
  219. package/Particles/IParticleSystem.js.map +1 -1
  220. package/Particles/baseParticleSystem.d.ts +11 -3
  221. package/Particles/baseParticleSystem.js +37 -3
  222. package/Particles/baseParticleSystem.js.map +1 -1
  223. package/Particles/gpuParticleSystem.js +1 -14
  224. package/Particles/gpuParticleSystem.js.map +1 -1
  225. package/Particles/particle.js +2 -2
  226. package/Particles/particle.js.map +1 -1
  227. package/Particles/particleSystem.js +15 -13
  228. package/Particles/particleSystem.js.map +1 -1
  229. package/Particles/thinParticleSystem.js +3 -16
  230. package/Particles/thinParticleSystem.js.map +1 -1
  231. package/Physics/physicsHelper.js +18 -14
  232. package/Physics/physicsHelper.js.map +1 -1
  233. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  234. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  235. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  236. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  237. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  238. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  239. package/Physics/v1/physicsEngine.js +4 -4
  240. package/Physics/v1/physicsEngine.js.map +1 -1
  241. package/Physics/v1/physicsImpostor.js +10 -21
  242. package/Physics/v1/physicsImpostor.js.map +1 -1
  243. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  244. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  245. package/Physics/v2/ragdoll.js +4 -4
  246. package/Physics/v2/ragdoll.js.map +1 -1
  247. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  248. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  249. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  250. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  251. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  252. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  253. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  254. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  255. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  256. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  257. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  258. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  259. package/Rendering/iblCdfGenerator.js +4 -4
  260. package/Rendering/iblCdfGenerator.js.map +1 -1
  261. package/Rendering/objectRenderer.js +2 -2
  262. package/Rendering/objectRenderer.js.map +1 -1
  263. package/Rendering/reflectiveShadowMap.js +7 -5
  264. package/Rendering/reflectiveShadowMap.js.map +1 -1
  265. package/Sprites/spriteMap.js +2 -2
  266. package/Sprites/spriteMap.js.map +1 -1
  267. package/XR/features/WebXRAbstractFeature.js +2 -2
  268. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  269. package/XR/features/WebXRAnchorSystem.js +4 -4
  270. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  271. package/XR/features/WebXRBackgroundRemover.js +3 -1
  272. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  273. package/XR/features/WebXRControllerMovement.js +6 -3
  274. package/XR/features/WebXRControllerMovement.js.map +1 -1
  275. package/XR/features/WebXRControllerPhysics.js +12 -7
  276. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  277. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  278. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  279. package/XR/features/WebXRControllerTeleportation.js +11 -7
  280. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  281. package/XR/features/WebXRDepthSensing.js +6 -6
  282. package/XR/features/WebXRDepthSensing.js.map +1 -1
  283. package/XR/features/WebXRHandTracking.js +60 -24
  284. package/XR/features/WebXRHandTracking.js.map +1 -1
  285. package/XR/features/WebXRHitTest.js +4 -4
  286. package/XR/features/WebXRHitTest.js.map +1 -1
  287. package/XR/features/WebXRImageTracking.js +2 -2
  288. package/XR/features/WebXRImageTracking.js.map +1 -1
  289. package/XR/features/WebXRLayers.js +2 -2
  290. package/XR/features/WebXRLayers.js.map +1 -1
  291. package/XR/features/WebXRNearInteraction.js +12 -7
  292. package/XR/features/WebXRNearInteraction.js.map +1 -1
  293. package/XR/features/WebXRRawCameraAccess.js +9 -4
  294. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  295. package/XR/features/WebXRSpaceWarp.js +2 -2
  296. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  297. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  298. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  299. package/XR/motionController/webXRGenericMotionController.js +2 -2
  300. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  301. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  302. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  303. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  304. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  305. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  306. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  307. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  308. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  309. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  310. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  311. package/XR/webXRCamera.js +3 -2
  312. package/XR/webXRCamera.js.map +1 -1
  313. package/XR/webXREnterExitUI.js +5 -4
  314. package/XR/webXREnterExitUI.js.map +1 -1
  315. package/XR/webXRExperienceHelper.js +2 -2
  316. package/XR/webXRExperienceHelper.js.map +1 -1
  317. package/XR/webXRFeaturesManager.js +10 -7
  318. package/XR/webXRFeaturesManager.js.map +1 -1
  319. package/XR/webXRInput.js +8 -8
  320. package/XR/webXRInput.js.map +1 -1
  321. package/XR/webXRInputSource.js +4 -1
  322. package/XR/webXRInputSource.js.map +1 -1
  323. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  324. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  325. package/assetContainer.js +156 -135
  326. package/assetContainer.js.map +1 -1
  327. package/node.js +2 -2
  328. package/node.js.map +1 -1
  329. package/package.json +1 -1
  330. package/scene.js +18 -11
  331. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ammoJSPlugin.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Physics/v1/Plugins/ammoJSPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { Quaternion, Vector3, Matrix } from \"../../../Maths/math.vector\";\r\nimport type { IPhysicsEnginePlugin, PhysicsImpostorJoint } from \"../IPhysicsEnginePlugin\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport type { IPhysicsEnabledObject } from \"../physicsImpostor\";\r\nimport { PhysicsImpostor } from \"../physicsImpostor\";\r\nimport type { IMotorEnabledJoint, DistanceJointData } from \"../physicsJoint\";\r\nimport { PhysicsJoint } from \"../physicsJoint\";\r\nimport { VertexBuffer } from \"../../../Buffers/buffer\";\r\nimport { VertexData } from \"../../../Meshes/mesh.vertexData\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { AbstractMesh } from \"../../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../../Meshes/mesh\";\r\nimport { ExtrudeShape } from \"../../../Meshes/Builders/shapeBuilder\";\r\nimport { CreateLines } from \"../../../Meshes/Builders/linesBuilder\";\r\nimport type { LinesMesh } from \"../../../Meshes/linesMesh\";\r\nimport { PhysicsRaycastResult } from \"../../physicsRaycastResult\";\r\nimport { WithinEpsilon } from \"../../../Maths/math.scalar.functions\";\r\nimport { Epsilon } from \"../../../Maths/math.constants\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let Ammo: any;\r\n\r\n/**\r\n * AmmoJS Physics plugin\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n * @see https://github.com/kripken/ammo.js/\r\n */\r\nexport class AmmoJSPlugin implements IPhysicsEnginePlugin {\r\n /**\r\n * Reference to the Ammo library\r\n */\r\n public bjsAMMO: any = {};\r\n /**\r\n * Created ammoJS world which physics bodies are added to\r\n */\r\n public world: any;\r\n /**\r\n * Name of the plugin\r\n */\r\n public name: string = \"AmmoJSPlugin\";\r\n\r\n private _timeStep: number = 1 / 60;\r\n private _fixedTimeStep: number = 1 / 60;\r\n private _maxSteps = 5;\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpAmmoTransform: any;\r\n private _tmpAmmoQuaternion: any;\r\n private _tmpAmmoConcreteContactResultCallback: any;\r\n private _collisionConfiguration: any;\r\n private _dispatcher: any;\r\n private _overlappingPairCache: any;\r\n private _solver: any;\r\n private _softBodySolver: any;\r\n private _tmpAmmoVectorA: any;\r\n private _tmpAmmoVectorB: any;\r\n private _tmpAmmoVectorC: any;\r\n private _tmpAmmoVectorD: any;\r\n private _tmpContactCallbackResult = false;\r\n private _tmpAmmoVectorRCA: any;\r\n private _tmpAmmoVectorRCB: any;\r\n private _raycastResult: PhysicsRaycastResult;\r\n private _tmpContactPoint = new Vector3();\r\n private _tmpContactNormal = new Vector3();\r\n private _tmpContactDistance: number;\r\n private _tmpContactImpulse: number;\r\n private _tmpVec3 = new Vector3();\r\n\r\n private static readonly _DISABLE_COLLISION_FLAG = 4;\r\n private static readonly _KINEMATIC_FLAG = 2;\r\n private static readonly _DISABLE_DEACTIVATION_FLAG = 4;\r\n\r\n /**\r\n * Initializes the ammoJS plugin\r\n * @param _useDeltaForWorldStep if the time between frames should be used when calculating physics steps (Default: true)\r\n * @param ammoInjection can be used to inject your own ammo reference\r\n * @param overlappingPairCache can be used to specify your own overlapping pair cache\r\n */\r\n public constructor(\r\n private _useDeltaForWorldStep: boolean = true,\r\n ammoInjection: any = Ammo,\r\n overlappingPairCache: any = null\r\n ) {\r\n if (typeof ammoInjection === \"function\") {\r\n Logger.Error(\"AmmoJS is not ready. Please make sure you await Ammo() before using the plugin.\");\r\n return;\r\n } else {\r\n this.bjsAMMO = ammoInjection;\r\n }\r\n\r\n if (!this.isSupported()) {\r\n Logger.Error(\"AmmoJS is not available. Please make sure you included the js file.\");\r\n return;\r\n }\r\n\r\n // Initialize the physics world\r\n this._collisionConfiguration = new this.bjsAMMO.btSoftBodyRigidBodyCollisionConfiguration();\r\n this._dispatcher = new this.bjsAMMO.btCollisionDispatcher(this._collisionConfiguration);\r\n this._overlappingPairCache = overlappingPairCache || new this.bjsAMMO.btDbvtBroadphase();\r\n this._solver = new this.bjsAMMO.btSequentialImpulseConstraintSolver();\r\n this._softBodySolver = new this.bjsAMMO.btDefaultSoftBodySolver();\r\n this.world = new this.bjsAMMO.btSoftRigidDynamicsWorld(this._dispatcher, this._overlappingPairCache, this._solver, this._collisionConfiguration, this._softBodySolver);\r\n\r\n this._tmpAmmoConcreteContactResultCallback = new this.bjsAMMO.ConcreteContactResultCallback();\r\n this._tmpAmmoConcreteContactResultCallback.addSingleResult = (contactPoint: any) => {\r\n contactPoint = this.bjsAMMO.wrapPointer(contactPoint, this.bjsAMMO.btManifoldPoint);\r\n const worldPoint = contactPoint.getPositionWorldOnA();\r\n const worldNormal = contactPoint.m_normalWorldOnB;\r\n this._tmpContactPoint.x = worldPoint.x();\r\n this._tmpContactPoint.y = worldPoint.y();\r\n this._tmpContactPoint.z = worldPoint.z();\r\n this._tmpContactNormal.x = worldNormal.x();\r\n this._tmpContactNormal.y = worldNormal.y();\r\n this._tmpContactNormal.z = worldNormal.z();\r\n this._tmpContactImpulse = contactPoint.getAppliedImpulse();\r\n this._tmpContactDistance = contactPoint.getDistance();\r\n this._tmpContactCallbackResult = true;\r\n };\r\n\r\n this._raycastResult = new PhysicsRaycastResult();\r\n\r\n // Create temp ammo variables\r\n this._tmpAmmoTransform = new this.bjsAMMO.btTransform();\r\n this._tmpAmmoTransform.setIdentity();\r\n this._tmpAmmoQuaternion = new this.bjsAMMO.btQuaternion(0, 0, 0, 1);\r\n this._tmpAmmoVectorA = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorB = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorC = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorD = new this.bjsAMMO.btVector3(0, 0, 0);\r\n }\r\n\r\n /**\r\n *\r\n * @returns plugin version\r\n */\r\n public getPluginVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Sets the gravity of the physics world (m/(s^2))\r\n * @param gravity Gravity to set\r\n */\r\n public setGravity(gravity: Vector3): void {\r\n this._tmpAmmoVectorA.setValue(gravity.x, gravity.y, gravity.z);\r\n this.world.setGravity(this._tmpAmmoVectorA);\r\n this.world.getWorldInfo().set_m_gravity(this._tmpAmmoVectorA);\r\n }\r\n\r\n /**\r\n * Amount of time to step forward on each frame (only used if useDeltaForWorldStep is false in the constructor)\r\n * @param timeStep timestep to use in seconds\r\n */\r\n public setTimeStep(timeStep: number) {\r\n this._timeStep = timeStep;\r\n }\r\n\r\n /**\r\n * Increment to step forward in the physics engine (If timeStep is set to 1/60 and fixedTimeStep is set to 1/120 the physics engine should run 2 steps per frame) (Default: 1/60)\r\n * @param fixedTimeStep fixedTimeStep to use in seconds\r\n */\r\n public setFixedTimeStep(fixedTimeStep: number) {\r\n this._fixedTimeStep = fixedTimeStep;\r\n }\r\n\r\n /**\r\n * Sets the maximum number of steps by the physics engine per frame (Default: 5)\r\n * @param maxSteps the maximum number of steps by the physics engine per frame\r\n */\r\n public setMaxSteps(maxSteps: number) {\r\n this._maxSteps = maxSteps;\r\n }\r\n\r\n /**\r\n * Gets the current timestep (only used if useDeltaForWorldStep is false in the constructor)\r\n * @returns the current timestep in seconds\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep;\r\n }\r\n\r\n /**\r\n * The create custom shape handler function to be called when using BABYLON.PhysicsImposter.CustomImpostor\r\n */\r\n public onCreateCustomShape: (impostor: PhysicsImpostor) => any;\r\n\r\n /**\r\n * The create custom mesh impostor handler function to support building custom mesh impostor vertex data\r\n */\r\n public onCreateCustomMeshImpostor: (impostor: PhysicsImpostor) => any;\r\n\r\n /**\r\n * The create custom convex hull impostor handler function to support building custom convex hull impostor vertex data\r\n */\r\n public onCreateCustomConvexHullImpostor: (impostor: PhysicsImpostor) => any;\r\n\r\n // Ammo's contactTest and contactPairTest take a callback that runs synchronously, wrap them so that they are easier to consume\r\n private _isImpostorInContact(impostor: PhysicsImpostor) {\r\n this._tmpContactCallbackResult = false;\r\n this.world.contactTest(impostor.physicsBody, this._tmpAmmoConcreteContactResultCallback);\r\n return this._tmpContactCallbackResult;\r\n }\r\n // Ammo's collision events have some weird quirks\r\n // contactPairTest fires too many events as it fires events even when objects are close together but contactTest does not\r\n // so only fire event if both contactTest and contactPairTest have a hit\r\n private _isImpostorPairInContact(impostorA: PhysicsImpostor, impostorB: PhysicsImpostor) {\r\n this._tmpContactCallbackResult = false;\r\n this.world.contactPairTest(impostorA.physicsBody, impostorB.physicsBody, this._tmpAmmoConcreteContactResultCallback);\r\n return this._tmpContactCallbackResult;\r\n }\r\n\r\n // Ammo's behavior when maxSteps > 0 does not behave as described in docs\r\n // @see http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World\r\n //\r\n // When maxSteps is 0 do the entire simulation in one step\r\n // When maxSteps is > 0, run up to maxStep times, if on the last step the (remaining step - fixedTimeStep) is < fixedTimeStep, the remainder will be used for the step. (eg. if remainder is 1.001 and fixedTimeStep is 1 the last step will be 1.001, if instead it did 2 steps (1, 0.001) issues occuered when having a tiny step in ammo)\r\n // Note: To get deterministic physics, timeStep would always need to be divisible by fixedTimeStep\r\n private _stepSimulation(timeStep: number = 1 / 60, maxSteps: number = 10, fixedTimeStep: number = 1 / 60) {\r\n if (maxSteps == 0) {\r\n this.world.stepSimulation(timeStep, 0);\r\n } else {\r\n while (maxSteps > 0 && timeStep > 0) {\r\n if (timeStep - fixedTimeStep < fixedTimeStep) {\r\n this.world.stepSimulation(timeStep, 0);\r\n timeStep = 0;\r\n } else {\r\n timeStep -= fixedTimeStep;\r\n this.world.stepSimulation(fixedTimeStep, 0);\r\n }\r\n maxSteps--;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Moves the physics simulation forward delta seconds and updates the given physics imposters\r\n * Prior to the step the imposters physics location is set to the position of the babylon meshes\r\n * After the step the babylon meshes are set to the position of the physics imposters\r\n * @param delta amount of time to step forward\r\n * @param impostors array of imposters to update before/after the step\r\n */\r\n public executeStep(delta: number, impostors: Array<PhysicsImpostor>): void {\r\n for (const impostor of impostors) {\r\n // Update physics world objects to match babylon world\r\n if (!impostor.soft) {\r\n impostor.beforeStep();\r\n }\r\n }\r\n\r\n this._stepSimulation(this._useDeltaForWorldStep ? delta : this._timeStep, this._maxSteps, this._fixedTimeStep);\r\n\r\n for (const mainImpostor of impostors) {\r\n // After physics update make babylon world objects match physics world objects\r\n if (mainImpostor.soft) {\r\n this._afterSoftStep(mainImpostor);\r\n } else {\r\n mainImpostor.afterStep();\r\n }\r\n\r\n // Handle collision event\r\n if (mainImpostor._onPhysicsCollideCallbacks.length > 0) {\r\n if (this._isImpostorInContact(mainImpostor)) {\r\n for (const collideCallback of mainImpostor._onPhysicsCollideCallbacks) {\r\n for (const otherImpostor of collideCallback.otherImpostors) {\r\n if (mainImpostor.physicsBody.isActive() || otherImpostor.physicsBody.isActive()) {\r\n if (this._isImpostorPairInContact(mainImpostor, otherImpostor)) {\r\n mainImpostor.onCollide({\r\n body: otherImpostor.physicsBody,\r\n point: this._tmpContactPoint,\r\n distance: this._tmpContactDistance,\r\n impulse: this._tmpContactImpulse,\r\n normal: this._tmpContactNormal,\r\n });\r\n otherImpostor.onCollide({\r\n body: mainImpostor.physicsBody,\r\n point: this._tmpContactPoint,\r\n distance: this._tmpContactDistance,\r\n impulse: this._tmpContactImpulse,\r\n normal: this._tmpContactNormal,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh to match physics world object\r\n * @param impostor imposter to match\r\n */\r\n private _afterSoftStep(impostor: PhysicsImpostor): void {\r\n if (impostor.type === PhysicsImpostor.RopeImpostor) {\r\n this._ropeStep(impostor);\r\n } else {\r\n this._softbodyOrClothStep(impostor);\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh vertices vertices to match physics world softbody or cloth\r\n * @param impostor imposter to match\r\n */\r\n private _ropeStep(impostor: PhysicsImpostor): void {\r\n const bodyVertices = impostor.physicsBody.get_m_nodes();\r\n const nbVertices = bodyVertices.size();\r\n let node: any;\r\n let nodePositions: any;\r\n let x, y, z: number;\r\n const path: Array<Vector3> = new Array();\r\n for (let n = 0; n < nbVertices; n++) {\r\n node = bodyVertices.at(n);\r\n nodePositions = node.get_m_x();\r\n x = nodePositions.x();\r\n y = nodePositions.y();\r\n z = nodePositions.z();\r\n path.push(new Vector3(x, y, z));\r\n }\r\n const object = impostor.object;\r\n const shape = impostor.getParam(\"shape\");\r\n if (impostor._isFromLine) {\r\n impostor.object = CreateLines(\"lines\", { points: path, instance: <LinesMesh>object });\r\n } else {\r\n impostor.object = ExtrudeShape(\"ext\", { shape: shape, path: path, instance: <Mesh>object });\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh vertices vertices to match physics world softbody or cloth\r\n * @param impostor imposter to match\r\n */\r\n private _softbodyOrClothStep(impostor: PhysicsImpostor): void {\r\n const normalDirection = impostor.type === PhysicsImpostor.ClothImpostor ? 1 : -1;\r\n const object = impostor.object;\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n let vertexNormals = object.getVerticesData(VertexBuffer.NormalKind);\r\n if (!vertexNormals) {\r\n vertexNormals = [];\r\n }\r\n\r\n const nbVertices = vertexPositions.length / 3;\r\n const bodyVertices = impostor.physicsBody.get_m_nodes();\r\n let node: any;\r\n let nodePositions: any;\r\n let x, y, z: number;\r\n let nx, ny, nz: number;\r\n for (let n = 0; n < nbVertices; n++) {\r\n node = bodyVertices.at(n);\r\n nodePositions = node.get_m_x();\r\n x = nodePositions.x();\r\n y = nodePositions.y();\r\n z = nodePositions.z() * normalDirection;\r\n const nodeNormals = node.get_m_n();\r\n nx = nodeNormals.x();\r\n ny = nodeNormals.y();\r\n nz = nodeNormals.z() * normalDirection;\r\n\r\n vertexPositions[3 * n] = x;\r\n vertexPositions[3 * n + 1] = y;\r\n vertexPositions[3 * n + 2] = z;\r\n vertexNormals[3 * n] = nx;\r\n vertexNormals[3 * n + 1] = ny;\r\n vertexNormals[3 * n + 2] = nz;\r\n }\r\n\r\n const vertex_data = new VertexData();\r\n\r\n vertex_data.positions = vertexPositions;\r\n vertex_data.normals = vertexNormals;\r\n vertex_data.uvs = object.getVerticesData(VertexBuffer.UVKind);\r\n vertex_data.colors = object.getVerticesData(VertexBuffer.ColorKind);\r\n if (object && object.getIndices) {\r\n vertex_data.indices = object.getIndices();\r\n }\r\n\r\n vertex_data.applyToMesh(<Mesh>object);\r\n }\r\n\r\n private _tmpMatrix = new Matrix();\r\n /**\r\n * Applies an impulse on the imposter\r\n * @param impostor imposter to apply impulse to\r\n * @param force amount of force to be applied to the imposter\r\n * @param contactPoint the location to apply the impulse on the imposter\r\n */\r\n public applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3) {\r\n if (!impostor.soft) {\r\n impostor.physicsBody.activate();\r\n const worldPoint = this._tmpAmmoVectorA;\r\n const impulse = this._tmpAmmoVectorB;\r\n\r\n // Convert contactPoint relative to center of mass\r\n if (impostor.object && impostor.object.getWorldMatrix) {\r\n contactPoint.subtractInPlace(impostor.object.getWorldMatrix().getTranslation());\r\n }\r\n\r\n worldPoint.setValue(contactPoint.x, contactPoint.y, contactPoint.z);\r\n impulse.setValue(force.x, force.y, force.z);\r\n\r\n impostor.physicsBody.applyImpulse(impulse, worldPoint);\r\n } else {\r\n Logger.Warn(\"Cannot be applied to a soft body\");\r\n }\r\n }\r\n\r\n /**\r\n * Applies a force on the imposter\r\n * @param impostor imposter to apply force\r\n * @param force amount of force to be applied to the imposter\r\n * @param contactPoint the location to apply the force on the imposter\r\n */\r\n public applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3) {\r\n if (!impostor.soft) {\r\n impostor.physicsBody.activate();\r\n const worldPoint = this._tmpAmmoVectorA;\r\n const impulse = this._tmpAmmoVectorB;\r\n\r\n // Convert contactPoint relative to center of mass\r\n if (impostor.object && impostor.object.getWorldMatrix) {\r\n const localTranslation = impostor.object.getWorldMatrix().getTranslation();\r\n worldPoint.setValue(contactPoint.x - localTranslation.x, contactPoint.y - localTranslation.y, contactPoint.z - localTranslation.z);\r\n } else {\r\n worldPoint.setValue(contactPoint.x, contactPoint.y, contactPoint.z);\r\n }\r\n\r\n impulse.setValue(force.x, force.y, force.z);\r\n\r\n impostor.physicsBody.applyForce(impulse, worldPoint);\r\n } else {\r\n Logger.Warn(\"Cannot be applied to a soft body\");\r\n }\r\n }\r\n\r\n /**\r\n * Creates a physics body using the plugin\r\n * @param impostor the imposter to create the physics body on\r\n */\r\n public generatePhysicsBody(impostor: PhysicsImpostor) {\r\n // Note: this method will not be called on child imposotrs for compound impostors\r\n\r\n impostor._pluginData.toDispose = [];\r\n\r\n //parent-child relationship\r\n if (impostor.parent) {\r\n if (impostor.physicsBody) {\r\n this.removePhysicsBody(impostor);\r\n impostor.forceUpdate();\r\n }\r\n return;\r\n }\r\n\r\n if (impostor.isBodyInitRequired()) {\r\n const colShape = this._createShape(impostor);\r\n const mass = impostor.getParam(\"mass\");\r\n impostor._pluginData.mass = mass;\r\n if (impostor.soft) {\r\n colShape.get_m_cfg().set_collisions(0x11);\r\n colShape.get_m_cfg().set_kDP(impostor.getParam(\"damping\"));\r\n this.bjsAMMO.castObject(colShape, this.bjsAMMO.btCollisionObject).getCollisionShape().setMargin(impostor.getParam(\"margin\"));\r\n colShape.setActivationState(AmmoJSPlugin._DISABLE_DEACTIVATION_FLAG);\r\n this.world.addSoftBody(colShape, 1, -1);\r\n impostor.physicsBody = colShape;\r\n impostor._pluginData.toDispose.push(colShape);\r\n this.setBodyPressure(impostor, 0);\r\n if (impostor.type === PhysicsImpostor.SoftbodyImpostor) {\r\n this.setBodyPressure(impostor, impostor.getParam(\"pressure\"));\r\n }\r\n this.setBodyStiffness(impostor, impostor.getParam(\"stiffness\"));\r\n this.setBodyVelocityIterations(impostor, impostor.getParam(\"velocityIterations\"));\r\n this.setBodyPositionIterations(impostor, impostor.getParam(\"positionIterations\"));\r\n } else {\r\n const localInertia = new this.bjsAMMO.btVector3(0, 0, 0);\r\n const startTransform = new this.bjsAMMO.btTransform();\r\n impostor.object.computeWorldMatrix(true);\r\n startTransform.setIdentity();\r\n if (mass !== 0) {\r\n colShape.calculateLocalInertia(mass, localInertia);\r\n }\r\n this._tmpAmmoVectorA.setValue(impostor.object.position.x, impostor.object.position.y, impostor.object.position.z);\r\n this._tmpAmmoQuaternion.setValue(\r\n impostor.object.rotationQuaternion!.x,\r\n impostor.object.rotationQuaternion!.y,\r\n impostor.object.rotationQuaternion!.z,\r\n impostor.object.rotationQuaternion!.w\r\n );\r\n startTransform.setOrigin(this._tmpAmmoVectorA);\r\n startTransform.setRotation(this._tmpAmmoQuaternion);\r\n const myMotionState = new this.bjsAMMO.btDefaultMotionState(startTransform);\r\n const rbInfo = new this.bjsAMMO.btRigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia);\r\n const body = new this.bjsAMMO.btRigidBody(rbInfo);\r\n\r\n // Make objects kinematic if it's mass is 0\r\n if (mass === 0) {\r\n body.setCollisionFlags(body.getCollisionFlags() | AmmoJSPlugin._KINEMATIC_FLAG);\r\n body.setActivationState(AmmoJSPlugin._DISABLE_DEACTIVATION_FLAG);\r\n }\r\n\r\n // Disable collision if NoImpostor, but keep collision if shape is btCompoundShape\r\n if (impostor.type == PhysicsImpostor.NoImpostor && !colShape.getChildShape) {\r\n body.setCollisionFlags(body.getCollisionFlags() | AmmoJSPlugin._DISABLE_COLLISION_FLAG);\r\n }\r\n\r\n // compute delta position: compensate the difference between shape center and mesh origin\r\n if (impostor.type !== PhysicsImpostor.MeshImpostor && impostor.type !== PhysicsImpostor.NoImpostor) {\r\n const boundingInfo = impostor.object.getBoundingInfo();\r\n this._tmpVec3.copyFrom(impostor.object.getAbsolutePosition());\r\n this._tmpVec3.subtractInPlace(boundingInfo.boundingBox.centerWorld);\r\n this._tmpVec3.x /= impostor.object.scaling.x;\r\n this._tmpVec3.y /= impostor.object.scaling.y;\r\n this._tmpVec3.z /= impostor.object.scaling.z;\r\n impostor.setDeltaPosition(this._tmpVec3);\r\n }\r\n\r\n const group = impostor.getParam(\"group\");\r\n const mask = impostor.getParam(\"mask\");\r\n if (group && mask) {\r\n this.world.addRigidBody(body, group, mask);\r\n } else {\r\n this.world.addRigidBody(body);\r\n }\r\n impostor.physicsBody = body;\r\n impostor._pluginData.toDispose = impostor._pluginData.toDispose.concat([body, rbInfo, myMotionState, startTransform, localInertia, colShape]);\r\n }\r\n this.setBodyRestitution(impostor, impostor.getParam(\"restitution\"));\r\n this.setBodyFriction(impostor, impostor.getParam(\"friction\"));\r\n }\r\n }\r\n\r\n /**\r\n * Removes the physics body from the imposter and disposes of the body's memory\r\n * @param impostor imposter to remove the physics body from\r\n */\r\n public removePhysicsBody(impostor: PhysicsImpostor) {\r\n if (this.world) {\r\n if (impostor.soft) {\r\n this.world.removeSoftBody(impostor.physicsBody);\r\n } else {\r\n this.world.removeRigidBody(impostor.physicsBody);\r\n }\r\n\r\n if (impostor._pluginData) {\r\n impostor._pluginData.toDispose.forEach((d: any) => {\r\n this.bjsAMMO.destroy(d);\r\n });\r\n impostor._pluginData.toDispose = [];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a joint\r\n * @param impostorJoint the imposter joint to create the joint with\r\n */\r\n public generateJoint(impostorJoint: PhysicsImpostorJoint) {\r\n const mainBody = impostorJoint.mainImpostor.physicsBody;\r\n const connectedBody = impostorJoint.connectedImpostor.physicsBody;\r\n if (!mainBody || !connectedBody) {\r\n return;\r\n }\r\n\r\n // if the joint is already created, don't create it again for preventing memory leaks\r\n if (impostorJoint.joint.physicsJoint) {\r\n return;\r\n }\r\n\r\n const jointData = impostorJoint.joint.jointData;\r\n if (!jointData.mainPivot) {\r\n jointData.mainPivot = new Vector3(0, 0, 0);\r\n }\r\n if (!jointData.connectedPivot) {\r\n jointData.connectedPivot = new Vector3(0, 0, 0);\r\n }\r\n\r\n let joint: any;\r\n switch (impostorJoint.joint.type) {\r\n case PhysicsJoint.DistanceJoint: {\r\n const distance = (<DistanceJointData>jointData).maxDistance;\r\n if (distance) {\r\n jointData.mainPivot = new Vector3(0, -distance / 2, 0);\r\n jointData.connectedPivot = new Vector3(0, distance / 2, 0);\r\n }\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n case PhysicsJoint.HingeJoint: {\r\n if (!jointData.mainAxis) {\r\n jointData.mainAxis = new Vector3(0, 0, 0);\r\n }\r\n if (!jointData.connectedAxis) {\r\n jointData.connectedAxis = new Vector3(0, 0, 0);\r\n }\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n const mainAxis = this._tmpAmmoVectorC;\r\n mainAxis.setValue(jointData.mainAxis.x, jointData.mainAxis.y, jointData.mainAxis.z);\r\n\r\n const connectedAxis = this._tmpAmmoVectorD;\r\n connectedAxis.setValue(jointData.connectedAxis.x, jointData.connectedAxis.y, jointData.connectedAxis.z);\r\n\r\n joint = new this.bjsAMMO.btHingeConstraint(mainBody, connectedBody, mainPivot, connectedPivot, mainAxis, connectedAxis);\r\n break;\r\n }\r\n case PhysicsJoint.BallAndSocketJoint: {\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n default: {\r\n Logger.Warn(\"JointType not currently supported by the Ammo plugin, falling back to PhysicsJoint.BallAndSocketJoint\");\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n }\r\n this.world.addConstraint(joint, !impostorJoint.joint.jointData.collision);\r\n impostorJoint.joint.physicsJoint = joint;\r\n }\r\n\r\n /**\r\n * Removes a joint\r\n * @param impostorJoint the imposter joint to remove the joint from\r\n */\r\n public removeJoint(impostorJoint: PhysicsImpostorJoint) {\r\n if (this.world) {\r\n this.world.removeConstraint(impostorJoint.joint.physicsJoint);\r\n }\r\n this.bjsAMMO.destroy(impostorJoint.joint.physicsJoint);\r\n }\r\n\r\n // adds all verticies (including child verticies) to the triangle mesh\r\n private _addMeshVerts(btTriangleMesh: any, topLevelObject: IPhysicsEnabledObject, object: IPhysicsEnabledObject) {\r\n let triangleCount = 0;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n\r\n let localMatrix;\r\n\r\n if (topLevelObject && topLevelObject !== object) {\r\n // top level matrix used for shape transform doesn't take scale into account.\r\n // Moreover, every children vertex position must be in that space.\r\n // So, each vertex position here is transform by (mesh world matrix * toplevelMatrix -1)\r\n let topLevelQuaternion;\r\n if (topLevelObject.rotationQuaternion) {\r\n topLevelQuaternion = topLevelObject.rotationQuaternion;\r\n } else if (topLevelObject.rotation) {\r\n topLevelQuaternion = Quaternion.FromEulerAngles(topLevelObject.rotation.x, topLevelObject.rotation.y, topLevelObject.rotation.z);\r\n } else {\r\n topLevelQuaternion = Quaternion.Identity();\r\n }\r\n const topLevelMatrix = Matrix.Compose(Vector3.One(), topLevelQuaternion, topLevelObject.position);\r\n topLevelMatrix.invertToRef(this._tmpMatrix);\r\n const wm = object.computeWorldMatrix(false);\r\n localMatrix = wm.multiply(this._tmpMatrix);\r\n } else {\r\n // current top level is same as object level -> only use local scaling\r\n Matrix.ScalingToRef(object.scaling.x, object.scaling.y, object.scaling.z, this._tmpMatrix);\r\n localMatrix = this._tmpMatrix;\r\n }\r\n const faceCount = indices.length / 3;\r\n for (let i = 0; i < faceCount; i++) {\r\n const triPoints = [];\r\n for (let point = 0; point < 3; point++) {\r\n let v = new Vector3(\r\n vertexPositions[indices[i * 3 + point] * 3 + 0],\r\n vertexPositions[indices[i * 3 + point] * 3 + 1],\r\n vertexPositions[indices[i * 3 + point] * 3 + 2]\r\n );\r\n\r\n v = Vector3.TransformCoordinates(v, localMatrix);\r\n\r\n let vec: any;\r\n if (point == 0) {\r\n vec = this._tmpAmmoVectorA;\r\n } else if (point == 1) {\r\n vec = this._tmpAmmoVectorB;\r\n } else {\r\n vec = this._tmpAmmoVectorC;\r\n }\r\n vec.setValue(v.x, v.y, v.z);\r\n\r\n triPoints.push(vec);\r\n }\r\n btTriangleMesh.addTriangle(triPoints[0], triPoints[1], triPoints[2]);\r\n triangleCount++;\r\n }\r\n\r\n object.getChildMeshes().forEach((m) => {\r\n triangleCount += this._addMeshVerts(btTriangleMesh, topLevelObject, m);\r\n });\r\n }\r\n return triangleCount;\r\n }\r\n\r\n /**\r\n * Initialise the soft body vertices to match its object's (mesh) vertices\r\n * Softbody vertices (nodes) are in world space and to match this\r\n * The object's position and rotation is set to zero and so its vertices are also then set in world space\r\n * @param impostor to create the softbody for\r\n * @returns the number of vertices added to the softbody\r\n */\r\n private _softVertexData(impostor: PhysicsImpostor): VertexData {\r\n const object = impostor.object;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n let vertexNormals = object.getVerticesData(VertexBuffer.NormalKind);\r\n if (!vertexNormals) {\r\n vertexNormals = [];\r\n }\r\n object.computeWorldMatrix(false);\r\n const newPoints = [];\r\n const newNorms = [];\r\n for (let i = 0; i < vertexPositions.length; i += 3) {\r\n let v = new Vector3(vertexPositions[i], vertexPositions[i + 1], vertexPositions[i + 2]);\r\n let n = new Vector3(vertexNormals[i], vertexNormals[i + 1], vertexNormals[i + 2]);\r\n v = Vector3.TransformCoordinates(v, object.getWorldMatrix());\r\n n = Vector3.TransformNormal(n, object.getWorldMatrix());\r\n newPoints.push(v.x, v.y, v.z);\r\n newNorms.push(n.x, n.y, n.z);\r\n }\r\n\r\n const vertex_data = new VertexData();\r\n\r\n vertex_data.positions = newPoints;\r\n vertex_data.normals = newNorms;\r\n vertex_data.uvs = object.getVerticesData(VertexBuffer.UVKind);\r\n vertex_data.colors = object.getVerticesData(VertexBuffer.ColorKind);\r\n if (object && object.getIndices) {\r\n vertex_data.indices = object.getIndices();\r\n }\r\n\r\n vertex_data.applyToMesh(<Mesh>object);\r\n\r\n object.position = Vector3.Zero();\r\n object.rotationQuaternion = null;\r\n object.rotation = Vector3.Zero();\r\n object.computeWorldMatrix(true);\r\n\r\n return vertex_data;\r\n }\r\n return VertexData.ExtractFromMesh(<Mesh>object);\r\n }\r\n\r\n /**\r\n * Create an impostor's soft body\r\n * @param impostor to create the softbody for\r\n * @returns the softbody\r\n */\r\n private _createSoftbody(impostor: PhysicsImpostor) {\r\n const object = impostor.object;\r\n if (object && object.getIndices) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n const triPoints = [];\r\n const triNorms = [];\r\n for (let i = 0; i < vertexPositions.length; i += 3) {\r\n const v = new Vector3(vertexPositions[i], vertexPositions[i + 1], vertexPositions[i + 2]);\r\n const n = new Vector3(vertexNormals[i], vertexNormals[i + 1], vertexNormals[i + 2]);\r\n triPoints.push(v.x, v.y, -v.z);\r\n triNorms.push(n.x, n.y, -n.z);\r\n }\r\n const softBody = new this.bjsAMMO.btSoftBodyHelpers().CreateFromTriMesh(this.world.getWorldInfo(), triPoints, object.getIndices(), indices.length / 3, true);\r\n\r\n const nbVertices = vertexPositions.length / 3;\r\n const bodyVertices = softBody.get_m_nodes();\r\n let node: any;\r\n let nodeNormals: any;\r\n for (let i = 0; i < nbVertices; i++) {\r\n node = bodyVertices.at(i);\r\n nodeNormals = node.get_m_n();\r\n nodeNormals.setX(triNorms[3 * i]);\r\n nodeNormals.setY(triNorms[3 * i + 1]);\r\n nodeNormals.setZ(triNorms[3 * i + 2]);\r\n }\r\n return softBody;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create cloth for an impostor\r\n * @param impostor to create the softbody for\r\n * @returns the cloth\r\n */\r\n private _createCloth(impostor: PhysicsImpostor) {\r\n const object = impostor.object;\r\n if (object && object.getIndices) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n const len = vertexPositions.length;\r\n const segments = Math.sqrt(len / 3);\r\n impostor.segments = segments;\r\n const segs = segments - 1;\r\n this._tmpAmmoVectorA.setValue(vertexPositions[0], vertexPositions[1], vertexPositions[2]);\r\n this._tmpAmmoVectorB.setValue(vertexPositions[3 * segs], vertexPositions[3 * segs + 1], vertexPositions[3 * segs + 2]);\r\n this._tmpAmmoVectorD.setValue(vertexPositions[len - 3], vertexPositions[len - 2], vertexPositions[len - 1]);\r\n this._tmpAmmoVectorC.setValue(vertexPositions[len - 3 - 3 * segs], vertexPositions[len - 2 - 3 * segs], vertexPositions[len - 1 - 3 * segs]);\r\n\r\n const clothBody = new this.bjsAMMO.btSoftBodyHelpers().CreatePatch(\r\n this.world.getWorldInfo(),\r\n this._tmpAmmoVectorA,\r\n this._tmpAmmoVectorB,\r\n this._tmpAmmoVectorC,\r\n this._tmpAmmoVectorD,\r\n segments,\r\n segments,\r\n impostor.getParam(\"fixedPoints\"),\r\n true\r\n );\r\n return clothBody;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create rope for an impostor\r\n * @param impostor to create the softbody for\r\n * @returns the rope\r\n */\r\n private _createRope(impostor: PhysicsImpostor) {\r\n let len: number;\r\n let segments: number;\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n }\r\n\r\n //force the mesh to be updatable\r\n vertex_data.applyToMesh(<Mesh>impostor.object, true);\r\n\r\n impostor._isFromLine = true;\r\n\r\n // If in lines mesh all normals will be zero\r\n const vertexSquared: Array<number> = <Array<number>>vertexNormals.map((x: number) => x * x);\r\n const reducer = (accumulator: number, currentValue: number): number => accumulator + currentValue;\r\n const reduced: number = vertexSquared.reduce(reducer);\r\n\r\n if (reduced === 0) {\r\n // line mesh\r\n len = vertexPositions.length;\r\n segments = len / 3 - 1;\r\n this._tmpAmmoVectorA.setValue(vertexPositions[0], vertexPositions[1], vertexPositions[2]);\r\n this._tmpAmmoVectorB.setValue(vertexPositions[len - 3], vertexPositions[len - 2], vertexPositions[len - 1]);\r\n } else {\r\n //extruded mesh\r\n impostor._isFromLine = false;\r\n const pathVectors = impostor.getParam(\"path\");\r\n const shape = impostor.getParam(\"shape\");\r\n if (shape === null) {\r\n Logger.Warn(\"No shape available for extruded mesh\");\r\n return new this.bjsAMMO.btCompoundShape();\r\n }\r\n len = pathVectors.length;\r\n segments = len - 1;\r\n this._tmpAmmoVectorA.setValue(pathVectors[0].x, pathVectors[0].y, pathVectors[0].z);\r\n this._tmpAmmoVectorB.setValue(pathVectors[len - 1].x, pathVectors[len - 1].y, pathVectors[len - 1].z);\r\n }\r\n\r\n impostor.segments = segments;\r\n\r\n let fixedPoints = impostor.getParam(\"fixedPoints\");\r\n fixedPoints = fixedPoints > 3 ? 3 : fixedPoints;\r\n\r\n const ropeBody = new this.bjsAMMO.btSoftBodyHelpers().CreateRope(this.world.getWorldInfo(), this._tmpAmmoVectorA, this._tmpAmmoVectorB, segments - 1, fixedPoints);\r\n ropeBody.get_m_cfg().set_collisions(0x11);\r\n return ropeBody;\r\n }\r\n\r\n /**\r\n * Create a custom physics impostor shape using the plugin's onCreateCustomShape handler\r\n * @param impostor to create the custom physics shape for\r\n * @returns the custom physics shape\r\n */\r\n private _createCustom(impostor: PhysicsImpostor): any {\r\n let returnValue: any = null;\r\n if (this.onCreateCustomShape) {\r\n returnValue = this.onCreateCustomShape(impostor);\r\n }\r\n if (returnValue == null) {\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n }\r\n return returnValue;\r\n }\r\n\r\n // adds all verticies (including child verticies) to the convex hull shape\r\n private _addHullVerts(btConvexHullShape: any, topLevelObject: IPhysicsEnabledObject, object: IPhysicsEnabledObject) {\r\n let triangleCount = 0;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n object.computeWorldMatrix(false);\r\n const faceCount = indices.length / 3;\r\n for (let i = 0; i < faceCount; i++) {\r\n const triPoints = [];\r\n for (let point = 0; point < 3; point++) {\r\n let v = new Vector3(\r\n vertexPositions[indices[i * 3 + point] * 3 + 0],\r\n vertexPositions[indices[i * 3 + point] * 3 + 1],\r\n vertexPositions[indices[i * 3 + point] * 3 + 2]\r\n );\r\n\r\n // Adjust for initial scaling\r\n Matrix.ScalingToRef(object.scaling.x, object.scaling.y, object.scaling.z, this._tmpMatrix);\r\n v = Vector3.TransformCoordinates(v, this._tmpMatrix);\r\n\r\n let vec: any;\r\n if (point == 0) {\r\n vec = this._tmpAmmoVectorA;\r\n } else if (point == 1) {\r\n vec = this._tmpAmmoVectorB;\r\n } else {\r\n vec = this._tmpAmmoVectorC;\r\n }\r\n vec.setValue(v.x, v.y, v.z);\r\n\r\n triPoints.push(vec);\r\n }\r\n btConvexHullShape.addPoint(triPoints[0], true);\r\n btConvexHullShape.addPoint(triPoints[1], true);\r\n btConvexHullShape.addPoint(triPoints[2], true);\r\n triangleCount++;\r\n }\r\n\r\n object.getChildMeshes().forEach((m) => {\r\n triangleCount += this._addHullVerts(btConvexHullShape, topLevelObject, m);\r\n });\r\n }\r\n return triangleCount;\r\n }\r\n\r\n private _createShape(impostor: PhysicsImpostor, ignoreChildren = false) {\r\n const object = impostor.object;\r\n\r\n let returnValue: any;\r\n const impostorExtents = impostor.getObjectExtents();\r\n\r\n if (!ignoreChildren) {\r\n const meshChildren = impostor.object.getChildMeshes ? impostor.object.getChildMeshes(true) : [];\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n\r\n // Add shape of all children to the compound shape\r\n let childrenAdded = 0;\r\n meshChildren.forEach((childMesh) => {\r\n const childImpostor = childMesh.getPhysicsImpostor();\r\n if (childImpostor) {\r\n if (childImpostor.type == PhysicsImpostor.MeshImpostor) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"A child MeshImpostor is not supported. Only primitive impostors are supported as children (eg. box or sphere)\";\r\n }\r\n const shape = this._createShape(childImpostor);\r\n\r\n // Position needs to be scaled based on parent's scaling\r\n const parentMat = childMesh.parent!.getWorldMatrix().clone();\r\n const s = new Vector3();\r\n parentMat.decompose(s);\r\n this._tmpAmmoTransform.getOrigin().setValue(childMesh.position.x * s.x, childMesh.position.y * s.y, childMesh.position.z * s.z);\r\n\r\n this._tmpAmmoQuaternion.setValue(\r\n childMesh.rotationQuaternion!.x,\r\n childMesh.rotationQuaternion!.y,\r\n childMesh.rotationQuaternion!.z,\r\n childMesh.rotationQuaternion!.w\r\n );\r\n this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);\r\n returnValue.addChildShape(this._tmpAmmoTransform, shape);\r\n childImpostor.dispose();\r\n childrenAdded++;\r\n }\r\n });\r\n\r\n if (childrenAdded > 0) {\r\n // Add parents shape as a child if present\r\n if (impostor.type != PhysicsImpostor.NoImpostor) {\r\n const shape = this._createShape(impostor, true);\r\n if (shape) {\r\n this._tmpAmmoTransform.getOrigin().setValue(0, 0, 0);\r\n this._tmpAmmoQuaternion.setValue(0, 0, 0, 1);\r\n this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);\r\n\r\n returnValue.addChildShape(this._tmpAmmoTransform, shape);\r\n }\r\n }\r\n return returnValue;\r\n } else {\r\n // If no children with impostors create the actual shape below instead\r\n this.bjsAMMO.destroy(returnValue);\r\n returnValue = null;\r\n }\r\n }\r\n\r\n switch (impostor.type) {\r\n case PhysicsImpostor.SphereImpostor:\r\n // Is there a better way to compare floats number? With an epsilon or with a Math function\r\n if (WithinEpsilon(impostorExtents.x, impostorExtents.y, 0.0001) && WithinEpsilon(impostorExtents.x, impostorExtents.z, 0.0001)) {\r\n returnValue = new this.bjsAMMO.btSphereShape(impostorExtents.x / 2);\r\n } else {\r\n // create a btMultiSphereShape because it's not possible to set a local scaling on a btSphereShape\r\n this._tmpAmmoVectorA.setValue(0, 0, 0);\r\n const positions = [this._tmpAmmoVectorA];\r\n const radii = [1];\r\n returnValue = new this.bjsAMMO.btMultiSphereShape(positions, radii, 1);\r\n\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue.setLocalScaling(this._tmpAmmoVectorA);\r\n }\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n {\r\n // https://pybullet.org/Bullet/BulletFull/classbtCapsuleShape.html#details\r\n // Height is just the height between the center of each 'sphere' of the capsule caps\r\n const capRadius = impostorExtents.x / 2;\r\n returnValue = new this.bjsAMMO.btCapsuleShape(capRadius, impostorExtents.y - capRadius * 2);\r\n }\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue = new this.bjsAMMO.btCylinderShape(this._tmpAmmoVectorA);\r\n break;\r\n case PhysicsImpostor.PlaneImpostor:\r\n case PhysicsImpostor.BoxImpostor:\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue = new this.bjsAMMO.btBoxShape(this._tmpAmmoVectorA);\r\n break;\r\n case PhysicsImpostor.MeshImpostor: {\r\n if (impostor.getParam(\"mass\") == 0) {\r\n // Only create btBvhTriangleMeshShape if the impostor is static\r\n // See https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=7283\r\n if (this.onCreateCustomMeshImpostor) {\r\n returnValue = this.onCreateCustomMeshImpostor(impostor);\r\n } else {\r\n const triMesh = new this.bjsAMMO.btTriangleMesh();\r\n impostor._pluginData.toDispose.push(triMesh);\r\n const triangleCount = this._addMeshVerts(triMesh, object, object);\r\n if (triangleCount == 0) {\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n returnValue = new this.bjsAMMO.btBvhTriangleMeshShape(triMesh);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n // Otherwise create convexHullImpostor\r\n // eslint-disable-next-line no-fallthrough\r\n case PhysicsImpostor.ConvexHullImpostor: {\r\n if (this.onCreateCustomConvexHullImpostor) {\r\n returnValue = this.onCreateCustomConvexHullImpostor(impostor);\r\n } else {\r\n const convexHull = new this.bjsAMMO.btConvexHullShape();\r\n const triangleCount = this._addHullVerts(convexHull, object, object);\r\n if (triangleCount == 0) {\r\n // Cleanup Unused Convex Hull Shape\r\n impostor._pluginData.toDispose.push(convexHull);\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n returnValue = convexHull;\r\n }\r\n }\r\n break;\r\n }\r\n case PhysicsImpostor.NoImpostor:\r\n // Fill with sphere but collision is disabled on the rigid body in generatePhysicsBody, using an empty shape caused unexpected movement with joints\r\n returnValue = new this.bjsAMMO.btSphereShape(impostorExtents.x / 2);\r\n break;\r\n case PhysicsImpostor.CustomImpostor:\r\n // Only usable when the plugin's onCreateCustomShape is set\r\n returnValue = this._createCustom(impostor);\r\n break;\r\n case PhysicsImpostor.SoftbodyImpostor:\r\n // Only usable with a mesh that has sufficient and shared vertices\r\n returnValue = this._createSoftbody(impostor);\r\n break;\r\n case PhysicsImpostor.ClothImpostor:\r\n // Only usable with a ground mesh that has sufficient and shared vertices\r\n returnValue = this._createCloth(impostor);\r\n break;\r\n case PhysicsImpostor.RopeImpostor:\r\n // Only usable with a line mesh or an extruded mesh that is updatable\r\n returnValue = this._createRope(impostor);\r\n break;\r\n default:\r\n Logger.Warn(\"The impostor type is not currently supported by the ammo plugin.\");\r\n break;\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n /**\r\n * Sets the mesh body position/rotation from the babylon impostor\r\n * @param impostor imposter containing the physics body and babylon object\r\n */\r\n public setTransformationFromPhysicsBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.getMotionState().getWorldTransform(this._tmpAmmoTransform);\r\n impostor.object.position.set(this._tmpAmmoTransform.getOrigin().x(), this._tmpAmmoTransform.getOrigin().y(), this._tmpAmmoTransform.getOrigin().z());\r\n\r\n if (!impostor.object.rotationQuaternion) {\r\n if (impostor.object.rotation) {\r\n this._tmpQuaternion.set(\r\n this._tmpAmmoTransform.getRotation().x(),\r\n this._tmpAmmoTransform.getRotation().y(),\r\n this._tmpAmmoTransform.getRotation().z(),\r\n this._tmpAmmoTransform.getRotation().w()\r\n );\r\n this._tmpQuaternion.toEulerAnglesToRef(impostor.object.rotation);\r\n }\r\n } else {\r\n impostor.object.rotationQuaternion.set(\r\n this._tmpAmmoTransform.getRotation().x(),\r\n this._tmpAmmoTransform.getRotation().y(),\r\n this._tmpAmmoTransform.getRotation().z(),\r\n this._tmpAmmoTransform.getRotation().w()\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Sets the babylon object's position/rotation from the physics body's position/rotation\r\n * @param impostor imposter containing the physics body and babylon object\r\n * @param newPosition new position\r\n * @param newRotation new rotation\r\n */\r\n public setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion) {\r\n const trans = impostor.physicsBody.getWorldTransform();\r\n\r\n // If rotation/position has changed update and activate rigged body\r\n if (\r\n Math.abs(trans.getOrigin().x() - newPosition.x) > Epsilon ||\r\n Math.abs(trans.getOrigin().y() - newPosition.y) > Epsilon ||\r\n Math.abs(trans.getOrigin().z() - newPosition.z) > Epsilon ||\r\n Math.abs(trans.getRotation().x() - newRotation.x) > Epsilon ||\r\n Math.abs(trans.getRotation().y() - newRotation.y) > Epsilon ||\r\n Math.abs(trans.getRotation().z() - newRotation.z) > Epsilon ||\r\n Math.abs(trans.getRotation().w() - newRotation.w) > Epsilon\r\n ) {\r\n this._tmpAmmoVectorA.setValue(newPosition.x, newPosition.y, newPosition.z);\r\n trans.setOrigin(this._tmpAmmoVectorA);\r\n\r\n this._tmpAmmoQuaternion.setValue(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\r\n trans.setRotation(this._tmpAmmoQuaternion);\r\n impostor.physicsBody.setWorldTransform(trans);\r\n\r\n if (impostor.mass == 0) {\r\n // Kinematic objects must be updated using motion state\r\n const motionState = impostor.physicsBody.getMotionState();\r\n if (motionState) {\r\n motionState.setWorldTransform(trans);\r\n }\r\n } else {\r\n impostor.physicsBody.activate();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * If this plugin is supported\r\n * @returns true if its supported\r\n */\r\n public isSupported(): boolean {\r\n return this.bjsAMMO !== undefined;\r\n }\r\n\r\n /**\r\n * Sets the linear velocity of the physics body\r\n * @param impostor imposter to set the velocity on\r\n * @param velocity velocity to set\r\n */\r\n public setLinearVelocity(impostor: PhysicsImpostor, velocity: Vector3) {\r\n this._tmpAmmoVectorA.setValue(velocity.x, velocity.y, velocity.z);\r\n if (impostor.soft) {\r\n impostor.physicsBody.linearVelocity(this._tmpAmmoVectorA);\r\n } else {\r\n impostor.physicsBody.setLinearVelocity(this._tmpAmmoVectorA);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the angular velocity of the physics body\r\n * @param impostor imposter to set the velocity on\r\n * @param velocity velocity to set\r\n */\r\n public setAngularVelocity(impostor: PhysicsImpostor, velocity: Vector3) {\r\n this._tmpAmmoVectorA.setValue(velocity.x, velocity.y, velocity.z);\r\n if (impostor.soft) {\r\n impostor.physicsBody.angularVelocity(this._tmpAmmoVectorA);\r\n } else {\r\n impostor.physicsBody.setAngularVelocity(this._tmpAmmoVectorA);\r\n }\r\n }\r\n\r\n /**\r\n * gets the linear velocity\r\n * @param impostor imposter to get linear velocity from\r\n * @returns linear velocity\r\n */\r\n public getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3> {\r\n let v: any;\r\n if (impostor.soft) {\r\n v = impostor.physicsBody.linearVelocity();\r\n } else {\r\n v = impostor.physicsBody.getLinearVelocity();\r\n }\r\n if (!v) {\r\n return null;\r\n }\r\n const result = new Vector3(v.x(), v.y(), v.z());\r\n this.bjsAMMO.destroy(v);\r\n return result;\r\n }\r\n\r\n /**\r\n * gets the angular velocity\r\n * @param impostor imposter to get angular velocity from\r\n * @returns angular velocity\r\n */\r\n public getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3> {\r\n let v: any;\r\n if (impostor.soft) {\r\n v = impostor.physicsBody.angularVelocity();\r\n } else {\r\n v = impostor.physicsBody.getAngularVelocity();\r\n }\r\n if (!v) {\r\n return null;\r\n }\r\n const result = new Vector3(v.x(), v.y(), v.z());\r\n this.bjsAMMO.destroy(v);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the mass of physics body\r\n * @param impostor imposter to set the mass on\r\n * @param mass mass to set\r\n */\r\n public setBodyMass(impostor: PhysicsImpostor, mass: number) {\r\n if (impostor.soft) {\r\n impostor.physicsBody.setTotalMass(mass, false);\r\n } else {\r\n impostor.physicsBody.setMassProps(mass);\r\n }\r\n impostor._pluginData.mass = mass;\r\n }\r\n\r\n /**\r\n * Gets the mass of the physics body\r\n * @param impostor imposter to get the mass from\r\n * @returns mass\r\n */\r\n public getBodyMass(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.mass || 0;\r\n }\r\n\r\n /**\r\n * Gets friction of the impostor\r\n * @param impostor impostor to get friction from\r\n * @returns friction value\r\n */\r\n public getBodyFriction(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.friction || 0;\r\n }\r\n\r\n /**\r\n * Sets friction of the impostor\r\n * @param impostor impostor to set friction on\r\n * @param friction friction value\r\n */\r\n public setBodyFriction(impostor: PhysicsImpostor, friction: number) {\r\n if (impostor.soft) {\r\n impostor.physicsBody.get_m_cfg().set_kDF(friction);\r\n } else {\r\n impostor.physicsBody.setFriction(friction);\r\n }\r\n impostor._pluginData.friction = friction;\r\n }\r\n\r\n /**\r\n * Gets restitution of the impostor\r\n * @param impostor impostor to get restitution from\r\n * @returns restitution value\r\n */\r\n public getBodyRestitution(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.restitution || 0;\r\n }\r\n\r\n /**\r\n * Sets restitution of the impostor\r\n * @param impostor impostor to set resitution on\r\n * @param restitution resitution value\r\n */\r\n public setBodyRestitution(impostor: PhysicsImpostor, restitution: number) {\r\n impostor.physicsBody.setRestitution(restitution);\r\n impostor._pluginData.restitution = restitution;\r\n }\r\n\r\n /**\r\n * Gets pressure inside the impostor\r\n * @param impostor impostor to get pressure from\r\n * @returns pressure value\r\n */\r\n public getBodyPressure(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Pressure is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.pressure || 0;\r\n }\r\n\r\n /**\r\n * Sets pressure inside a soft body impostor\r\n * Cloth and rope must remain 0 pressure\r\n * @param impostor impostor to set pressure on\r\n * @param pressure pressure value\r\n */\r\n public setBodyPressure(impostor: PhysicsImpostor, pressure: number) {\r\n if (impostor.soft) {\r\n if (impostor.type === PhysicsImpostor.SoftbodyImpostor) {\r\n impostor.physicsBody.get_m_cfg().set_kPR(pressure);\r\n impostor._pluginData.pressure = pressure;\r\n } else {\r\n impostor.physicsBody.get_m_cfg().set_kPR(0);\r\n impostor._pluginData.pressure = 0;\r\n }\r\n } else {\r\n Logger.Warn(\"Pressure can only be applied to a softbody\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets stiffness of the impostor\r\n * @param impostor impostor to get stiffness from\r\n * @returns pressure value\r\n */\r\n public getBodyStiffness(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Stiffness is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.stiffness || 0;\r\n }\r\n\r\n /**\r\n * Sets stiffness of the impostor\r\n * @param impostor impostor to set stiffness on\r\n * @param stiffness stiffness value from 0 to 1\r\n */\r\n public setBodyStiffness(impostor: PhysicsImpostor, stiffness: number) {\r\n if (impostor.soft) {\r\n stiffness = stiffness < 0 ? 0 : stiffness;\r\n stiffness = stiffness > 1 ? 1 : stiffness;\r\n impostor.physicsBody.get_m_materials().at(0).set_m_kLST(stiffness);\r\n impostor._pluginData.stiffness = stiffness;\r\n } else {\r\n Logger.Warn(\"Stiffness cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets velocityIterations of the impostor\r\n * @param impostor impostor to get velocity iterations from\r\n * @returns velocityIterations value\r\n */\r\n public getBodyVelocityIterations(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Velocity iterations is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.velocityIterations || 0;\r\n }\r\n\r\n /**\r\n * Sets velocityIterations of the impostor\r\n * @param impostor impostor to set velocity iterations on\r\n * @param velocityIterations velocityIterations value\r\n */\r\n public setBodyVelocityIterations(impostor: PhysicsImpostor, velocityIterations: number) {\r\n if (impostor.soft) {\r\n velocityIterations = velocityIterations < 0 ? 0 : velocityIterations;\r\n impostor.physicsBody.get_m_cfg().set_viterations(velocityIterations);\r\n impostor._pluginData.velocityIterations = velocityIterations;\r\n } else {\r\n Logger.Warn(\"Velocity iterations cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets positionIterations of the impostor\r\n * @param impostor impostor to get position iterations from\r\n * @returns positionIterations value\r\n */\r\n public getBodyPositionIterations(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Position iterations is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.positionIterations || 0;\r\n }\r\n\r\n /**\r\n * Sets positionIterations of the impostor\r\n * @param impostor impostor to set position on\r\n * @param positionIterations positionIterations value\r\n */\r\n public setBodyPositionIterations(impostor: PhysicsImpostor, positionIterations: number) {\r\n if (impostor.soft) {\r\n positionIterations = positionIterations < 0 ? 0 : positionIterations;\r\n impostor.physicsBody.get_m_cfg().set_piterations(positionIterations);\r\n impostor._pluginData.positionIterations = positionIterations;\r\n } else {\r\n Logger.Warn(\"Position iterations cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Append an anchor to a cloth object\r\n * @param impostor is the cloth impostor to add anchor to\r\n * @param otherImpostor is the rigid impostor to anchor to\r\n * @param width ratio across width from 0 to 1\r\n * @param height ratio up height from 0 to 1\r\n * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n */\r\n public appendAnchor(\r\n impostor: PhysicsImpostor,\r\n otherImpostor: PhysicsImpostor,\r\n width: number,\r\n height: number,\r\n influence: number = 1,\r\n noCollisionBetweenLinkedBodies: boolean = false\r\n ) {\r\n const segs = impostor.segments;\r\n const nbAcross = Math.round((segs - 1) * width);\r\n const nbUp = Math.round((segs - 1) * height);\r\n const nbDown = segs - 1 - nbUp;\r\n const node = nbAcross + segs * nbDown;\r\n impostor.physicsBody.appendAnchor(node, otherImpostor.physicsBody, noCollisionBetweenLinkedBodies, influence);\r\n }\r\n\r\n /**\r\n * Append an hook to a rope object\r\n * @param impostor is the rope impostor to add hook to\r\n * @param otherImpostor is the rigid impostor to hook to\r\n * @param length ratio along the rope from 0 to 1\r\n * @param influence the elasticity between soft impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n */\r\n public appendHook(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, length: number, influence: number = 1, noCollisionBetweenLinkedBodies: boolean = false) {\r\n const node = Math.round(impostor.segments * length);\r\n impostor.physicsBody.appendAnchor(node, otherImpostor.physicsBody, noCollisionBetweenLinkedBodies, influence);\r\n }\r\n\r\n /**\r\n * Sleeps the physics body and stops it from being active\r\n * @param impostor impostor to sleep\r\n */\r\n public sleepBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.forceActivationState(0);\r\n }\r\n\r\n /**\r\n * Activates the physics body\r\n * @param impostor impostor to activate\r\n */\r\n public wakeUpBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.activate();\r\n }\r\n\r\n /**\r\n * Updates the distance parameters of the joint\r\n */\r\n public updateDistanceJoint() {\r\n Logger.Warn(\"updateDistanceJoint is not currently supported by the Ammo physics plugin\");\r\n }\r\n\r\n /**\r\n * Sets a motor on the joint\r\n * @param joint joint to set motor on\r\n * @param speed speed of the motor\r\n * @param maxForce maximum force of the motor\r\n */\r\n public setMotor(joint: IMotorEnabledJoint, speed?: number, maxForce?: number) {\r\n joint.physicsJoint.enableAngularMotor(true, speed, maxForce);\r\n }\r\n\r\n /**\r\n * Sets the motors limit\r\n */\r\n public setLimit() {\r\n Logger.Warn(\"setLimit is not currently supported by the Ammo physics plugin\");\r\n }\r\n\r\n /**\r\n * Syncs the position and rotation of a mesh with the impostor\r\n * @param mesh mesh to sync\r\n * @param impostor impostor to update the mesh with\r\n */\r\n public syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor) {\r\n const body = impostor.physicsBody;\r\n\r\n body.getMotionState().getWorldTransform(this._tmpAmmoTransform);\r\n\r\n mesh.position.x = this._tmpAmmoTransform.getOrigin().x();\r\n mesh.position.y = this._tmpAmmoTransform.getOrigin().y();\r\n mesh.position.z = this._tmpAmmoTransform.getOrigin().z();\r\n\r\n if (mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion.x = this._tmpAmmoTransform.getRotation().x();\r\n mesh.rotationQuaternion.y = this._tmpAmmoTransform.getRotation().y();\r\n mesh.rotationQuaternion.z = this._tmpAmmoTransform.getRotation().z();\r\n mesh.rotationQuaternion.w = this._tmpAmmoTransform.getRotation().w();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the radius of the impostor\r\n * @param impostor impostor to get radius from\r\n * @returns the radius\r\n */\r\n public getRadius(impostor: PhysicsImpostor): number {\r\n const extents = impostor.getObjectExtents();\r\n return extents.x / 2;\r\n }\r\n\r\n /**\r\n * Gets the box size of the impostor\r\n * @param impostor impostor to get box size from\r\n * @param result the resulting box size\r\n */\r\n public getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void {\r\n const extents = impostor.getObjectExtents();\r\n result.x = extents.x;\r\n result.y = extents.y;\r\n result.z = extents.z;\r\n }\r\n\r\n /**\r\n * Disposes of the impostor\r\n */\r\n public dispose() {\r\n // Dispose of world\r\n this.bjsAMMO.destroy(this.world);\r\n this.bjsAMMO.destroy(this._softBodySolver);\r\n this.bjsAMMO.destroy(this._solver);\r\n this.bjsAMMO.destroy(this._overlappingPairCache);\r\n this.bjsAMMO.destroy(this._dispatcher);\r\n this.bjsAMMO.destroy(this._collisionConfiguration);\r\n\r\n // Dispose of temp variables\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorA);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorB);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorC);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorD);\r\n this.bjsAMMO.destroy(this._tmpAmmoTransform);\r\n this.bjsAMMO.destroy(this._tmpAmmoQuaternion);\r\n this.bjsAMMO.destroy(this._tmpAmmoConcreteContactResultCallback);\r\n\r\n this.world = null;\r\n }\r\n\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from where should the ray start?\r\n * @param to where should the ray end?\r\n * @returns PhysicsRaycastResult\r\n */\r\n public raycast(from: Vector3, to: Vector3): PhysicsRaycastResult {\r\n this.raycastToRef(from, to, this._raycastResult);\r\n return this._raycastResult;\r\n }\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from when should the ray start?\r\n * @param to when should the ray end?\r\n * @param result resulting PhysicsRaycastResult\r\n */\r\n public raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void {\r\n this._tmpAmmoVectorRCA = new this.bjsAMMO.btVector3(from.x, from.y, from.z);\r\n this._tmpAmmoVectorRCB = new this.bjsAMMO.btVector3(to.x, to.y, to.z);\r\n\r\n const rayCallback = new this.bjsAMMO.ClosestRayResultCallback(this._tmpAmmoVectorRCA, this._tmpAmmoVectorRCB);\r\n this.world.rayTest(this._tmpAmmoVectorRCA, this._tmpAmmoVectorRCB, rayCallback);\r\n\r\n result.reset(from, to);\r\n if (rayCallback.hasHit()) {\r\n // TODO: do we want/need the body? If so, set all the data\r\n /*\r\n var rigidBody = this.bjsAMMO.btRigidBody.prototype.upcast(\r\n rayCallback.get_m_collisionObject()\r\n );\r\n var body = {};\r\n */\r\n result.setHitData(\r\n {\r\n x: rayCallback.get_m_hitNormalWorld().x(),\r\n y: rayCallback.get_m_hitNormalWorld().y(),\r\n z: rayCallback.get_m_hitNormalWorld().z(),\r\n },\r\n {\r\n x: rayCallback.get_m_hitPointWorld().x(),\r\n y: rayCallback.get_m_hitPointWorld().y(),\r\n z: rayCallback.get_m_hitPointWorld().z(),\r\n }\r\n );\r\n result.calculateHitDistance();\r\n }\r\n this.bjsAMMO.destroy(rayCallback);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorRCA);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorRCB);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ammoJSPlugin.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Physics/v1/Plugins/ammoJSPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAI7D,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAKxD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IA4CrB;;;;;OAKG;IACH,YACY,wBAAiC,IAAI,EAC7C,gBAAqB,IAAI,EACzB,uBAA4B,IAAI;QAFxB,0BAAqB,GAArB,qBAAqB,CAAgB;QAlDjD;;WAEG;QACI,YAAO,GAAQ,EAAE,CAAC;QAKzB;;WAEG;QACI,SAAI,GAAW,cAAc,CAAC;QAE7B,cAAS,GAAW,CAAC,GAAG,EAAE,CAAC;QAC3B,mBAAc,GAAW,CAAC,GAAG,EAAE,CAAC;QAChC,cAAS,GAAG,CAAC,CAAC;QACd,mBAAc,GAAG,IAAI,UAAU,EAAE,CAAC;QAalC,8BAAyB,GAAG,KAAK,CAAC;QAIlC,qBAAgB,GAAG,IAAI,OAAO,EAAE,CAAC;QACjC,sBAAiB,GAAG,IAAI,OAAO,EAAE,CAAC;QAGlC,aAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;QA6TzB,eAAU,GAAG,IAAI,MAAM,EAAE,CAAC;QA5S9B,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;YAChG,OAAO;QACX,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACpF,OAAO;QACX,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,uBAAuB,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,yCAAyC,EAAE,CAAC;QAC5F,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACxF,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACzF,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,mCAAmC,EAAE,CAAC;QACtE,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEvK,IAAI,CAAC,qCAAqC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC;QAC9F,IAAI,CAAC,qCAAqC,CAAC,eAAe,GAAG,CAAC,YAAiB,EAAE,EAAE;YAC/E,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACpF,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC;YACtD,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC;YAClD,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC,iBAAiB,EAAE,CAAC;YAC3D,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QAC1C,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAEjD,6BAA6B;QAC7B,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACnB,OAAO,CAAC,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAgB;QAC9B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,QAAgB;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,aAAqB;QACzC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,QAAgB;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAiBD,+HAA+H;IACvH,oBAAoB,CAAC,QAAyB;QAClD,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IACD,iDAAiD;IACjD,yHAAyH;IACzH,wEAAwE;IAChE,wBAAwB,CAAC,SAA0B,EAAE,SAA0B;QACnF,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrH,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IAED,yEAAyE;IACzE,iFAAiF;IACjF,EAAE;IACF,0DAA0D;IAC1D,4UAA4U;IAC5U,kGAAkG;IAC1F,eAAe,CAAC,WAAmB,CAAC,GAAG,EAAE,EAAE,WAAmB,EAAE,EAAE,gBAAwB,CAAC,GAAG,EAAE;QACpG,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACJ,OAAO,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,QAAQ,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACvC,QAAQ,GAAG,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACJ,QAAQ,IAAI,aAAa,CAAC;oBAC1B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,QAAQ,EAAE,CAAC;YACf,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,KAAa,EAAE,SAAiC;QAC/D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,sDAAsD;YACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACjB,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAE/G,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;YACnC,8EAA8E;YAC9E,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACJ,YAAY,CAAC,SAAS,EAAE,CAAC;YAC7B,CAAC;YAED,yBAAyB;YACzB,IAAI,YAAY,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,IAAI,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1C,KAAK,MAAM,eAAe,IAAI,YAAY,CAAC,0BAA0B,EAAE,CAAC;wBACpE,KAAK,MAAM,aAAa,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC;4BACzD,IAAI,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;gCAC9E,IAAI,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;oCAC7D,YAAY,CAAC,SAAS,CAAC;wCACnB,IAAI,EAAE,aAAa,CAAC,WAAW;wCAC/B,KAAK,EAAE,IAAI,CAAC,gBAAgB;wCAC5B,QAAQ,EAAE,IAAI,CAAC,mBAAmB;wCAClC,OAAO,EAAE,IAAI,CAAC,kBAAkB;wCAChC,MAAM,EAAE,IAAI,CAAC,iBAAiB;qCACjC,CAAC,CAAC;oCACH,aAAa,CAAC,SAAS,CAAC;wCACpB,IAAI,EAAE,YAAY,CAAC,WAAW;wCAC9B,KAAK,EAAE,IAAI,CAAC,gBAAgB;wCAC5B,QAAQ,EAAE,IAAI,CAAC,mBAAmB;wCAClC,OAAO,EAAE,IAAI,CAAC,kBAAkB;wCAChC,MAAM,EAAE,IAAI,CAAC,iBAAiB;qCACjC,CAAC,CAAC;gCACP,CAAC;4BACL,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,QAAyB;QAC5C,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,QAAyB;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,IAAS,CAAC;QACd,IAAI,aAAkB,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAS,CAAC;QACpB,MAAM,IAAI,GAAmB,IAAI,KAAK,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1B,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC;YACtB,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC;YACtB,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAQ,MAAM,EAAE,CAAC,CAAC;QAChG,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,QAAyB;QAClD,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACxE,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,eAAe,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,aAAa,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,IAAS,CAAC;QACd,IAAI,aAAkB,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAS,CAAC;QACpB,IAAI,EAAE,EAAE,EAAE,EAAE,EAAU,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1B,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC;YACtB,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC;YACtB,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,GAAG,eAAe,CAAC;YACxC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;YACrB,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC;YACrB,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,GAAG,eAAe,CAAC;YAEvC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3B,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1B,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;QAErC,WAAW,CAAC,SAAS,GAAG,eAAe,CAAC;QACxC,WAAW,CAAC,OAAO,GAAG,aAAa,CAAC;QACpC,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9B,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC;QAED,WAAW,CAAC,WAAW,CAAO,MAAM,CAAC,CAAC;IAC1C,CAAC;IAGD;;;;;OAKG;IACI,YAAY,CAAC,QAAyB,EAAE,KAAc,EAAE,YAAqB;QAChF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;YAErC,kDAAkD;YAClD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACpD,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;YACpF,CAAC;YAED,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5C,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,QAAyB,EAAE,KAAc,EAAE,YAAqB;QAC9E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC;YAErC,kDAAkD;YAClD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACpD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,cAAc,EAAE,CAAC;gBAC3E,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACvI,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;YAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAE5C,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,mBAAmB,CAAC,QAAyB;QAChD,iFAAiF;QAEjF,QAAQ,CAAC,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;QAEpC,2BAA2B;QAC3B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACvB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBACjC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC3B,CAAC;YACD,OAAO;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAChB,QAAQ,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC1C,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC7H,QAAQ,CAAC,kBAAkB,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;gBACrE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxC,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAChC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,gBAAgB,EAAE,CAAC;oBACrD,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBAClE,CAAC;gBACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAClF,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACJ,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtD,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBACzC,cAAc,CAAC,WAAW,EAAE,CAAC;gBAC7B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACb,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBACvD,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAClH,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAC5B,QAAQ,CAAC,MAAM,CAAC,kBAAmB,CAAC,CAAC,EACrC,QAAQ,CAAC,MAAM,CAAC,kBAAmB,CAAC,CAAC,EACrC,QAAQ,CAAC,MAAM,CAAC,kBAAmB,CAAC,CAAC,EACrC,QAAQ,CAAC,MAAM,CAAC,kBAAmB,CAAC,CAAC,CACxC,CAAC;gBACF,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC/C,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACpD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;gBAC5E,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBACzG,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAElD,2CAA2C;gBAC3C,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACb,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;oBAChF,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;gBACrE,CAAC;gBAED,kFAAkF;gBAClF,IAAI,QAAQ,CAAC,IAAI,IAAI,eAAe,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;oBACzE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC;gBAC5F,CAAC;gBAED,yFAAyF;gBACzF,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,UAAU,EAAE,CAAC;oBACjG,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;oBACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;oBAC9D,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;oBACpE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC7C,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,CAAC;gBAED,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBACD,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC5B,QAAQ,CAAC,WAAW,CAAC,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClJ,CAAC;YACD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,QAAyB;QAC9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;oBAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;gBACD,QAAQ,CAAC,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC;YACxC,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,aAAmC;QACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC;QACxD,MAAM,aAAa,GAAG,aAAa,CAAC,iBAAiB,CAAC,WAAW,CAAC;QAClE,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,qFAAqF;QACrF,IAAI,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACnC,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACvB,SAAS,CAAC,SAAS,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAC5B,SAAS,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,KAAU,CAAC;QACf,QAAQ,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC9B,MAAM,QAAQ,GAAuB,SAAU,CAAC,WAAW,CAAC;gBAC5D,IAAI,QAAQ,EAAE,CAAC;oBACX,SAAS,CAAC,SAAS,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvD,SAAS,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAExF,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC5C,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBAE5G,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;gBACrG,MAAM;YACV,CAAC;YACD,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;oBACtB,SAAS,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC3B,SAAS,CAAC,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;gBAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAExF,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC5C,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBAE5G,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;gBACtC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEpF,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC3C,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAExG,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;gBACxH,MAAM;YACV,CAAC;YACD,KAAK,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAExF,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC5C,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBAE5G,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;gBACrG,MAAM;YACV,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;gBAErH,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;gBACvC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAExF,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;gBAC5C,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;gBAE5G,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;gBACrG,MAAM;YACV,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1E,aAAa,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,aAAmC;QAClD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAED,sEAAsE;IAC9D,aAAa,CAAC,cAAmB,EAAE,cAAqC,EAAE,MAA6B;QAC3G,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAChF,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,eAAe,GAAG,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,WAAW,CAAC;YAEhB,IAAI,cAAc,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;gBAC9C,6EAA6E;gBAC7E,kEAAkE;gBAClE,wFAAwF;gBACxF,IAAI,kBAAkB,CAAC;gBACvB,IAAI,cAAc,CAAC,kBAAkB,EAAE,CAAC;oBACpC,kBAAkB,GAAG,cAAc,CAAC,kBAAkB,CAAC;gBAC3D,CAAC;qBAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;oBACjC,kBAAkB,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACrI,CAAC;qBAAM,CAAC;oBACJ,kBAAkB,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC/C,CAAC;gBACD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAClG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC5C,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,sEAAsE;gBACtE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC3F,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;YAClC,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,EAAE,CAAC;gBACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,IAAI,OAAO,CACf,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAC/C,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAC/C,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAClD,CAAC;oBAEF,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;oBAEjD,IAAI,GAAQ,CAAC;oBACb,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACb,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;yBAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACpB,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;oBACD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE5B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;gBACD,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,aAAa,EAAE,CAAC;YACpB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC1B,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;QACL,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,QAAyB;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAChF,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,eAAe,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,IAAI,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACpE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,aAAa,GAAG,EAAE,CAAC;YACvB,CAAC;YACD,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxF,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClF,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC7D,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;gBACxD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,UAAU,EAAE,CAAC;YAErC,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;YAClC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;YAC/B,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9D,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACpE,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC9B,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9C,CAAC;YAED,WAAW,CAAC,WAAW,CAAO,MAAM,CAAC,CAAC;YAEtC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAEhC,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,OAAO,UAAU,CAAC,eAAe,CAAO,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,QAAyB;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC;YAC9C,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC;YAE1C,IAAI,eAAe,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACrD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACJ,MAAM,SAAS,GAAG,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjD,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC1F,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACpF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE7J,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC5C,IAAI,IAAS,CAAC;gBACd,IAAI,WAAgB,CAAC;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;oBAClC,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC1B,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC7B,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC;gBACD,OAAO,QAAQ,CAAC;YACpB,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,QAAyB;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC;YAC9C,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC;YAE1C,IAAI,eAAe,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACrD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACpC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC7B,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1F,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5G,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAE7I,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,WAAW,CAC9D,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EACzB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,eAAe,EACpB,QAAQ,EACR,QAAQ,EACR,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAChC,IAAI,CACP,CAAC;gBACF,OAAO,SAAS,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,WAAW,CAAC,QAAyB;QACzC,IAAI,GAAW,CAAC;QAChB,IAAI,QAAgB,CAAC;QACrB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC;QAC9C,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC;QAE1C,IAAI,eAAe,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YACrD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC;QAED,gCAAgC;QAChC,WAAW,CAAC,WAAW,CAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAErD,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QAE5B,4CAA4C;QAC5C,MAAM,aAAa,GAAiC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,CAAC,WAAmB,EAAE,YAAoB,EAAU,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC;QAClG,MAAM,OAAO,GAAW,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAChB,YAAY;YACZ,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC;YAC7B,QAAQ,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1F,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,CAAC;YACJ,eAAe;YACf,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;YAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;gBACpD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC9C,CAAC;YACD,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;YACzB,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,CAAC;QAED,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE7B,IAAI,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACnD,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAEhD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;QACnK,QAAQ,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,QAAyB;QAC3C,IAAI,WAAW,GAAQ,IAAI,CAAC;QAC5B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACtB,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,0EAA0E;IAClE,aAAa,CAAC,iBAAsB,EAAE,cAAqC,EAAE,MAA6B;QAC9G,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAChF,IAAI,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,eAAe,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,EAAE,CAAC;gBACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,IAAI,OAAO,CACf,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAC/C,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAC/C,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAClD,CAAC;oBAEF,6BAA6B;oBAC7B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC3F,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAErD,IAAI,GAAQ,CAAC;oBACb,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACb,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;yBAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACpB,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC/B,CAAC;oBACD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE5B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;gBACD,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/C,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/C,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/C,aAAa,EAAE,CAAC;YACpB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC1B,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;QACL,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,QAAyB,EAAE,cAAc,GAAG,KAAK;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAE/B,IAAI,WAAgB,CAAC;QACrB,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAEpD,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAEjD,kDAAkD;YAClD,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;gBACnC,MAAM,aAAa,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBACrD,IAAI,aAAa,EAAE,CAAC;oBAChB,IAAI,aAAa,CAAC,IAAI,IAAI,eAAe,CAAC,YAAY,EAAE,CAAC;wBACrD,4CAA4C;wBAC5C,MAAM,+GAA+G,CAAC;oBAC1H,CAAC;oBACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;oBAE/C,wDAAwD;oBACxD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,CAAC;oBAC7D,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;oBACxB,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEhI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAC5B,SAAS,CAAC,kBAAmB,CAAC,CAAC,EAC/B,SAAS,CAAC,kBAAmB,CAAC,CAAC,EAC/B,SAAS,CAAC,kBAAmB,CAAC,CAAC,EAC/B,SAAS,CAAC,kBAAmB,CAAC,CAAC,CAClC,CAAC;oBACF,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAC5D,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBACzD,aAAa,CAAC,OAAO,EAAE,CAAC;oBACxB,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC;YAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACpB,0CAA0C;gBAC1C,IAAI,QAAQ,CAAC,IAAI,IAAI,eAAe,CAAC,UAAU,EAAE,CAAC;oBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACR,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBACrD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC7C,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;wBAE5D,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBAC7D,CAAC;gBACL,CAAC;gBACD,OAAO,WAAW,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACJ,sEAAsE;gBACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAClC,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC;QACL,CAAC;QAED,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,eAAe,CAAC,cAAc;gBAC/B,0FAA0F;gBAC1F,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC7H,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACJ,kGAAkG;oBAClG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBACzC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClB,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;oBAEvE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACtD,CAAC;gBACD,MAAM;YACV,KAAK,eAAe,CAAC,eAAe;gBAChC,CAAC;oBACG,0EAA0E;oBAC1E,oFAAoF;oBACpF,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC;oBACxC,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;gBAChG,CAAC;gBACD,MAAM;YACV,KAAK,eAAe,CAAC,gBAAgB;gBACjC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACrE,MAAM;YACV,KAAK,eAAe,CAAC,aAAa,CAAC;YACnC,KAAK,eAAe,CAAC,WAAW;gBAC5B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAChE,MAAM;YACV,KAAK,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,+DAA+D;oBAC/D,8DAA8D;oBAC9D,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;wBAClC,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;oBAC5D,CAAC;yBAAM,CAAC;wBACJ,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;wBAClD,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;wBAClE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;4BACrB,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;wBACrD,CAAC;6BAAM,CAAC;4BACJ,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;wBACnE,CAAC;oBACL,CAAC;oBACD,MAAM;gBACV,CAAC;YACL,CAAC;YACD,sCAAsC;YACtC,0CAA0C;YAC1C,KAAK,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACtC,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;oBACxC,WAAW,GAAG,IAAI,CAAC,gCAAgC,CAAC,QAAQ,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACJ,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;oBACxD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;oBACrE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;wBACrB,mCAAmC;wBACnC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAChD,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACJ,WAAW,GAAG,UAAU,CAAC;oBAC7B,CAAC;gBACL,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,eAAe,CAAC,UAAU;gBAC3B,mJAAmJ;gBACnJ,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpE,MAAM;YACV,KAAK,eAAe,CAAC,cAAc;gBAC/B,2DAA2D;gBAC3D,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM;YACV,KAAK,eAAe,CAAC,gBAAgB;gBACjC,kEAAkE;gBAClE,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM;YACV,KAAK,eAAe,CAAC,aAAa;gBAC9B,yEAAyE;gBACzE,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM;YACV,KAAK,eAAe,CAAC,YAAY;gBAC7B,qEAAqE;gBACrE,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM;YACV;gBACI,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;gBAChF,MAAM;QACd,CAAC;QAED,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,gCAAgC,CAAC,QAAyB;QAC7D,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChF,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAErJ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CACnB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAC3C,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAClC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAC3C,CAAC;QACN,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,4BAA4B,CAAC,QAAyB,EAAE,WAAoB,EAAE,WAAuB;QACxG,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAEvD,mEAAmE;QACnE,IACI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YACzD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YACzD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YACzD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO;YAC3D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,EAC7D,CAAC;YACC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3E,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEtC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7F,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC3C,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAE9C,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBACrB,uDAAuD;gBACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;gBAC1D,IAAI,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YACpC,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,QAAyB,EAAE,QAAiB;QACjE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,QAAyB,EAAE,QAAiB;QAClE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,QAAyB;QAC9C,IAAI,CAAM,CAAC;QACX,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,QAAyB;QAC/C,IAAI,CAAM,CAAC;QACX,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAyB,EAAE,IAAY;QACtD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAyB;QACxC,OAAO,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,QAAyB;QAC5C,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,QAAyB,EAAE,QAAgB;QAC9D,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,QAAyB;QAC/C,OAAO,QAAQ,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,QAAyB,EAAE,WAAmB;QACpE,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACjD,QAAQ,CAAC,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,QAAyB;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,QAAyB,EAAE,QAAgB;QAC9D,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,gBAAgB,EAAE,CAAC;gBACrD,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnD,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC5C,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,QAAyB;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,QAAyB,EAAE,SAAiB;QAChE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnE,QAAQ,CAAC,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,QAAyB;QACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,kBAAkB,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,QAAyB,EAAE,kBAA0B;QAClF,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACrE,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;YACrE,QAAQ,CAAC,WAAW,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QACjE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,QAAyB;QACtD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,kBAAkB,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,QAAyB,EAAE,kBAA0B;QAClF,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,kBAAkB,GAAG,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACrE,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;YACrE,QAAQ,CAAC,WAAW,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QACjE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzE,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACI,YAAY,CACf,QAAyB,EACzB,aAA8B,EAC9B,KAAa,EACb,MAAc,EACd,YAAoB,CAAC,EACrB,iCAA0C,KAAK;QAE/C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IAClH,CAAC;IAED;;;;;;;OAOG;IACI,UAAU,CAAC,QAAyB,EAAE,aAA8B,EAAE,MAAc,EAAE,YAAoB,CAAC,EAAE,iCAA0C,KAAK;QAC/J,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QACpD,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IAClH,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,QAAyB;QACtC,QAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,QAAyB;QACvC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,mBAAmB;QACtB,MAAM,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAC7F,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,KAAyB,EAAE,KAAc,EAAE,QAAiB;QACxE,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACI,QAAQ;QACX,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAClF,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,IAAkB,EAAE,QAAyB;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;QAElC,IAAI,CAAC,cAAc,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;QAEzD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;QACzE,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,QAAyB;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,QAAyB,EAAE,MAAe;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,OAAO;QACV,mBAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEnD,4BAA4B;QAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAEjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,IAAa,EAAE,EAAW;QACrC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IACD;;;;;OAKG;IACI,YAAY,CAAC,IAAa,EAAE,EAAW,EAAE,MAA4B;QACxE,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAEhF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,0DAA0D;YAC1D;;;;;cAKE;YACF,MAAM,CAAC,UAAU,CACb;gBACI,CAAC,EAAE,WAAW,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;gBACzC,CAAC,EAAE,WAAW,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;gBACzC,CAAC,EAAE,WAAW,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;aAC5C,EACD;gBACI,CAAC,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;gBACxC,CAAC,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;gBACxC,CAAC,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;aAC3C,CACJ,CAAC;YACF,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC;;AA5kDuB,oCAAuB,GAAG,CAAC,AAAJ,CAAK;AAC5B,4BAAe,GAAG,CAAC,AAAJ,CAAK;AACpB,uCAA0B,GAAG,CAAC,AAAJ,CAAK","sourcesContent":["import { Quaternion, Vector3, Matrix } from \"../../../Maths/math.vector\";\r\nimport type { IPhysicsEnginePlugin, PhysicsImpostorJoint } from \"../IPhysicsEnginePlugin\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport type { IPhysicsEnabledObject } from \"../physicsImpostor\";\r\nimport { PhysicsImpostor } from \"../physicsImpostor\";\r\nimport type { IMotorEnabledJoint, DistanceJointData } from \"../physicsJoint\";\r\nimport { PhysicsJoint } from \"../physicsJoint\";\r\nimport { VertexBuffer } from \"../../../Buffers/buffer\";\r\nimport { VertexData } from \"../../../Meshes/mesh.vertexData\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport type { AbstractMesh } from \"../../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../../Meshes/mesh\";\r\nimport { ExtrudeShape } from \"../../../Meshes/Builders/shapeBuilder\";\r\nimport { CreateLines } from \"../../../Meshes/Builders/linesBuilder\";\r\nimport type { LinesMesh } from \"../../../Meshes/linesMesh\";\r\nimport { PhysicsRaycastResult } from \"../../physicsRaycastResult\";\r\nimport { WithinEpsilon } from \"../../../Maths/math.scalar.functions\";\r\nimport { Epsilon } from \"../../../Maths/math.constants\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let Ammo: any;\r\n\r\n/**\r\n * AmmoJS Physics plugin\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n * @see https://github.com/kripken/ammo.js/\r\n */\r\nexport class AmmoJSPlugin implements IPhysicsEnginePlugin {\r\n /**\r\n * Reference to the Ammo library\r\n */\r\n public bjsAMMO: any = {};\r\n /**\r\n * Created ammoJS world which physics bodies are added to\r\n */\r\n public world: any;\r\n /**\r\n * Name of the plugin\r\n */\r\n public name: string = \"AmmoJSPlugin\";\r\n\r\n private _timeStep: number = 1 / 60;\r\n private _fixedTimeStep: number = 1 / 60;\r\n private _maxSteps = 5;\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpAmmoTransform: any;\r\n private _tmpAmmoQuaternion: any;\r\n private _tmpAmmoConcreteContactResultCallback: any;\r\n private _collisionConfiguration: any;\r\n private _dispatcher: any;\r\n private _overlappingPairCache: any;\r\n private _solver: any;\r\n private _softBodySolver: any;\r\n private _tmpAmmoVectorA: any;\r\n private _tmpAmmoVectorB: any;\r\n private _tmpAmmoVectorC: any;\r\n private _tmpAmmoVectorD: any;\r\n private _tmpContactCallbackResult = false;\r\n private _tmpAmmoVectorRCA: any;\r\n private _tmpAmmoVectorRCB: any;\r\n private _raycastResult: PhysicsRaycastResult;\r\n private _tmpContactPoint = new Vector3();\r\n private _tmpContactNormal = new Vector3();\r\n private _tmpContactDistance: number;\r\n private _tmpContactImpulse: number;\r\n private _tmpVec3 = new Vector3();\r\n\r\n private static readonly _DISABLE_COLLISION_FLAG = 4;\r\n private static readonly _KINEMATIC_FLAG = 2;\r\n private static readonly _DISABLE_DEACTIVATION_FLAG = 4;\r\n\r\n /**\r\n * Initializes the ammoJS plugin\r\n * @param _useDeltaForWorldStep if the time between frames should be used when calculating physics steps (Default: true)\r\n * @param ammoInjection can be used to inject your own ammo reference\r\n * @param overlappingPairCache can be used to specify your own overlapping pair cache\r\n */\r\n public constructor(\r\n private _useDeltaForWorldStep: boolean = true,\r\n ammoInjection: any = Ammo,\r\n overlappingPairCache: any = null\r\n ) {\r\n if (typeof ammoInjection === \"function\") {\r\n Logger.Error(\"AmmoJS is not ready. Please make sure you await Ammo() before using the plugin.\");\r\n return;\r\n } else {\r\n this.bjsAMMO = ammoInjection;\r\n }\r\n\r\n if (!this.isSupported()) {\r\n Logger.Error(\"AmmoJS is not available. Please make sure you included the js file.\");\r\n return;\r\n }\r\n\r\n // Initialize the physics world\r\n this._collisionConfiguration = new this.bjsAMMO.btSoftBodyRigidBodyCollisionConfiguration();\r\n this._dispatcher = new this.bjsAMMO.btCollisionDispatcher(this._collisionConfiguration);\r\n this._overlappingPairCache = overlappingPairCache || new this.bjsAMMO.btDbvtBroadphase();\r\n this._solver = new this.bjsAMMO.btSequentialImpulseConstraintSolver();\r\n this._softBodySolver = new this.bjsAMMO.btDefaultSoftBodySolver();\r\n this.world = new this.bjsAMMO.btSoftRigidDynamicsWorld(this._dispatcher, this._overlappingPairCache, this._solver, this._collisionConfiguration, this._softBodySolver);\r\n\r\n this._tmpAmmoConcreteContactResultCallback = new this.bjsAMMO.ConcreteContactResultCallback();\r\n this._tmpAmmoConcreteContactResultCallback.addSingleResult = (contactPoint: any) => {\r\n contactPoint = this.bjsAMMO.wrapPointer(contactPoint, this.bjsAMMO.btManifoldPoint);\r\n const worldPoint = contactPoint.getPositionWorldOnA();\r\n const worldNormal = contactPoint.m_normalWorldOnB;\r\n this._tmpContactPoint.x = worldPoint.x();\r\n this._tmpContactPoint.y = worldPoint.y();\r\n this._tmpContactPoint.z = worldPoint.z();\r\n this._tmpContactNormal.x = worldNormal.x();\r\n this._tmpContactNormal.y = worldNormal.y();\r\n this._tmpContactNormal.z = worldNormal.z();\r\n this._tmpContactImpulse = contactPoint.getAppliedImpulse();\r\n this._tmpContactDistance = contactPoint.getDistance();\r\n this._tmpContactCallbackResult = true;\r\n };\r\n\r\n this._raycastResult = new PhysicsRaycastResult();\r\n\r\n // Create temp ammo variables\r\n this._tmpAmmoTransform = new this.bjsAMMO.btTransform();\r\n this._tmpAmmoTransform.setIdentity();\r\n this._tmpAmmoQuaternion = new this.bjsAMMO.btQuaternion(0, 0, 0, 1);\r\n this._tmpAmmoVectorA = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorB = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorC = new this.bjsAMMO.btVector3(0, 0, 0);\r\n this._tmpAmmoVectorD = new this.bjsAMMO.btVector3(0, 0, 0);\r\n }\r\n\r\n /**\r\n *\r\n * @returns plugin version\r\n */\r\n public getPluginVersion(): number {\r\n return 1;\r\n }\r\n\r\n /**\r\n * Sets the gravity of the physics world (m/(s^2))\r\n * @param gravity Gravity to set\r\n */\r\n public setGravity(gravity: Vector3): void {\r\n this._tmpAmmoVectorA.setValue(gravity.x, gravity.y, gravity.z);\r\n this.world.setGravity(this._tmpAmmoVectorA);\r\n this.world.getWorldInfo().set_m_gravity(this._tmpAmmoVectorA);\r\n }\r\n\r\n /**\r\n * Amount of time to step forward on each frame (only used if useDeltaForWorldStep is false in the constructor)\r\n * @param timeStep timestep to use in seconds\r\n */\r\n public setTimeStep(timeStep: number) {\r\n this._timeStep = timeStep;\r\n }\r\n\r\n /**\r\n * Increment to step forward in the physics engine (If timeStep is set to 1/60 and fixedTimeStep is set to 1/120 the physics engine should run 2 steps per frame) (Default: 1/60)\r\n * @param fixedTimeStep fixedTimeStep to use in seconds\r\n */\r\n public setFixedTimeStep(fixedTimeStep: number) {\r\n this._fixedTimeStep = fixedTimeStep;\r\n }\r\n\r\n /**\r\n * Sets the maximum number of steps by the physics engine per frame (Default: 5)\r\n * @param maxSteps the maximum number of steps by the physics engine per frame\r\n */\r\n public setMaxSteps(maxSteps: number) {\r\n this._maxSteps = maxSteps;\r\n }\r\n\r\n /**\r\n * Gets the current timestep (only used if useDeltaForWorldStep is false in the constructor)\r\n * @returns the current timestep in seconds\r\n */\r\n public getTimeStep(): number {\r\n return this._timeStep;\r\n }\r\n\r\n /**\r\n * The create custom shape handler function to be called when using BABYLON.PhysicsImposter.CustomImpostor\r\n */\r\n public onCreateCustomShape: (impostor: PhysicsImpostor) => any;\r\n\r\n /**\r\n * The create custom mesh impostor handler function to support building custom mesh impostor vertex data\r\n */\r\n public onCreateCustomMeshImpostor: (impostor: PhysicsImpostor) => any;\r\n\r\n /**\r\n * The create custom convex hull impostor handler function to support building custom convex hull impostor vertex data\r\n */\r\n public onCreateCustomConvexHullImpostor: (impostor: PhysicsImpostor) => any;\r\n\r\n // Ammo's contactTest and contactPairTest take a callback that runs synchronously, wrap them so that they are easier to consume\r\n private _isImpostorInContact(impostor: PhysicsImpostor) {\r\n this._tmpContactCallbackResult = false;\r\n this.world.contactTest(impostor.physicsBody, this._tmpAmmoConcreteContactResultCallback);\r\n return this._tmpContactCallbackResult;\r\n }\r\n // Ammo's collision events have some weird quirks\r\n // contactPairTest fires too many events as it fires events even when objects are close together but contactTest does not\r\n // so only fire event if both contactTest and contactPairTest have a hit\r\n private _isImpostorPairInContact(impostorA: PhysicsImpostor, impostorB: PhysicsImpostor) {\r\n this._tmpContactCallbackResult = false;\r\n this.world.contactPairTest(impostorA.physicsBody, impostorB.physicsBody, this._tmpAmmoConcreteContactResultCallback);\r\n return this._tmpContactCallbackResult;\r\n }\r\n\r\n // Ammo's behavior when maxSteps > 0 does not behave as described in docs\r\n // @see http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World\r\n //\r\n // When maxSteps is 0 do the entire simulation in one step\r\n // When maxSteps is > 0, run up to maxStep times, if on the last step the (remaining step - fixedTimeStep) is < fixedTimeStep, the remainder will be used for the step. (eg. if remainder is 1.001 and fixedTimeStep is 1 the last step will be 1.001, if instead it did 2 steps (1, 0.001) issues occuered when having a tiny step in ammo)\r\n // Note: To get deterministic physics, timeStep would always need to be divisible by fixedTimeStep\r\n private _stepSimulation(timeStep: number = 1 / 60, maxSteps: number = 10, fixedTimeStep: number = 1 / 60) {\r\n if (maxSteps == 0) {\r\n this.world.stepSimulation(timeStep, 0);\r\n } else {\r\n while (maxSteps > 0 && timeStep > 0) {\r\n if (timeStep - fixedTimeStep < fixedTimeStep) {\r\n this.world.stepSimulation(timeStep, 0);\r\n timeStep = 0;\r\n } else {\r\n timeStep -= fixedTimeStep;\r\n this.world.stepSimulation(fixedTimeStep, 0);\r\n }\r\n maxSteps--;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Moves the physics simulation forward delta seconds and updates the given physics imposters\r\n * Prior to the step the imposters physics location is set to the position of the babylon meshes\r\n * After the step the babylon meshes are set to the position of the physics imposters\r\n * @param delta amount of time to step forward\r\n * @param impostors array of imposters to update before/after the step\r\n */\r\n public executeStep(delta: number, impostors: Array<PhysicsImpostor>): void {\r\n for (const impostor of impostors) {\r\n // Update physics world objects to match babylon world\r\n if (!impostor.soft) {\r\n impostor.beforeStep();\r\n }\r\n }\r\n\r\n this._stepSimulation(this._useDeltaForWorldStep ? delta : this._timeStep, this._maxSteps, this._fixedTimeStep);\r\n\r\n for (const mainImpostor of impostors) {\r\n // After physics update make babylon world objects match physics world objects\r\n if (mainImpostor.soft) {\r\n this._afterSoftStep(mainImpostor);\r\n } else {\r\n mainImpostor.afterStep();\r\n }\r\n\r\n // Handle collision event\r\n if (mainImpostor._onPhysicsCollideCallbacks.length > 0) {\r\n if (this._isImpostorInContact(mainImpostor)) {\r\n for (const collideCallback of mainImpostor._onPhysicsCollideCallbacks) {\r\n for (const otherImpostor of collideCallback.otherImpostors) {\r\n if (mainImpostor.physicsBody.isActive() || otherImpostor.physicsBody.isActive()) {\r\n if (this._isImpostorPairInContact(mainImpostor, otherImpostor)) {\r\n mainImpostor.onCollide({\r\n body: otherImpostor.physicsBody,\r\n point: this._tmpContactPoint,\r\n distance: this._tmpContactDistance,\r\n impulse: this._tmpContactImpulse,\r\n normal: this._tmpContactNormal,\r\n });\r\n otherImpostor.onCollide({\r\n body: mainImpostor.physicsBody,\r\n point: this._tmpContactPoint,\r\n distance: this._tmpContactDistance,\r\n impulse: this._tmpContactImpulse,\r\n normal: this._tmpContactNormal,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh to match physics world object\r\n * @param impostor imposter to match\r\n */\r\n private _afterSoftStep(impostor: PhysicsImpostor): void {\r\n if (impostor.type === PhysicsImpostor.RopeImpostor) {\r\n this._ropeStep(impostor);\r\n } else {\r\n this._softbodyOrClothStep(impostor);\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh vertices vertices to match physics world softbody or cloth\r\n * @param impostor imposter to match\r\n */\r\n private _ropeStep(impostor: PhysicsImpostor): void {\r\n const bodyVertices = impostor.physicsBody.get_m_nodes();\r\n const nbVertices = bodyVertices.size();\r\n let node: any;\r\n let nodePositions: any;\r\n let x, y, z: number;\r\n const path: Array<Vector3> = new Array();\r\n for (let n = 0; n < nbVertices; n++) {\r\n node = bodyVertices.at(n);\r\n nodePositions = node.get_m_x();\r\n x = nodePositions.x();\r\n y = nodePositions.y();\r\n z = nodePositions.z();\r\n path.push(new Vector3(x, y, z));\r\n }\r\n const object = impostor.object;\r\n const shape = impostor.getParam(\"shape\");\r\n if (impostor._isFromLine) {\r\n impostor.object = CreateLines(\"lines\", { points: path, instance: <LinesMesh>object });\r\n } else {\r\n impostor.object = ExtrudeShape(\"ext\", { shape: shape, path: path, instance: <Mesh>object });\r\n }\r\n }\r\n\r\n /**\r\n * Update babylon mesh vertices vertices to match physics world softbody or cloth\r\n * @param impostor imposter to match\r\n */\r\n private _softbodyOrClothStep(impostor: PhysicsImpostor): void {\r\n const normalDirection = impostor.type === PhysicsImpostor.ClothImpostor ? 1 : -1;\r\n const object = impostor.object;\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n let vertexNormals = object.getVerticesData(VertexBuffer.NormalKind);\r\n if (!vertexNormals) {\r\n vertexNormals = [];\r\n }\r\n\r\n const nbVertices = vertexPositions.length / 3;\r\n const bodyVertices = impostor.physicsBody.get_m_nodes();\r\n let node: any;\r\n let nodePositions: any;\r\n let x, y, z: number;\r\n let nx, ny, nz: number;\r\n for (let n = 0; n < nbVertices; n++) {\r\n node = bodyVertices.at(n);\r\n nodePositions = node.get_m_x();\r\n x = nodePositions.x();\r\n y = nodePositions.y();\r\n z = nodePositions.z() * normalDirection;\r\n const nodeNormals = node.get_m_n();\r\n nx = nodeNormals.x();\r\n ny = nodeNormals.y();\r\n nz = nodeNormals.z() * normalDirection;\r\n\r\n vertexPositions[3 * n] = x;\r\n vertexPositions[3 * n + 1] = y;\r\n vertexPositions[3 * n + 2] = z;\r\n vertexNormals[3 * n] = nx;\r\n vertexNormals[3 * n + 1] = ny;\r\n vertexNormals[3 * n + 2] = nz;\r\n }\r\n\r\n const vertex_data = new VertexData();\r\n\r\n vertex_data.positions = vertexPositions;\r\n vertex_data.normals = vertexNormals;\r\n vertex_data.uvs = object.getVerticesData(VertexBuffer.UVKind);\r\n vertex_data.colors = object.getVerticesData(VertexBuffer.ColorKind);\r\n if (object && object.getIndices) {\r\n vertex_data.indices = object.getIndices();\r\n }\r\n\r\n vertex_data.applyToMesh(<Mesh>object);\r\n }\r\n\r\n private _tmpMatrix = new Matrix();\r\n /**\r\n * Applies an impulse on the imposter\r\n * @param impostor imposter to apply impulse to\r\n * @param force amount of force to be applied to the imposter\r\n * @param contactPoint the location to apply the impulse on the imposter\r\n */\r\n public applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3) {\r\n if (!impostor.soft) {\r\n impostor.physicsBody.activate();\r\n const worldPoint = this._tmpAmmoVectorA;\r\n const impulse = this._tmpAmmoVectorB;\r\n\r\n // Convert contactPoint relative to center of mass\r\n if (impostor.object && impostor.object.getWorldMatrix) {\r\n contactPoint.subtractInPlace(impostor.object.getWorldMatrix().getTranslation());\r\n }\r\n\r\n worldPoint.setValue(contactPoint.x, contactPoint.y, contactPoint.z);\r\n impulse.setValue(force.x, force.y, force.z);\r\n\r\n impostor.physicsBody.applyImpulse(impulse, worldPoint);\r\n } else {\r\n Logger.Warn(\"Cannot be applied to a soft body\");\r\n }\r\n }\r\n\r\n /**\r\n * Applies a force on the imposter\r\n * @param impostor imposter to apply force\r\n * @param force amount of force to be applied to the imposter\r\n * @param contactPoint the location to apply the force on the imposter\r\n */\r\n public applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3) {\r\n if (!impostor.soft) {\r\n impostor.physicsBody.activate();\r\n const worldPoint = this._tmpAmmoVectorA;\r\n const impulse = this._tmpAmmoVectorB;\r\n\r\n // Convert contactPoint relative to center of mass\r\n if (impostor.object && impostor.object.getWorldMatrix) {\r\n const localTranslation = impostor.object.getWorldMatrix().getTranslation();\r\n worldPoint.setValue(contactPoint.x - localTranslation.x, contactPoint.y - localTranslation.y, contactPoint.z - localTranslation.z);\r\n } else {\r\n worldPoint.setValue(contactPoint.x, contactPoint.y, contactPoint.z);\r\n }\r\n\r\n impulse.setValue(force.x, force.y, force.z);\r\n\r\n impostor.physicsBody.applyForce(impulse, worldPoint);\r\n } else {\r\n Logger.Warn(\"Cannot be applied to a soft body\");\r\n }\r\n }\r\n\r\n /**\r\n * Creates a physics body using the plugin\r\n * @param impostor the imposter to create the physics body on\r\n */\r\n public generatePhysicsBody(impostor: PhysicsImpostor) {\r\n // Note: this method will not be called on child imposotrs for compound impostors\r\n\r\n impostor._pluginData.toDispose = [];\r\n\r\n //parent-child relationship\r\n if (impostor.parent) {\r\n if (impostor.physicsBody) {\r\n this.removePhysicsBody(impostor);\r\n impostor.forceUpdate();\r\n }\r\n return;\r\n }\r\n\r\n if (impostor.isBodyInitRequired()) {\r\n const colShape = this._createShape(impostor);\r\n const mass = impostor.getParam(\"mass\");\r\n impostor._pluginData.mass = mass;\r\n if (impostor.soft) {\r\n colShape.get_m_cfg().set_collisions(0x11);\r\n colShape.get_m_cfg().set_kDP(impostor.getParam(\"damping\"));\r\n this.bjsAMMO.castObject(colShape, this.bjsAMMO.btCollisionObject).getCollisionShape().setMargin(impostor.getParam(\"margin\"));\r\n colShape.setActivationState(AmmoJSPlugin._DISABLE_DEACTIVATION_FLAG);\r\n this.world.addSoftBody(colShape, 1, -1);\r\n impostor.physicsBody = colShape;\r\n impostor._pluginData.toDispose.push(colShape);\r\n this.setBodyPressure(impostor, 0);\r\n if (impostor.type === PhysicsImpostor.SoftbodyImpostor) {\r\n this.setBodyPressure(impostor, impostor.getParam(\"pressure\"));\r\n }\r\n this.setBodyStiffness(impostor, impostor.getParam(\"stiffness\"));\r\n this.setBodyVelocityIterations(impostor, impostor.getParam(\"velocityIterations\"));\r\n this.setBodyPositionIterations(impostor, impostor.getParam(\"positionIterations\"));\r\n } else {\r\n const localInertia = new this.bjsAMMO.btVector3(0, 0, 0);\r\n const startTransform = new this.bjsAMMO.btTransform();\r\n impostor.object.computeWorldMatrix(true);\r\n startTransform.setIdentity();\r\n if (mass !== 0) {\r\n colShape.calculateLocalInertia(mass, localInertia);\r\n }\r\n this._tmpAmmoVectorA.setValue(impostor.object.position.x, impostor.object.position.y, impostor.object.position.z);\r\n this._tmpAmmoQuaternion.setValue(\r\n impostor.object.rotationQuaternion!.x,\r\n impostor.object.rotationQuaternion!.y,\r\n impostor.object.rotationQuaternion!.z,\r\n impostor.object.rotationQuaternion!.w\r\n );\r\n startTransform.setOrigin(this._tmpAmmoVectorA);\r\n startTransform.setRotation(this._tmpAmmoQuaternion);\r\n const myMotionState = new this.bjsAMMO.btDefaultMotionState(startTransform);\r\n const rbInfo = new this.bjsAMMO.btRigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia);\r\n const body = new this.bjsAMMO.btRigidBody(rbInfo);\r\n\r\n // Make objects kinematic if it's mass is 0\r\n if (mass === 0) {\r\n body.setCollisionFlags(body.getCollisionFlags() | AmmoJSPlugin._KINEMATIC_FLAG);\r\n body.setActivationState(AmmoJSPlugin._DISABLE_DEACTIVATION_FLAG);\r\n }\r\n\r\n // Disable collision if NoImpostor, but keep collision if shape is btCompoundShape\r\n if (impostor.type == PhysicsImpostor.NoImpostor && !colShape.getChildShape) {\r\n body.setCollisionFlags(body.getCollisionFlags() | AmmoJSPlugin._DISABLE_COLLISION_FLAG);\r\n }\r\n\r\n // compute delta position: compensate the difference between shape center and mesh origin\r\n if (impostor.type !== PhysicsImpostor.MeshImpostor && impostor.type !== PhysicsImpostor.NoImpostor) {\r\n const boundingInfo = impostor.object.getBoundingInfo();\r\n this._tmpVec3.copyFrom(impostor.object.getAbsolutePosition());\r\n this._tmpVec3.subtractInPlace(boundingInfo.boundingBox.centerWorld);\r\n this._tmpVec3.x /= impostor.object.scaling.x;\r\n this._tmpVec3.y /= impostor.object.scaling.y;\r\n this._tmpVec3.z /= impostor.object.scaling.z;\r\n impostor.setDeltaPosition(this._tmpVec3);\r\n }\r\n\r\n const group = impostor.getParam(\"group\");\r\n const mask = impostor.getParam(\"mask\");\r\n if (group && mask) {\r\n this.world.addRigidBody(body, group, mask);\r\n } else {\r\n this.world.addRigidBody(body);\r\n }\r\n impostor.physicsBody = body;\r\n impostor._pluginData.toDispose = impostor._pluginData.toDispose.concat([body, rbInfo, myMotionState, startTransform, localInertia, colShape]);\r\n }\r\n this.setBodyRestitution(impostor, impostor.getParam(\"restitution\"));\r\n this.setBodyFriction(impostor, impostor.getParam(\"friction\"));\r\n }\r\n }\r\n\r\n /**\r\n * Removes the physics body from the imposter and disposes of the body's memory\r\n * @param impostor imposter to remove the physics body from\r\n */\r\n public removePhysicsBody(impostor: PhysicsImpostor) {\r\n if (this.world) {\r\n if (impostor.soft) {\r\n this.world.removeSoftBody(impostor.physicsBody);\r\n } else {\r\n this.world.removeRigidBody(impostor.physicsBody);\r\n }\r\n\r\n if (impostor._pluginData) {\r\n for (const d of impostor._pluginData.toDispose) {\r\n this.bjsAMMO.destroy(d);\r\n }\r\n impostor._pluginData.toDispose = [];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generates a joint\r\n * @param impostorJoint the imposter joint to create the joint with\r\n */\r\n public generateJoint(impostorJoint: PhysicsImpostorJoint) {\r\n const mainBody = impostorJoint.mainImpostor.physicsBody;\r\n const connectedBody = impostorJoint.connectedImpostor.physicsBody;\r\n if (!mainBody || !connectedBody) {\r\n return;\r\n }\r\n\r\n // if the joint is already created, don't create it again for preventing memory leaks\r\n if (impostorJoint.joint.physicsJoint) {\r\n return;\r\n }\r\n\r\n const jointData = impostorJoint.joint.jointData;\r\n if (!jointData.mainPivot) {\r\n jointData.mainPivot = new Vector3(0, 0, 0);\r\n }\r\n if (!jointData.connectedPivot) {\r\n jointData.connectedPivot = new Vector3(0, 0, 0);\r\n }\r\n\r\n let joint: any;\r\n switch (impostorJoint.joint.type) {\r\n case PhysicsJoint.DistanceJoint: {\r\n const distance = (<DistanceJointData>jointData).maxDistance;\r\n if (distance) {\r\n jointData.mainPivot = new Vector3(0, -distance / 2, 0);\r\n jointData.connectedPivot = new Vector3(0, distance / 2, 0);\r\n }\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n case PhysicsJoint.HingeJoint: {\r\n if (!jointData.mainAxis) {\r\n jointData.mainAxis = new Vector3(0, 0, 0);\r\n }\r\n if (!jointData.connectedAxis) {\r\n jointData.connectedAxis = new Vector3(0, 0, 0);\r\n }\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n const mainAxis = this._tmpAmmoVectorC;\r\n mainAxis.setValue(jointData.mainAxis.x, jointData.mainAxis.y, jointData.mainAxis.z);\r\n\r\n const connectedAxis = this._tmpAmmoVectorD;\r\n connectedAxis.setValue(jointData.connectedAxis.x, jointData.connectedAxis.y, jointData.connectedAxis.z);\r\n\r\n joint = new this.bjsAMMO.btHingeConstraint(mainBody, connectedBody, mainPivot, connectedPivot, mainAxis, connectedAxis);\r\n break;\r\n }\r\n case PhysicsJoint.BallAndSocketJoint: {\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n default: {\r\n Logger.Warn(\"JointType not currently supported by the Ammo plugin, falling back to PhysicsJoint.BallAndSocketJoint\");\r\n\r\n const mainPivot = this._tmpAmmoVectorA;\r\n mainPivot.setValue(jointData.mainPivot.x, jointData.mainPivot.y, jointData.mainPivot.z);\r\n\r\n const connectedPivot = this._tmpAmmoVectorB;\r\n connectedPivot.setValue(jointData.connectedPivot.x, jointData.connectedPivot.y, jointData.connectedPivot.z);\r\n\r\n joint = new this.bjsAMMO.btPoint2PointConstraint(mainBody, connectedBody, mainPivot, connectedPivot);\r\n break;\r\n }\r\n }\r\n this.world.addConstraint(joint, !impostorJoint.joint.jointData.collision);\r\n impostorJoint.joint.physicsJoint = joint;\r\n }\r\n\r\n /**\r\n * Removes a joint\r\n * @param impostorJoint the imposter joint to remove the joint from\r\n */\r\n public removeJoint(impostorJoint: PhysicsImpostorJoint) {\r\n if (this.world) {\r\n this.world.removeConstraint(impostorJoint.joint.physicsJoint);\r\n }\r\n this.bjsAMMO.destroy(impostorJoint.joint.physicsJoint);\r\n }\r\n\r\n // adds all verticies (including child verticies) to the triangle mesh\r\n private _addMeshVerts(btTriangleMesh: any, topLevelObject: IPhysicsEnabledObject, object: IPhysicsEnabledObject) {\r\n let triangleCount = 0;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n\r\n let localMatrix;\r\n\r\n if (topLevelObject && topLevelObject !== object) {\r\n // top level matrix used for shape transform doesn't take scale into account.\r\n // Moreover, every children vertex position must be in that space.\r\n // So, each vertex position here is transform by (mesh world matrix * toplevelMatrix -1)\r\n let topLevelQuaternion;\r\n if (topLevelObject.rotationQuaternion) {\r\n topLevelQuaternion = topLevelObject.rotationQuaternion;\r\n } else if (topLevelObject.rotation) {\r\n topLevelQuaternion = Quaternion.FromEulerAngles(topLevelObject.rotation.x, topLevelObject.rotation.y, topLevelObject.rotation.z);\r\n } else {\r\n topLevelQuaternion = Quaternion.Identity();\r\n }\r\n const topLevelMatrix = Matrix.Compose(Vector3.One(), topLevelQuaternion, topLevelObject.position);\r\n topLevelMatrix.invertToRef(this._tmpMatrix);\r\n const wm = object.computeWorldMatrix(false);\r\n localMatrix = wm.multiply(this._tmpMatrix);\r\n } else {\r\n // current top level is same as object level -> only use local scaling\r\n Matrix.ScalingToRef(object.scaling.x, object.scaling.y, object.scaling.z, this._tmpMatrix);\r\n localMatrix = this._tmpMatrix;\r\n }\r\n const faceCount = indices.length / 3;\r\n for (let i = 0; i < faceCount; i++) {\r\n const triPoints = [];\r\n for (let point = 0; point < 3; point++) {\r\n let v = new Vector3(\r\n vertexPositions[indices[i * 3 + point] * 3 + 0],\r\n vertexPositions[indices[i * 3 + point] * 3 + 1],\r\n vertexPositions[indices[i * 3 + point] * 3 + 2]\r\n );\r\n\r\n v = Vector3.TransformCoordinates(v, localMatrix);\r\n\r\n let vec: any;\r\n if (point == 0) {\r\n vec = this._tmpAmmoVectorA;\r\n } else if (point == 1) {\r\n vec = this._tmpAmmoVectorB;\r\n } else {\r\n vec = this._tmpAmmoVectorC;\r\n }\r\n vec.setValue(v.x, v.y, v.z);\r\n\r\n triPoints.push(vec);\r\n }\r\n btTriangleMesh.addTriangle(triPoints[0], triPoints[1], triPoints[2]);\r\n triangleCount++;\r\n }\r\n\r\n const childMeshes = object.getChildMeshes();\r\n for (const m of childMeshes) {\r\n triangleCount += this._addMeshVerts(btTriangleMesh, topLevelObject, m);\r\n }\r\n }\r\n return triangleCount;\r\n }\r\n\r\n /**\r\n * Initialise the soft body vertices to match its object's (mesh) vertices\r\n * Softbody vertices (nodes) are in world space and to match this\r\n * The object's position and rotation is set to zero and so its vertices are also then set in world space\r\n * @param impostor to create the softbody for\r\n * @returns the number of vertices added to the softbody\r\n */\r\n private _softVertexData(impostor: PhysicsImpostor): VertexData {\r\n const object = impostor.object;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n let vertexNormals = object.getVerticesData(VertexBuffer.NormalKind);\r\n if (!vertexNormals) {\r\n vertexNormals = [];\r\n }\r\n object.computeWorldMatrix(false);\r\n const newPoints = [];\r\n const newNorms = [];\r\n for (let i = 0; i < vertexPositions.length; i += 3) {\r\n let v = new Vector3(vertexPositions[i], vertexPositions[i + 1], vertexPositions[i + 2]);\r\n let n = new Vector3(vertexNormals[i], vertexNormals[i + 1], vertexNormals[i + 2]);\r\n v = Vector3.TransformCoordinates(v, object.getWorldMatrix());\r\n n = Vector3.TransformNormal(n, object.getWorldMatrix());\r\n newPoints.push(v.x, v.y, v.z);\r\n newNorms.push(n.x, n.y, n.z);\r\n }\r\n\r\n const vertex_data = new VertexData();\r\n\r\n vertex_data.positions = newPoints;\r\n vertex_data.normals = newNorms;\r\n vertex_data.uvs = object.getVerticesData(VertexBuffer.UVKind);\r\n vertex_data.colors = object.getVerticesData(VertexBuffer.ColorKind);\r\n if (object && object.getIndices) {\r\n vertex_data.indices = object.getIndices();\r\n }\r\n\r\n vertex_data.applyToMesh(<Mesh>object);\r\n\r\n object.position = Vector3.Zero();\r\n object.rotationQuaternion = null;\r\n object.rotation = Vector3.Zero();\r\n object.computeWorldMatrix(true);\r\n\r\n return vertex_data;\r\n }\r\n return VertexData.ExtractFromMesh(<Mesh>object);\r\n }\r\n\r\n /**\r\n * Create an impostor's soft body\r\n * @param impostor to create the softbody for\r\n * @returns the softbody\r\n */\r\n private _createSoftbody(impostor: PhysicsImpostor) {\r\n const object = impostor.object;\r\n if (object && object.getIndices) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n const triPoints = [];\r\n const triNorms = [];\r\n for (let i = 0; i < vertexPositions.length; i += 3) {\r\n const v = new Vector3(vertexPositions[i], vertexPositions[i + 1], vertexPositions[i + 2]);\r\n const n = new Vector3(vertexNormals[i], vertexNormals[i + 1], vertexNormals[i + 2]);\r\n triPoints.push(v.x, v.y, -v.z);\r\n triNorms.push(n.x, n.y, -n.z);\r\n }\r\n const softBody = new this.bjsAMMO.btSoftBodyHelpers().CreateFromTriMesh(this.world.getWorldInfo(), triPoints, object.getIndices(), indices.length / 3, true);\r\n\r\n const nbVertices = vertexPositions.length / 3;\r\n const bodyVertices = softBody.get_m_nodes();\r\n let node: any;\r\n let nodeNormals: any;\r\n for (let i = 0; i < nbVertices; i++) {\r\n node = bodyVertices.at(i);\r\n nodeNormals = node.get_m_n();\r\n nodeNormals.setX(triNorms[3 * i]);\r\n nodeNormals.setY(triNorms[3 * i + 1]);\r\n nodeNormals.setZ(triNorms[3 * i + 2]);\r\n }\r\n return softBody;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create cloth for an impostor\r\n * @param impostor to create the softbody for\r\n * @returns the cloth\r\n */\r\n private _createCloth(impostor: PhysicsImpostor) {\r\n const object = impostor.object;\r\n if (object && object.getIndices) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n const len = vertexPositions.length;\r\n const segments = Math.sqrt(len / 3);\r\n impostor.segments = segments;\r\n const segs = segments - 1;\r\n this._tmpAmmoVectorA.setValue(vertexPositions[0], vertexPositions[1], vertexPositions[2]);\r\n this._tmpAmmoVectorB.setValue(vertexPositions[3 * segs], vertexPositions[3 * segs + 1], vertexPositions[3 * segs + 2]);\r\n this._tmpAmmoVectorD.setValue(vertexPositions[len - 3], vertexPositions[len - 2], vertexPositions[len - 1]);\r\n this._tmpAmmoVectorC.setValue(vertexPositions[len - 3 - 3 * segs], vertexPositions[len - 2 - 3 * segs], vertexPositions[len - 1 - 3 * segs]);\r\n\r\n const clothBody = new this.bjsAMMO.btSoftBodyHelpers().CreatePatch(\r\n this.world.getWorldInfo(),\r\n this._tmpAmmoVectorA,\r\n this._tmpAmmoVectorB,\r\n this._tmpAmmoVectorC,\r\n this._tmpAmmoVectorD,\r\n segments,\r\n segments,\r\n impostor.getParam(\"fixedPoints\"),\r\n true\r\n );\r\n return clothBody;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create rope for an impostor\r\n * @param impostor to create the softbody for\r\n * @returns the rope\r\n */\r\n private _createRope(impostor: PhysicsImpostor) {\r\n let len: number;\r\n let segments: number;\r\n const vertex_data = this._softVertexData(impostor);\r\n const vertexPositions = vertex_data.positions;\r\n const vertexNormals = vertex_data.normals;\r\n\r\n if (vertexPositions === null || vertexNormals === null) {\r\n return new this.bjsAMMO.btCompoundShape();\r\n }\r\n\r\n //force the mesh to be updatable\r\n vertex_data.applyToMesh(<Mesh>impostor.object, true);\r\n\r\n impostor._isFromLine = true;\r\n\r\n // If in lines mesh all normals will be zero\r\n const vertexSquared: Array<number> = <Array<number>>vertexNormals.map((x: number) => x * x);\r\n const reducer = (accumulator: number, currentValue: number): number => accumulator + currentValue;\r\n const reduced: number = vertexSquared.reduce(reducer);\r\n\r\n if (reduced === 0) {\r\n // line mesh\r\n len = vertexPositions.length;\r\n segments = len / 3 - 1;\r\n this._tmpAmmoVectorA.setValue(vertexPositions[0], vertexPositions[1], vertexPositions[2]);\r\n this._tmpAmmoVectorB.setValue(vertexPositions[len - 3], vertexPositions[len - 2], vertexPositions[len - 1]);\r\n } else {\r\n //extruded mesh\r\n impostor._isFromLine = false;\r\n const pathVectors = impostor.getParam(\"path\");\r\n const shape = impostor.getParam(\"shape\");\r\n if (shape === null) {\r\n Logger.Warn(\"No shape available for extruded mesh\");\r\n return new this.bjsAMMO.btCompoundShape();\r\n }\r\n len = pathVectors.length;\r\n segments = len - 1;\r\n this._tmpAmmoVectorA.setValue(pathVectors[0].x, pathVectors[0].y, pathVectors[0].z);\r\n this._tmpAmmoVectorB.setValue(pathVectors[len - 1].x, pathVectors[len - 1].y, pathVectors[len - 1].z);\r\n }\r\n\r\n impostor.segments = segments;\r\n\r\n let fixedPoints = impostor.getParam(\"fixedPoints\");\r\n fixedPoints = fixedPoints > 3 ? 3 : fixedPoints;\r\n\r\n const ropeBody = new this.bjsAMMO.btSoftBodyHelpers().CreateRope(this.world.getWorldInfo(), this._tmpAmmoVectorA, this._tmpAmmoVectorB, segments - 1, fixedPoints);\r\n ropeBody.get_m_cfg().set_collisions(0x11);\r\n return ropeBody;\r\n }\r\n\r\n /**\r\n * Create a custom physics impostor shape using the plugin's onCreateCustomShape handler\r\n * @param impostor to create the custom physics shape for\r\n * @returns the custom physics shape\r\n */\r\n private _createCustom(impostor: PhysicsImpostor): any {\r\n let returnValue: any = null;\r\n if (this.onCreateCustomShape) {\r\n returnValue = this.onCreateCustomShape(impostor);\r\n }\r\n if (returnValue == null) {\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n }\r\n return returnValue;\r\n }\r\n\r\n // adds all verticies (including child verticies) to the convex hull shape\r\n private _addHullVerts(btConvexHullShape: any, topLevelObject: IPhysicsEnabledObject, object: IPhysicsEnabledObject) {\r\n let triangleCount = 0;\r\n if (object && object.getIndices && object.getWorldMatrix && object.getChildMeshes) {\r\n let indices = object.getIndices();\r\n if (!indices) {\r\n indices = [];\r\n }\r\n let vertexPositions = object.getVerticesData(VertexBuffer.PositionKind);\r\n if (!vertexPositions) {\r\n vertexPositions = [];\r\n }\r\n object.computeWorldMatrix(false);\r\n const faceCount = indices.length / 3;\r\n for (let i = 0; i < faceCount; i++) {\r\n const triPoints = [];\r\n for (let point = 0; point < 3; point++) {\r\n let v = new Vector3(\r\n vertexPositions[indices[i * 3 + point] * 3 + 0],\r\n vertexPositions[indices[i * 3 + point] * 3 + 1],\r\n vertexPositions[indices[i * 3 + point] * 3 + 2]\r\n );\r\n\r\n // Adjust for initial scaling\r\n Matrix.ScalingToRef(object.scaling.x, object.scaling.y, object.scaling.z, this._tmpMatrix);\r\n v = Vector3.TransformCoordinates(v, this._tmpMatrix);\r\n\r\n let vec: any;\r\n if (point == 0) {\r\n vec = this._tmpAmmoVectorA;\r\n } else if (point == 1) {\r\n vec = this._tmpAmmoVectorB;\r\n } else {\r\n vec = this._tmpAmmoVectorC;\r\n }\r\n vec.setValue(v.x, v.y, v.z);\r\n\r\n triPoints.push(vec);\r\n }\r\n btConvexHullShape.addPoint(triPoints[0], true);\r\n btConvexHullShape.addPoint(triPoints[1], true);\r\n btConvexHullShape.addPoint(triPoints[2], true);\r\n triangleCount++;\r\n }\r\n\r\n const childMeshes = object.getChildMeshes();\r\n for (const m of childMeshes) {\r\n triangleCount += this._addHullVerts(btConvexHullShape, topLevelObject, m);\r\n }\r\n }\r\n return triangleCount;\r\n }\r\n\r\n private _createShape(impostor: PhysicsImpostor, ignoreChildren = false) {\r\n const object = impostor.object;\r\n\r\n let returnValue: any;\r\n const impostorExtents = impostor.getObjectExtents();\r\n\r\n if (!ignoreChildren) {\r\n const meshChildren = impostor.object.getChildMeshes ? impostor.object.getChildMeshes(true) : [];\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n\r\n // Add shape of all children to the compound shape\r\n let childrenAdded = 0;\r\n for (const childMesh of meshChildren) {\r\n const childImpostor = childMesh.getPhysicsImpostor();\r\n if (childImpostor) {\r\n if (childImpostor.type == PhysicsImpostor.MeshImpostor) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"A child MeshImpostor is not supported. Only primitive impostors are supported as children (eg. box or sphere)\";\r\n }\r\n const shape = this._createShape(childImpostor);\r\n\r\n // Position needs to be scaled based on parent's scaling\r\n const parentMat = childMesh.parent!.getWorldMatrix().clone();\r\n const s = new Vector3();\r\n parentMat.decompose(s);\r\n this._tmpAmmoTransform.getOrigin().setValue(childMesh.position.x * s.x, childMesh.position.y * s.y, childMesh.position.z * s.z);\r\n\r\n this._tmpAmmoQuaternion.setValue(\r\n childMesh.rotationQuaternion!.x,\r\n childMesh.rotationQuaternion!.y,\r\n childMesh.rotationQuaternion!.z,\r\n childMesh.rotationQuaternion!.w\r\n );\r\n this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);\r\n returnValue.addChildShape(this._tmpAmmoTransform, shape);\r\n childImpostor.dispose();\r\n childrenAdded++;\r\n }\r\n }\r\n\r\n if (childrenAdded > 0) {\r\n // Add parents shape as a child if present\r\n if (impostor.type != PhysicsImpostor.NoImpostor) {\r\n const shape = this._createShape(impostor, true);\r\n if (shape) {\r\n this._tmpAmmoTransform.getOrigin().setValue(0, 0, 0);\r\n this._tmpAmmoQuaternion.setValue(0, 0, 0, 1);\r\n this._tmpAmmoTransform.setRotation(this._tmpAmmoQuaternion);\r\n\r\n returnValue.addChildShape(this._tmpAmmoTransform, shape);\r\n }\r\n }\r\n return returnValue;\r\n } else {\r\n // If no children with impostors create the actual shape below instead\r\n this.bjsAMMO.destroy(returnValue);\r\n returnValue = null;\r\n }\r\n }\r\n\r\n switch (impostor.type) {\r\n case PhysicsImpostor.SphereImpostor:\r\n // Is there a better way to compare floats number? With an epsilon or with a Math function\r\n if (WithinEpsilon(impostorExtents.x, impostorExtents.y, 0.0001) && WithinEpsilon(impostorExtents.x, impostorExtents.z, 0.0001)) {\r\n returnValue = new this.bjsAMMO.btSphereShape(impostorExtents.x / 2);\r\n } else {\r\n // create a btMultiSphereShape because it's not possible to set a local scaling on a btSphereShape\r\n this._tmpAmmoVectorA.setValue(0, 0, 0);\r\n const positions = [this._tmpAmmoVectorA];\r\n const radii = [1];\r\n returnValue = new this.bjsAMMO.btMultiSphereShape(positions, radii, 1);\r\n\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue.setLocalScaling(this._tmpAmmoVectorA);\r\n }\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n {\r\n // https://pybullet.org/Bullet/BulletFull/classbtCapsuleShape.html#details\r\n // Height is just the height between the center of each 'sphere' of the capsule caps\r\n const capRadius = impostorExtents.x / 2;\r\n returnValue = new this.bjsAMMO.btCapsuleShape(capRadius, impostorExtents.y - capRadius * 2);\r\n }\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue = new this.bjsAMMO.btCylinderShape(this._tmpAmmoVectorA);\r\n break;\r\n case PhysicsImpostor.PlaneImpostor:\r\n case PhysicsImpostor.BoxImpostor:\r\n this._tmpAmmoVectorA.setValue(impostorExtents.x / 2, impostorExtents.y / 2, impostorExtents.z / 2);\r\n returnValue = new this.bjsAMMO.btBoxShape(this._tmpAmmoVectorA);\r\n break;\r\n case PhysicsImpostor.MeshImpostor: {\r\n if (impostor.getParam(\"mass\") == 0) {\r\n // Only create btBvhTriangleMeshShape if the impostor is static\r\n // See https://pybullet.org/Bullet/phpBB3/viewtopic.php?t=7283\r\n if (this.onCreateCustomMeshImpostor) {\r\n returnValue = this.onCreateCustomMeshImpostor(impostor);\r\n } else {\r\n const triMesh = new this.bjsAMMO.btTriangleMesh();\r\n impostor._pluginData.toDispose.push(triMesh);\r\n const triangleCount = this._addMeshVerts(triMesh, object, object);\r\n if (triangleCount == 0) {\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n returnValue = new this.bjsAMMO.btBvhTriangleMeshShape(triMesh);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n // Otherwise create convexHullImpostor\r\n // eslint-disable-next-line no-fallthrough\r\n case PhysicsImpostor.ConvexHullImpostor: {\r\n if (this.onCreateCustomConvexHullImpostor) {\r\n returnValue = this.onCreateCustomConvexHullImpostor(impostor);\r\n } else {\r\n const convexHull = new this.bjsAMMO.btConvexHullShape();\r\n const triangleCount = this._addHullVerts(convexHull, object, object);\r\n if (triangleCount == 0) {\r\n // Cleanup Unused Convex Hull Shape\r\n impostor._pluginData.toDispose.push(convexHull);\r\n returnValue = new this.bjsAMMO.btCompoundShape();\r\n } else {\r\n returnValue = convexHull;\r\n }\r\n }\r\n break;\r\n }\r\n case PhysicsImpostor.NoImpostor:\r\n // Fill with sphere but collision is disabled on the rigid body in generatePhysicsBody, using an empty shape caused unexpected movement with joints\r\n returnValue = new this.bjsAMMO.btSphereShape(impostorExtents.x / 2);\r\n break;\r\n case PhysicsImpostor.CustomImpostor:\r\n // Only usable when the plugin's onCreateCustomShape is set\r\n returnValue = this._createCustom(impostor);\r\n break;\r\n case PhysicsImpostor.SoftbodyImpostor:\r\n // Only usable with a mesh that has sufficient and shared vertices\r\n returnValue = this._createSoftbody(impostor);\r\n break;\r\n case PhysicsImpostor.ClothImpostor:\r\n // Only usable with a ground mesh that has sufficient and shared vertices\r\n returnValue = this._createCloth(impostor);\r\n break;\r\n case PhysicsImpostor.RopeImpostor:\r\n // Only usable with a line mesh or an extruded mesh that is updatable\r\n returnValue = this._createRope(impostor);\r\n break;\r\n default:\r\n Logger.Warn(\"The impostor type is not currently supported by the ammo plugin.\");\r\n break;\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n /**\r\n * Sets the mesh body position/rotation from the babylon impostor\r\n * @param impostor imposter containing the physics body and babylon object\r\n */\r\n public setTransformationFromPhysicsBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.getMotionState().getWorldTransform(this._tmpAmmoTransform);\r\n impostor.object.position.set(this._tmpAmmoTransform.getOrigin().x(), this._tmpAmmoTransform.getOrigin().y(), this._tmpAmmoTransform.getOrigin().z());\r\n\r\n if (!impostor.object.rotationQuaternion) {\r\n if (impostor.object.rotation) {\r\n this._tmpQuaternion.set(\r\n this._tmpAmmoTransform.getRotation().x(),\r\n this._tmpAmmoTransform.getRotation().y(),\r\n this._tmpAmmoTransform.getRotation().z(),\r\n this._tmpAmmoTransform.getRotation().w()\r\n );\r\n this._tmpQuaternion.toEulerAnglesToRef(impostor.object.rotation);\r\n }\r\n } else {\r\n impostor.object.rotationQuaternion.set(\r\n this._tmpAmmoTransform.getRotation().x(),\r\n this._tmpAmmoTransform.getRotation().y(),\r\n this._tmpAmmoTransform.getRotation().z(),\r\n this._tmpAmmoTransform.getRotation().w()\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Sets the babylon object's position/rotation from the physics body's position/rotation\r\n * @param impostor imposter containing the physics body and babylon object\r\n * @param newPosition new position\r\n * @param newRotation new rotation\r\n */\r\n public setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion) {\r\n const trans = impostor.physicsBody.getWorldTransform();\r\n\r\n // If rotation/position has changed update and activate rigged body\r\n if (\r\n Math.abs(trans.getOrigin().x() - newPosition.x) > Epsilon ||\r\n Math.abs(trans.getOrigin().y() - newPosition.y) > Epsilon ||\r\n Math.abs(trans.getOrigin().z() - newPosition.z) > Epsilon ||\r\n Math.abs(trans.getRotation().x() - newRotation.x) > Epsilon ||\r\n Math.abs(trans.getRotation().y() - newRotation.y) > Epsilon ||\r\n Math.abs(trans.getRotation().z() - newRotation.z) > Epsilon ||\r\n Math.abs(trans.getRotation().w() - newRotation.w) > Epsilon\r\n ) {\r\n this._tmpAmmoVectorA.setValue(newPosition.x, newPosition.y, newPosition.z);\r\n trans.setOrigin(this._tmpAmmoVectorA);\r\n\r\n this._tmpAmmoQuaternion.setValue(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\r\n trans.setRotation(this._tmpAmmoQuaternion);\r\n impostor.physicsBody.setWorldTransform(trans);\r\n\r\n if (impostor.mass == 0) {\r\n // Kinematic objects must be updated using motion state\r\n const motionState = impostor.physicsBody.getMotionState();\r\n if (motionState) {\r\n motionState.setWorldTransform(trans);\r\n }\r\n } else {\r\n impostor.physicsBody.activate();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * If this plugin is supported\r\n * @returns true if its supported\r\n */\r\n public isSupported(): boolean {\r\n return this.bjsAMMO !== undefined;\r\n }\r\n\r\n /**\r\n * Sets the linear velocity of the physics body\r\n * @param impostor imposter to set the velocity on\r\n * @param velocity velocity to set\r\n */\r\n public setLinearVelocity(impostor: PhysicsImpostor, velocity: Vector3) {\r\n this._tmpAmmoVectorA.setValue(velocity.x, velocity.y, velocity.z);\r\n if (impostor.soft) {\r\n impostor.physicsBody.linearVelocity(this._tmpAmmoVectorA);\r\n } else {\r\n impostor.physicsBody.setLinearVelocity(this._tmpAmmoVectorA);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the angular velocity of the physics body\r\n * @param impostor imposter to set the velocity on\r\n * @param velocity velocity to set\r\n */\r\n public setAngularVelocity(impostor: PhysicsImpostor, velocity: Vector3) {\r\n this._tmpAmmoVectorA.setValue(velocity.x, velocity.y, velocity.z);\r\n if (impostor.soft) {\r\n impostor.physicsBody.angularVelocity(this._tmpAmmoVectorA);\r\n } else {\r\n impostor.physicsBody.setAngularVelocity(this._tmpAmmoVectorA);\r\n }\r\n }\r\n\r\n /**\r\n * gets the linear velocity\r\n * @param impostor imposter to get linear velocity from\r\n * @returns linear velocity\r\n */\r\n public getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3> {\r\n let v: any;\r\n if (impostor.soft) {\r\n v = impostor.physicsBody.linearVelocity();\r\n } else {\r\n v = impostor.physicsBody.getLinearVelocity();\r\n }\r\n if (!v) {\r\n return null;\r\n }\r\n const result = new Vector3(v.x(), v.y(), v.z());\r\n this.bjsAMMO.destroy(v);\r\n return result;\r\n }\r\n\r\n /**\r\n * gets the angular velocity\r\n * @param impostor imposter to get angular velocity from\r\n * @returns angular velocity\r\n */\r\n public getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3> {\r\n let v: any;\r\n if (impostor.soft) {\r\n v = impostor.physicsBody.angularVelocity();\r\n } else {\r\n v = impostor.physicsBody.getAngularVelocity();\r\n }\r\n if (!v) {\r\n return null;\r\n }\r\n const result = new Vector3(v.x(), v.y(), v.z());\r\n this.bjsAMMO.destroy(v);\r\n return result;\r\n }\r\n\r\n /**\r\n * Sets the mass of physics body\r\n * @param impostor imposter to set the mass on\r\n * @param mass mass to set\r\n */\r\n public setBodyMass(impostor: PhysicsImpostor, mass: number) {\r\n if (impostor.soft) {\r\n impostor.physicsBody.setTotalMass(mass, false);\r\n } else {\r\n impostor.physicsBody.setMassProps(mass);\r\n }\r\n impostor._pluginData.mass = mass;\r\n }\r\n\r\n /**\r\n * Gets the mass of the physics body\r\n * @param impostor imposter to get the mass from\r\n * @returns mass\r\n */\r\n public getBodyMass(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.mass || 0;\r\n }\r\n\r\n /**\r\n * Gets friction of the impostor\r\n * @param impostor impostor to get friction from\r\n * @returns friction value\r\n */\r\n public getBodyFriction(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.friction || 0;\r\n }\r\n\r\n /**\r\n * Sets friction of the impostor\r\n * @param impostor impostor to set friction on\r\n * @param friction friction value\r\n */\r\n public setBodyFriction(impostor: PhysicsImpostor, friction: number) {\r\n if (impostor.soft) {\r\n impostor.physicsBody.get_m_cfg().set_kDF(friction);\r\n } else {\r\n impostor.physicsBody.setFriction(friction);\r\n }\r\n impostor._pluginData.friction = friction;\r\n }\r\n\r\n /**\r\n * Gets restitution of the impostor\r\n * @param impostor impostor to get restitution from\r\n * @returns restitution value\r\n */\r\n public getBodyRestitution(impostor: PhysicsImpostor): number {\r\n return impostor._pluginData.restitution || 0;\r\n }\r\n\r\n /**\r\n * Sets restitution of the impostor\r\n * @param impostor impostor to set resitution on\r\n * @param restitution resitution value\r\n */\r\n public setBodyRestitution(impostor: PhysicsImpostor, restitution: number) {\r\n impostor.physicsBody.setRestitution(restitution);\r\n impostor._pluginData.restitution = restitution;\r\n }\r\n\r\n /**\r\n * Gets pressure inside the impostor\r\n * @param impostor impostor to get pressure from\r\n * @returns pressure value\r\n */\r\n public getBodyPressure(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Pressure is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.pressure || 0;\r\n }\r\n\r\n /**\r\n * Sets pressure inside a soft body impostor\r\n * Cloth and rope must remain 0 pressure\r\n * @param impostor impostor to set pressure on\r\n * @param pressure pressure value\r\n */\r\n public setBodyPressure(impostor: PhysicsImpostor, pressure: number) {\r\n if (impostor.soft) {\r\n if (impostor.type === PhysicsImpostor.SoftbodyImpostor) {\r\n impostor.physicsBody.get_m_cfg().set_kPR(pressure);\r\n impostor._pluginData.pressure = pressure;\r\n } else {\r\n impostor.physicsBody.get_m_cfg().set_kPR(0);\r\n impostor._pluginData.pressure = 0;\r\n }\r\n } else {\r\n Logger.Warn(\"Pressure can only be applied to a softbody\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets stiffness of the impostor\r\n * @param impostor impostor to get stiffness from\r\n * @returns pressure value\r\n */\r\n public getBodyStiffness(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Stiffness is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.stiffness || 0;\r\n }\r\n\r\n /**\r\n * Sets stiffness of the impostor\r\n * @param impostor impostor to set stiffness on\r\n * @param stiffness stiffness value from 0 to 1\r\n */\r\n public setBodyStiffness(impostor: PhysicsImpostor, stiffness: number) {\r\n if (impostor.soft) {\r\n stiffness = stiffness < 0 ? 0 : stiffness;\r\n stiffness = stiffness > 1 ? 1 : stiffness;\r\n impostor.physicsBody.get_m_materials().at(0).set_m_kLST(stiffness);\r\n impostor._pluginData.stiffness = stiffness;\r\n } else {\r\n Logger.Warn(\"Stiffness cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets velocityIterations of the impostor\r\n * @param impostor impostor to get velocity iterations from\r\n * @returns velocityIterations value\r\n */\r\n public getBodyVelocityIterations(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Velocity iterations is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.velocityIterations || 0;\r\n }\r\n\r\n /**\r\n * Sets velocityIterations of the impostor\r\n * @param impostor impostor to set velocity iterations on\r\n * @param velocityIterations velocityIterations value\r\n */\r\n public setBodyVelocityIterations(impostor: PhysicsImpostor, velocityIterations: number) {\r\n if (impostor.soft) {\r\n velocityIterations = velocityIterations < 0 ? 0 : velocityIterations;\r\n impostor.physicsBody.get_m_cfg().set_viterations(velocityIterations);\r\n impostor._pluginData.velocityIterations = velocityIterations;\r\n } else {\r\n Logger.Warn(\"Velocity iterations cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Gets positionIterations of the impostor\r\n * @param impostor impostor to get position iterations from\r\n * @returns positionIterations value\r\n */\r\n public getBodyPositionIterations(impostor: PhysicsImpostor): number {\r\n if (!impostor.soft) {\r\n Logger.Warn(\"Position iterations is not a property of a rigid body\");\r\n return 0;\r\n }\r\n return impostor._pluginData.positionIterations || 0;\r\n }\r\n\r\n /**\r\n * Sets positionIterations of the impostor\r\n * @param impostor impostor to set position on\r\n * @param positionIterations positionIterations value\r\n */\r\n public setBodyPositionIterations(impostor: PhysicsImpostor, positionIterations: number) {\r\n if (impostor.soft) {\r\n positionIterations = positionIterations < 0 ? 0 : positionIterations;\r\n impostor.physicsBody.get_m_cfg().set_piterations(positionIterations);\r\n impostor._pluginData.positionIterations = positionIterations;\r\n } else {\r\n Logger.Warn(\"Position iterations cannot be applied to a rigid body\");\r\n }\r\n }\r\n\r\n /**\r\n * Append an anchor to a cloth object\r\n * @param impostor is the cloth impostor to add anchor to\r\n * @param otherImpostor is the rigid impostor to anchor to\r\n * @param width ratio across width from 0 to 1\r\n * @param height ratio up height from 0 to 1\r\n * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n */\r\n public appendAnchor(\r\n impostor: PhysicsImpostor,\r\n otherImpostor: PhysicsImpostor,\r\n width: number,\r\n height: number,\r\n influence: number = 1,\r\n noCollisionBetweenLinkedBodies: boolean = false\r\n ) {\r\n const segs = impostor.segments;\r\n const nbAcross = Math.round((segs - 1) * width);\r\n const nbUp = Math.round((segs - 1) * height);\r\n const nbDown = segs - 1 - nbUp;\r\n const node = nbAcross + segs * nbDown;\r\n impostor.physicsBody.appendAnchor(node, otherImpostor.physicsBody, noCollisionBetweenLinkedBodies, influence);\r\n }\r\n\r\n /**\r\n * Append an hook to a rope object\r\n * @param impostor is the rope impostor to add hook to\r\n * @param otherImpostor is the rigid impostor to hook to\r\n * @param length ratio along the rope from 0 to 1\r\n * @param influence the elasticity between soft impostor and anchor from 0, very stretchy to 1, little stretch\r\n * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false\r\n */\r\n public appendHook(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, length: number, influence: number = 1, noCollisionBetweenLinkedBodies: boolean = false) {\r\n const node = Math.round(impostor.segments * length);\r\n impostor.physicsBody.appendAnchor(node, otherImpostor.physicsBody, noCollisionBetweenLinkedBodies, influence);\r\n }\r\n\r\n /**\r\n * Sleeps the physics body and stops it from being active\r\n * @param impostor impostor to sleep\r\n */\r\n public sleepBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.forceActivationState(0);\r\n }\r\n\r\n /**\r\n * Activates the physics body\r\n * @param impostor impostor to activate\r\n */\r\n public wakeUpBody(impostor: PhysicsImpostor) {\r\n impostor.physicsBody.activate();\r\n }\r\n\r\n /**\r\n * Updates the distance parameters of the joint\r\n */\r\n public updateDistanceJoint() {\r\n Logger.Warn(\"updateDistanceJoint is not currently supported by the Ammo physics plugin\");\r\n }\r\n\r\n /**\r\n * Sets a motor on the joint\r\n * @param joint joint to set motor on\r\n * @param speed speed of the motor\r\n * @param maxForce maximum force of the motor\r\n */\r\n public setMotor(joint: IMotorEnabledJoint, speed?: number, maxForce?: number) {\r\n joint.physicsJoint.enableAngularMotor(true, speed, maxForce);\r\n }\r\n\r\n /**\r\n * Sets the motors limit\r\n */\r\n public setLimit() {\r\n Logger.Warn(\"setLimit is not currently supported by the Ammo physics plugin\");\r\n }\r\n\r\n /**\r\n * Syncs the position and rotation of a mesh with the impostor\r\n * @param mesh mesh to sync\r\n * @param impostor impostor to update the mesh with\r\n */\r\n public syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor) {\r\n const body = impostor.physicsBody;\r\n\r\n body.getMotionState().getWorldTransform(this._tmpAmmoTransform);\r\n\r\n mesh.position.x = this._tmpAmmoTransform.getOrigin().x();\r\n mesh.position.y = this._tmpAmmoTransform.getOrigin().y();\r\n mesh.position.z = this._tmpAmmoTransform.getOrigin().z();\r\n\r\n if (mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion.x = this._tmpAmmoTransform.getRotation().x();\r\n mesh.rotationQuaternion.y = this._tmpAmmoTransform.getRotation().y();\r\n mesh.rotationQuaternion.z = this._tmpAmmoTransform.getRotation().z();\r\n mesh.rotationQuaternion.w = this._tmpAmmoTransform.getRotation().w();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the radius of the impostor\r\n * @param impostor impostor to get radius from\r\n * @returns the radius\r\n */\r\n public getRadius(impostor: PhysicsImpostor): number {\r\n const extents = impostor.getObjectExtents();\r\n return extents.x / 2;\r\n }\r\n\r\n /**\r\n * Gets the box size of the impostor\r\n * @param impostor impostor to get box size from\r\n * @param result the resulting box size\r\n */\r\n public getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void {\r\n const extents = impostor.getObjectExtents();\r\n result.x = extents.x;\r\n result.y = extents.y;\r\n result.z = extents.z;\r\n }\r\n\r\n /**\r\n * Disposes of the impostor\r\n */\r\n public dispose() {\r\n // Dispose of world\r\n this.bjsAMMO.destroy(this.world);\r\n this.bjsAMMO.destroy(this._softBodySolver);\r\n this.bjsAMMO.destroy(this._solver);\r\n this.bjsAMMO.destroy(this._overlappingPairCache);\r\n this.bjsAMMO.destroy(this._dispatcher);\r\n this.bjsAMMO.destroy(this._collisionConfiguration);\r\n\r\n // Dispose of temp variables\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorA);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorB);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorC);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorD);\r\n this.bjsAMMO.destroy(this._tmpAmmoTransform);\r\n this.bjsAMMO.destroy(this._tmpAmmoQuaternion);\r\n this.bjsAMMO.destroy(this._tmpAmmoConcreteContactResultCallback);\r\n\r\n this.world = null;\r\n }\r\n\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from where should the ray start?\r\n * @param to where should the ray end?\r\n * @returns PhysicsRaycastResult\r\n */\r\n public raycast(from: Vector3, to: Vector3): PhysicsRaycastResult {\r\n this.raycastToRef(from, to, this._raycastResult);\r\n return this._raycastResult;\r\n }\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from when should the ray start?\r\n * @param to when should the ray end?\r\n * @param result resulting PhysicsRaycastResult\r\n */\r\n public raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void {\r\n this._tmpAmmoVectorRCA = new this.bjsAMMO.btVector3(from.x, from.y, from.z);\r\n this._tmpAmmoVectorRCB = new this.bjsAMMO.btVector3(to.x, to.y, to.z);\r\n\r\n const rayCallback = new this.bjsAMMO.ClosestRayResultCallback(this._tmpAmmoVectorRCA, this._tmpAmmoVectorRCB);\r\n this.world.rayTest(this._tmpAmmoVectorRCA, this._tmpAmmoVectorRCB, rayCallback);\r\n\r\n result.reset(from, to);\r\n if (rayCallback.hasHit()) {\r\n // TODO: do we want/need the body? If so, set all the data\r\n /*\r\n var rigidBody = this.bjsAMMO.btRigidBody.prototype.upcast(\r\n rayCallback.get_m_collisionObject()\r\n );\r\n var body = {};\r\n */\r\n result.setHitData(\r\n {\r\n x: rayCallback.get_m_hitNormalWorld().x(),\r\n y: rayCallback.get_m_hitNormalWorld().y(),\r\n z: rayCallback.get_m_hitNormalWorld().z(),\r\n },\r\n {\r\n x: rayCallback.get_m_hitPointWorld().x(),\r\n y: rayCallback.get_m_hitPointWorld().y(),\r\n z: rayCallback.get_m_hitPointWorld().z(),\r\n }\r\n );\r\n result.calculateHitDistance();\r\n }\r\n this.bjsAMMO.destroy(rayCallback);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorRCA);\r\n this.bjsAMMO.destroy(this._tmpAmmoVectorRCB);\r\n }\r\n}\r\n"]}