@babylonjs/core 5.0.0-alpha.60 → 5.0.0-alpha.61

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 (332) hide show
  1. package/Animations/animation.d.ts +20 -0
  2. package/Animations/animation.js +57 -8
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animationKey.d.ts +4 -0
  5. package/Animations/animationKey.js +4 -0
  6. package/Animations/animationKey.js.map +1 -1
  7. package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +130 -0
  8. package/BakedVertexAnimation/bakedVertexAnimationManager.js +134 -0
  9. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -0
  10. package/BakedVertexAnimation/index.d.ts +2 -0
  11. package/BakedVertexAnimation/index.js +3 -0
  12. package/BakedVertexAnimation/index.js.map +1 -0
  13. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +65 -0
  14. package/BakedVertexAnimation/vertexAnimationBaker.js +155 -0
  15. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -0
  16. package/Behaviors/Cameras/framingBehavior.d.ts +5 -0
  17. package/Behaviors/Cameras/framingBehavior.js +8 -1
  18. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  19. package/Bones/bone.d.ts +3 -1
  20. package/Bones/bone.js +4 -1
  21. package/Bones/bone.js.map +1 -1
  22. package/Cameras/Inputs/BaseCameraPointersInput.js +4 -6
  23. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  24. package/Cameras/Inputs/flyCameraMouseInput.js +4 -4
  25. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  26. package/Cameras/Inputs/freeCameraMouseInput.js +4 -4
  27. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  28. package/Cameras/camera.js +7 -1
  29. package/Cameras/camera.js.map +1 -1
  30. package/Cameras/targetCamera.js +1 -1
  31. package/Cameras/targetCamera.js.map +1 -1
  32. package/Culling/boundingBox.d.ts +4 -0
  33. package/Culling/boundingBox.js +8 -0
  34. package/Culling/boundingBox.js.map +1 -1
  35. package/Debug/physicsViewer.js +1 -1
  36. package/Debug/physicsViewer.js.map +1 -1
  37. package/Debug/skeletonViewer.js +2 -2
  38. package/Debug/skeletonViewer.js.map +1 -1
  39. package/DeviceInput/Implementations/nativeDeviceInputWrapper.d.ts +6 -1
  40. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js +16 -1
  41. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js.map +1 -1
  42. package/DeviceInput/Implementations/webDeviceInputSystem.js +1 -1
  43. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  44. package/DeviceInput/deviceInputSystem.js +6 -1
  45. package/DeviceInput/deviceInputSystem.js.map +1 -1
  46. package/Engines/Extensions/engine.multiview.js +17 -6
  47. package/Engines/Extensions/engine.multiview.js.map +1 -1
  48. package/Engines/WebGPU/Extensions/engine.query.js +19 -3
  49. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  50. package/Engines/WebGPU/webgpuBundleList.d.ts +13 -0
  51. package/Engines/WebGPU/webgpuBundleList.js +27 -0
  52. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  53. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +4 -0
  54. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  55. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +6 -0
  56. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +6 -0
  57. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  58. package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +27 -0
  59. package/Engines/WebGPU/webgpuSnapshotRendering.js +107 -0
  60. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -0
  61. package/Engines/WebGPU/webgpuTextureHelper.d.ts +2 -2
  62. package/Engines/WebGPU/webgpuTextureHelper.js +41 -18
  63. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  64. package/Engines/constants.d.ts +2 -0
  65. package/Engines/constants.js +2 -0
  66. package/Engines/constants.js.map +1 -1
  67. package/Engines/engine.d.ts +12 -1
  68. package/Engines/engine.js +33 -0
  69. package/Engines/engine.js.map +1 -1
  70. package/Engines/engineFeatures.d.ts +2 -0
  71. package/Engines/engineFeatures.js.map +1 -1
  72. package/Engines/index.d.ts +1 -0
  73. package/Engines/index.js +1 -0
  74. package/Engines/index.js.map +1 -1
  75. package/Engines/nativeEngine.js +1 -0
  76. package/Engines/nativeEngine.js.map +1 -1
  77. package/Engines/nullEngine.js +1 -0
  78. package/Engines/nullEngine.js.map +1 -1
  79. package/Engines/thinEngine.d.ts +0 -11
  80. package/Engines/thinEngine.js +12 -40
  81. package/Engines/thinEngine.js.map +1 -1
  82. package/Engines/webgpuEngine.d.ts +6 -6
  83. package/Engines/webgpuEngine.js +26 -67
  84. package/Engines/webgpuEngine.js.map +1 -1
  85. package/Helpers/sceneHelpers.d.ts +3 -3
  86. package/Helpers/sceneHelpers.js +1 -2
  87. package/Helpers/sceneHelpers.js.map +1 -1
  88. package/Inputs/scene.inputManager.js +12 -14
  89. package/Inputs/scene.inputManager.js.map +1 -1
  90. package/Layers/effectLayer.d.ts +13 -1
  91. package/Layers/effectLayer.js +115 -65
  92. package/Layers/effectLayer.js.map +1 -1
  93. package/Layers/highlightLayer.d.ts +2 -1
  94. package/Layers/highlightLayer.js +6 -3
  95. package/Layers/highlightLayer.js.map +1 -1
  96. package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -0
  97. package/Lights/Shadows/cascadedShadowGenerator.js +14 -0
  98. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  99. package/Lights/Shadows/shadowGenerator.d.ts +4 -0
  100. package/Lights/Shadows/shadowGenerator.js +31 -3
  101. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  102. package/Lights/light.js +7 -1
  103. package/Lights/light.js.map +1 -1
  104. package/Loading/Plugins/babylonFileLoader.js +17 -4
  105. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  106. package/Materials/Background/backgroundMaterial.js +1 -0
  107. package/Materials/Background/backgroundMaterial.js.map +1 -1
  108. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +10 -0
  109. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +31 -0
  110. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  111. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  112. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  113. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  114. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.d.ts +41 -0
  115. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +130 -0
  116. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -0
  117. package/Materials/Node/Blocks/Input/inputBlock.js +1 -1
  118. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  119. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.d.ts +1 -0
  120. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +15 -0
  121. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  122. package/Materials/Node/Blocks/index.d.ts +1 -0
  123. package/Materials/Node/Blocks/index.js +1 -0
  124. package/Materials/Node/Blocks/index.js.map +1 -1
  125. package/Materials/Node/Blocks/vectorMergerBlock.js +4 -4
  126. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  127. package/Materials/Node/Blocks/voronoiNoiseBlock.d.ts +39 -0
  128. package/Materials/Node/Blocks/voronoiNoiseBlock.js +107 -0
  129. package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -0
  130. package/Materials/Node/Blocks/worleyNoise3DBlock.d.ts +8 -0
  131. package/Materials/Node/Blocks/worleyNoise3DBlock.js +34 -2
  132. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  133. package/Materials/Node/nodeMaterial.d.ts +1 -0
  134. package/Materials/Node/nodeMaterial.js +2 -0
  135. package/Materials/Node/nodeMaterial.js.map +1 -1
  136. package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -0
  137. package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
  138. package/Materials/PBR/pbrBaseMaterial.d.ts +2 -0
  139. package/Materials/PBR/pbrBaseMaterial.js +11 -4
  140. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  141. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +11 -0
  142. package/Materials/PBR/pbrSubSurfaceConfiguration.js +18 -3
  143. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  144. package/Materials/Textures/hdrCubeTexture.d.ts +9 -0
  145. package/Materials/Textures/hdrCubeTexture.js +21 -5
  146. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  147. package/Materials/Textures/mirrorTexture.d.ts +2 -0
  148. package/Materials/Textures/mirrorTexture.js +13 -0
  149. package/Materials/Textures/mirrorTexture.js.map +1 -1
  150. package/Materials/imageProcessingConfiguration.d.ts +16 -1
  151. package/Materials/imageProcessingConfiguration.js +31 -0
  152. package/Materials/imageProcessingConfiguration.js.map +1 -1
  153. package/Materials/materialHelper.d.ts +15 -1
  154. package/Materials/materialHelper.js +40 -3
  155. package/Materials/materialHelper.js.map +1 -1
  156. package/Materials/pushMaterial.d.ts +2 -2
  157. package/Materials/pushMaterial.js +7 -3
  158. package/Materials/pushMaterial.js.map +1 -1
  159. package/Materials/shaderMaterial.d.ts +6 -5
  160. package/Materials/shaderMaterial.js +58 -28
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Materials/shadowDepthWrapper.js +7 -7
  163. package/Materials/shadowDepthWrapper.js.map +1 -1
  164. package/Materials/standardMaterial.d.ts +2 -0
  165. package/Materials/standardMaterial.js +11 -1
  166. package/Materials/standardMaterial.js.map +1 -1
  167. package/Materials/uniformBuffer.js +1 -2
  168. package/Materials/uniformBuffer.js.map +1 -1
  169. package/Maths/math.color.d.ts +20 -0
  170. package/Maths/math.color.js +45 -2
  171. package/Maths/math.color.js.map +1 -1
  172. package/Maths/math.vector.d.ts +2 -1
  173. package/Maths/math.vector.js +14 -3
  174. package/Maths/math.vector.js.map +1 -1
  175. package/Meshes/Builders/boxBuilder.d.ts +1 -1
  176. package/Meshes/Builders/boxBuilder.js +1 -0
  177. package/Meshes/Builders/boxBuilder.js.map +1 -1
  178. package/Meshes/Builders/cylinderBuilder.d.ts +17 -17
  179. package/Meshes/Builders/cylinderBuilder.js +1 -0
  180. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  181. package/Meshes/Builders/discBuilder.d.ts +1 -1
  182. package/Meshes/Builders/discBuilder.js +1 -0
  183. package/Meshes/Builders/discBuilder.js.map +1 -1
  184. package/Meshes/Builders/groundBuilder.d.ts +8 -8
  185. package/Meshes/Builders/groundBuilder.js +2 -0
  186. package/Meshes/Builders/groundBuilder.js.map +1 -1
  187. package/Meshes/Builders/hemisphereBuilder.d.ts +4 -4
  188. package/Meshes/Builders/hemisphereBuilder.js +1 -0
  189. package/Meshes/Builders/hemisphereBuilder.js.map +1 -1
  190. package/Meshes/Builders/icoSphereBuilder.d.ts +1 -1
  191. package/Meshes/Builders/icoSphereBuilder.js +1 -0
  192. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  193. package/Meshes/Builders/planeBuilder.d.ts +1 -1
  194. package/Meshes/Builders/planeBuilder.js +1 -0
  195. package/Meshes/Builders/planeBuilder.js.map +1 -1
  196. package/Meshes/Builders/polyhedronBuilder.d.ts +1 -1
  197. package/Meshes/Builders/polyhedronBuilder.js +1 -0
  198. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  199. package/Meshes/Builders/sphereBuilder.d.ts +1 -1
  200. package/Meshes/Builders/sphereBuilder.js +1 -0
  201. package/Meshes/Builders/sphereBuilder.js.map +1 -1
  202. package/Meshes/Builders/torusBuilder.d.ts +8 -8
  203. package/Meshes/Builders/torusBuilder.js +1 -0
  204. package/Meshes/Builders/torusBuilder.js.map +1 -1
  205. package/Meshes/Builders/torusKnotBuilder.d.ts +11 -11
  206. package/Meshes/Builders/torusKnotBuilder.js +1 -0
  207. package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
  208. package/Meshes/abstractMesh.d.ts +22 -2
  209. package/Meshes/abstractMesh.js +55 -6
  210. package/Meshes/abstractMesh.js.map +1 -1
  211. package/Meshes/geometry.d.ts +3 -0
  212. package/Meshes/geometry.js +13 -5
  213. package/Meshes/geometry.js.map +1 -1
  214. package/Meshes/linesMesh.d.ts +0 -2
  215. package/Meshes/linesMesh.js +3 -35
  216. package/Meshes/linesMesh.js.map +1 -1
  217. package/Meshes/mesh.js +4 -4
  218. package/Meshes/mesh.js.map +1 -1
  219. package/Meshes/thinInstanceMesh.js +6 -5
  220. package/Meshes/thinInstanceMesh.js.map +1 -1
  221. package/Meshes/transformNode.d.ts +8 -8
  222. package/Meshes/transformNode.js +25 -17
  223. package/Meshes/transformNode.js.map +1 -1
  224. package/Misc/basis.d.ts +2 -2
  225. package/Misc/basis.js +19 -4
  226. package/Misc/basis.js.map +1 -1
  227. package/Misc/sceneSerializer.js +0 -3
  228. package/Misc/sceneSerializer.js.map +1 -1
  229. package/Misc/tools.d.ts +2 -4
  230. package/Misc/tools.js +6 -10
  231. package/Misc/tools.js.map +1 -1
  232. package/Particles/particleSystem.js +19 -16
  233. package/Particles/particleSystem.js.map +1 -1
  234. package/Particles/solidParticleSystem.js +29 -5
  235. package/Particles/solidParticleSystem.js.map +1 -1
  236. package/Physics/Plugins/ammoJSPlugin.js +10 -8
  237. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  238. package/PostProcesses/imageProcessingPostProcess.js +1 -0
  239. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  240. package/Probes/reflectionProbe.d.ts +2 -0
  241. package/Probes/reflectionProbe.js +21 -0
  242. package/Probes/reflectionProbe.js.map +1 -1
  243. package/Rendering/boundingBoxRenderer.d.ts +3 -0
  244. package/Rendering/boundingBoxRenderer.js +49 -14
  245. package/Rendering/boundingBoxRenderer.js.map +1 -1
  246. package/Rendering/depthRenderer.d.ts +1 -1
  247. package/Rendering/depthRenderer.js +2 -2
  248. package/Rendering/depthRenderer.js.map +1 -1
  249. package/Rendering/edgesRenderer.js +3 -1
  250. package/Rendering/edgesRenderer.js.map +1 -1
  251. package/Rendering/geometryBufferRenderer.d.ts +0 -2
  252. package/Rendering/geometryBufferRenderer.js +13 -10
  253. package/Rendering/geometryBufferRenderer.js.map +1 -1
  254. package/Shaders/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
  255. package/Shaders/ShadersInclude/bakedVertexAnimation.js +7 -0
  256. package/Shaders/ShadersInclude/bakedVertexAnimation.js.map +1 -0
  257. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
  258. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
  259. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
  260. package/Shaders/ShadersInclude/bonesDeclaration.js +1 -1
  261. package/Shaders/ShadersInclude/bonesDeclaration.js.map +1 -1
  262. package/Shaders/ShadersInclude/bonesVertex.js +1 -1
  263. package/Shaders/ShadersInclude/bonesVertex.js.map +1 -1
  264. package/Shaders/ShadersInclude/pbrBlockImageProcessing.js +1 -1
  265. package/Shaders/ShadersInclude/pbrBlockImageProcessing.js.map +1 -1
  266. package/Shaders/background.fragment.js +1 -1
  267. package/Shaders/background.fragment.js.map +1 -1
  268. package/Shaders/background.vertex.d.ts +2 -0
  269. package/Shaders/background.vertex.js +3 -1
  270. package/Shaders/background.vertex.js.map +1 -1
  271. package/Shaders/color.vertex.d.ts +2 -0
  272. package/Shaders/color.vertex.js +3 -1
  273. package/Shaders/color.vertex.js.map +1 -1
  274. package/Shaders/default.vertex.d.ts +2 -0
  275. package/Shaders/default.vertex.js +3 -1
  276. package/Shaders/default.vertex.js.map +1 -1
  277. package/Shaders/depth.vertex.d.ts +2 -0
  278. package/Shaders/depth.vertex.js +3 -1
  279. package/Shaders/depth.vertex.js.map +1 -1
  280. package/Shaders/geometry.vertex.d.ts +2 -0
  281. package/Shaders/geometry.vertex.js +3 -1
  282. package/Shaders/geometry.vertex.js.map +1 -1
  283. package/Shaders/glowMapGeneration.vertex.d.ts +2 -0
  284. package/Shaders/glowMapGeneration.vertex.js +3 -1
  285. package/Shaders/glowMapGeneration.vertex.js.map +1 -1
  286. package/Shaders/outline.vertex.d.ts +2 -0
  287. package/Shaders/outline.vertex.js +3 -1
  288. package/Shaders/outline.vertex.js.map +1 -1
  289. package/Shaders/pbr.vertex.d.ts +2 -0
  290. package/Shaders/pbr.vertex.js +3 -1
  291. package/Shaders/pbr.vertex.js.map +1 -1
  292. package/Shaders/shadowMap.vertex.d.ts +2 -0
  293. package/Shaders/shadowMap.vertex.js +3 -1
  294. package/Shaders/shadowMap.vertex.js.map +1 -1
  295. package/Shaders/volumetricLightScatteringPass.vertex.d.ts +2 -0
  296. package/Shaders/volumetricLightScatteringPass.vertex.js +3 -1
  297. package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
  298. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
  299. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js +7 -0
  300. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js.map +1 -0
  301. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
  302. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
  303. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
  304. package/ShadersWGSL/ShadersInclude/bonesDeclaration.js +1 -1
  305. package/ShadersWGSL/ShadersInclude/bonesDeclaration.js.map +1 -1
  306. package/ShadersWGSL/ShadersInclude/bonesVertex.js +1 -1
  307. package/ShadersWGSL/ShadersInclude/bonesVertex.js.map +1 -1
  308. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.d.ts +5 -0
  309. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js +7 -0
  310. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js.map +1 -0
  311. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.d.ts +5 -0
  312. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js +7 -0
  313. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js.map +1 -0
  314. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.d.ts +5 -0
  315. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js +7 -0
  316. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js.map +1 -0
  317. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.d.ts +5 -0
  318. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js +7 -0
  319. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js.map +1 -0
  320. package/XR/features/WebXRNearInteraction.d.ts +1 -0
  321. package/XR/features/WebXRNearInteraction.js +2 -0
  322. package/XR/features/WebXRNearInteraction.js.map +1 -1
  323. package/index.d.ts +1 -0
  324. package/index.js +1 -0
  325. package/index.js.map +1 -1
  326. package/node.d.ts +30 -1
  327. package/node.js +12 -0
  328. package/node.js.map +1 -1
  329. package/package.json +43 -1
  330. package/scene.d.ts +10 -0
  331. package/scene.js +27 -0
  332. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"boundingBox.js","sourceRoot":"","sources":["../../../sourceES6/core/Culling/boundingBox.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepImmutable, Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from '../Maths/math.constants';\r\nimport { Plane } from '../Maths/math.plane';\r\n\r\ndeclare type DrawWrapper = import(\"../Materials/drawWrapper\").DrawWrapper;\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in local space\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in world space\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable<Matrix>;\r\n private static readonly TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _tag: number;\r\n\r\n /** @hidden */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @hidden */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox.TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable<Matrix> {\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @hidden */\r\n public _update(world: DeepImmutable<Matrix>): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n }\r\n else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable<Vector3>): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n const pointX = point.x, pointY = point.y, pointZ = point.z;\r\n var delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x, myMinY = myMin.y, myMinZ = myMin.z, myMaxX = myMax.x, myMaxY = myMax.y, myMaxZ = myMax.z;\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable<BoundingBox>, box1: DeepImmutable<BoundingBox>): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable<Vector3>, maxPoint: DeepImmutable<Vector3>, sphereCenter: DeepImmutable<Vector3>, sphereRadius: number): boolean {\r\n const vector = BoundingBox.TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n var num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return (num <= (sphereRadius * sphereRadius));\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @return true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (var p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (var i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @return true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (var p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (var i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"boundingBox.js","sourceRoot":"","sources":["../../../sourceES6/core/Culling/boundingBox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAKlD;;GAEG;AACH;IA2DI;;;;;OAKG;IACH,qBAAY,GAA2B,EAAE,GAA2B,EAAE,WAAmC;QAhEzG;;WAEG;QACa,YAAO,GAAc,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E;;WAEG;QACa,WAAM,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACjD;;WAEG;QACa,gBAAW,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACtD;;WAEG;QACa,eAAU,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACrD;;WAEG;QACa,oBAAe,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1D;;WAEG;QACa,eAAU,GAAc,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E;;WAEG;QACa,iBAAY,GAAc,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACjF;;WAEG;QACa,iBAAY,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACvD;;WAEG;QACa,iBAAY,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QACvD;;WAEG;QACa,YAAO,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD;;WAEG;QACa,YAAO,GAAY,OAAO,CAAC,IAAI,EAAE,CAAC;QAUlD,cAAc;QACP,sBAAiB,GAA0B,IAAI,CAAC;QACvD,cAAc;QACP,qBAAgB,GAA0B,IAAI,CAAC;QASlD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU;IAEV;;;;;OAKG;IACI,iCAAW,GAAlB,UAAmB,GAA2B,EAAE,GAA2B,EAAE,WAAmC;QAC5G,IAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACzF,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE5C,MAAM;QACN,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACjD,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE1D,IAAI,CAAC,YAAY,GAAG,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACI,2BAAK,GAAZ,UAAa,MAAc;QACvB,IAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;QAC1C,IAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAM,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC;QAC9B,IAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAEpD,IAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,oCAAc,GAArB;QACI,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,cAAc;IACP,6BAAO,GAAd,UAAe,KAA4B;QACvC,IAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QACnC,IAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QACnC,IAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE;YACrB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAEnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE;gBACpC,IAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC9B,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5D,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC5B,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;aAC/B;YAED,SAAS;YACT,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACzE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SACnE;aACI;YACD,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE;gBACpC,YAAY,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;aAChD;YAED,SAAS;YACT,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1C;QAED,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,iCAAW,GAAlB,UAAmB,aAA0C;QACzD,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACI,2CAAqB,GAA5B,UAA6B,aAA0C;QACnE,OAAO,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACI,qCAAe,GAAtB,UAAuB,KAA6B;QAChD,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACzF,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAC3D,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC;QAErB,IAAI,IAAI,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE;YAChD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE;YAChD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE;YAChD,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,sCAAgB,GAAvB,UAAwB,MAAqC;QACzD,OAAO,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACtH,CAAC;IAED;;;;;OAKG;IACI,sCAAgB,GAAvB,UAAwB,GAA2B,EAAE,GAA2B;QAC5E,IAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QACjH,IAAM,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACzF,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,EAAE;YAChC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,EAAE;YAChC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,EAAE;YAChC,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,6BAAO,GAAd;;QACI,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,CAAC;QAClC,MAAA,IAAI,CAAC,gBAAgB,0CAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,UAAU;IAEV;;;;;OAKG;IACW,sBAAU,GAAxB,UAAyB,IAAgC,EAAE,IAAgC;QACvF,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;OAOG;IACW,4BAAgB,GAA9B,UAA+B,QAAgC,EAAE,QAAgC,EAAE,YAAoC,EAAE,YAAoB;QACzJ,IAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACW,iCAAqB,GAAnC,UAAoC,eAA8C,EAAE,aAA0C;QAC1H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YACxB,IAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBACxB,IAAI,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBACpD,OAAO,KAAK,CAAC;iBAChB;aACJ;SACJ;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACW,uBAAW,GAAzB,UAA0B,eAA8C,EAAE,aAA0C;QAChH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YACxB,IAAI,cAAc,GAAG,IAAI,CAAC;YAC1B,IAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBACxB,IAAI,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;oBACrD,cAAc,GAAG,KAAK,CAAC;oBACvB,MAAM;iBACT;aACJ;YACD,IAAI,cAAc,EAAE;gBAChB,OAAO,KAAK,CAAC;aAChB;SACJ;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAvRuB,sBAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAwRhF,kBAAC;CAAA,AAvUD,IAuUC;SAvUY,WAAW","sourcesContent":["import { DeepImmutable, Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { BoundingSphere } from \"../Culling/boundingSphere\";\r\n\r\nimport { ICullable } from \"./boundingInfo\";\r\nimport { Epsilon } from '../Maths/math.constants';\r\nimport { Plane } from '../Maths/math.plane';\r\n\r\ndeclare type DrawWrapper = import(\"../Materials/drawWrapper\").DrawWrapper;\r\n\r\n/**\r\n * Class used to store bounding box information\r\n */\r\nexport class BoundingBox implements ICullable {\r\n /**\r\n * Gets the 8 vectors representing the bounding box in local space\r\n */\r\n public readonly vectors: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the center of the bounding box in local space\r\n */\r\n public readonly center: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the center of the bounding box in world space\r\n */\r\n public readonly centerWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in local space\r\n */\r\n public readonly extendSize: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the extend size in world space\r\n */\r\n public readonly extendSizeWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the OBB (object bounding box) directions\r\n */\r\n public readonly directions: Vector3[] = ArrayTools.BuildArray(3, Vector3.Zero);\r\n /**\r\n * Gets the 8 vectors representing the bounding box in world space\r\n */\r\n public readonly vectorsWorld: Vector3[] = ArrayTools.BuildArray(8, Vector3.Zero);\r\n /**\r\n * Gets the minimum vector in world space\r\n */\r\n public readonly minimumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in world space\r\n */\r\n public readonly maximumWorld: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the minimum vector in local space\r\n */\r\n public readonly minimum: Vector3 = Vector3.Zero();\r\n /**\r\n * Gets the maximum vector in local space\r\n */\r\n public readonly maximum: Vector3 = Vector3.Zero();\r\n\r\n private _worldMatrix: DeepImmutable<Matrix>;\r\n private static readonly TmpVector3 = ArrayTools.BuildArray(3, Vector3.Zero);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _tag: number;\r\n\r\n /** @hidden */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @hidden */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = null;\r\n\r\n /**\r\n * Creates a new bounding box\r\n * @param min defines the minimum vector (in local space)\r\n * @param max defines the maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n constructor(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n this.reConstruct(min, max, worldMatrix);\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Recreates the entire bounding box from scratch as if we call the constructor in place\r\n * @param min defines the new minimum vector (in local space)\r\n * @param max defines the new maximum vector (in local space)\r\n * @param worldMatrix defines the new world matrix\r\n */\r\n public reConstruct(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>) {\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n const vectors = this.vectors;\r\n\r\n this.minimum.copyFromFloats(minX, minY, minZ);\r\n this.maximum.copyFromFloats(maxX, maxY, maxZ);\r\n vectors[0].copyFromFloats(minX, minY, minZ);\r\n vectors[1].copyFromFloats(maxX, maxY, maxZ);\r\n vectors[2].copyFromFloats(maxX, minY, minZ);\r\n vectors[3].copyFromFloats(minX, maxY, minZ);\r\n vectors[4].copyFromFloats(minX, minY, maxZ);\r\n vectors[5].copyFromFloats(maxX, maxY, minZ);\r\n vectors[6].copyFromFloats(minX, maxY, maxZ);\r\n vectors[7].copyFromFloats(maxX, minY, maxZ);\r\n\r\n // OBB\r\n max.addToRef(min, this.center).scaleInPlace(0.5);\r\n max.subtractToRef(min, this.extendSize).scaleInPlace(0.5);\r\n\r\n this._worldMatrix = worldMatrix || Matrix.IdentityReadOnly;\r\n\r\n this._update(this._worldMatrix);\r\n }\r\n\r\n /**\r\n * Scale the current bounding box by applying a scale factor\r\n * @param factor defines the scale factor to apply\r\n * @returns the current bounding box\r\n */\r\n public scale(factor: number): BoundingBox {\r\n const tmpVectors = BoundingBox.TmpVector3;\r\n const diff = this.maximum.subtractToRef(this.minimum, tmpVectors[0]);\r\n const len = diff.length();\r\n diff.normalizeFromLength(len);\r\n const distance = len * factor;\r\n const newRadius = diff.scaleInPlace(distance * 0.5);\r\n\r\n const min = this.center.subtractToRef(newRadius, tmpVectors[1]);\r\n const max = this.center.addToRef(newRadius, tmpVectors[2]);\r\n\r\n this.reConstruct(min, max, this._worldMatrix);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the world matrix of the bounding box\r\n * @returns a matrix\r\n */\r\n public getWorldMatrix(): DeepImmutable<Matrix> {\r\n return this._worldMatrix;\r\n }\r\n\r\n /** @hidden */\r\n public _update(world: DeepImmutable<Matrix>): void {\r\n const minWorld = this.minimumWorld;\r\n const maxWorld = this.maximumWorld;\r\n const directions = this.directions;\r\n const vectorsWorld = this.vectorsWorld;\r\n const vectors = this.vectors;\r\n\r\n if (!world.isIdentity()) {\r\n minWorld.setAll(Number.MAX_VALUE);\r\n maxWorld.setAll(-Number.MAX_VALUE);\r\n\r\n for (let index = 0; index < 8; ++index) {\r\n const v = vectorsWorld[index];\r\n Vector3.TransformCoordinatesToRef(vectors[index], world, v);\r\n minWorld.minimizeInPlace(v);\r\n maxWorld.maximizeInPlace(v);\r\n }\r\n\r\n // Extend\r\n maxWorld.subtractToRef(minWorld, this.extendSizeWorld).scaleInPlace(0.5);\r\n maxWorld.addToRef(minWorld, this.centerWorld).scaleInPlace(0.5);\r\n }\r\n else {\r\n minWorld.copyFrom(this.minimum);\r\n maxWorld.copyFrom(this.maximum);\r\n for (let index = 0; index < 8; ++index) {\r\n vectorsWorld[index].copyFrom(vectors[index]);\r\n }\r\n\r\n // Extend\r\n this.extendSizeWorld.copyFrom(this.extendSize);\r\n this.centerWorld.copyFrom(this.center);\r\n }\r\n\r\n Vector3.FromArrayToRef(world.m, 0, directions[0]);\r\n Vector3.FromArrayToRef(world.m, 4, directions[1]);\r\n Vector3.FromArrayToRef(world.m, 8, directions[2]);\r\n\r\n this._worldMatrix = world;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is intersecting the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an intersection\r\n */\r\n public isInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box is entirely inside the frustum planes\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @returns true if there is an inclusion\r\n */\r\n public isCompletelyInFrustum(frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);\r\n }\r\n\r\n /**\r\n * Tests if a point is inside the bounding box\r\n * @param point defines the point to test\r\n * @returns true if the point is inside the bounding box\r\n */\r\n public intersectsPoint(point: DeepImmutable<Vector3>): boolean {\r\n const min = this.minimumWorld;\r\n const max = this.maximumWorld;\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n const pointX = point.x, pointY = point.y, pointZ = point.z;\r\n var delta = -Epsilon;\r\n\r\n if (maxX - pointX < delta || delta > pointX - minX) {\r\n return false;\r\n }\r\n\r\n if (maxY - pointY < delta || delta > pointY - minY) {\r\n return false;\r\n }\r\n\r\n if (maxZ - pointZ < delta || delta > pointZ - minZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a bounding sphere\r\n * @param sphere defines the sphere to test\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>): boolean {\r\n return BoundingBox.IntersectsSphere(this.minimumWorld, this.maximumWorld, sphere.centerWorld, sphere.radiusWorld);\r\n }\r\n\r\n /**\r\n * Tests if the bounding box intersects with a box defined by a min and max vectors\r\n * @param min defines the min vector to use\r\n * @param max defines the max vector to use\r\n * @returns true if there is an intersection\r\n */\r\n public intersectsMinMax(min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>): boolean {\r\n const myMin = this.minimumWorld;\r\n const myMax = this.maximumWorld;\r\n const myMinX = myMin.x, myMinY = myMin.y, myMinZ = myMin.z, myMaxX = myMax.x, myMaxY = myMax.y, myMaxZ = myMax.z;\r\n const minX = min.x, minY = min.y, minZ = min.z, maxX = max.x, maxY = max.y, maxZ = max.z;\r\n if (myMaxX < minX || myMinX > maxX) {\r\n return false;\r\n }\r\n\r\n if (myMaxY < minY || myMinY > maxY) {\r\n return false;\r\n }\r\n\r\n if (myMaxZ < minZ || myMinZ > maxZ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes the resources of the class\r\n */\r\n public dispose(): void {\r\n this._drawWrapperFront?.dispose();\r\n this._drawWrapperBack?.dispose();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Tests if two bounding boxes are intersections\r\n * @param box0 defines the first box to test\r\n * @param box1 defines the second box to test\r\n * @returns true if there is an intersection\r\n */\r\n public static Intersects(box0: DeepImmutable<BoundingBox>, box1: DeepImmutable<BoundingBox>): boolean {\r\n return box0.intersectsMinMax(box1.minimumWorld, box1.maximumWorld);\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defines by a min/max vectors intersects a sphere\r\n * @param minPoint defines the minimum vector of the bounding box\r\n * @param maxPoint defines the maximum vector of the bounding box\r\n * @param sphereCenter defines the sphere center\r\n * @param sphereRadius defines the sphere radius\r\n * @returns true if there is an intersection\r\n */\r\n public static IntersectsSphere(minPoint: DeepImmutable<Vector3>, maxPoint: DeepImmutable<Vector3>, sphereCenter: DeepImmutable<Vector3>, sphereRadius: number): boolean {\r\n const vector = BoundingBox.TmpVector3[0];\r\n Vector3.ClampToRef(sphereCenter, minPoint, maxPoint, vector);\r\n var num = Vector3.DistanceSquared(sphereCenter, vector);\r\n return (num <= (sphereRadius * sphereRadius));\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors is entirely inside frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @return true if there is an inclusion\r\n */\r\n public static IsCompletelyInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (var p = 0; p < 6; ++p) {\r\n const frustumPlane = frustumPlanes[p];\r\n for (var i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) < 0) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Tests if a bounding box defined with 8 vectors intersects frustum planes\r\n * @param boundingVectors defines an array of 8 vectors representing a bounding box\r\n * @param frustumPlanes defines the frustum planes to test\r\n * @return true if there is an intersection\r\n */\r\n public static IsInFrustum(boundingVectors: Array<DeepImmutable<Vector3>>, frustumPlanes: Array<DeepImmutable<Plane>>): boolean {\r\n for (var p = 0; p < 6; ++p) {\r\n let canReturnFalse = true;\r\n const frustumPlane = frustumPlanes[p];\r\n for (var i = 0; i < 8; ++i) {\r\n if (frustumPlane.dotCoordinate(boundingVectors[i]) >= 0) {\r\n canReturnFalse = false;\r\n break;\r\n }\r\n }\r\n if (canReturnFalse) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n}\r\n"]}
@@ -171,8 +171,8 @@ var PhysicsViewer = /** @class */ (function () {
171
171
  };
172
172
  PhysicsViewer.prototype._getDebugMeshMesh = function (mesh, scene) {
173
173
  var wireframeOver = new Mesh(mesh.name, scene, null, mesh);
174
- wireframeOver.position = Vector3.Zero();
175
174
  wireframeOver.setParent(mesh);
175
+ wireframeOver.position = Vector3.Zero();
176
176
  wireframeOver.material = this._getDebugMaterial(scene);
177
177
  this._debugMeshMeshes.push(wireframeOver);
178
178
  return wireframeOver;
@@ -1 +1 @@
1
- {"version":3,"file":"physicsViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/physicsViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from '../Maths/math.color';\r\nimport { Material } from \"../Materials/material\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { IPhysicsEnginePlugin } from \"../Physics/IPhysicsEngine\";\r\nimport { PhysicsImpostor } from \"../Physics/physicsImpostor\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { CreateCylinder } from '../Meshes/Builders/cylinderBuilder';\r\nimport { CreateCapsule, ICreateCapsuleOptions } from '../Meshes/Builders/capsuleBuilder';\r\n\r\n/**\r\n * Used to show the physics impostor around the specific mesh\r\n */\r\nexport class PhysicsViewer {\r\n\r\n /** @hidden */\r\n protected _impostors: Array<Nullable<PhysicsImpostor>> = [];\r\n /** @hidden */\r\n protected _meshes: Array<Nullable<AbstractMesh>> = [];\r\n /** @hidden */\r\n protected _scene: Nullable<Scene>;\r\n /** @hidden */\r\n protected _numMeshes = 0;\r\n /** @hidden */\r\n protected _physicsEnginePlugin: Nullable<IPhysicsEnginePlugin>;\r\n private _renderFunction: () => void;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _debugBoxMesh: Mesh;\r\n private _debugSphereMesh: Mesh;\r\n private _debugCapsuleMesh: Mesh;\r\n private _debugCylinderMesh: Mesh;\r\n private _debugMaterial: StandardMaterial;\r\n private _debugMeshMeshes = new Array<Mesh>();\r\n\r\n /**\r\n * Creates a new PhysicsViewer\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n let physicEngine = this._scene.getPhysicsEngine();\r\n\r\n if (physicEngine) {\r\n this._physicsEnginePlugin = physicEngine.getPhysicsPlugin();\r\n }\r\n\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n }\r\n\r\n /** @hidden */\r\n protected _updateDebugMeshes(): void {\r\n var plugin = this._physicsEnginePlugin;\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n let impostor = this._impostors[i];\r\n\r\n if (!impostor) {\r\n continue;\r\n }\r\n\r\n if (impostor.isDisposed) {\r\n this.hideImpostor(this._impostors[i--]);\r\n } else {\r\n if (impostor.type === PhysicsImpostor.MeshImpostor) {\r\n continue;\r\n }\r\n let mesh = this._meshes[i];\r\n\r\n if (mesh && plugin) {\r\n plugin.syncMeshWithImpostor(mesh, impostor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Renders a specified physic impostor\r\n * @param impostor defines the impostor to render\r\n * @param targetMesh defines the mesh represented by the impostor\r\n * @returns the new debug mesh used to render the impostor\r\n */\r\n public showImpostor(impostor: PhysicsImpostor, targetMesh?: Mesh): Nullable<AbstractMesh> {\r\n\r\n if (!this._scene) {\r\n return null;\r\n }\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n if (this._impostors[i] == impostor) {\r\n return null;\r\n }\r\n }\r\n\r\n var debugMesh = this._getDebugMesh(impostor, targetMesh);\r\n\r\n if (debugMesh) {\r\n this._impostors[this._numMeshes] = impostor;\r\n this._meshes[this._numMeshes] = debugMesh;\r\n\r\n if (this._numMeshes === 0) {\r\n this._renderFunction = this._updateDebugMeshes.bind(this);\r\n this._scene.registerBeforeRender(this._renderFunction);\r\n }\r\n\r\n this._numMeshes++;\r\n }\r\n\r\n return debugMesh;\r\n }\r\n\r\n /**\r\n * Hides a specified physic impostor\r\n * @param impostor defines the impostor to hide\r\n */\r\n public hideImpostor(impostor: Nullable<PhysicsImpostor>) {\r\n\r\n if (!impostor || !this._scene || !this._utilityLayer) {\r\n return;\r\n }\r\n\r\n var removed = false;\r\n const utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n if (this._impostors[i] == impostor) {\r\n let mesh = this._meshes[i];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n utilityLayerScene.removeMesh(mesh);\r\n mesh.dispose();\r\n\r\n let index = this._debugMeshMeshes.indexOf(mesh as Mesh);\r\n if (index > -1) {\r\n this._debugMeshMeshes.splice(index, 1);\r\n }\r\n\r\n this._numMeshes--;\r\n if (this._numMeshes > 0) {\r\n this._meshes[i] = this._meshes[this._numMeshes];\r\n this._impostors[i] = this._impostors[this._numMeshes];\r\n this._meshes[this._numMeshes] = null;\r\n this._impostors[this._numMeshes] = null;\r\n } else {\r\n this._meshes[0] = null;\r\n this._impostors[0] = null;\r\n }\r\n removed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (removed && this._numMeshes === 0) {\r\n this._scene.unregisterBeforeRender(this._renderFunction);\r\n }\r\n\r\n }\r\n\r\n private _getDebugMaterial(scene: Scene): Material {\r\n if (!this._debugMaterial) {\r\n this._debugMaterial = new StandardMaterial('', scene);\r\n this._debugMaterial.wireframe = true;\r\n this._debugMaterial.emissiveColor = Color3.White();\r\n this._debugMaterial.disableLighting = true;\r\n }\r\n\r\n return this._debugMaterial;\r\n }\r\n\r\n private _getDebugBoxMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugBoxMesh) {\r\n this._debugBoxMesh = CreateBox('physicsBodyBoxViewMesh', { size: 1 }, scene);\r\n this._debugBoxMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugBoxMesh.material = this._getDebugMaterial(scene);\r\n this._debugBoxMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugBoxMesh.createInstance('physicsBodyBoxViewInstance');\r\n }\r\n\r\n private _getDebugSphereMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugSphereMesh) {\r\n this._debugSphereMesh = CreateSphere('physicsBodySphereViewMesh', { diameter: 1 }, scene);\r\n this._debugSphereMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugSphereMesh.material = this._getDebugMaterial(scene);\r\n this._debugSphereMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugSphereMesh.createInstance('physicsBodySphereViewInstance');\r\n }\r\n\r\n private _getDebugCapsuleMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugCapsuleMesh) {\r\n this._debugCapsuleMesh = CreateCapsule('physicsBodyCapsuleViewMesh', { height: 1 } as ICreateCapsuleOptions, scene);\r\n this._debugCapsuleMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugCapsuleMesh.material = this._getDebugMaterial(scene);\r\n this._debugCapsuleMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugCapsuleMesh.createInstance('physicsBodyCapsuleViewInstance');\r\n }\r\n\r\n private _getDebugCylinderMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugCylinderMesh) {\r\n this._debugCylinderMesh = CreateCylinder('physicsBodyCylinderViewMesh', { diameterTop: 1, diameterBottom: 1, height: 1 }, scene);\r\n this._debugCylinderMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugCylinderMesh.material = this._getDebugMaterial(scene);\r\n this._debugCylinderMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugCylinderMesh.createInstance('physicsBodyCylinderViewInstance');\r\n }\r\n\r\n private _getDebugMeshMesh(mesh: Mesh, scene: Scene): AbstractMesh {\r\n var wireframeOver = new Mesh(mesh.name, scene, null, mesh);\r\n wireframeOver.position = Vector3.Zero();\r\n wireframeOver.setParent(mesh);\r\n wireframeOver.material = this._getDebugMaterial(scene);\r\n\r\n this._debugMeshMeshes.push(wireframeOver);\r\n\r\n return wireframeOver;\r\n }\r\n\r\n private _getDebugMesh(impostor: PhysicsImpostor, targetMesh?: Mesh): Nullable<AbstractMesh> {\r\n if (!this._utilityLayer) {\r\n return null;\r\n }\r\n\r\n // Only create child impostor debug meshes when evaluating the parent\r\n if (targetMesh && targetMesh.parent && (targetMesh.parent as Mesh).physicsImpostor) {\r\n return null;\r\n }\r\n\r\n var mesh: Nullable<AbstractMesh> = null;\r\n const utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n switch (impostor.type) {\r\n case PhysicsImpostor.BoxImpostor:\r\n mesh = this._getDebugBoxMesh(utilityLayerScene);\r\n impostor.getBoxSizeToRef(mesh.scaling);\r\n break;\r\n case PhysicsImpostor.SphereImpostor:\r\n mesh = this._getDebugSphereMesh(utilityLayerScene);\r\n var radius = impostor.getRadius();\r\n mesh.scaling.x = radius * 2;\r\n mesh.scaling.y = radius * 2;\r\n mesh.scaling.z = radius * 2;\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n mesh = this._getDebugCapsuleMesh(utilityLayerScene);\r\n var bi = impostor.object.getBoundingInfo();\r\n mesh.scaling.x = (bi.boundingBox.maximum.x - bi.boundingBox.minimum.x) * 2 * impostor.object.scaling.x;\r\n mesh.scaling.y = (bi.boundingBox.maximum.y - bi.boundingBox.minimum.y) * impostor.object.scaling.y;\r\n mesh.scaling.z = (bi.boundingBox.maximum.z - bi.boundingBox.minimum.z) * 2 * impostor.object.scaling.z;\r\n break;\r\n case PhysicsImpostor.MeshImpostor:\r\n if (targetMesh) {\r\n mesh = this._getDebugMeshMesh(targetMesh, utilityLayerScene);\r\n }\r\n break;\r\n case PhysicsImpostor.NoImpostor:\r\n if (targetMesh) {\r\n // Handle compound impostors\r\n var childMeshes = targetMesh.getChildMeshes().filter((c) => { return c.physicsImpostor ? 1 : 0; });\r\n childMeshes.forEach((m) => {\r\n if (m.physicsImpostor && m.getClassName() === \"Mesh\") {\r\n const boundingInfo = m.getBoundingInfo();\r\n const min = boundingInfo.boundingBox.minimum;\r\n const max = boundingInfo.boundingBox.maximum;\r\n switch (m.physicsImpostor.type) {\r\n case PhysicsImpostor.BoxImpostor:\r\n mesh = this._getDebugBoxMesh(utilityLayerScene);\r\n mesh.position.copyFrom(min);\r\n mesh.position.addInPlace(max);\r\n mesh.position.scaleInPlace(0.5);\r\n break;\r\n case PhysicsImpostor.SphereImpostor:\r\n mesh = this._getDebugSphereMesh(utilityLayerScene);\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n mesh = this._getDebugCylinderMesh(utilityLayerScene);\r\n break;\r\n default:\r\n mesh = null;\r\n break;\r\n }\r\n if (mesh) {\r\n mesh.scaling.x = max.x - min.x;\r\n mesh.scaling.y = max.y - min.y;\r\n mesh.scaling.z = max.z - min.z;\r\n mesh.parent = m;\r\n }\r\n }\r\n });\r\n }\r\n mesh = null;\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n mesh = this._getDebugCylinderMesh(utilityLayerScene);\r\n var bi = impostor.object.getBoundingInfo();\r\n mesh.scaling.x = (bi.boundingBox.maximum.x - bi.boundingBox.minimum.x) * impostor.object.scaling.x;\r\n mesh.scaling.y = (bi.boundingBox.maximum.y - bi.boundingBox.minimum.y) * impostor.object.scaling.y;\r\n mesh.scaling.z = (bi.boundingBox.maximum.z - bi.boundingBox.minimum.z) * impostor.object.scaling.z;\r\n break;\r\n }\r\n return mesh;\r\n }\r\n\r\n /** Releases all resources */\r\n public dispose() {\r\n let count = this._numMeshes;\r\n for (var index = 0; index < count; index++) {\r\n this.hideImpostor(this._impostors[0]);\r\n }\r\n\r\n if (this._debugBoxMesh) {\r\n this._debugBoxMesh.dispose();\r\n }\r\n if (this._debugSphereMesh) {\r\n this._debugSphereMesh.dispose();\r\n }\r\n if (this._debugCylinderMesh) {\r\n this._debugCylinderMesh.dispose();\r\n }\r\n if (this._debugMaterial) {\r\n this._debugMaterial.dispose();\r\n }\r\n\r\n this._impostors.length = 0;\r\n this._scene = null;\r\n this._physicsEnginePlugin = null;\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"physicsViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/physicsViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from '../Maths/math.color';\r\nimport { Material } from \"../Materials/material\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { IPhysicsEnginePlugin } from \"../Physics/IPhysicsEngine\";\r\nimport { PhysicsImpostor } from \"../Physics/physicsImpostor\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { CreateCylinder } from '../Meshes/Builders/cylinderBuilder';\r\nimport { CreateCapsule, ICreateCapsuleOptions } from '../Meshes/Builders/capsuleBuilder';\r\n\r\n/**\r\n * Used to show the physics impostor around the specific mesh\r\n */\r\nexport class PhysicsViewer {\r\n\r\n /** @hidden */\r\n protected _impostors: Array<Nullable<PhysicsImpostor>> = [];\r\n /** @hidden */\r\n protected _meshes: Array<Nullable<AbstractMesh>> = [];\r\n /** @hidden */\r\n protected _scene: Nullable<Scene>;\r\n /** @hidden */\r\n protected _numMeshes = 0;\r\n /** @hidden */\r\n protected _physicsEnginePlugin: Nullable<IPhysicsEnginePlugin>;\r\n private _renderFunction: () => void;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _debugBoxMesh: Mesh;\r\n private _debugSphereMesh: Mesh;\r\n private _debugCapsuleMesh: Mesh;\r\n private _debugCylinderMesh: Mesh;\r\n private _debugMaterial: StandardMaterial;\r\n private _debugMeshMeshes = new Array<Mesh>();\r\n\r\n /**\r\n * Creates a new PhysicsViewer\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n let physicEngine = this._scene.getPhysicsEngine();\r\n\r\n if (physicEngine) {\r\n this._physicsEnginePlugin = physicEngine.getPhysicsPlugin();\r\n }\r\n\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n }\r\n\r\n /** @hidden */\r\n protected _updateDebugMeshes(): void {\r\n var plugin = this._physicsEnginePlugin;\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n let impostor = this._impostors[i];\r\n\r\n if (!impostor) {\r\n continue;\r\n }\r\n\r\n if (impostor.isDisposed) {\r\n this.hideImpostor(this._impostors[i--]);\r\n } else {\r\n if (impostor.type === PhysicsImpostor.MeshImpostor) {\r\n continue;\r\n }\r\n let mesh = this._meshes[i];\r\n\r\n if (mesh && plugin) {\r\n plugin.syncMeshWithImpostor(mesh, impostor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Renders a specified physic impostor\r\n * @param impostor defines the impostor to render\r\n * @param targetMesh defines the mesh represented by the impostor\r\n * @returns the new debug mesh used to render the impostor\r\n */\r\n public showImpostor(impostor: PhysicsImpostor, targetMesh?: Mesh): Nullable<AbstractMesh> {\r\n\r\n if (!this._scene) {\r\n return null;\r\n }\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n if (this._impostors[i] == impostor) {\r\n return null;\r\n }\r\n }\r\n\r\n var debugMesh = this._getDebugMesh(impostor, targetMesh);\r\n\r\n if (debugMesh) {\r\n this._impostors[this._numMeshes] = impostor;\r\n this._meshes[this._numMeshes] = debugMesh;\r\n\r\n if (this._numMeshes === 0) {\r\n this._renderFunction = this._updateDebugMeshes.bind(this);\r\n this._scene.registerBeforeRender(this._renderFunction);\r\n }\r\n\r\n this._numMeshes++;\r\n }\r\n\r\n return debugMesh;\r\n }\r\n\r\n /**\r\n * Hides a specified physic impostor\r\n * @param impostor defines the impostor to hide\r\n */\r\n public hideImpostor(impostor: Nullable<PhysicsImpostor>) {\r\n\r\n if (!impostor || !this._scene || !this._utilityLayer) {\r\n return;\r\n }\r\n\r\n var removed = false;\r\n const utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n for (var i = 0; i < this._numMeshes; i++) {\r\n if (this._impostors[i] == impostor) {\r\n let mesh = this._meshes[i];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n utilityLayerScene.removeMesh(mesh);\r\n mesh.dispose();\r\n\r\n let index = this._debugMeshMeshes.indexOf(mesh as Mesh);\r\n if (index > -1) {\r\n this._debugMeshMeshes.splice(index, 1);\r\n }\r\n\r\n this._numMeshes--;\r\n if (this._numMeshes > 0) {\r\n this._meshes[i] = this._meshes[this._numMeshes];\r\n this._impostors[i] = this._impostors[this._numMeshes];\r\n this._meshes[this._numMeshes] = null;\r\n this._impostors[this._numMeshes] = null;\r\n } else {\r\n this._meshes[0] = null;\r\n this._impostors[0] = null;\r\n }\r\n removed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (removed && this._numMeshes === 0) {\r\n this._scene.unregisterBeforeRender(this._renderFunction);\r\n }\r\n\r\n }\r\n\r\n private _getDebugMaterial(scene: Scene): Material {\r\n if (!this._debugMaterial) {\r\n this._debugMaterial = new StandardMaterial('', scene);\r\n this._debugMaterial.wireframe = true;\r\n this._debugMaterial.emissiveColor = Color3.White();\r\n this._debugMaterial.disableLighting = true;\r\n }\r\n\r\n return this._debugMaterial;\r\n }\r\n\r\n private _getDebugBoxMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugBoxMesh) {\r\n this._debugBoxMesh = CreateBox('physicsBodyBoxViewMesh', { size: 1 }, scene);\r\n this._debugBoxMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugBoxMesh.material = this._getDebugMaterial(scene);\r\n this._debugBoxMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugBoxMesh.createInstance('physicsBodyBoxViewInstance');\r\n }\r\n\r\n private _getDebugSphereMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugSphereMesh) {\r\n this._debugSphereMesh = CreateSphere('physicsBodySphereViewMesh', { diameter: 1 }, scene);\r\n this._debugSphereMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugSphereMesh.material = this._getDebugMaterial(scene);\r\n this._debugSphereMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugSphereMesh.createInstance('physicsBodySphereViewInstance');\r\n }\r\n\r\n private _getDebugCapsuleMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugCapsuleMesh) {\r\n this._debugCapsuleMesh = CreateCapsule('physicsBodyCapsuleViewMesh', { height: 1 } as ICreateCapsuleOptions, scene);\r\n this._debugCapsuleMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugCapsuleMesh.material = this._getDebugMaterial(scene);\r\n this._debugCapsuleMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugCapsuleMesh.createInstance('physicsBodyCapsuleViewInstance');\r\n }\r\n\r\n private _getDebugCylinderMesh(scene: Scene): AbstractMesh {\r\n if (!this._debugCylinderMesh) {\r\n this._debugCylinderMesh = CreateCylinder('physicsBodyCylinderViewMesh', { diameterTop: 1, diameterBottom: 1, height: 1 }, scene);\r\n this._debugCylinderMesh.rotationQuaternion = Quaternion.Identity();\r\n this._debugCylinderMesh.material = this._getDebugMaterial(scene);\r\n this._debugCylinderMesh.setEnabled(false);\r\n }\r\n\r\n return this._debugCylinderMesh.createInstance('physicsBodyCylinderViewInstance');\r\n }\r\n\r\n private _getDebugMeshMesh(mesh: Mesh, scene: Scene): AbstractMesh {\r\n var wireframeOver = new Mesh(mesh.name, scene, null, mesh);\r\n wireframeOver.setParent(mesh);\r\n wireframeOver.position = Vector3.Zero();\r\n wireframeOver.material = this._getDebugMaterial(scene);\r\n\r\n this._debugMeshMeshes.push(wireframeOver);\r\n\r\n return wireframeOver;\r\n }\r\n\r\n private _getDebugMesh(impostor: PhysicsImpostor, targetMesh?: Mesh): Nullable<AbstractMesh> {\r\n if (!this._utilityLayer) {\r\n return null;\r\n }\r\n\r\n // Only create child impostor debug meshes when evaluating the parent\r\n if (targetMesh && targetMesh.parent && (targetMesh.parent as Mesh).physicsImpostor) {\r\n return null;\r\n }\r\n\r\n var mesh: Nullable<AbstractMesh> = null;\r\n const utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n switch (impostor.type) {\r\n case PhysicsImpostor.BoxImpostor:\r\n mesh = this._getDebugBoxMesh(utilityLayerScene);\r\n impostor.getBoxSizeToRef(mesh.scaling);\r\n break;\r\n case PhysicsImpostor.SphereImpostor:\r\n mesh = this._getDebugSphereMesh(utilityLayerScene);\r\n var radius = impostor.getRadius();\r\n mesh.scaling.x = radius * 2;\r\n mesh.scaling.y = radius * 2;\r\n mesh.scaling.z = radius * 2;\r\n break;\r\n case PhysicsImpostor.CapsuleImpostor:\r\n mesh = this._getDebugCapsuleMesh(utilityLayerScene);\r\n var bi = impostor.object.getBoundingInfo();\r\n mesh.scaling.x = (bi.boundingBox.maximum.x - bi.boundingBox.minimum.x) * 2 * impostor.object.scaling.x;\r\n mesh.scaling.y = (bi.boundingBox.maximum.y - bi.boundingBox.minimum.y) * impostor.object.scaling.y;\r\n mesh.scaling.z = (bi.boundingBox.maximum.z - bi.boundingBox.minimum.z) * 2 * impostor.object.scaling.z;\r\n break;\r\n case PhysicsImpostor.MeshImpostor:\r\n if (targetMesh) {\r\n mesh = this._getDebugMeshMesh(targetMesh, utilityLayerScene);\r\n }\r\n break;\r\n case PhysicsImpostor.NoImpostor:\r\n if (targetMesh) {\r\n // Handle compound impostors\r\n var childMeshes = targetMesh.getChildMeshes().filter((c) => { return c.physicsImpostor ? 1 : 0; });\r\n childMeshes.forEach((m) => {\r\n if (m.physicsImpostor && m.getClassName() === \"Mesh\") {\r\n const boundingInfo = m.getBoundingInfo();\r\n const min = boundingInfo.boundingBox.minimum;\r\n const max = boundingInfo.boundingBox.maximum;\r\n switch (m.physicsImpostor.type) {\r\n case PhysicsImpostor.BoxImpostor:\r\n mesh = this._getDebugBoxMesh(utilityLayerScene);\r\n mesh.position.copyFrom(min);\r\n mesh.position.addInPlace(max);\r\n mesh.position.scaleInPlace(0.5);\r\n break;\r\n case PhysicsImpostor.SphereImpostor:\r\n mesh = this._getDebugSphereMesh(utilityLayerScene);\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n mesh = this._getDebugCylinderMesh(utilityLayerScene);\r\n break;\r\n default:\r\n mesh = null;\r\n break;\r\n }\r\n if (mesh) {\r\n mesh.scaling.x = max.x - min.x;\r\n mesh.scaling.y = max.y - min.y;\r\n mesh.scaling.z = max.z - min.z;\r\n mesh.parent = m;\r\n }\r\n }\r\n });\r\n }\r\n mesh = null;\r\n break;\r\n case PhysicsImpostor.CylinderImpostor:\r\n mesh = this._getDebugCylinderMesh(utilityLayerScene);\r\n var bi = impostor.object.getBoundingInfo();\r\n mesh.scaling.x = (bi.boundingBox.maximum.x - bi.boundingBox.minimum.x) * impostor.object.scaling.x;\r\n mesh.scaling.y = (bi.boundingBox.maximum.y - bi.boundingBox.minimum.y) * impostor.object.scaling.y;\r\n mesh.scaling.z = (bi.boundingBox.maximum.z - bi.boundingBox.minimum.z) * impostor.object.scaling.z;\r\n break;\r\n }\r\n return mesh;\r\n }\r\n\r\n /** Releases all resources */\r\n public dispose() {\r\n let count = this._numMeshes;\r\n for (var index = 0; index < count; index++) {\r\n this.hideImpostor(this._impostors[0]);\r\n }\r\n\r\n if (this._debugBoxMesh) {\r\n this._debugBoxMesh.dispose();\r\n }\r\n if (this._debugSphereMesh) {\r\n this._debugSphereMesh.dispose();\r\n }\r\n if (this._debugCylinderMesh) {\r\n this._debugCylinderMesh.dispose();\r\n }\r\n if (this._debugMaterial) {\r\n this._debugMaterial.dispose();\r\n }\r\n\r\n this._impostors.length = 0;\r\n this._scene = null;\r\n this._physicsEnginePlugin = null;\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n }\r\n}\r\n"]}
@@ -115,7 +115,7 @@ var SkeletonViewer = /** @class */ (function () {
115
115
  var colorFull = (_f = options.colorFull) !== null && _f !== void 0 ? _f : Color3.Red();
116
116
  var targetBoneIndex = (_g = options.targetBoneIndex) !== null && _g !== void 0 ? _g : 0;
117
117
  Effect.ShadersStore['boneWeights:' + skeleton.name + "VertexShader"] =
118
- "precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n uniform vec3 colorBase;\n uniform vec3 colorZero;\n uniform vec3 colorQuarter;\n uniform vec3 colorHalf;\n uniform vec3 colorFull;\n\n uniform float targetBoneIndex;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n vec3 color = colorBase;\n float totalWeight = 0.;\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\n totalWeight += matricesWeights[0];\n }\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\n totalWeight += matricesWeights[1];\n }\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\n totalWeight += matricesWeights[2];\n }\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\n totalWeight += matricesWeights[3];\n }\n\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\n vColor = color;\n\n gl_Position = projection * view * worldPos;\n }";
118
+ "precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n #include<bakedVertexAnimationDeclaration>\n\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n uniform vec3 colorBase;\n uniform vec3 colorZero;\n uniform vec3 colorQuarter;\n uniform vec3 colorHalf;\n uniform vec3 colorFull;\n\n uniform float targetBoneIndex;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n #include<bakedVertexAnimation>\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n vec3 color = colorBase;\n float totalWeight = 0.;\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\n totalWeight += matricesWeights[0];\n }\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\n totalWeight += matricesWeights[1];\n }\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\n totalWeight += matricesWeights[2];\n }\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\n totalWeight += matricesWeights[3];\n }\n\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\n vColor = color;\n\n gl_Position = projection * view * worldPos;\n }";
119
119
  Effect.ShadersStore['boneWeights:' + skeleton.name + "FragmentShader"] =
120
120
  "\n precision highp float;\n varying vec3 vPosition;\n\n varying vec3 vColor;\n\n void main() {\n vec4 color = vec4(vColor, 1.0);\n gl_FragColor = color;\n }\n ";
121
121
  var shader = new ShaderMaterial('boneWeight:' + skeleton.name, scene, {
@@ -177,7 +177,7 @@ var SkeletonViewer = /** @class */ (function () {
177
177
  var bufferWidth = skeleton.bones.length + 1;
178
178
  var colorMapBuffer = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);
179
179
  var shader = new ShaderMaterial('boneWeights:' + skeleton.name, scene, {
180
- vertexSource: "precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n uniform float colorMap[" + ((skeleton.bones.length) * 4) + "];\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n\n vec3 color = vec3(0.);\n bool first = true;\n\n for (int i = 0; i < 4; i++) {\n int boneIdx = int(matricesIndices[i]);\n float boneWgt = matricesWeights[i];\n\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\n\n if (boneWgt > 0.) {\n if (first) {\n first = false;\n color = c;\n } else {\n color = mix(color, c, boneWgt);\n }\n }\n }\n\n vColor = color;\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n gl_Position = projection * view * worldPos;\n }",
180
+ vertexSource: "precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n uniform float colorMap[" + ((skeleton.bones.length) * 4) + "];\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n #include<bakedVertexAnimationDeclaration>\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n #include<bakedVertexAnimation>\n\n vec3 color = vec3(0.);\n bool first = true;\n\n for (int i = 0; i < 4; i++) {\n int boneIdx = int(matricesIndices[i]);\n float boneWgt = matricesWeights[i];\n\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\n\n if (boneWgt > 0.) {\n if (first) {\n first = false;\n color = c;\n } else {\n color = mix(color, c, boneWgt);\n }\n }\n }\n\n vColor = color;\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n gl_Position = projection * view * worldPos;\n }",
181
181
  fragmentSource: "\n precision highp float;\n varying vec3 vColor;\n\n void main() {\n vec4 color = vec4( vColor, 1.0 );\n gl_FragColor = color;\n }\n "
182
182
  }, {
183
183
  attributes: ['position', 'normal', 'matricesIndices', 'matricesWeights'],
@@ -1 +1 @@
1
- {"version":3,"file":"skeletonViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/skeletonViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from '../Maths/math.color';\r\nimport { Scene } from \"../scene\";\r\nimport { Nullable } from \"../types\";\r\nimport { Bone } from \"../Bones/bone\";\r\nimport { Skeleton } from \"../Bones/skeleton\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Material } from '../Materials/material';\r\nimport { ShaderMaterial } from '../Materials/shaderMaterial';\r\nimport { DynamicTexture } from '../Materials/Textures/dynamicTexture';\r\nimport { VertexBuffer } from '../Buffers/buffer';\r\nimport { Effect } from '../Materials/effect';\r\n\r\nimport { ISkeletonViewerOptions, IBoneWeightShaderOptions, ISkeletonMapShaderOptions, ISkeletonMapShaderColorMapKnot } from './ISkeletonViewer';\r\nimport { Observer } from '../Misc/observable';\r\n\r\nimport { CreateSphere } from '../Meshes/Builders/sphereBuilder';\r\nimport { ExtrudeShapeCustom } from '../Meshes/Builders/shapeBuilder';\r\n\r\n/**\r\n * Class used to render a debug view of a given skeleton\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\r\n */\r\nexport class SkeletonViewer {\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\r\n public static readonly DISPLAY_LINES = 0;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\r\n public static readonly DISPLAY_SPHERES = 1;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\r\n public static readonly DISPLAY_SPHERE_AND_SPURS = 2;\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\r\n */\r\n static CreateBoneWeightShader(options: IBoneWeightShaderOptions, scene: Scene): ShaderMaterial {\r\n\r\n let skeleton: Skeleton = options.skeleton;\r\n let colorBase: Color3 = options.colorBase ?? Color3.Black();\r\n let colorZero: Color3 = options.colorZero ?? Color3.Blue();\r\n let colorQuarter: Color3 = options.colorQuarter ?? Color3.Green();\r\n let colorHalf: Color3 = options.colorHalf ?? Color3.Yellow();\r\n let colorFull: Color3 = options.colorFull ?? Color3.Red();\r\n let targetBoneIndex: number = options.targetBoneIndex ?? 0;\r\n\r\n Effect.ShadersStore['boneWeights:' + skeleton.name + \"VertexShader\"] =\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n uniform vec3 colorBase;\r\n uniform vec3 colorZero;\r\n uniform vec3 colorQuarter;\r\n uniform vec3 colorHalf;\r\n uniform vec3 colorFull;\r\n\r\n uniform float targetBoneIndex;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n vec3 color = colorBase;\r\n float totalWeight = 0.;\r\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\r\n totalWeight += matricesWeights[0];\r\n }\r\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\r\n totalWeight += matricesWeights[1];\r\n }\r\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\r\n totalWeight += matricesWeights[2];\r\n }\r\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\r\n totalWeight += matricesWeights[3];\r\n }\r\n\r\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\r\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\r\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\r\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\r\n vColor = color;\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`;\r\n Effect.ShadersStore['boneWeights:' + skeleton.name + \"FragmentShader\"] =\r\n `\r\n precision highp float;\r\n varying vec3 vPosition;\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4(vColor, 1.0);\r\n gl_FragColor = color;\r\n }\r\n `;\r\n let shader: ShaderMaterial = new ShaderMaterial('boneWeight:' + skeleton.name, scene,\r\n {\r\n vertex: 'boneWeights:' + skeleton.name,\r\n fragment: 'boneWeights:' + skeleton.name\r\n },\r\n {\r\n attributes: ['position', 'normal', 'matricesIndices', 'matricesWeights'],\r\n uniforms: [\r\n 'world', 'worldView', 'worldViewProjection', 'view', 'projection', 'viewProjection',\r\n 'colorBase', 'colorZero', 'colorQuarter', 'colorHalf', 'colorFull', 'targetBoneIndex'\r\n ]\r\n });\r\n\r\n shader.setColor3('colorBase', colorBase);\r\n shader.setColor3('colorZero', colorZero);\r\n shader.setColor3('colorQuarter', colorQuarter);\r\n shader.setColor3('colorHalf', colorHalf);\r\n shader.setColor3('colorFull', colorFull);\r\n shader.setFloat('targetBoneIndex', targetBoneIndex);\r\n\r\n shader.getClassName = (): string => {\r\n return \"BoneWeightShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n */\r\n static CreateSkeletonMapShader(options: ISkeletonMapShaderOptions, scene: Scene) {\r\n\r\n let skeleton: Skeleton = options.skeleton;\r\n let colorMap: ISkeletonMapShaderColorMapKnot[] = options.colorMap ?? [\r\n {\r\n color: new Color3(1, 0.38, 0.18),\r\n location: 0\r\n },\r\n {\r\n color: new Color3(.59, 0.18, 1.00),\r\n location: 0.2\r\n },\r\n {\r\n color: new Color3(0.59, 1, 0.18),\r\n location: 0.4\r\n },\r\n {\r\n color: new Color3(1, 0.87, 0.17),\r\n location: 0.6\r\n },\r\n {\r\n color: new Color3(1, 0.17, 0.42),\r\n location: 0.8\r\n },\r\n {\r\n color: new Color3(0.17, 0.68, 1.0),\r\n location: 1.0\r\n }\r\n ];\r\n\r\n let bufferWidth: number = skeleton.bones.length + 1;\r\n let colorMapBuffer: number[] = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\r\n let shader = new ShaderMaterial('boneWeights:' + skeleton.name, scene,\r\n {\r\n vertexSource:\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n uniform float colorMap[` + ((skeleton.bones.length) * 4) + `];\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n\r\n vec3 color = vec3(0.);\r\n bool first = true;\r\n\r\n for (int i = 0; i < 4; i++) {\r\n int boneIdx = int(matricesIndices[i]);\r\n float boneWgt = matricesWeights[i];\r\n\r\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\r\n\r\n if (boneWgt > 0.) {\r\n if (first) {\r\n first = false;\r\n color = c;\r\n } else {\r\n color = mix(color, c, boneWgt);\r\n }\r\n }\r\n }\r\n\r\n vColor = color;\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`,\r\n fragmentSource:\r\n `\r\n precision highp float;\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4( vColor, 1.0 );\r\n gl_FragColor = color;\r\n }\r\n `\r\n },\r\n {\r\n attributes: ['position', 'normal', 'matricesIndices', 'matricesWeights'],\r\n uniforms: [\r\n 'world', 'worldView', 'worldViewProjection', 'view', 'projection', 'viewProjection',\r\n 'colorMap'\r\n ]\r\n });\r\n\r\n shader.setFloats('colorMap', colorMapBuffer);\r\n\r\n shader.getClassName = (): string => {\r\n return \"SkeletonMapShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** private static method to create a BoneWeight Shader\r\n * @param size The size of the buffer to create (usually the bone count)\r\n * @param colorMap The gradient data to generate\r\n * @param scene The scene that the shader is scoped to\r\n * @returns an Array of floats from the color gradient values\r\n */\r\n private static _CreateBoneMapColorBuffer(size: number, colorMap: ISkeletonMapShaderColorMapKnot[], scene: Scene) {\r\n let tempGrad = new DynamicTexture('temp', { width: size, height: 1 }, scene, false);\r\n let ctx = tempGrad.getContext();\r\n let grad = ctx.createLinearGradient(0, 0, size, 0);\r\n\r\n colorMap.forEach((stop) => {\r\n grad.addColorStop(stop.location, stop.color.toHexString());\r\n });\r\n\r\n ctx.fillStyle = grad;\r\n ctx.fillRect(0, 0, size, 1);\r\n tempGrad.update();\r\n let buffer: number[] = [];\r\n let data: Uint8ClampedArray = ctx.getImageData(0, 0, size, 1).data;\r\n let rUnit = 1 / 255;\r\n for (let i = 0; i < data.length; i++) {\r\n buffer.push(data[i] * rUnit);\r\n }\r\n tempGrad.dispose();\r\n return buffer;\r\n }\r\n\r\n /** If SkeletonViewer scene scope. */\r\n private _scene: Scene;\r\n\r\n /** Gets or sets the color used to render the skeleton */\r\n public color: Color3 = Color3.White();\r\n\r\n /** Array of the points of the skeleton fo the line view. */\r\n private _debugLines = new Array<Array<Vector3>>();\r\n\r\n /** The SkeletonViewers Mesh. */\r\n private _debugMesh: Nullable<LinesMesh>;\r\n\r\n /** The local axes Meshes. */\r\n private _localAxes: Nullable<LinesMesh> = null;\r\n\r\n /** If SkeletonViewer is enabled. */\r\n private _isEnabled = true;\r\n\r\n /** If SkeletonViewer is ready. */\r\n private _ready: boolean;\r\n\r\n /** SkeletonViewer render observable. */\r\n private _obs: Nullable<Observer<Scene>> = null;\r\n\r\n /** The Utility Layer to render the gizmos in. */\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _boneIndices: Set<number>;\r\n\r\n /** Gets the Scene. */\r\n get scene(): Scene {\r\n return this._scene;\r\n }\r\n /** Gets the utilityLayer. */\r\n get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n /** Checks Ready Status. */\r\n get isReady(): Boolean {\r\n return this._ready;\r\n }\r\n /** Sets Ready Status. */\r\n set ready(value: boolean) {\r\n this._ready = value;\r\n }\r\n /** Gets the debugMesh */\r\n get debugMesh(): Nullable<AbstractMesh> | Nullable<LinesMesh> {\r\n return this._debugMesh;\r\n }\r\n /** Sets the debugMesh */\r\n set debugMesh(value: Nullable<AbstractMesh> | Nullable<LinesMesh>) {\r\n this._debugMesh = (value as any);\r\n }\r\n /** Gets the displayMode */\r\n get displayMode(): number {\r\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\r\n }\r\n /** Sets the displayMode */\r\n set displayMode(value: number) {\r\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n value = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.options.displayMode = value;\r\n }\r\n /**\r\n * Creates a new SkeletonViewer\r\n * @param skeleton defines the skeleton to render\r\n * @param mesh defines the mesh attached to the skeleton\r\n * @param scene defines the hosting scene\r\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\r\n * @param renderingGroupId defines the rendering group id to use with the viewer\r\n * @param options All of the extra constructor options for the SkeletonViewer\r\n */\r\n constructor(\r\n /** defines the skeleton to render */\r\n public skeleton: Skeleton,\r\n /** defines the mesh attached to the skeleton */\r\n public mesh: AbstractMesh,\r\n /** The Scene scope*/\r\n scene: Scene,\r\n /** defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\r\n public autoUpdateBonesMatrices: boolean = true,\r\n /** defines the rendering group id to use with the viewer */\r\n public renderingGroupId: number = 3,\r\n /** is the options for the viewer */\r\n public options: Partial<ISkeletonViewerOptions> = {}\r\n ) {\r\n\r\n this._scene = scene;\r\n this._ready = false;\r\n\r\n //Defaults\r\n options.pauseAnimations = options.pauseAnimations ?? true;\r\n options.returnToRest = options.returnToRest ?? false;\r\n options.displayMode = options.displayMode ?? SkeletonViewer.DISPLAY_LINES;\r\n options.displayOptions = options.displayOptions ?? {};\r\n options.displayOptions.midStep = options.displayOptions.midStep ?? 0.235;\r\n options.displayOptions.midStepFactor = options.displayOptions.midStepFactor ?? 0.155;\r\n options.displayOptions.sphereBaseSize = options.displayOptions.sphereBaseSize ?? 0.15;\r\n options.displayOptions.sphereScaleUnit = options.displayOptions.sphereScaleUnit ?? 2;\r\n options.displayOptions.sphereFactor = options.displayOptions.sphereFactor ?? 0.865;\r\n options.displayOptions.spurFollowsChild = options.displayOptions.spurFollowsChild ?? false;\r\n options.displayOptions.showLocalAxes = options.displayOptions.showLocalAxes ?? false;\r\n options.displayOptions.localAxesSize = options.displayOptions.localAxesSize ?? 0.075;\r\n options.computeBonesUsingShaders = options.computeBonesUsingShaders ?? true;\r\n options.useAllBones = options.useAllBones ?? true;\r\n\r\n const initialMeshBoneIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const initialMeshBoneWeights = mesh.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n this._boneIndices = new Set();\r\n\r\n if (!options.useAllBones) {\r\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\r\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\r\n const index = initialMeshBoneIndices[i], weight = initialMeshBoneWeights[i];\r\n if (weight !== 0) {\r\n this._boneIndices.add(index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Create Utility Layer */\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n\r\n let displayMode = this.options.displayMode || 0;\r\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n displayMode = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.displayMode = displayMode;\r\n //Prep the Systems\r\n this.update();\r\n this._bindObs();\r\n }\r\n\r\n /** The Dynamic bindings for the update functions */\r\n private _bindObs(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\r\n this._displayLinesUpdate();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\r\n public update(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._displayLinesUpdate();\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERES: {\r\n this._buildSpheresAndSpurs(true);\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS: {\r\n this._buildSpheresAndSpurs(false);\r\n break;\r\n }\r\n }\r\n\r\n this._buildLocalAxes();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the viewer is enabled */\r\n public set isEnabled(value: boolean) {\r\n if (this.isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (this.debugMesh) {\r\n this.debugMesh.setEnabled(value);\r\n }\r\n\r\n if (value && !this._obs) {\r\n this._bindObs();\r\n } else if (!value && this._obs) {\r\n this.scene.onBeforeRenderObservable.remove(this._obs);\r\n this._obs = null;\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n private _getBonePosition(position: Vector3, bone: Bone, meshMat: Matrix, x = 0, y = 0, z = 0): void {\r\n var tmat = TmpVectors.Matrix[0];\r\n var parentBone = bone.getParent();\r\n tmat.copyFrom(bone.getLocalMatrix());\r\n\r\n if (x !== 0 || y !== 0 || z !== 0) {\r\n var tmat2 = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(tmat2);\r\n tmat2.setTranslationFromFloats(x, y, z);\r\n tmat2.multiplyToRef(tmat, tmat);\r\n }\r\n\r\n if (parentBone) {\r\n tmat.multiplyToRef(parentBone.getAbsoluteTransform(), tmat);\r\n }\r\n\r\n tmat.multiplyToRef(meshMat, tmat);\r\n\r\n position.x = tmat.m[12];\r\n position.y = tmat.m[13];\r\n position.z = tmat.m[14];\r\n }\r\n\r\n private _getLinesForBonesWithLength(bones: Bone[], meshMat: Matrix): void {\r\n var len = bones.length;\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n var meshPos = mesh.position;\r\n let idx = 0;\r\n for (var i = 0; i < len; i++) {\r\n var bone = bones[i];\r\n var points = this._debugLines[idx];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[idx] = points;\r\n }\r\n this._getBonePosition(points[0], bone, meshMat);\r\n this._getBonePosition(points[1], bone, meshMat, 0, bone.length, 0);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n idx++;\r\n }\r\n }\r\n\r\n private _getLinesForBonesNoLength(bones: Bone[]): void {\r\n var len = bones.length;\r\n var boneNum = 0;\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n var meshPos = mesh.position;\r\n for (var i = len - 1; i >= 0; i--) {\r\n var childBone = bones[i];\r\n var parentBone = childBone.getParent();\r\n if (!parentBone || (!this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n var points = this._debugLines[boneNum];\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[boneNum] = points;\r\n }\r\n childBone.getAbsolutePositionToRef(mesh, points[0]);\r\n parentBone.getAbsolutePositionToRef(mesh, points[1]);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n boneNum++;\r\n }\r\n }\r\n\r\n /** function to revert the mesh and scene back to the initial state. */\r\n private _revert(animationState: boolean): void {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = animationState;\r\n this.utilityLayer!.utilityLayerScene!.animationsEnabled = animationState;\r\n }\r\n }\r\n\r\n /** function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy. */\r\n private _getAbsoluteBindPoseToRef(bone: Nullable<Bone>, matrix: Matrix) {\r\n if (bone === null || bone._index === -1) {\r\n matrix.copyFrom(Matrix.Identity());\r\n return;\r\n }\r\n\r\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\r\n bone.getBaseMatrix().multiplyToRef(matrix, matrix);\r\n return;\r\n }\r\n\r\n /** function to build and bind sphere joint points and spur bone representations. */\r\n private _buildSpheresAndSpurs(spheresOnly = true): void {\r\n\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n\r\n this._ready = false;\r\n let utilityLayerScene = this.utilityLayer?.utilityLayerScene!;\r\n let bones: Bone[] = this.skeleton.bones;\r\n let spheres: Array<[Mesh, Bone]> = [];\r\n let spurs: Mesh[] = [];\r\n\r\n const animationState = this.scene.animationsEnabled;\r\n\r\n try {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = false;\r\n utilityLayerScene.animationsEnabled = false;\r\n }\r\n\r\n if (this.options.returnToRest) {\r\n this.skeleton.returnToRest();\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteTransforms();\r\n }\r\n\r\n let longestBoneLength = Number.NEGATIVE_INFINITY;\r\n let displayOptions = this.options.displayOptions || {};\r\n\r\n for (let i = 0; i < bones.length; i++) {\r\n let bone = bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n let boneAbsoluteBindPoseTransform = new Matrix();\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n\r\n let anchorPoint = new Vector3();\r\n\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\r\n\r\n bone.children.forEach((bc, i) => {\r\n let childAbsoluteBindPoseTransform: Matrix = new Matrix();\r\n bc.getBaseMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\r\n let childPoint = new Vector3();\r\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\r\n let distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\r\n if (distanceFromParent > longestBoneLength) {\r\n longestBoneLength = distanceFromParent;\r\n }\r\n if (spheresOnly) {\r\n return;\r\n }\r\n\r\n let dir = childPoint.clone().subtract(anchorPoint.clone());\r\n let h = dir.length();\r\n let up = dir.normalize().scale(h);\r\n\r\n let midStep = displayOptions.midStep || 0.165;\r\n let midStepFactor = displayOptions.midStepFactor || 0.215;\r\n\r\n let up0 = up.scale(midStep);\r\n\r\n let spur = ExtrudeShapeCustom('skeletonViewer',\r\n {\r\n shape: [\r\n new Vector3(1, -1, 0),\r\n new Vector3(1, 1, 0),\r\n new Vector3(-1, 1, 0),\r\n new Vector3(-1, -1, 0),\r\n new Vector3(1, -1, 0)\r\n ],\r\n path: [Vector3.Zero(), up0, up],\r\n scaleFunction:\r\n (i: number) => {\r\n switch (i) {\r\n case 0:\r\n case 2:\r\n return 0;\r\n case 1:\r\n return h * midStepFactor;\r\n }\r\n return 0;\r\n },\r\n sideOrientation: Mesh.DEFAULTSIDE,\r\n updatable: false\r\n }, utilityLayerScene);\r\n\r\n let numVertices = spur.getTotalVertices();\r\n let mwk: number[] = [], mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n\r\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\r\n // bone if spurFollowsChild is enabled.\r\n if (displayOptions.spurFollowsChild && i > 9) {\r\n mik.push(bc.getIndex(), 0, 0, 0);\r\n }\r\n else {\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n spur.position = anchorPoint.clone();\r\n\r\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n spur.convertToFlatShadedMesh();\r\n\r\n spurs.push(spur);\r\n });\r\n\r\n let sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\r\n\r\n let sphere = CreateSphere('skeletonViewer', {\r\n segments: 6,\r\n diameter: sphereBaseSize,\r\n updatable: true\r\n }, utilityLayerScene);\r\n\r\n const numVertices = sphere.getTotalVertices();\r\n\r\n let mwk: number[] = [], mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n\r\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n\r\n sphere.position = anchorPoint.clone();\r\n spheres.push([sphere, bone]);\r\n }\r\n\r\n let sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\r\n let sphereFactor = displayOptions.sphereFactor || 0.85;\r\n\r\n const meshes = [];\r\n for (let i = 0; i < spheres.length; i++) {\r\n let [sphere, bone] = spheres[i];\r\n let scale = 1 / (sphereScaleUnit / longestBoneLength);\r\n\r\n let _stepsOut = 0;\r\n let _b = bone;\r\n\r\n while ((_b.getParent()) && (_b.getParent() as Bone).getIndex() !== -1) {\r\n _stepsOut++;\r\n _b = (_b.getParent() as Bone);\r\n }\r\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\r\n meshes.push(sphere);\r\n }\r\n\r\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\r\n if (this.debugMesh) {\r\n this.debugMesh.renderingGroupId = this.renderingGroupId;\r\n this.debugMesh.skeleton = this.skeleton;\r\n this.debugMesh.parent = this.mesh;\r\n this.debugMesh.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n this.debugMesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n const light = this.utilityLayer!._getSharedGizmoLight();\r\n light.intensity = 0.7;\r\n\r\n this._revert(animationState);\r\n this.ready = true;\r\n } catch (err) {\r\n console.error(err);\r\n this._revert(animationState);\r\n this.dispose();\r\n }\r\n }\r\n\r\n private _buildLocalAxes(): void {\r\n if (this._localAxes) {\r\n this._localAxes.dispose();\r\n }\r\n\r\n this._localAxes = null;\r\n\r\n let displayOptions = this.options.displayOptions || {};\r\n\r\n if (!displayOptions.showLocalAxes) {\r\n return;\r\n }\r\n\r\n const targetScene = this._utilityLayer!.utilityLayerScene;\r\n const size = displayOptions.localAxesSize || 0.075;\r\n let lines = [];\r\n let colors = [];\r\n let red = new Color4(1, 0, 0, 1);\r\n let green = new Color4(0, 1, 0, 1);\r\n let blue = new Color4(0, 0, 1, 1);\r\n\r\n let mwk: number[] = [];\r\n let mik: number[] = [];\r\n const vertsPerBone = 6;\r\n\r\n for (let i in this.skeleton.bones) {\r\n let bone = this.skeleton.bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n let boneAbsoluteBindPoseTransform = new Matrix();\r\n let boneOrigin = new Vector3();\r\n\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, boneOrigin);\r\n\r\n let m = bone.getBaseMatrix().getRotationMatrix();\r\n\r\n let boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\r\n let boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\r\n let boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\r\n\r\n let axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\r\n let axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\r\n let axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\r\n\r\n let linePoints = [axisX, axisY, axisZ];\r\n let lineColors = [[red, red], [green, green], [blue, blue]];\r\n\r\n lines.push(...linePoints);\r\n colors.push(...lineColors);\r\n\r\n for (let j = 0; j < vertsPerBone; j++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n this._localAxes = CreateLineSystem('localAxes', { lines: lines, colors: colors, updatable: true }, targetScene);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n this._localAxes.skeleton = this.skeleton;\r\n this._localAxes.renderingGroupId = this.renderingGroupId;\r\n this._localAxes.parent = this.mesh;\r\n this._localAxes.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\r\n private _displayLinesUpdate(): void {\r\n if (!this._utilityLayer) {\r\n return;\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteTransforms();\r\n }\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n\r\n if (this.skeleton.bones[0].length === undefined) {\r\n this._getLinesForBonesNoLength(this.skeleton.bones);\r\n } else {\r\n this._getLinesForBonesWithLength(this.skeleton.bones, mesh.getWorldMatrix());\r\n }\r\n\r\n const targetScene = this._utilityLayer.utilityLayerScene;\r\n\r\n if (targetScene) {\r\n if (!this._debugMesh) {\r\n this._debugMesh = CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: null }, targetScene);\r\n this._debugMesh.renderingGroupId = this.renderingGroupId;\r\n } else {\r\n CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: this._debugMesh }, targetScene);\r\n }\r\n this._debugMesh.position.copyFrom(this.mesh.position);\r\n this._debugMesh.color = this.color;\r\n }\r\n }\r\n /** Changes the displayMode of the skeleton viewer\r\n * @param mode The displayMode numerical value\r\n */\r\n public changeDisplayMode(mode: number): void {\r\n let wasEnabled = (this.isEnabled) ? true : false;\r\n if (this.displayMode !== mode) {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.displayMode = mode;\r\n\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n }\r\n\r\n /** Sets a display option of the skeleton viewer\r\n *\r\n * | Option | Type | Default | Description |\r\n * | ---------------- | ------- | ------- | ----------- |\r\n * | midStep | float | 0.235 | A percentage between a bone and its child that determines the widest part of a spur. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | midStepFactor | float | 0.15 | Mid step width expressed as a factor of the length. A value of 0.5 makes the spur width half of the spur length. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereScaleUnit | float | 0.865 | Sphere scale factor used to scale spheres in relation to the longest bone. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\r\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\r\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\r\n *\r\n * @param option String of the option name\r\n * @param value The numerical option value\r\n */\r\n public changeDisplayOptions(option: string, value: number): void {\r\n let wasEnabled = (this.isEnabled) ? true : false;\r\n (this.options.displayOptions as any)[option] = value;\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose(): void {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n\r\n this.ready = false;\r\n }\r\n}"]}
1
+ {"version":3,"file":"skeletonViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/skeletonViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from '../Maths/math.color';\r\nimport { Scene } from \"../scene\";\r\nimport { Nullable } from \"../types\";\r\nimport { Bone } from \"../Bones/bone\";\r\nimport { Skeleton } from \"../Bones/skeleton\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Material } from '../Materials/material';\r\nimport { ShaderMaterial } from '../Materials/shaderMaterial';\r\nimport { DynamicTexture } from '../Materials/Textures/dynamicTexture';\r\nimport { VertexBuffer } from '../Buffers/buffer';\r\nimport { Effect } from '../Materials/effect';\r\n\r\nimport { ISkeletonViewerOptions, IBoneWeightShaderOptions, ISkeletonMapShaderOptions, ISkeletonMapShaderColorMapKnot } from './ISkeletonViewer';\r\nimport { Observer } from '../Misc/observable';\r\n\r\nimport { CreateSphere } from '../Meshes/Builders/sphereBuilder';\r\nimport { ExtrudeShapeCustom } from '../Meshes/Builders/shapeBuilder';\r\n\r\n/**\r\n * Class used to render a debug view of a given skeleton\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\r\n */\r\nexport class SkeletonViewer {\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\r\n public static readonly DISPLAY_LINES = 0;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\r\n public static readonly DISPLAY_SPHERES = 1;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\r\n public static readonly DISPLAY_SPHERE_AND_SPURS = 2;\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\r\n */\r\n static CreateBoneWeightShader(options: IBoneWeightShaderOptions, scene: Scene): ShaderMaterial {\r\n\r\n let skeleton: Skeleton = options.skeleton;\r\n let colorBase: Color3 = options.colorBase ?? Color3.Black();\r\n let colorZero: Color3 = options.colorZero ?? Color3.Blue();\r\n let colorQuarter: Color3 = options.colorQuarter ?? Color3.Green();\r\n let colorHalf: Color3 = options.colorHalf ?? Color3.Yellow();\r\n let colorFull: Color3 = options.colorFull ?? Color3.Red();\r\n let targetBoneIndex: number = options.targetBoneIndex ?? 0;\r\n\r\n Effect.ShadersStore['boneWeights:' + skeleton.name + \"VertexShader\"] =\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n uniform vec3 colorBase;\r\n uniform vec3 colorZero;\r\n uniform vec3 colorQuarter;\r\n uniform vec3 colorHalf;\r\n uniform vec3 colorFull;\r\n\r\n uniform float targetBoneIndex;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n vec3 color = colorBase;\r\n float totalWeight = 0.;\r\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\r\n totalWeight += matricesWeights[0];\r\n }\r\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\r\n totalWeight += matricesWeights[1];\r\n }\r\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\r\n totalWeight += matricesWeights[2];\r\n }\r\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\r\n totalWeight += matricesWeights[3];\r\n }\r\n\r\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\r\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\r\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\r\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\r\n vColor = color;\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`;\r\n Effect.ShadersStore['boneWeights:' + skeleton.name + \"FragmentShader\"] =\r\n `\r\n precision highp float;\r\n varying vec3 vPosition;\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4(vColor, 1.0);\r\n gl_FragColor = color;\r\n }\r\n `;\r\n let shader: ShaderMaterial = new ShaderMaterial('boneWeight:' + skeleton.name, scene,\r\n {\r\n vertex: 'boneWeights:' + skeleton.name,\r\n fragment: 'boneWeights:' + skeleton.name\r\n },\r\n {\r\n attributes: ['position', 'normal', 'matricesIndices', 'matricesWeights'],\r\n uniforms: [\r\n 'world', 'worldView', 'worldViewProjection', 'view', 'projection', 'viewProjection',\r\n 'colorBase', 'colorZero', 'colorQuarter', 'colorHalf', 'colorFull', 'targetBoneIndex'\r\n ]\r\n });\r\n\r\n shader.setColor3('colorBase', colorBase);\r\n shader.setColor3('colorZero', colorZero);\r\n shader.setColor3('colorQuarter', colorQuarter);\r\n shader.setColor3('colorHalf', colorHalf);\r\n shader.setColor3('colorFull', colorFull);\r\n shader.setFloat('targetBoneIndex', targetBoneIndex);\r\n\r\n shader.getClassName = (): string => {\r\n return \"BoneWeightShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n */\r\n static CreateSkeletonMapShader(options: ISkeletonMapShaderOptions, scene: Scene) {\r\n\r\n let skeleton: Skeleton = options.skeleton;\r\n let colorMap: ISkeletonMapShaderColorMapKnot[] = options.colorMap ?? [\r\n {\r\n color: new Color3(1, 0.38, 0.18),\r\n location: 0\r\n },\r\n {\r\n color: new Color3(.59, 0.18, 1.00),\r\n location: 0.2\r\n },\r\n {\r\n color: new Color3(0.59, 1, 0.18),\r\n location: 0.4\r\n },\r\n {\r\n color: new Color3(1, 0.87, 0.17),\r\n location: 0.6\r\n },\r\n {\r\n color: new Color3(1, 0.17, 0.42),\r\n location: 0.8\r\n },\r\n {\r\n color: new Color3(0.17, 0.68, 1.0),\r\n location: 1.0\r\n }\r\n ];\r\n\r\n let bufferWidth: number = skeleton.bones.length + 1;\r\n let colorMapBuffer: number[] = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\r\n let shader = new ShaderMaterial('boneWeights:' + skeleton.name, scene,\r\n {\r\n vertexSource:\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n uniform float colorMap[` + ((skeleton.bones.length) * 4) + `];\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec3 color = vec3(0.);\r\n bool first = true;\r\n\r\n for (int i = 0; i < 4; i++) {\r\n int boneIdx = int(matricesIndices[i]);\r\n float boneWgt = matricesWeights[i];\r\n\r\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\r\n\r\n if (boneWgt > 0.) {\r\n if (first) {\r\n first = false;\r\n color = c;\r\n } else {\r\n color = mix(color, c, boneWgt);\r\n }\r\n }\r\n }\r\n\r\n vColor = color;\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`,\r\n fragmentSource:\r\n `\r\n precision highp float;\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4( vColor, 1.0 );\r\n gl_FragColor = color;\r\n }\r\n `\r\n },\r\n {\r\n attributes: ['position', 'normal', 'matricesIndices', 'matricesWeights'],\r\n uniforms: [\r\n 'world', 'worldView', 'worldViewProjection', 'view', 'projection', 'viewProjection',\r\n 'colorMap'\r\n ]\r\n });\r\n\r\n shader.setFloats('colorMap', colorMapBuffer);\r\n\r\n shader.getClassName = (): string => {\r\n return \"SkeletonMapShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** private static method to create a BoneWeight Shader\r\n * @param size The size of the buffer to create (usually the bone count)\r\n * @param colorMap The gradient data to generate\r\n * @param scene The scene that the shader is scoped to\r\n * @returns an Array of floats from the color gradient values\r\n */\r\n private static _CreateBoneMapColorBuffer(size: number, colorMap: ISkeletonMapShaderColorMapKnot[], scene: Scene) {\r\n let tempGrad = new DynamicTexture('temp', { width: size, height: 1 }, scene, false);\r\n let ctx = tempGrad.getContext();\r\n let grad = ctx.createLinearGradient(0, 0, size, 0);\r\n\r\n colorMap.forEach((stop) => {\r\n grad.addColorStop(stop.location, stop.color.toHexString());\r\n });\r\n\r\n ctx.fillStyle = grad;\r\n ctx.fillRect(0, 0, size, 1);\r\n tempGrad.update();\r\n let buffer: number[] = [];\r\n let data: Uint8ClampedArray = ctx.getImageData(0, 0, size, 1).data;\r\n let rUnit = 1 / 255;\r\n for (let i = 0; i < data.length; i++) {\r\n buffer.push(data[i] * rUnit);\r\n }\r\n tempGrad.dispose();\r\n return buffer;\r\n }\r\n\r\n /** If SkeletonViewer scene scope. */\r\n private _scene: Scene;\r\n\r\n /** Gets or sets the color used to render the skeleton */\r\n public color: Color3 = Color3.White();\r\n\r\n /** Array of the points of the skeleton fo the line view. */\r\n private _debugLines = new Array<Array<Vector3>>();\r\n\r\n /** The SkeletonViewers Mesh. */\r\n private _debugMesh: Nullable<LinesMesh>;\r\n\r\n /** The local axes Meshes. */\r\n private _localAxes: Nullable<LinesMesh> = null;\r\n\r\n /** If SkeletonViewer is enabled. */\r\n private _isEnabled = true;\r\n\r\n /** If SkeletonViewer is ready. */\r\n private _ready: boolean;\r\n\r\n /** SkeletonViewer render observable. */\r\n private _obs: Nullable<Observer<Scene>> = null;\r\n\r\n /** The Utility Layer to render the gizmos in. */\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _boneIndices: Set<number>;\r\n\r\n /** Gets the Scene. */\r\n get scene(): Scene {\r\n return this._scene;\r\n }\r\n /** Gets the utilityLayer. */\r\n get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n /** Checks Ready Status. */\r\n get isReady(): Boolean {\r\n return this._ready;\r\n }\r\n /** Sets Ready Status. */\r\n set ready(value: boolean) {\r\n this._ready = value;\r\n }\r\n /** Gets the debugMesh */\r\n get debugMesh(): Nullable<AbstractMesh> | Nullable<LinesMesh> {\r\n return this._debugMesh;\r\n }\r\n /** Sets the debugMesh */\r\n set debugMesh(value: Nullable<AbstractMesh> | Nullable<LinesMesh>) {\r\n this._debugMesh = (value as any);\r\n }\r\n /** Gets the displayMode */\r\n get displayMode(): number {\r\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\r\n }\r\n /** Sets the displayMode */\r\n set displayMode(value: number) {\r\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n value = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.options.displayMode = value;\r\n }\r\n /**\r\n * Creates a new SkeletonViewer\r\n * @param skeleton defines the skeleton to render\r\n * @param mesh defines the mesh attached to the skeleton\r\n * @param scene defines the hosting scene\r\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\r\n * @param renderingGroupId defines the rendering group id to use with the viewer\r\n * @param options All of the extra constructor options for the SkeletonViewer\r\n */\r\n constructor(\r\n /** defines the skeleton to render */\r\n public skeleton: Skeleton,\r\n /** defines the mesh attached to the skeleton */\r\n public mesh: AbstractMesh,\r\n /** The Scene scope*/\r\n scene: Scene,\r\n /** defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\r\n public autoUpdateBonesMatrices: boolean = true,\r\n /** defines the rendering group id to use with the viewer */\r\n public renderingGroupId: number = 3,\r\n /** is the options for the viewer */\r\n public options: Partial<ISkeletonViewerOptions> = {}\r\n ) {\r\n\r\n this._scene = scene;\r\n this._ready = false;\r\n\r\n //Defaults\r\n options.pauseAnimations = options.pauseAnimations ?? true;\r\n options.returnToRest = options.returnToRest ?? false;\r\n options.displayMode = options.displayMode ?? SkeletonViewer.DISPLAY_LINES;\r\n options.displayOptions = options.displayOptions ?? {};\r\n options.displayOptions.midStep = options.displayOptions.midStep ?? 0.235;\r\n options.displayOptions.midStepFactor = options.displayOptions.midStepFactor ?? 0.155;\r\n options.displayOptions.sphereBaseSize = options.displayOptions.sphereBaseSize ?? 0.15;\r\n options.displayOptions.sphereScaleUnit = options.displayOptions.sphereScaleUnit ?? 2;\r\n options.displayOptions.sphereFactor = options.displayOptions.sphereFactor ?? 0.865;\r\n options.displayOptions.spurFollowsChild = options.displayOptions.spurFollowsChild ?? false;\r\n options.displayOptions.showLocalAxes = options.displayOptions.showLocalAxes ?? false;\r\n options.displayOptions.localAxesSize = options.displayOptions.localAxesSize ?? 0.075;\r\n options.computeBonesUsingShaders = options.computeBonesUsingShaders ?? true;\r\n options.useAllBones = options.useAllBones ?? true;\r\n\r\n const initialMeshBoneIndices = mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const initialMeshBoneWeights = mesh.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n this._boneIndices = new Set();\r\n\r\n if (!options.useAllBones) {\r\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\r\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\r\n const index = initialMeshBoneIndices[i], weight = initialMeshBoneWeights[i];\r\n if (weight !== 0) {\r\n this._boneIndices.add(index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Create Utility Layer */\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n\r\n let displayMode = this.options.displayMode || 0;\r\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n displayMode = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.displayMode = displayMode;\r\n //Prep the Systems\r\n this.update();\r\n this._bindObs();\r\n }\r\n\r\n /** The Dynamic bindings for the update functions */\r\n private _bindObs(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\r\n this._displayLinesUpdate();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\r\n public update(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._displayLinesUpdate();\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERES: {\r\n this._buildSpheresAndSpurs(true);\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS: {\r\n this._buildSpheresAndSpurs(false);\r\n break;\r\n }\r\n }\r\n\r\n this._buildLocalAxes();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the viewer is enabled */\r\n public set isEnabled(value: boolean) {\r\n if (this.isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (this.debugMesh) {\r\n this.debugMesh.setEnabled(value);\r\n }\r\n\r\n if (value && !this._obs) {\r\n this._bindObs();\r\n } else if (!value && this._obs) {\r\n this.scene.onBeforeRenderObservable.remove(this._obs);\r\n this._obs = null;\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n private _getBonePosition(position: Vector3, bone: Bone, meshMat: Matrix, x = 0, y = 0, z = 0): void {\r\n var tmat = TmpVectors.Matrix[0];\r\n var parentBone = bone.getParent();\r\n tmat.copyFrom(bone.getLocalMatrix());\r\n\r\n if (x !== 0 || y !== 0 || z !== 0) {\r\n var tmat2 = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(tmat2);\r\n tmat2.setTranslationFromFloats(x, y, z);\r\n tmat2.multiplyToRef(tmat, tmat);\r\n }\r\n\r\n if (parentBone) {\r\n tmat.multiplyToRef(parentBone.getAbsoluteTransform(), tmat);\r\n }\r\n\r\n tmat.multiplyToRef(meshMat, tmat);\r\n\r\n position.x = tmat.m[12];\r\n position.y = tmat.m[13];\r\n position.z = tmat.m[14];\r\n }\r\n\r\n private _getLinesForBonesWithLength(bones: Bone[], meshMat: Matrix): void {\r\n var len = bones.length;\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n var meshPos = mesh.position;\r\n let idx = 0;\r\n for (var i = 0; i < len; i++) {\r\n var bone = bones[i];\r\n var points = this._debugLines[idx];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[idx] = points;\r\n }\r\n this._getBonePosition(points[0], bone, meshMat);\r\n this._getBonePosition(points[1], bone, meshMat, 0, bone.length, 0);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n idx++;\r\n }\r\n }\r\n\r\n private _getLinesForBonesNoLength(bones: Bone[]): void {\r\n var len = bones.length;\r\n var boneNum = 0;\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n var meshPos = mesh.position;\r\n for (var i = len - 1; i >= 0; i--) {\r\n var childBone = bones[i];\r\n var parentBone = childBone.getParent();\r\n if (!parentBone || (!this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n var points = this._debugLines[boneNum];\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[boneNum] = points;\r\n }\r\n childBone.getAbsolutePositionToRef(mesh, points[0]);\r\n parentBone.getAbsolutePositionToRef(mesh, points[1]);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n boneNum++;\r\n }\r\n }\r\n\r\n /** function to revert the mesh and scene back to the initial state. */\r\n private _revert(animationState: boolean): void {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = animationState;\r\n this.utilityLayer!.utilityLayerScene!.animationsEnabled = animationState;\r\n }\r\n }\r\n\r\n /** function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy. */\r\n private _getAbsoluteBindPoseToRef(bone: Nullable<Bone>, matrix: Matrix) {\r\n if (bone === null || bone._index === -1) {\r\n matrix.copyFrom(Matrix.Identity());\r\n return;\r\n }\r\n\r\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\r\n bone.getBaseMatrix().multiplyToRef(matrix, matrix);\r\n return;\r\n }\r\n\r\n /** function to build and bind sphere joint points and spur bone representations. */\r\n private _buildSpheresAndSpurs(spheresOnly = true): void {\r\n\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n\r\n this._ready = false;\r\n let utilityLayerScene = this.utilityLayer?.utilityLayerScene!;\r\n let bones: Bone[] = this.skeleton.bones;\r\n let spheres: Array<[Mesh, Bone]> = [];\r\n let spurs: Mesh[] = [];\r\n\r\n const animationState = this.scene.animationsEnabled;\r\n\r\n try {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = false;\r\n utilityLayerScene.animationsEnabled = false;\r\n }\r\n\r\n if (this.options.returnToRest) {\r\n this.skeleton.returnToRest();\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteTransforms();\r\n }\r\n\r\n let longestBoneLength = Number.NEGATIVE_INFINITY;\r\n let displayOptions = this.options.displayOptions || {};\r\n\r\n for (let i = 0; i < bones.length; i++) {\r\n let bone = bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n let boneAbsoluteBindPoseTransform = new Matrix();\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n\r\n let anchorPoint = new Vector3();\r\n\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\r\n\r\n bone.children.forEach((bc, i) => {\r\n let childAbsoluteBindPoseTransform: Matrix = new Matrix();\r\n bc.getBaseMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\r\n let childPoint = new Vector3();\r\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\r\n let distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\r\n if (distanceFromParent > longestBoneLength) {\r\n longestBoneLength = distanceFromParent;\r\n }\r\n if (spheresOnly) {\r\n return;\r\n }\r\n\r\n let dir = childPoint.clone().subtract(anchorPoint.clone());\r\n let h = dir.length();\r\n let up = dir.normalize().scale(h);\r\n\r\n let midStep = displayOptions.midStep || 0.165;\r\n let midStepFactor = displayOptions.midStepFactor || 0.215;\r\n\r\n let up0 = up.scale(midStep);\r\n\r\n let spur = ExtrudeShapeCustom('skeletonViewer',\r\n {\r\n shape: [\r\n new Vector3(1, -1, 0),\r\n new Vector3(1, 1, 0),\r\n new Vector3(-1, 1, 0),\r\n new Vector3(-1, -1, 0),\r\n new Vector3(1, -1, 0)\r\n ],\r\n path: [Vector3.Zero(), up0, up],\r\n scaleFunction:\r\n (i: number) => {\r\n switch (i) {\r\n case 0:\r\n case 2:\r\n return 0;\r\n case 1:\r\n return h * midStepFactor;\r\n }\r\n return 0;\r\n },\r\n sideOrientation: Mesh.DEFAULTSIDE,\r\n updatable: false\r\n }, utilityLayerScene);\r\n\r\n let numVertices = spur.getTotalVertices();\r\n let mwk: number[] = [], mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n\r\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\r\n // bone if spurFollowsChild is enabled.\r\n if (displayOptions.spurFollowsChild && i > 9) {\r\n mik.push(bc.getIndex(), 0, 0, 0);\r\n }\r\n else {\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n spur.position = anchorPoint.clone();\r\n\r\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n spur.convertToFlatShadedMesh();\r\n\r\n spurs.push(spur);\r\n });\r\n\r\n let sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\r\n\r\n let sphere = CreateSphere('skeletonViewer', {\r\n segments: 6,\r\n diameter: sphereBaseSize,\r\n updatable: true\r\n }, utilityLayerScene);\r\n\r\n const numVertices = sphere.getTotalVertices();\r\n\r\n let mwk: number[] = [], mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n\r\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n\r\n sphere.position = anchorPoint.clone();\r\n spheres.push([sphere, bone]);\r\n }\r\n\r\n let sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\r\n let sphereFactor = displayOptions.sphereFactor || 0.85;\r\n\r\n const meshes = [];\r\n for (let i = 0; i < spheres.length; i++) {\r\n let [sphere, bone] = spheres[i];\r\n let scale = 1 / (sphereScaleUnit / longestBoneLength);\r\n\r\n let _stepsOut = 0;\r\n let _b = bone;\r\n\r\n while ((_b.getParent()) && (_b.getParent() as Bone).getIndex() !== -1) {\r\n _stepsOut++;\r\n _b = (_b.getParent() as Bone);\r\n }\r\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\r\n meshes.push(sphere);\r\n }\r\n\r\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\r\n if (this.debugMesh) {\r\n this.debugMesh.renderingGroupId = this.renderingGroupId;\r\n this.debugMesh.skeleton = this.skeleton;\r\n this.debugMesh.parent = this.mesh;\r\n this.debugMesh.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n this.debugMesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n const light = this.utilityLayer!._getSharedGizmoLight();\r\n light.intensity = 0.7;\r\n\r\n this._revert(animationState);\r\n this.ready = true;\r\n } catch (err) {\r\n console.error(err);\r\n this._revert(animationState);\r\n this.dispose();\r\n }\r\n }\r\n\r\n private _buildLocalAxes(): void {\r\n if (this._localAxes) {\r\n this._localAxes.dispose();\r\n }\r\n\r\n this._localAxes = null;\r\n\r\n let displayOptions = this.options.displayOptions || {};\r\n\r\n if (!displayOptions.showLocalAxes) {\r\n return;\r\n }\r\n\r\n const targetScene = this._utilityLayer!.utilityLayerScene;\r\n const size = displayOptions.localAxesSize || 0.075;\r\n let lines = [];\r\n let colors = [];\r\n let red = new Color4(1, 0, 0, 1);\r\n let green = new Color4(0, 1, 0, 1);\r\n let blue = new Color4(0, 0, 1, 1);\r\n\r\n let mwk: number[] = [];\r\n let mik: number[] = [];\r\n const vertsPerBone = 6;\r\n\r\n for (let i in this.skeleton.bones) {\r\n let bone = this.skeleton.bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n let boneAbsoluteBindPoseTransform = new Matrix();\r\n let boneOrigin = new Vector3();\r\n\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, boneOrigin);\r\n\r\n let m = bone.getBaseMatrix().getRotationMatrix();\r\n\r\n let boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\r\n let boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\r\n let boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\r\n\r\n let axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\r\n let axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\r\n let axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\r\n\r\n let linePoints = [axisX, axisY, axisZ];\r\n let lineColors = [[red, red], [green, green], [blue, blue]];\r\n\r\n lines.push(...linePoints);\r\n colors.push(...lineColors);\r\n\r\n for (let j = 0; j < vertsPerBone; j++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n this._localAxes = CreateLineSystem('localAxes', { lines: lines, colors: colors, updatable: true }, targetScene);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n this._localAxes.skeleton = this.skeleton;\r\n this._localAxes.renderingGroupId = this.renderingGroupId;\r\n this._localAxes.parent = this.mesh;\r\n this._localAxes.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\r\n private _displayLinesUpdate(): void {\r\n if (!this._utilityLayer) {\r\n return;\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteTransforms();\r\n }\r\n\r\n let mesh = this.mesh._effectiveMesh;\r\n\r\n if (this.skeleton.bones[0].length === undefined) {\r\n this._getLinesForBonesNoLength(this.skeleton.bones);\r\n } else {\r\n this._getLinesForBonesWithLength(this.skeleton.bones, mesh.getWorldMatrix());\r\n }\r\n\r\n const targetScene = this._utilityLayer.utilityLayerScene;\r\n\r\n if (targetScene) {\r\n if (!this._debugMesh) {\r\n this._debugMesh = CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: null }, targetScene);\r\n this._debugMesh.renderingGroupId = this.renderingGroupId;\r\n } else {\r\n CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: this._debugMesh }, targetScene);\r\n }\r\n this._debugMesh.position.copyFrom(this.mesh.position);\r\n this._debugMesh.color = this.color;\r\n }\r\n }\r\n /** Changes the displayMode of the skeleton viewer\r\n * @param mode The displayMode numerical value\r\n */\r\n public changeDisplayMode(mode: number): void {\r\n let wasEnabled = (this.isEnabled) ? true : false;\r\n if (this.displayMode !== mode) {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.displayMode = mode;\r\n\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n }\r\n\r\n /** Sets a display option of the skeleton viewer\r\n *\r\n * | Option | Type | Default | Description |\r\n * | ---------------- | ------- | ------- | ----------- |\r\n * | midStep | float | 0.235 | A percentage between a bone and its child that determines the widest part of a spur. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | midStepFactor | float | 0.15 | Mid step width expressed as a factor of the length. A value of 0.5 makes the spur width half of the spur length. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereScaleUnit | float | 0.865 | Sphere scale factor used to scale spheres in relation to the longest bone. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\r\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\r\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\r\n *\r\n * @param option String of the option name\r\n * @param value The numerical option value\r\n */\r\n public changeDisplayOptions(option: string, value: number): void {\r\n let wasEnabled = (this.isEnabled) ? true : false;\r\n (this.options.displayOptions as any)[option] = value;\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose(): void {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n\r\n this.ready = false;\r\n }\r\n}"]}