@babylonjs/core 5.27.0 → 5.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/Animations/animatable.js +2 -1
  2. package/Animations/animatable.js.map +1 -1
  3. package/Animations/runtimeAnimation.js +1 -1
  4. package/Animations/runtimeAnimation.js.map +1 -1
  5. package/Audio/audioSceneComponent.js +2 -1
  6. package/Audio/audioSceneComponent.js.map +1 -1
  7. package/Audio/sound.js +70 -45
  8. package/Audio/sound.js.map +1 -1
  9. package/Audio/soundTrack.js +12 -6
  10. package/Audio/soundTrack.js.map +1 -1
  11. package/BakedVertexAnimation/bakedVertexAnimationManager.js +2 -1
  12. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
  13. package/Behaviors/Cameras/autoRotationBehavior.js +1 -1
  14. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  15. package/Behaviors/Meshes/followBehavior.js +2 -1
  16. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  17. package/Behaviors/Meshes/handConstraintBehavior.js +6 -6
  18. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  19. package/Bones/bone.js +2 -1
  20. package/Bones/bone.js.map +1 -1
  21. package/Bones/skeleton.js +3 -2
  22. package/Bones/skeleton.js.map +1 -1
  23. package/Cameras/Inputs/BaseCameraPointersInput.js +2 -2
  24. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  25. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +5 -3
  26. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  27. package/Cameras/Inputs/flyCameraMouseInput.js +2 -2
  28. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  29. package/Cameras/Inputs/freeCameraMouseInput.js +2 -2
  30. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +2 -1
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +6 -4
  34. package/Cameras/camera.js.map +1 -1
  35. package/Compute/computeEffect.js +8 -5
  36. package/Compute/computeEffect.js.map +1 -1
  37. package/Compute/computeShader.js +12 -11
  38. package/Compute/computeShader.js.map +1 -1
  39. package/Culling/Octrees/octreeSceneComponent.js +2 -1
  40. package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
  41. package/Culling/boundingBox.js +3 -2
  42. package/Culling/boundingBox.js.map +1 -1
  43. package/Culling/ray.js +2 -1
  44. package/Culling/ray.js.map +1 -1
  45. package/Debug/directionalLightFrustumViewer.js +9 -7
  46. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  47. package/Debug/rayHelper.js +2 -1
  48. package/Debug/rayHelper.js.map +1 -1
  49. package/Debug/skeletonViewer.js +29 -24
  50. package/Debug/skeletonViewer.js.map +1 -1
  51. package/DeviceInput/InputDevices/deviceSourceManager.js +5 -3
  52. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  53. package/DeviceInput/internalDeviceSourceManager.js +2 -1
  54. package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
  55. package/DeviceInput/webDeviceInputSystem.js +12 -9
  56. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  57. package/Engines/Extensions/engine.rawTexture.js +4 -4
  58. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  59. package/Engines/Extensions/engine.readTexture.js +3 -2
  60. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  61. package/Engines/Extensions/engine.views.js +2 -1
  62. package/Engines/Extensions/engine.views.js.map +1 -1
  63. package/Engines/Processors/shaderProcessor.js +11 -6
  64. package/Engines/Processors/shaderProcessor.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +1 -1
  66. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +2 -1
  68. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/engine.multiRender.js +2 -1
  70. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  71. package/Engines/WebGPU/Extensions/engine.query.js +4 -2
  72. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  73. package/Engines/WebGPU/Extensions/engine.rawTexture.js +4 -4
  74. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  75. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -1
  76. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  77. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +3 -2
  78. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  79. package/Engines/WebGPU/Extensions/engine.textureSampler.js +2 -1
  80. package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
  81. package/Engines/WebGPU/Extensions/engine.videoTexture.js +2 -1
  82. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  83. package/Engines/WebGPU/webgpuCacheBindGroups.js +7 -6
  84. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  85. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -14
  86. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  87. package/Engines/WebGPU/webgpuCacheSampler.js +4 -3
  88. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  89. package/Engines/WebGPU/webgpuClearQuad.js +3 -2
  90. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  91. package/Engines/WebGPU/webgpuComputePipelineContext.js +2 -1
  92. package/Engines/WebGPU/webgpuComputePipelineContext.js.map +1 -1
  93. package/Engines/WebGPU/webgpuDepthCullingState.js +2 -2
  94. package/Engines/WebGPU/webgpuDepthCullingState.js.map +1 -1
  95. package/Engines/WebGPU/webgpuDrawContext.js +2 -1
  96. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  97. package/Engines/WebGPU/webgpuHardwareTexture.js +4 -3
  98. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  99. package/Engines/WebGPU/webgpuMaterialContext.js +5 -4
  100. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  101. package/Engines/WebGPU/webgpuOcclusionQuery.js +5 -3
  102. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  103. package/Engines/WebGPU/webgpuPipelineContext.js +4 -2
  104. package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
  105. package/Engines/WebGPU/webgpuShaderProcessingContext.js +4 -2
  106. package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
  107. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +2 -1
  108. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  109. package/Engines/WebGPU/webgpuSnapshotRendering.js +3 -2
  110. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
  111. package/Engines/WebGPU/webgpuStencilStateComposer.js +2 -1
  112. package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
  113. package/Engines/WebGPU/webgpuTextureHelper.js +40 -38
  114. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  115. package/Engines/engine.d.ts +898 -273
  116. package/Engines/engine.js +5 -3
  117. package/Engines/engine.js.map +1 -1
  118. package/Engines/nativeEngine.js +7 -5
  119. package/Engines/nativeEngine.js.map +1 -1
  120. package/Engines/nullEngine.d.ts +7 -0
  121. package/Engines/nullEngine.js +42 -0
  122. package/Engines/nullEngine.js.map +1 -1
  123. package/Engines/renderTargetWrapper.js +14 -9
  124. package/Engines/renderTargetWrapper.js.map +1 -1
  125. package/Engines/thinEngine.js +25 -16
  126. package/Engines/thinEngine.js.map +1 -1
  127. package/Engines/webgpuEngine.js +87 -61
  128. package/Engines/webgpuEngine.js.map +1 -1
  129. package/Gamepads/gamepadManager.js +1 -1
  130. package/Gamepads/gamepadManager.js.map +1 -1
  131. package/Gizmos/axisDragGizmo.js +4 -2
  132. package/Gizmos/axisDragGizmo.js.map +1 -1
  133. package/Gizmos/axisScaleGizmo.js +6 -4
  134. package/Gizmos/axisScaleGizmo.js.map +1 -1
  135. package/Gizmos/gizmo.js +21 -6
  136. package/Gizmos/gizmo.js.map +1 -1
  137. package/Gizmos/gizmoManager.js +3 -2
  138. package/Gizmos/gizmoManager.js.map +1 -1
  139. package/Gizmos/planeDragGizmo.js +4 -2
  140. package/Gizmos/planeDragGizmo.js.map +1 -1
  141. package/Gizmos/planeRotationGizmo.js +4 -2
  142. package/Gizmos/planeRotationGizmo.js.map +1 -1
  143. package/Helpers/videoDome.js +2 -1
  144. package/Helpers/videoDome.js.map +1 -1
  145. package/Layers/effectLayer.js +5 -3
  146. package/Layers/effectLayer.js.map +1 -1
  147. package/Layers/glowLayer.js +4 -3
  148. package/Layers/glowLayer.js.map +1 -1
  149. package/Layers/highlightLayer.js +2 -1
  150. package/Layers/highlightLayer.js.map +1 -1
  151. package/LensFlares/lensFlareSystem.js +2 -1
  152. package/LensFlares/lensFlareSystem.js.map +1 -1
  153. package/Lights/Shadows/cascadedShadowGenerator.js +25 -21
  154. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  155. package/Lights/Shadows/shadowGenerator.js +13 -8
  156. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  157. package/Loading/Plugins/babylonFileLoader.js +2 -1
  158. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  159. package/Loading/sceneLoader.d.ts +1 -1
  160. package/Loading/sceneLoader.js +3 -3
  161. package/Loading/sceneLoader.js.map +1 -1
  162. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +2 -1
  163. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  164. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +2 -1
  165. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  166. package/Materials/Node/Blocks/Dual/textureBlock.js +10 -6
  167. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  168. package/Materials/Node/Blocks/Fragment/TBNBlock.js +3 -2
  169. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  170. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +2 -1
  171. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  172. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +2 -1
  173. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  174. package/Materials/Node/Blocks/Input/inputBlock.js +2 -1
  175. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  176. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +26 -24
  177. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  178. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +3 -3
  179. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
  180. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +48 -44
  181. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  182. package/Materials/Node/Blocks/PBR/reflectionBlock.js +2 -1
  183. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  184. package/Materials/Node/Blocks/PBR/refractionBlock.js +2 -1
  185. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  186. package/Materials/Node/Blocks/PBR/sheenBlock.js +13 -13
  187. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  188. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +27 -26
  189. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  190. package/Materials/Node/Blocks/Vertex/instancesBlock.js +2 -2
  191. package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
  192. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +6 -6
  193. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  194. package/Materials/Node/Blocks/cloudBlock.js +3 -2
  195. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  196. package/Materials/Node/Blocks/colorMergerBlock.js +5 -4
  197. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  198. package/Materials/Node/Blocks/customBlock.js +4 -3
  199. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  200. package/Materials/Node/Blocks/vectorMergerBlock.js +5 -4
  201. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  202. package/Materials/Node/nodeMaterial.js +7 -6
  203. package/Materials/Node/nodeMaterial.js.map +1 -1
  204. package/Materials/Node/nodeMaterialBlock.js +4 -3
  205. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  206. package/Materials/Node/nodeMaterialDecorator.js +1 -1
  207. package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
  208. package/Materials/PBR/pbrBaseMaterial.js +25 -19
  209. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  210. package/Materials/PBR/pbrClearCoatConfiguration.js +9 -6
  211. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  212. package/Materials/PBR/pbrIridescenceConfiguration.js +7 -4
  213. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
  214. package/Materials/PBR/pbrSheenConfiguration.js +7 -4
  215. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  216. package/Materials/Textures/Loaders/envTextureLoader.js +2 -2
  217. package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
  218. package/Materials/Textures/Packer/packer.js +14 -13
  219. package/Materials/Textures/Packer/packer.js.map +1 -1
  220. package/Materials/Textures/Procedurals/customProceduralTexture.d.ts +2 -1
  221. package/Materials/Textures/Procedurals/customProceduralTexture.js.map +1 -1
  222. package/Materials/Textures/Procedurals/noiseProceduralTexture.js +2 -1
  223. package/Materials/Textures/Procedurals/noiseProceduralTexture.js.map +1 -1
  224. package/Materials/Textures/Procedurals/proceduralTexture.js +7 -4
  225. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  226. package/Materials/Textures/baseTexture.d.ts +5 -4
  227. package/Materials/Textures/baseTexture.js +1 -0
  228. package/Materials/Textures/baseTexture.js.map +1 -1
  229. package/Materials/Textures/cubeTexture.js +8 -4
  230. package/Materials/Textures/cubeTexture.js.map +1 -1
  231. package/Materials/Textures/hdrCubeTexture.js +4 -2
  232. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  233. package/Materials/Textures/internalTexture.js +4 -2
  234. package/Materials/Textures/internalTexture.js.map +1 -1
  235. package/Materials/Textures/mirrorTexture.js +6 -3
  236. package/Materials/Textures/mirrorTexture.js.map +1 -1
  237. package/Materials/Textures/multiRenderTarget.js +6 -4
  238. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  239. package/Materials/Textures/rawTexture.js +1 -1
  240. package/Materials/Textures/rawTexture.js.map +1 -1
  241. package/Materials/Textures/renderTargetTexture.js +26 -15
  242. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  243. package/Materials/Textures/texture.js +16 -13
  244. package/Materials/Textures/texture.js.map +1 -1
  245. package/Materials/Textures/thinRenderTargetTexture.js +4 -2
  246. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  247. package/Materials/Textures/thinTexture.d.ts +3 -3
  248. package/Materials/Textures/thinTexture.js.map +1 -1
  249. package/Materials/Textures/videoTexture.js +3 -3
  250. package/Materials/Textures/videoTexture.js.map +1 -1
  251. package/Materials/drawWrapper.js +4 -2
  252. package/Materials/drawWrapper.js.map +1 -1
  253. package/Materials/effect.js +15 -10
  254. package/Materials/effect.js.map +1 -1
  255. package/Materials/material.d.ts +14 -0
  256. package/Materials/material.detailMapConfiguration.js +2 -1
  257. package/Materials/material.detailMapConfiguration.js.map +1 -1
  258. package/Materials/material.js +35 -3
  259. package/Materials/material.js.map +1 -1
  260. package/Materials/materialDefines.js +6 -5
  261. package/Materials/materialDefines.js.map +1 -1
  262. package/Materials/materialHelper.js +1 -1
  263. package/Materials/materialHelper.js.map +1 -1
  264. package/Materials/materialPluginManager.js +3 -2
  265. package/Materials/materialPluginManager.js.map +1 -1
  266. package/Materials/multiMaterial.js +2 -1
  267. package/Materials/multiMaterial.js.map +1 -1
  268. package/Materials/shaderMaterial.js +12 -9
  269. package/Materials/shaderMaterial.js.map +1 -1
  270. package/Materials/shadowDepthWrapper.js +13 -8
  271. package/Materials/shadowDepthWrapper.js.map +1 -1
  272. package/Materials/standardMaterial.js +12 -10
  273. package/Materials/standardMaterial.js.map +1 -1
  274. package/Materials/uniformBuffer.js +1 -1
  275. package/Materials/uniformBuffer.js.map +1 -1
  276. package/Maths/math.vector.d.ts +7 -6
  277. package/Maths/math.vector.js +10 -8
  278. package/Maths/math.vector.js.map +1 -1
  279. package/Meshes/Builders/groundBuilder.js +1 -1
  280. package/Meshes/Builders/groundBuilder.js.map +1 -1
  281. package/Meshes/abstractMesh.js +8 -5
  282. package/Meshes/abstractMesh.js.map +1 -1
  283. package/Meshes/csg.js +2 -1
  284. package/Meshes/csg.js.map +1 -1
  285. package/Meshes/instancedMesh.js +2 -1
  286. package/Meshes/instancedMesh.js.map +1 -1
  287. package/Meshes/mesh.d.ts +1 -1
  288. package/Meshes/mesh.js +23 -13
  289. package/Meshes/mesh.js.map +1 -1
  290. package/Meshes/mesh.vertexData.js +4 -3
  291. package/Meshes/mesh.vertexData.js.map +1 -1
  292. package/Meshes/subMesh.js +14 -8
  293. package/Meshes/subMesh.js.map +1 -1
  294. package/Meshes/thinInstanceMesh.js +18 -12
  295. package/Meshes/thinInstanceMesh.js.map +1 -1
  296. package/Meshes/transformNode.d.ts +7 -1
  297. package/Meshes/transformNode.js +15 -4
  298. package/Meshes/transformNode.js.map +1 -1
  299. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +2 -1
  300. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  301. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +12 -8
  302. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  303. package/Misc/PerformanceViewer/performanceViewerCollector.js +3 -2
  304. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  305. package/Misc/arrayTools.js +1 -1
  306. package/Misc/arrayTools.js.map +1 -1
  307. package/Misc/assetsManager.d.ts +22 -4
  308. package/Misc/assetsManager.js +20 -8
  309. package/Misc/assetsManager.js.map +1 -1
  310. package/Misc/computePressure.js +9 -6
  311. package/Misc/computePressure.js.map +1 -1
  312. package/Misc/dataStorage.js +1 -1
  313. package/Misc/dataStorage.js.map +1 -1
  314. package/Misc/dds.js +1 -1
  315. package/Misc/dds.js.map +1 -1
  316. package/Misc/environmentTextureTools.js +3 -2
  317. package/Misc/environmentTextureTools.js.map +1 -1
  318. package/Misc/fileTools.js +31 -8
  319. package/Misc/fileTools.js.map +1 -1
  320. package/Misc/logger.js +2 -1
  321. package/Misc/logger.js.map +1 -1
  322. package/Misc/minMaxReducer.js +3 -2
  323. package/Misc/minMaxReducer.js.map +1 -1
  324. package/Misc/sceneRecorder.js +1 -1
  325. package/Misc/sceneRecorder.js.map +1 -1
  326. package/Misc/textureTools.js +3 -3
  327. package/Misc/textureTools.js.map +1 -1
  328. package/Misc/timer.js +5 -3
  329. package/Misc/timer.js.map +1 -1
  330. package/Misc/tools.js +4 -4
  331. package/Misc/tools.js.map +1 -1
  332. package/Misc/trajectoryClassifier.js +3 -3
  333. package/Misc/trajectoryClassifier.js.map +1 -1
  334. package/Particles/EmitterTypes/meshParticleEmitter.js +2 -1
  335. package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
  336. package/Particles/computeShaderParticleSystem.js +6 -3
  337. package/Particles/computeShaderParticleSystem.js.map +1 -1
  338. package/Particles/gpuParticleSystem.js +13 -8
  339. package/Particles/gpuParticleSystem.js.map +1 -1
  340. package/Particles/particleSystem.js +22 -14
  341. package/Particles/particleSystem.js.map +1 -1
  342. package/Particles/particleSystemComponent.js +2 -1
  343. package/Particles/particleSystemComponent.js.map +1 -1
  344. package/Particles/pointsCloudSystem.js +7 -4
  345. package/Particles/pointsCloudSystem.js.map +1 -1
  346. package/Particles/solidParticleSystem.js +2 -2
  347. package/Particles/solidParticleSystem.js.map +1 -1
  348. package/Particles/webgl2ParticleSystem.js +2 -1
  349. package/Particles/webgl2ParticleSystem.js.map +1 -1
  350. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +5 -4
  351. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  352. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -2
  353. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  354. package/PostProcesses/colorCorrectionPostProcess.js +1 -1
  355. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  356. package/PostProcesses/postProcess.js +8 -5
  357. package/PostProcesses/postProcess.js.map +1 -1
  358. package/PostProcesses/postProcessManager.js +6 -4
  359. package/PostProcesses/postProcessManager.js.map +1 -1
  360. package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -1
  361. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  362. package/PostProcesses/volumetricLightScatteringPostProcess.js +7 -4
  363. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  364. package/PostProcesses/vrMultiviewToSingleviewPostProcess.js +1 -1
  365. package/PostProcesses/vrMultiviewToSingleviewPostProcess.js.map +1 -1
  366. package/Probes/reflectionProbe.js +4 -2
  367. package/Probes/reflectionProbe.js.map +1 -1
  368. package/Rendering/boundingBoxRenderer.js +3 -2
  369. package/Rendering/boundingBoxRenderer.js.map +1 -1
  370. package/Rendering/depthPeelingRenderer.d.ts +12 -0
  371. package/Rendering/depthPeelingRenderer.js +30 -6
  372. package/Rendering/depthPeelingRenderer.js.map +1 -1
  373. package/Rendering/depthPeelingSceneComponent.js +4 -2
  374. package/Rendering/depthPeelingSceneComponent.js.map +1 -1
  375. package/Rendering/depthRenderer.js +10 -6
  376. package/Rendering/depthRenderer.js.map +1 -1
  377. package/Rendering/edgesRenderer.js +11 -8
  378. package/Rendering/edgesRenderer.js.map +1 -1
  379. package/Rendering/outlineRenderer.js +2 -2
  380. package/Rendering/outlineRenderer.js.map +1 -1
  381. package/Rendering/prePassRenderer.js +4 -2
  382. package/Rendering/prePassRenderer.js.map +1 -1
  383. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +3 -3
  384. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  385. package/Shaders/pbr.fragment.js +4 -1
  386. package/Shaders/pbr.fragment.js.map +1 -1
  387. package/Sprites/spriteManager.js +2 -1
  388. package/Sprites/spriteManager.js.map +1 -1
  389. package/Sprites/spriteRenderer.js +2 -1
  390. package/Sprites/spriteRenderer.js.map +1 -1
  391. package/States/stencilStateComposer.js +4 -2
  392. package/States/stencilStateComposer.js.map +1 -1
  393. package/XR/features/WebXRAnchorSystem.js +2 -1
  394. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  395. package/XR/features/WebXRControllerMovement.js +7 -6
  396. package/XR/features/WebXRControllerMovement.js.map +1 -1
  397. package/XR/features/WebXRControllerPhysics.js +6 -4
  398. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  399. package/XR/features/WebXRControllerPointerSelection.js +2 -1
  400. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  401. package/XR/features/WebXRHandTracking.d.ts +3 -3
  402. package/XR/features/WebXRHandTracking.js +126 -118
  403. package/XR/features/WebXRHandTracking.js.map +1 -1
  404. package/XR/features/WebXRHitTest.js.map +1 -1
  405. package/XR/features/WebXRLayers.js +1 -1
  406. package/XR/features/WebXRLayers.js.map +1 -1
  407. package/XR/features/WebXRLightEstimation.js +7 -4
  408. package/XR/features/WebXRLightEstimation.js.map +1 -1
  409. package/XR/features/WebXRMeshDetector.js +2 -1
  410. package/XR/features/WebXRMeshDetector.js.map +1 -1
  411. package/XR/features/WebXRNearInteraction.js +7 -4
  412. package/XR/features/WebXRNearInteraction.js.map +1 -1
  413. package/XR/features/WebXRPlaneDetector.js +2 -1
  414. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  415. package/XR/native/nativeXRFrame.js +2 -1
  416. package/XR/native/nativeXRFrame.js.map +1 -1
  417. package/XR/webXRCamera.js +2 -1
  418. package/XR/webXRCamera.js.map +1 -1
  419. package/XR/webXRExperienceHelper.js +7 -5
  420. package/XR/webXRExperienceHelper.js.map +1 -1
  421. package/XR/webXRInput.js.map +1 -1
  422. package/XR/webXRInputSource.js +2 -1
  423. package/XR/webXRInputSource.js.map +1 -1
  424. package/XR/webXRManagedOutputCanvas.js +0 -1
  425. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  426. package/XR/webXRSessionManager.js +27 -14
  427. package/XR/webXRSessionManager.js.map +1 -1
  428. package/XR/webXRWebGLLayer.js +3 -0
  429. package/XR/webXRWebGLLayer.js.map +1 -1
  430. package/package.json +1 -1
  431. package/scene.js +17 -11
  432. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"trajectoryClassifier.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Misc/trajectoryClassifier.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\n\r\n// This implementation was based on the original MIT-licensed TRACE repository\r\n// from https://github.com/septagon/TRACE.\r\n\r\n/**\r\n * Generic implementation of Levenshtein distance.\r\n */\r\nnamespace Levenshtein {\r\n /**\r\n * Alphabet from which to construct sequences to be compared using Levenshtein\r\n * distance.\r\n */\r\n export class Alphabet<T> {\r\n private _characterToIdx: Map<T, number>;\r\n private _insertionCosts: number[];\r\n private _deletionCosts: number[];\r\n private _substitutionCosts: number[][];\r\n\r\n /**\r\n * Serialize the Alphabet to JSON string.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n\r\n const characters = new Array<T>(this._characterToIdx.size);\r\n this._characterToIdx.forEach((v, k) => {\r\n characters[v] = k;\r\n });\r\n jsonObject[\"characters\"] = characters;\r\n\r\n jsonObject[\"insertionCosts\"] = this._insertionCosts;\r\n jsonObject[\"deletionCosts\"] = this._deletionCosts;\r\n jsonObject[\"substitutionCosts\"] = this._substitutionCosts;\r\n\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Parse an Alphabet from a JSON serialization.\r\n * @param json JSON string to deserialize\r\n * @returns deserialized Alphabet\r\n */\r\n public static Deserialize<T>(json: string): Alphabet<T> {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Alphabet(jsonObject[\"characters\"] as T[]);\r\n alphabet._insertionCosts = jsonObject[\"insertionCosts\"];\r\n alphabet._deletionCosts = jsonObject[\"deletionCosts\"];\r\n alphabet._substitutionCosts = jsonObject[\"substitutionCosts\"];\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Create a new Alphabet.\r\n * @param characters characters of the alphabet\r\n * @param charToInsertionCost function mapping characters to insertion costs\r\n * @param charToDeletionCost function mapping characters to deletion costs\r\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\r\n */\r\n public constructor(\r\n characters: Array<T>,\r\n charToInsertionCost: Nullable<(char: T) => number> = null,\r\n charToDeletionCost: Nullable<(char: T) => number> = null,\r\n charsToSubstitutionCost: Nullable<(outChar: T, inChar: T) => number> = null\r\n ) {\r\n charToInsertionCost = charToInsertionCost ?? (() => 1);\r\n charToDeletionCost = charToDeletionCost ?? (() => 1);\r\n charsToSubstitutionCost = charsToSubstitutionCost ?? ((a: T, b: T) => (a === b ? 0 : 1));\r\n\r\n this._characterToIdx = new Map<T, number>();\r\n this._insertionCosts = new Array<number>(characters.length);\r\n this._deletionCosts = new Array<number>(characters.length);\r\n this._substitutionCosts = new Array<Array<number>>(characters.length);\r\n\r\n let c: T;\r\n for (let outerIdx = 0; outerIdx < characters.length; ++outerIdx) {\r\n c = characters[outerIdx];\r\n this._characterToIdx.set(c, outerIdx);\r\n this._insertionCosts[outerIdx] = charToInsertionCost(c);\r\n this._deletionCosts[outerIdx] = charToDeletionCost(c);\r\n\r\n this._substitutionCosts[outerIdx] = new Array<number>(characters.length);\r\n for (let innerIdx = outerIdx; innerIdx < characters.length; ++innerIdx) {\r\n this._substitutionCosts[outerIdx][innerIdx] = charsToSubstitutionCost(c, characters[innerIdx]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the index (internally-assigned number) for a character.\r\n * @param char character\r\n * @returns index\r\n */\r\n public getCharacterIdx(char: T): number {\r\n return this._characterToIdx.get(char)!;\r\n }\r\n\r\n /**\r\n * Get the insertion cost of a character from its index.\r\n * @param idx character index\r\n * @returns insertion cost\r\n */\r\n public getInsertionCost(idx: number): number {\r\n return this._insertionCosts[idx];\r\n }\r\n\r\n /**\r\n * Get the deletion cost of a character from its index.\r\n * @param idx character index\r\n * @returns deletion cost\r\n */\r\n public getDeletionCost(idx: number): number {\r\n return this._deletionCosts[idx];\r\n }\r\n\r\n /**\r\n * Gets the cost to substitute two characters. NOTE: this cost is\r\n * required to be bi-directional, meaning it cannot matter which of\r\n * the provided characters is being removed and which is being inserted.\r\n * @param idx1 the first character index\r\n * @param idx2 the second character index\r\n * @returns substitution cost\r\n */\r\n public getSubstitutionCost(idx1: number, idx2: number): number {\r\n const min = Math.min(idx1, idx2);\r\n const max = Math.max(idx1, idx2);\r\n\r\n return this._substitutionCosts[min][max];\r\n }\r\n }\r\n\r\n /**\r\n * Character sequence intended to be compared against other Sequences created\r\n * with the same Alphabet in order to compute Levenshtein distance.\r\n */\r\n export class Sequence<T> {\r\n private _alphabet: Alphabet<T>;\r\n private _characters: number[];\r\n\r\n // Scratch values\r\n private static readonly _MAX_SEQUENCE_LENGTH = 256;\r\n private static _CostMatrix = [...Array(Sequence._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array<number>(Sequence._MAX_SEQUENCE_LENGTH + 1));\r\n private static _InsertionCost: number;\r\n private static _DeletionCost: number;\r\n private static _SubstitutionCost: number;\r\n\r\n /**\r\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\r\n * from which this Sequence was created; Alphabet must be independently\r\n * serialized.\r\n * @returns JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._characters);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the Sequence was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation of Sequence\r\n * @param alphabet Alphabet from which Sequence was originally created\r\n * @returns Sequence\r\n */\r\n public static Deserialize<T>(json: string, alphabet: Alphabet<T>): Sequence<T> {\r\n const sequence = new Sequence([], alphabet);\r\n sequence._characters = JSON.parse(json);\r\n return sequence;\r\n }\r\n\r\n /**\r\n * Create a new Sequence.\r\n * @param characters characters in the new Sequence\r\n * @param alphabet Alphabet, which must include all used characters\r\n */\r\n public constructor(characters: T[], alphabet: Alphabet<T>) {\r\n if (characters.length > Sequence._MAX_SEQUENCE_LENGTH) {\r\n throw new Error(\"Sequences longer than \" + Sequence._MAX_SEQUENCE_LENGTH + \" not supported.\");\r\n }\r\n this._alphabet = alphabet;\r\n this._characters = characters.map((c) => this._alphabet.getCharacterIdx(c));\r\n }\r\n\r\n /**\r\n * Get the distance between this Sequence and another.\r\n * @param other sequence to compare to\r\n * @returns Levenshtein distance\r\n */\r\n public distance(other: Sequence<T>): number {\r\n return Sequence._Distance<T>(this, other);\r\n }\r\n\r\n /**\r\n * Compute the Levenshtein distance between two Sequences.\r\n * @param a first Sequence\r\n * @param b second Sequence\r\n * @returns Levenshtein distance\r\n */\r\n private static _Distance<T>(a: Sequence<T>, b: Sequence<T>): number {\r\n const alphabet = a._alphabet;\r\n if (alphabet !== b._alphabet) {\r\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\r\n }\r\n const aChars = a._characters;\r\n const bChars = b._characters;\r\n const aLength = aChars.length;\r\n const bLength = bChars.length;\r\n\r\n const costMatrix = Sequence._CostMatrix;\r\n costMatrix[0][0] = 0;\r\n for (let idx = 0; idx < aLength; ++idx) {\r\n costMatrix[idx + 1][0] = costMatrix[idx][0] + alphabet.getInsertionCost(aChars[idx]);\r\n }\r\n for (let idx = 0; idx < bLength; ++idx) {\r\n costMatrix[0][idx + 1] = costMatrix[0][idx] + alphabet.getInsertionCost(bChars[idx]);\r\n }\r\n\r\n for (let aIdx = 0; aIdx < aLength; ++aIdx) {\r\n for (let bIdx = 0; bIdx < bLength; ++bIdx) {\r\n Sequence._InsertionCost = costMatrix[aIdx + 1][bIdx] + alphabet.getInsertionCost(bChars[bIdx]);\r\n Sequence._DeletionCost = costMatrix[aIdx][bIdx + 1] + alphabet.getDeletionCost(aChars[aIdx]);\r\n Sequence._SubstitutionCost = costMatrix[aIdx][bIdx] + alphabet.getSubstitutionCost(aChars[aIdx], bChars[bIdx]);\r\n\r\n costMatrix[aIdx + 1][bIdx + 1] = Math.min(Sequence._InsertionCost, Sequence._DeletionCost, Sequence._SubstitutionCost);\r\n }\r\n }\r\n\r\n return costMatrix[aLength][bLength];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A 3D trajectory consisting of an order list of vectors describing a\r\n * path of motion through 3D space.\r\n */\r\nexport class Trajectory {\r\n private _points: Vector3[];\r\n private readonly _segmentLength: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns serialized JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json serialized JSON string\r\n * @returns deserialized Trajectory\r\n */\r\n public static Deserialize(json: string): Trajectory {\r\n const jsonObject = JSON.parse(json);\r\n const trajectory = new Trajectory(jsonObject[\"_segmentLength\"]);\r\n trajectory._points = jsonObject[\"_points\"].map((pt: any) => {\r\n return new Vector3(pt[\"_x\"], pt[\"_y\"], pt[\"_z\"]);\r\n });\r\n return trajectory;\r\n }\r\n\r\n /**\r\n * Create a new empty Trajectory.\r\n * @param segmentLength radius of discretization for Trajectory points\r\n */\r\n public constructor(segmentLength: number = 0.01) {\r\n this._points = [];\r\n this._segmentLength = segmentLength;\r\n }\r\n\r\n /**\r\n * Get the length of the Trajectory.\r\n * @returns length of the Trajectory\r\n */\r\n public getLength(): number {\r\n return this._points.length * this._segmentLength;\r\n }\r\n\r\n /**\r\n * Append a new point to the Trajectory.\r\n * NOTE: This implementation has many allocations.\r\n * @param point point to append to the Trajectory\r\n */\r\n public add(point: DeepImmutable<Vector3>): void {\r\n let numPoints = this._points.length;\r\n if (numPoints === 0) {\r\n this._points.push(point.clone());\r\n } else {\r\n const getT = () => this._segmentLength / Vector3.Distance(this._points[numPoints - 1], point);\r\n for (let t = getT(); t <= 1.0; t = getT()) {\r\n const newPoint = this._points[numPoints - 1].scale(1.0 - t);\r\n point.scaleAndAddToRef(t, newPoint);\r\n this._points.push(newPoint);\r\n ++numPoints;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Trajectory with a segment length chosen to make it\r\n * probable that the new Trajectory will have a specified number of\r\n * segments. This operation is imprecise.\r\n * @param targetResolution number of segments desired\r\n * @returns new Trajectory with approximately the requested number of segments\r\n */\r\n public resampleAtTargetResolution(targetResolution: number): Trajectory {\r\n const resampled = new Trajectory(this.getLength() / targetResolution);\r\n this._points.forEach((pt) => {\r\n resampled.add(pt);\r\n });\r\n return resampled;\r\n }\r\n\r\n /**\r\n * Convert Trajectory segments into tokenized representation. This\r\n * representation is an array of numbers where each nth number is the\r\n * index of the token which is most similar to the nth segment of the\r\n * Trajectory.\r\n * @param tokens list of vectors which serve as discrete tokens\r\n * @returns list of indices of most similar token per segment\r\n */\r\n public tokenize(tokens: DeepImmutable<Vector3[]>): number[] {\r\n const tokenization: number[] = [];\r\n\r\n const segmentDir = new Vector3();\r\n for (let idx = 2; idx < this._points.length; ++idx) {\r\n if (Trajectory._TransformSegmentDirToRef(this._points[idx - 2], this._points[idx - 1], this._points[idx], segmentDir)) {\r\n tokenization.push(Trajectory._TokenizeSegment(segmentDir, tokens));\r\n }\r\n }\r\n\r\n return tokenization;\r\n }\r\n\r\n private static _ForwardDir = new Vector3();\r\n private static _InverseFromVec = new Vector3();\r\n private static _UpDir = new Vector3();\r\n private static _FromToVec = new Vector3();\r\n private static _LookMatrix = new Matrix();\r\n\r\n /**\r\n * Transform the rotation (i.e., direction) of a segment to isolate\r\n * the relative transformation represented by the segment. This operation\r\n * may or may not succeed due to singularities in the equations that define\r\n * motion relativity in this context.\r\n * @param priorVec the origin of the prior segment\r\n * @param fromVec the origin of the current segment\r\n * @param toVec the destination of the current segment\r\n * @param result reference to output variable\r\n * @returns whether or not transformation was successful\r\n */\r\n private static _TransformSegmentDirToRef(priorVec: DeepImmutable<Vector3>, fromVec: DeepImmutable<Vector3>, toVec: DeepImmutable<Vector3>, result: Vector3): boolean {\r\n const DOT_PRODUCT_SAMPLE_REJECTION_THRESHOLD = 0.98;\r\n\r\n fromVec.subtractToRef(priorVec, Trajectory._ForwardDir);\r\n Trajectory._ForwardDir.normalize();\r\n fromVec.scaleToRef(-1, Trajectory._InverseFromVec);\r\n Trajectory._InverseFromVec.normalize();\r\n\r\n if (Math.abs(Vector3.Dot(Trajectory._ForwardDir, Trajectory._InverseFromVec)) > DOT_PRODUCT_SAMPLE_REJECTION_THRESHOLD) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(Trajectory._ForwardDir, Trajectory._InverseFromVec, Trajectory._UpDir);\r\n Trajectory._UpDir.normalize();\r\n Matrix.LookAtLHToRef(priorVec, fromVec, Trajectory._UpDir, Trajectory._LookMatrix);\r\n toVec.subtractToRef(fromVec, Trajectory._FromToVec);\r\n Trajectory._FromToVec.normalize();\r\n Vector3.TransformNormalToRef(Trajectory._FromToVec, Trajectory._LookMatrix, result);\r\n return true;\r\n }\r\n\r\n private static _BestMatch: number;\r\n private static _Score: number;\r\n private static _BestScore: number;\r\n\r\n /**\r\n * Determine which token vector is most similar to the\r\n * segment vector.\r\n * @param segment segment vector\r\n * @param tokens token vector list\r\n * @returns index of the most similar token to the segment\r\n */\r\n private static _TokenizeSegment(segment: DeepImmutable<Vector3>, tokens: DeepImmutable<Vector3[]>): number {\r\n Trajectory._BestMatch = 0;\r\n Trajectory._Score = Vector3.Dot(segment, tokens[0]);\r\n Trajectory._BestScore = Trajectory._Score;\r\n for (let idx = 1; idx < tokens.length; ++idx) {\r\n Trajectory._Score = Vector3.Dot(segment, tokens[idx]);\r\n if (Trajectory._Score > Trajectory._BestScore) {\r\n Trajectory._BestMatch = idx;\r\n Trajectory._BestScore = Trajectory._Score;\r\n }\r\n }\r\n\r\n return Trajectory._BestMatch;\r\n }\r\n}\r\n\r\n/**\r\n * Collection of vectors intended to be used as the basis of Trajectory\r\n * tokenization for Levenshtein distance comparison. Canonically, a\r\n * Vector3Alphabet will resemble a \"spikeball\" of vectors distributed\r\n * roughly evenly over the surface of the unit sphere.\r\n */\r\nclass Vector3Alphabet {\r\n /**\r\n * Characters in the alphabet.\r\n * NOTE: There is no reason for this property to exist and this class should just extend\r\n * Array<Vector3>, except that doing so produces bizarre build-time errors indicating that\r\n * the ES5 library itself fails its own TypeDoc validation.\r\n */\r\n public chars: Vector3[];\r\n\r\n /**\r\n * Helper method to create new \"spikeball\" Vector3Alphabets. Uses a naive\r\n * optimize-from-random strategy to space points around the unit sphere\r\n * surface as a simple alternative to really doing the math to tile the\r\n * sphere.\r\n * @param alphabetSize size of the desired alphabet\r\n * @param iterations number of iterations over which to optimize the \"spikeball\"\r\n * @param startingStepSize distance factor to move points in early optimization iterations\r\n * @param endingStepSize distance factor to move points in late optimization iterations\r\n * @param fixedValues alphabet \"characters\" that are required and cannot be moved by optimization\r\n * @returns a new randomly generated and optimized Vector3Alphabet of the specified size\r\n */\r\n public static Generate(\r\n alphabetSize: number = 64,\r\n iterations: number = 256,\r\n startingStepSize: number = 0.1,\r\n endingStepSize: number = 0.001,\r\n fixedValues: DeepImmutable<Vector3[]> = []\r\n ): Vector3Alphabet {\r\n const EPSILON = 0.001;\r\n const EPSILON_SQUARED = EPSILON * EPSILON;\r\n\r\n const alphabet = new Vector3Alphabet(alphabetSize);\r\n for (let idx = 0; idx < alphabetSize; ++idx) {\r\n alphabet.chars[idx] = new Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);\r\n alphabet.chars[idx].normalize();\r\n }\r\n\r\n for (let idx = 0; idx < fixedValues.length; ++idx) {\r\n alphabet.chars[idx].copyFrom(fixedValues[idx]);\r\n }\r\n\r\n let stepSize: number;\r\n let distSq: number;\r\n const force = new Vector3();\r\n const scratch = new Vector3();\r\n const lerp = (l: number, r: number, t: number) => (1.0 - t) * l + t * r;\r\n for (let iteration = 0; iteration < iterations; ++iteration) {\r\n stepSize = lerp(startingStepSize, endingStepSize, iteration / (iterations - 1));\r\n for (let idx = fixedValues.length; idx < alphabet.chars.length; ++idx) {\r\n force.copyFromFloats(0, 0, 0);\r\n alphabet.chars.forEach((pt) => {\r\n alphabet.chars[idx].subtractToRef(pt, scratch);\r\n distSq = scratch.lengthSquared();\r\n if (distSq > EPSILON_SQUARED) {\r\n scratch.scaleAndAddToRef(1 / (scratch.lengthSquared() * distSq), force);\r\n }\r\n });\r\n force.scaleInPlace(stepSize);\r\n alphabet.chars[idx].addInPlace(force);\r\n alphabet.chars[idx].normalize();\r\n }\r\n }\r\n\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this.chars);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized Vector3Alphabet\r\n */\r\n public static Deserialize(json: string): Vector3Alphabet {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Vector3Alphabet(jsonObject.length);\r\n for (let idx = 0; idx < jsonObject.length; ++idx) {\r\n alphabet.chars[idx] = new Vector3(jsonObject[idx][\"_x\"], jsonObject[idx][\"_y\"], jsonObject[idx][\"_z\"]);\r\n }\r\n return alphabet;\r\n }\r\n\r\n private constructor(size: number) {\r\n this.chars = new Array(size);\r\n }\r\n}\r\n\r\n/**\r\n * Class which formalizes the manner in which a Vector3Alphabet is used to tokenize and\r\n * describe a Trajectory. This class houses the functionality which determines what\r\n * attributes of Trajectories are and are not considered important, such as scale.\r\n */\r\nclass TrajectoryDescriptor {\r\n private static readonly _FINEST_DESCRIPTOR_RESOLUTION = 32;\r\n\r\n private _sequences: Levenshtein.Sequence<number>[];\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._sequences.map((sequence) => sequence.serialize()));\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptor was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON serialization\r\n * @param alphabet Alphabet from which descriptor was originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = (JSON.parse(json) as string[]).map((s) => Levenshtein.Sequence.Deserialize(s, alphabet));\r\n return descriptor;\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor to describe a provided Trajectory according\r\n * to the provided alphabets.\r\n * @param trajectory Trajectory to be described\r\n * @param vector3Alphabet Vector3Alphabet to be used to tokenize the Trajectory\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be used as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing provided Trajectory\r\n */\r\n public static CreateFromTrajectory(trajectory: Trajectory, vector3Alphabet: Vector3Alphabet, levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n return TrajectoryDescriptor.CreateFromTokenizationPyramid(TrajectoryDescriptor._GetTokenizationPyramid(trajectory, vector3Alphabet), levenshteinAlphabet);\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor from a pre-existing pyramid of tokens.\r\n * NOTE: This function exists to support an outdated serialization mechanism and should\r\n * be deleted if it is no longer useful.\r\n * @param pyramid tokenization pyramid\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be uses as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing the Trajectory from which the pyramid was built\r\n */\r\n public static CreateFromTokenizationPyramid(pyramid: number[][], levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = pyramid.map((tokens) => new Levenshtein.Sequence<number>(tokens, levenshteinAlphabet));\r\n return descriptor;\r\n }\r\n\r\n private constructor() {\r\n this._sequences = [];\r\n }\r\n\r\n /**\r\n * Create the tokenization pyramid for the provided Trajectory according to the given\r\n * Vector3Alphabet.\r\n * @param trajectory Trajectory to be tokenized\r\n * @param alphabet Vector3Alphabet containing tokens\r\n * @param targetResolution finest resolution of descriptor\r\n * @returns tokenization pyramid for Trajectory\r\n */\r\n private static _GetTokenizationPyramid(\r\n trajectory: Trajectory,\r\n alphabet: Vector3Alphabet,\r\n targetResolution: number = TrajectoryDescriptor._FINEST_DESCRIPTOR_RESOLUTION\r\n ): number[][] {\r\n const pyramid: number[][] = [];\r\n for (let res = targetResolution; res > 4; res = Math.floor(res / 2)) {\r\n pyramid.push(trajectory.resampleAtTargetResolution(res).tokenize(alphabet.chars));\r\n }\r\n return pyramid;\r\n }\r\n\r\n /**\r\n * Calculate a distance metric between this TrajectoryDescriptor and another. This is\r\n * essentially a similarity score and does not directly represent Euclidean distance,\r\n * edit distance, or any other formal distance metric.\r\n * @param other TrajectoryDescriptor from which to determine distance\r\n * @returns distance, a nonnegative similarity score where larger values indicate dissimilarity\r\n */\r\n public distance(other: TrajectoryDescriptor): number {\r\n let totalDistance = 0;\r\n let weight: number;\r\n for (let idx = 0; idx < this._sequences.length; ++idx) {\r\n weight = Math.pow(2, idx);\r\n totalDistance += weight * this._sequences[idx].distance(other._sequences[idx]);\r\n }\r\n return totalDistance;\r\n }\r\n}\r\n\r\n/**\r\n * A set of TrajectoryDescriptors defined to be \"the same.\" This is essentially a helper\r\n * class to facilitate methods of Trajectory clustering.\r\n */\r\nclass TrajectoryClass {\r\n private static readonly _MIN_AVERAGE_DISTANCE = 1;\r\n\r\n private _descriptors: TrajectoryDescriptor[];\r\n private _centroidIdx: number;\r\n private _averageDistance: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.descriptors = this._descriptors.map((desc) => desc.serialize());\r\n jsonObject.centroidIdx = this._centroidIdx;\r\n jsonObject.averageDistance = this._averageDistance;\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptors were originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation\r\n * @param alphabet Alphabet from which TrajectoryDescriptors were originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryClass {\r\n const jsonObject = JSON.parse(json);\r\n const described = new TrajectoryClass();\r\n described._descriptors = jsonObject.descriptors.map((s: string) => TrajectoryDescriptor.Deserialize(s, alphabet));\r\n described._centroidIdx = jsonObject.centroidIdx;\r\n described._averageDistance = jsonObject.averageDistance;\r\n return described;\r\n }\r\n\r\n /**\r\n * Create a new DescribedTrajectory.\r\n * @param descriptors currently-known TrajectoryDescriptors, if any\r\n */\r\n public constructor(descriptors: TrajectoryDescriptor[] = []) {\r\n this._descriptors = descriptors;\r\n this._centroidIdx = -1;\r\n this._averageDistance = 0;\r\n\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Add a new TrajectoryDescriptor to the list of descriptors known to describe\r\n * this same DescribedTrajectory.\r\n * @param descriptor descriptor to be added\r\n */\r\n public add(descriptor: TrajectoryDescriptor): void {\r\n this._descriptors.push(descriptor);\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Compute the cost, which is inversely related to the likelihood that the provided\r\n * TrajectoryDescriptor describes a Trajectory that is considered to be the same as\r\n * the class represented by this DescribedTrajectory.\r\n * @param descriptor the descriptor to be costed\r\n * @returns cost of the match, which is a nonnegative similarity metric where larger values indicate dissimilarity\r\n */\r\n public getMatchCost(descriptor: TrajectoryDescriptor): number {\r\n return descriptor.distance(this._descriptors[this._centroidIdx]) / this._averageDistance;\r\n }\r\n\r\n /**\r\n * Compute the minimum distance between the queried TrajectoryDescriptor and a\r\n * descriptor which is a member of this collection. This is an alternative way of\r\n * conceptualizing match cost from getMatchCost(), and it serves a different function.\r\n * @param descriptor the descriptor to find the minimum distance to\r\n * @returns minimum descriptor distance to a member descriptor of this DescribedTrajectory\r\n */\r\n public getMatchMinimumDistance(descriptor: TrajectoryDescriptor): number {\r\n return Math.min(...this._descriptors.map((desc) => desc.distance(descriptor)));\r\n }\r\n\r\n /**\r\n * Refreshes the internal representation of this DescribedTrajectory.\r\n */\r\n private _refreshDescription(): void {\r\n this._centroidIdx = -1;\r\n let sum: number;\r\n const distances = this._descriptors.map((a) => {\r\n sum = 0;\r\n this._descriptors.forEach((b) => {\r\n sum += a.distance(b);\r\n });\r\n return sum;\r\n });\r\n for (let idx = 0; idx < distances.length; ++idx) {\r\n if (this._centroidIdx < 0 || distances[idx] < distances[this._centroidIdx]) {\r\n this._centroidIdx = idx;\r\n }\r\n }\r\n\r\n this._averageDistance = 0;\r\n this._descriptors.forEach((desc) => {\r\n this._averageDistance += desc.distance(this._descriptors[this._centroidIdx]);\r\n });\r\n if (this._descriptors.length > 0) {\r\n this._averageDistance = Math.max(this._averageDistance / this._descriptors.length, TrajectoryClass._MIN_AVERAGE_DISTANCE);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class representing a set of known, named trajectories to which Trajectories can be\r\n * added and using which Trajectories can be recognized.\r\n */\r\nexport class TrajectoryClassifier {\r\n private _maximumAllowableMatchCost: number = 4;\r\n private _vector3Alphabet: Vector3Alphabet;\r\n private _levenshteinAlphabet: Levenshtein.Alphabet<number>;\r\n private _nameToDescribedTrajectory: Map<string, TrajectoryClass>;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.maximumAllowableMatchCost = this._maximumAllowableMatchCost;\r\n jsonObject.vector3Alphabet = this._vector3Alphabet.serialize();\r\n jsonObject.levenshteinAlphabet = this._levenshteinAlphabet.serialize();\r\n jsonObject.nameToDescribedTrajectory = [];\r\n this._nameToDescribedTrajectory.forEach((described, name) => {\r\n jsonObject.nameToDescribedTrajectory.push(name);\r\n jsonObject.nameToDescribedTrajectory.push(described.serialize());\r\n });\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized TrajectorySet\r\n */\r\n public static Deserialize(json: string): TrajectoryClassifier {\r\n const jsonObject = JSON.parse(json);\r\n const classifier = new TrajectoryClassifier();\r\n classifier._maximumAllowableMatchCost = jsonObject.maximumAllowableMatchCost;\r\n classifier._vector3Alphabet = Vector3Alphabet.Deserialize(jsonObject.vector3Alphabet);\r\n classifier._levenshteinAlphabet = Levenshtein.Alphabet.Deserialize<number>(jsonObject.levenshteinAlphabet);\r\n for (let idx = 0; idx < jsonObject.nameToDescribedTrajectory.length; idx += 2) {\r\n classifier._nameToDescribedTrajectory.set(\r\n jsonObject.nameToDescribedTrajectory[idx],\r\n TrajectoryClass.Deserialize(jsonObject.nameToDescribedTrajectory[idx + 1], classifier._levenshteinAlphabet)\r\n );\r\n }\r\n return classifier;\r\n }\r\n\r\n /**\r\n * Initialize a new empty TrajectorySet with auto-generated Alphabets.\r\n * VERY naive, need to be generating these things from known\r\n * sets. Better version later, probably eliminating this one.\r\n * @returns auto-generated TrajectorySet\r\n */\r\n public static Generate(): TrajectoryClassifier {\r\n const vecs = Vector3Alphabet.Generate(64, 256, 0.1, 0.001, [Vector3.Forward()]);\r\n\r\n const charIdxs = new Array(vecs.chars.length);\r\n for (let idx = 0; idx < charIdxs.length; ++idx) {\r\n charIdxs[idx] = idx;\r\n }\r\n\r\n const alphabet = new Levenshtein.Alphabet<number>(\r\n charIdxs,\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (a, b) => Math.min(1 - Vector3.Dot(vecs.chars[a], vecs.chars[b]), 1)\r\n );\r\n\r\n const trajectorySet = new TrajectoryClassifier();\r\n trajectorySet._vector3Alphabet = vecs;\r\n trajectorySet._levenshteinAlphabet = alphabet;\r\n return trajectorySet;\r\n }\r\n\r\n private constructor() {\r\n this._nameToDescribedTrajectory = new Map<string, TrajectoryClass>();\r\n }\r\n\r\n /**\r\n * Add a new Trajectory to the set with a given name.\r\n * @param trajectory new Trajectory to be added\r\n * @param classification name to which to add the Trajectory\r\n */\r\n public addTrajectoryToClassification(trajectory: Trajectory, classification: string): void {\r\n if (!this._nameToDescribedTrajectory.has(classification)) {\r\n this._nameToDescribedTrajectory.set(classification, new TrajectoryClass());\r\n }\r\n\r\n this._nameToDescribedTrajectory.get(classification)!.add(TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet));\r\n }\r\n\r\n /**\r\n * Remove a known named trajectory and all Trajectories associated with it.\r\n * @param classification name to remove\r\n * @returns whether anything was removed\r\n */\r\n public deleteClassification(classification: string): boolean {\r\n return this._nameToDescribedTrajectory.delete(classification);\r\n }\r\n\r\n /**\r\n * Attempt to recognize a Trajectory from among all the classifications\r\n * already known to the classifier.\r\n * @param trajectory Trajectory to be recognized\r\n * @returns classification of Trajectory if recognized, null otherwise\r\n */\r\n public classifyTrajectory(trajectory: Trajectory): Nullable<string> {\r\n const descriptor = TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet);\r\n\r\n const allowableMatches: string[] = [];\r\n this._nameToDescribedTrajectory.forEach((trajectoryClass, classification) => {\r\n if (trajectoryClass.getMatchCost(descriptor) < this._maximumAllowableMatchCost) {\r\n allowableMatches.push(classification);\r\n }\r\n });\r\n\r\n if (allowableMatches.length === 0) {\r\n return null;\r\n }\r\n\r\n let bestIdx = 0;\r\n let bestMatch = this._nameToDescribedTrajectory.get(allowableMatches[bestIdx])!.getMatchMinimumDistance(descriptor);\r\n let match: number;\r\n for (let idx = 0; idx < allowableMatches.length; ++idx) {\r\n match = this._nameToDescribedTrajectory.get(allowableMatches[idx])!.getMatchMinimumDistance(descriptor);\r\n if (match < bestMatch) {\r\n bestMatch = match;\r\n bestIdx = idx;\r\n }\r\n }\r\n return allowableMatches[bestIdx];\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"trajectoryClassifier.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Misc/trajectoryClassifier.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeepImmutable, Nullable } from \"../types\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\n\r\n// This implementation was based on the original MIT-licensed TRACE repository\r\n// from https://github.com/septagon/TRACE.\r\n\r\n/**\r\n * Generic implementation of Levenshtein distance.\r\n */\r\nnamespace Levenshtein {\r\n /**\r\n * Alphabet from which to construct sequences to be compared using Levenshtein\r\n * distance.\r\n */\r\n export class Alphabet<T> {\r\n private _characterToIdx: Map<T, number>;\r\n private _insertionCosts: number[];\r\n private _deletionCosts: number[];\r\n private _substitutionCosts: number[][];\r\n\r\n /**\r\n * Serialize the Alphabet to JSON string.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n\r\n const characters = new Array<T>(this._characterToIdx.size);\r\n this._characterToIdx.forEach((v, k) => {\r\n characters[v] = k;\r\n });\r\n jsonObject[\"characters\"] = characters;\r\n\r\n jsonObject[\"insertionCosts\"] = this._insertionCosts;\r\n jsonObject[\"deletionCosts\"] = this._deletionCosts;\r\n jsonObject[\"substitutionCosts\"] = this._substitutionCosts;\r\n\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Parse an Alphabet from a JSON serialization.\r\n * @param json JSON string to deserialize\r\n * @returns deserialized Alphabet\r\n */\r\n public static Deserialize<T>(json: string): Alphabet<T> {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Alphabet(jsonObject[\"characters\"] as T[]);\r\n alphabet._insertionCosts = jsonObject[\"insertionCosts\"];\r\n alphabet._deletionCosts = jsonObject[\"deletionCosts\"];\r\n alphabet._substitutionCosts = jsonObject[\"substitutionCosts\"];\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Create a new Alphabet.\r\n * @param characters characters of the alphabet\r\n * @param charToInsertionCost function mapping characters to insertion costs\r\n * @param charToDeletionCost function mapping characters to deletion costs\r\n * @param charsToSubstitutionCost function mapping character pairs to substitution costs\r\n */\r\n public constructor(\r\n characters: Array<T>,\r\n charToInsertionCost: Nullable<(char: T) => number> = null,\r\n charToDeletionCost: Nullable<(char: T) => number> = null,\r\n charsToSubstitutionCost: Nullable<(outChar: T, inChar: T) => number> = null\r\n ) {\r\n charToInsertionCost = charToInsertionCost ?? (() => 1);\r\n charToDeletionCost = charToDeletionCost ?? (() => 1);\r\n charsToSubstitutionCost = charsToSubstitutionCost ?? ((a: T, b: T) => (a === b ? 0 : 1));\r\n\r\n this._characterToIdx = new Map<T, number>();\r\n this._insertionCosts = new Array<number>(characters.length);\r\n this._deletionCosts = new Array<number>(characters.length);\r\n this._substitutionCosts = new Array<Array<number>>(characters.length);\r\n\r\n let c: T;\r\n for (let outerIdx = 0; outerIdx < characters.length; ++outerIdx) {\r\n c = characters[outerIdx];\r\n this._characterToIdx.set(c, outerIdx);\r\n this._insertionCosts[outerIdx] = charToInsertionCost(c);\r\n this._deletionCosts[outerIdx] = charToDeletionCost(c);\r\n\r\n this._substitutionCosts[outerIdx] = new Array<number>(characters.length);\r\n for (let innerIdx = outerIdx; innerIdx < characters.length; ++innerIdx) {\r\n this._substitutionCosts[outerIdx][innerIdx] = charsToSubstitutionCost(c, characters[innerIdx]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the index (internally-assigned number) for a character.\r\n * @param char character\r\n * @returns index\r\n */\r\n public getCharacterIdx(char: T): number {\r\n return this._characterToIdx.get(char)!;\r\n }\r\n\r\n /**\r\n * Get the insertion cost of a character from its index.\r\n * @param idx character index\r\n * @returns insertion cost\r\n */\r\n public getInsertionCost(idx: number): number {\r\n return this._insertionCosts[idx];\r\n }\r\n\r\n /**\r\n * Get the deletion cost of a character from its index.\r\n * @param idx character index\r\n * @returns deletion cost\r\n */\r\n public getDeletionCost(idx: number): number {\r\n return this._deletionCosts[idx];\r\n }\r\n\r\n /**\r\n * Gets the cost to substitute two characters. NOTE: this cost is\r\n * required to be bi-directional, meaning it cannot matter which of\r\n * the provided characters is being removed and which is being inserted.\r\n * @param idx1 the first character index\r\n * @param idx2 the second character index\r\n * @returns substitution cost\r\n */\r\n public getSubstitutionCost(idx1: number, idx2: number): number {\r\n const min = Math.min(idx1, idx2);\r\n const max = Math.max(idx1, idx2);\r\n\r\n return this._substitutionCosts[min][max];\r\n }\r\n }\r\n\r\n /**\r\n * Character sequence intended to be compared against other Sequences created\r\n * with the same Alphabet in order to compute Levenshtein distance.\r\n */\r\n export class Sequence<T> {\r\n private _alphabet: Alphabet<T>;\r\n private _characters: number[];\r\n\r\n // Scratch values\r\n private static readonly _MAX_SEQUENCE_LENGTH = 256;\r\n private static _CostMatrix = [...Array(Sequence._MAX_SEQUENCE_LENGTH + 1)].map(() => new Array<number>(Sequence._MAX_SEQUENCE_LENGTH + 1));\r\n private static _InsertionCost: number;\r\n private static _DeletionCost: number;\r\n private static _SubstitutionCost: number;\r\n\r\n /**\r\n * Serialize to JSON string. JSON representation does NOT include the Alphabet\r\n * from which this Sequence was created; Alphabet must be independently\r\n * serialized.\r\n * @returns JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._characters);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the Sequence was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation of Sequence\r\n * @param alphabet Alphabet from which Sequence was originally created\r\n * @returns Sequence\r\n */\r\n public static Deserialize<T>(json: string, alphabet: Alphabet<T>): Sequence<T> {\r\n const sequence = new Sequence([], alphabet);\r\n sequence._characters = JSON.parse(json);\r\n return sequence;\r\n }\r\n\r\n /**\r\n * Create a new Sequence.\r\n * @param characters characters in the new Sequence\r\n * @param alphabet Alphabet, which must include all used characters\r\n */\r\n public constructor(characters: T[], alphabet: Alphabet<T>) {\r\n if (characters.length > Sequence._MAX_SEQUENCE_LENGTH) {\r\n throw new Error(\"Sequences longer than \" + Sequence._MAX_SEQUENCE_LENGTH + \" not supported.\");\r\n }\r\n this._alphabet = alphabet;\r\n this._characters = characters.map((c) => this._alphabet.getCharacterIdx(c));\r\n }\r\n\r\n /**\r\n * Get the distance between this Sequence and another.\r\n * @param other sequence to compare to\r\n * @returns Levenshtein distance\r\n */\r\n public distance(other: Sequence<T>): number {\r\n return Sequence._Distance<T>(this, other);\r\n }\r\n\r\n /**\r\n * Compute the Levenshtein distance between two Sequences.\r\n * @param a first Sequence\r\n * @param b second Sequence\r\n * @returns Levenshtein distance\r\n */\r\n private static _Distance<T>(a: Sequence<T>, b: Sequence<T>): number {\r\n const alphabet = a._alphabet;\r\n if (alphabet !== b._alphabet) {\r\n throw new Error(\"Cannot Levenshtein compare Sequences built from different alphabets.\");\r\n }\r\n const aChars = a._characters;\r\n const bChars = b._characters;\r\n const aLength = aChars.length;\r\n const bLength = bChars.length;\r\n\r\n const costMatrix = Sequence._CostMatrix;\r\n costMatrix[0][0] = 0;\r\n for (let idx = 0; idx < aLength; ++idx) {\r\n costMatrix[idx + 1][0] = costMatrix[idx][0] + alphabet.getInsertionCost(aChars[idx]);\r\n }\r\n for (let idx = 0; idx < bLength; ++idx) {\r\n costMatrix[0][idx + 1] = costMatrix[0][idx] + alphabet.getInsertionCost(bChars[idx]);\r\n }\r\n\r\n for (let aIdx = 0; aIdx < aLength; ++aIdx) {\r\n for (let bIdx = 0; bIdx < bLength; ++bIdx) {\r\n Sequence._InsertionCost = costMatrix[aIdx + 1][bIdx] + alphabet.getInsertionCost(bChars[bIdx]);\r\n Sequence._DeletionCost = costMatrix[aIdx][bIdx + 1] + alphabet.getDeletionCost(aChars[aIdx]);\r\n Sequence._SubstitutionCost = costMatrix[aIdx][bIdx] + alphabet.getSubstitutionCost(aChars[aIdx], bChars[bIdx]);\r\n\r\n costMatrix[aIdx + 1][bIdx + 1] = Math.min(Sequence._InsertionCost, Sequence._DeletionCost, Sequence._SubstitutionCost);\r\n }\r\n }\r\n\r\n return costMatrix[aLength][bLength];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * A 3D trajectory consisting of an order list of vectors describing a\r\n * path of motion through 3D space.\r\n */\r\nexport class Trajectory {\r\n private _points: Vector3[];\r\n private readonly _segmentLength: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns serialized JSON string\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json serialized JSON string\r\n * @returns deserialized Trajectory\r\n */\r\n public static Deserialize(json: string): Trajectory {\r\n const jsonObject = JSON.parse(json);\r\n const trajectory = new Trajectory(jsonObject[\"_segmentLength\"]);\r\n trajectory._points = jsonObject[\"_points\"].map((pt: any) => {\r\n return new Vector3(pt[\"_x\"], pt[\"_y\"], pt[\"_z\"]);\r\n });\r\n return trajectory;\r\n }\r\n\r\n /**\r\n * Create a new empty Trajectory.\r\n * @param segmentLength radius of discretization for Trajectory points\r\n */\r\n public constructor(segmentLength: number = 0.01) {\r\n this._points = [];\r\n this._segmentLength = segmentLength;\r\n }\r\n\r\n /**\r\n * Get the length of the Trajectory.\r\n * @returns length of the Trajectory\r\n */\r\n public getLength(): number {\r\n return this._points.length * this._segmentLength;\r\n }\r\n\r\n /**\r\n * Append a new point to the Trajectory.\r\n * NOTE: This implementation has many allocations.\r\n * @param point point to append to the Trajectory\r\n */\r\n public add(point: DeepImmutable<Vector3>): void {\r\n let numPoints = this._points.length;\r\n if (numPoints === 0) {\r\n this._points.push(point.clone());\r\n } else {\r\n const getT = () => this._segmentLength / Vector3.Distance(this._points[numPoints - 1], point);\r\n for (let t = getT(); t <= 1.0; t = getT()) {\r\n const newPoint = this._points[numPoints - 1].scale(1.0 - t);\r\n point.scaleAndAddToRef(t, newPoint);\r\n this._points.push(newPoint);\r\n ++numPoints;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Create a new Trajectory with a segment length chosen to make it\r\n * probable that the new Trajectory will have a specified number of\r\n * segments. This operation is imprecise.\r\n * @param targetResolution number of segments desired\r\n * @returns new Trajectory with approximately the requested number of segments\r\n */\r\n public resampleAtTargetResolution(targetResolution: number): Trajectory {\r\n const resampled = new Trajectory(this.getLength() / targetResolution);\r\n this._points.forEach((pt) => {\r\n resampled.add(pt);\r\n });\r\n return resampled;\r\n }\r\n\r\n /**\r\n * Convert Trajectory segments into tokenized representation. This\r\n * representation is an array of numbers where each nth number is the\r\n * index of the token which is most similar to the nth segment of the\r\n * Trajectory.\r\n * @param tokens list of vectors which serve as discrete tokens\r\n * @returns list of indices of most similar token per segment\r\n */\r\n public tokenize(tokens: DeepImmutable<Vector3[]>): number[] {\r\n const tokenization: number[] = [];\r\n\r\n const segmentDir = new Vector3();\r\n for (let idx = 2; idx < this._points.length; ++idx) {\r\n if (Trajectory._TransformSegmentDirToRef(this._points[idx - 2], this._points[idx - 1], this._points[idx], segmentDir)) {\r\n tokenization.push(Trajectory._TokenizeSegment(segmentDir, tokens));\r\n }\r\n }\r\n\r\n return tokenization;\r\n }\r\n\r\n private static _ForwardDir = new Vector3();\r\n private static _InverseFromVec = new Vector3();\r\n private static _UpDir = new Vector3();\r\n private static _FromToVec = new Vector3();\r\n private static _LookMatrix = new Matrix();\r\n\r\n /**\r\n * Transform the rotation (i.e., direction) of a segment to isolate\r\n * the relative transformation represented by the segment. This operation\r\n * may or may not succeed due to singularities in the equations that define\r\n * motion relativity in this context.\r\n * @param priorVec the origin of the prior segment\r\n * @param fromVec the origin of the current segment\r\n * @param toVec the destination of the current segment\r\n * @param result reference to output variable\r\n * @returns whether or not transformation was successful\r\n */\r\n private static _TransformSegmentDirToRef(priorVec: DeepImmutable<Vector3>, fromVec: DeepImmutable<Vector3>, toVec: DeepImmutable<Vector3>, result: Vector3): boolean {\r\n const DOT_PRODUCT_SAMPLE_REJECTION_THRESHOLD = 0.98;\r\n\r\n fromVec.subtractToRef(priorVec, Trajectory._ForwardDir);\r\n Trajectory._ForwardDir.normalize();\r\n fromVec.scaleToRef(-1, Trajectory._InverseFromVec);\r\n Trajectory._InverseFromVec.normalize();\r\n\r\n if (Math.abs(Vector3.Dot(Trajectory._ForwardDir, Trajectory._InverseFromVec)) > DOT_PRODUCT_SAMPLE_REJECTION_THRESHOLD) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(Trajectory._ForwardDir, Trajectory._InverseFromVec, Trajectory._UpDir);\r\n Trajectory._UpDir.normalize();\r\n Matrix.LookAtLHToRef(priorVec, fromVec, Trajectory._UpDir, Trajectory._LookMatrix);\r\n toVec.subtractToRef(fromVec, Trajectory._FromToVec);\r\n Trajectory._FromToVec.normalize();\r\n Vector3.TransformNormalToRef(Trajectory._FromToVec, Trajectory._LookMatrix, result);\r\n return true;\r\n }\r\n\r\n private static _BestMatch: number;\r\n private static _Score: number;\r\n private static _BestScore: number;\r\n\r\n /**\r\n * Determine which token vector is most similar to the\r\n * segment vector.\r\n * @param segment segment vector\r\n * @param tokens token vector list\r\n * @returns index of the most similar token to the segment\r\n */\r\n private static _TokenizeSegment(segment: DeepImmutable<Vector3>, tokens: DeepImmutable<Vector3[]>): number {\r\n Trajectory._BestMatch = 0;\r\n Trajectory._Score = Vector3.Dot(segment, tokens[0]);\r\n Trajectory._BestScore = Trajectory._Score;\r\n for (let idx = 1; idx < tokens.length; ++idx) {\r\n Trajectory._Score = Vector3.Dot(segment, tokens[idx]);\r\n if (Trajectory._Score > Trajectory._BestScore) {\r\n Trajectory._BestMatch = idx;\r\n Trajectory._BestScore = Trajectory._Score;\r\n }\r\n }\r\n\r\n return Trajectory._BestMatch;\r\n }\r\n}\r\n\r\n/**\r\n * Collection of vectors intended to be used as the basis of Trajectory\r\n * tokenization for Levenshtein distance comparison. Canonically, a\r\n * Vector3Alphabet will resemble a \"spikeball\" of vectors distributed\r\n * roughly evenly over the surface of the unit sphere.\r\n */\r\nclass Vector3Alphabet {\r\n /**\r\n * Characters in the alphabet.\r\n * NOTE: There is no reason for this property to exist and this class should just extend\r\n * Array<Vector3>, except that doing so produces bizarre build-time errors indicating that\r\n * the ES5 library itself fails its own TypeDoc validation.\r\n */\r\n public chars: Vector3[];\r\n\r\n /**\r\n * Helper method to create new \"spikeball\" Vector3Alphabets. Uses a naive\r\n * optimize-from-random strategy to space points around the unit sphere\r\n * surface as a simple alternative to really doing the math to tile the\r\n * sphere.\r\n * @param alphabetSize size of the desired alphabet\r\n * @param iterations number of iterations over which to optimize the \"spikeball\"\r\n * @param startingStepSize distance factor to move points in early optimization iterations\r\n * @param endingStepSize distance factor to move points in late optimization iterations\r\n * @param fixedValues alphabet \"characters\" that are required and cannot be moved by optimization\r\n * @returns a new randomly generated and optimized Vector3Alphabet of the specified size\r\n */\r\n public static Generate(\r\n alphabetSize: number = 64,\r\n iterations: number = 256,\r\n startingStepSize: number = 0.1,\r\n endingStepSize: number = 0.001,\r\n fixedValues: DeepImmutable<Vector3[]> = []\r\n ): Vector3Alphabet {\r\n const EPSILON = 0.001;\r\n const EPSILON_SQUARED = EPSILON * EPSILON;\r\n\r\n const alphabet = new Vector3Alphabet(alphabetSize);\r\n for (let idx = 0; idx < alphabetSize; ++idx) {\r\n alphabet.chars[idx] = new Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5);\r\n alphabet.chars[idx].normalize();\r\n }\r\n\r\n for (let idx = 0; idx < fixedValues.length; ++idx) {\r\n alphabet.chars[idx].copyFrom(fixedValues[idx]);\r\n }\r\n\r\n let stepSize: number;\r\n let distSq: number;\r\n const force = new Vector3();\r\n const scratch = new Vector3();\r\n const lerp = (l: number, r: number, t: number) => (1.0 - t) * l + t * r;\r\n for (let iteration = 0; iteration < iterations; ++iteration) {\r\n stepSize = lerp(startingStepSize, endingStepSize, iteration / (iterations - 1));\r\n for (let idx = fixedValues.length; idx < alphabet.chars.length; ++idx) {\r\n force.copyFromFloats(0, 0, 0);\r\n alphabet.chars.forEach((pt) => {\r\n alphabet.chars[idx].subtractToRef(pt, scratch);\r\n distSq = scratch.lengthSquared();\r\n if (distSq > EPSILON_SQUARED) {\r\n scratch.scaleAndAddToRef(1 / (scratch.lengthSquared() * distSq), force);\r\n }\r\n });\r\n force.scaleInPlace(stepSize);\r\n alphabet.chars[idx].addInPlace(force);\r\n alphabet.chars[idx].normalize();\r\n }\r\n }\r\n\r\n return alphabet;\r\n }\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this.chars);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized Vector3Alphabet\r\n */\r\n public static Deserialize(json: string): Vector3Alphabet {\r\n const jsonObject = JSON.parse(json);\r\n const alphabet = new Vector3Alphabet(jsonObject.length);\r\n for (let idx = 0; idx < jsonObject.length; ++idx) {\r\n alphabet.chars[idx] = new Vector3(jsonObject[idx][\"_x\"], jsonObject[idx][\"_y\"], jsonObject[idx][\"_z\"]);\r\n }\r\n return alphabet;\r\n }\r\n\r\n private constructor(size: number) {\r\n this.chars = new Array(size);\r\n }\r\n}\r\n\r\n/**\r\n * Class which formalizes the manner in which a Vector3Alphabet is used to tokenize and\r\n * describe a Trajectory. This class houses the functionality which determines what\r\n * attributes of Trajectories are and are not considered important, such as scale.\r\n */\r\nclass TrajectoryDescriptor {\r\n private static readonly _FINEST_DESCRIPTOR_RESOLUTION = 32;\r\n\r\n private _sequences: Levenshtein.Sequence<number>[];\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n return JSON.stringify(this._sequences.map((sequence) => sequence.serialize()));\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptor was originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON serialization\r\n * @param alphabet Alphabet from which descriptor was originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = (JSON.parse(json) as string[]).map((s) => Levenshtein.Sequence.Deserialize(s, alphabet));\r\n return descriptor;\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor to describe a provided Trajectory according\r\n * to the provided alphabets.\r\n * @param trajectory Trajectory to be described\r\n * @param vector3Alphabet Vector3Alphabet to be used to tokenize the Trajectory\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be used as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing provided Trajectory\r\n */\r\n public static CreateFromTrajectory(trajectory: Trajectory, vector3Alphabet: Vector3Alphabet, levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n return TrajectoryDescriptor.CreateFromTokenizationPyramid(TrajectoryDescriptor._GetTokenizationPyramid(trajectory, vector3Alphabet), levenshteinAlphabet);\r\n }\r\n\r\n /**\r\n * Create a new TrajectoryDescriptor from a pre-existing pyramid of tokens.\r\n * NOTE: This function exists to support an outdated serialization mechanism and should\r\n * be deleted if it is no longer useful.\r\n * @param pyramid tokenization pyramid\r\n * @param levenshteinAlphabet Levenshtein.Alphabet to be uses as basis for comparison with other descriptors\r\n * @returns TrajectoryDescriptor describing the Trajectory from which the pyramid was built\r\n */\r\n public static CreateFromTokenizationPyramid(pyramid: number[][], levenshteinAlphabet: Levenshtein.Alphabet<number>): TrajectoryDescriptor {\r\n const descriptor = new TrajectoryDescriptor();\r\n descriptor._sequences = pyramid.map((tokens) => new Levenshtein.Sequence<number>(tokens, levenshteinAlphabet));\r\n return descriptor;\r\n }\r\n\r\n private constructor() {\r\n this._sequences = [];\r\n }\r\n\r\n /**\r\n * Create the tokenization pyramid for the provided Trajectory according to the given\r\n * Vector3Alphabet.\r\n * @param trajectory Trajectory to be tokenized\r\n * @param alphabet Vector3Alphabet containing tokens\r\n * @param targetResolution finest resolution of descriptor\r\n * @returns tokenization pyramid for Trajectory\r\n */\r\n private static _GetTokenizationPyramid(\r\n trajectory: Trajectory,\r\n alphabet: Vector3Alphabet,\r\n targetResolution: number = TrajectoryDescriptor._FINEST_DESCRIPTOR_RESOLUTION\r\n ): number[][] {\r\n const pyramid: number[][] = [];\r\n for (let res = targetResolution; res > 4; res = Math.floor(res / 2)) {\r\n pyramid.push(trajectory.resampleAtTargetResolution(res).tokenize(alphabet.chars));\r\n }\r\n return pyramid;\r\n }\r\n\r\n /**\r\n * Calculate a distance metric between this TrajectoryDescriptor and another. This is\r\n * essentially a similarity score and does not directly represent Euclidean distance,\r\n * edit distance, or any other formal distance metric.\r\n * @param other TrajectoryDescriptor from which to determine distance\r\n * @returns distance, a nonnegative similarity score where larger values indicate dissimilarity\r\n */\r\n public distance(other: TrajectoryDescriptor): number {\r\n let totalDistance = 0;\r\n let weight: number;\r\n for (let idx = 0; idx < this._sequences.length; ++idx) {\r\n weight = Math.pow(2, idx);\r\n totalDistance += weight * this._sequences[idx].distance(other._sequences[idx]);\r\n }\r\n return totalDistance;\r\n }\r\n}\r\n\r\n/**\r\n * A set of TrajectoryDescriptors defined to be \"the same.\" This is essentially a helper\r\n * class to facilitate methods of Trajectory clustering.\r\n */\r\nclass TrajectoryClass {\r\n private static readonly _MIN_AVERAGE_DISTANCE = 1;\r\n\r\n private _descriptors: TrajectoryDescriptor[];\r\n private _centroidIdx: number;\r\n private _averageDistance: number;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.descriptors = this._descriptors.map((desc) => desc.serialize());\r\n jsonObject.centroidIdx = this._centroidIdx;\r\n jsonObject.averageDistance = this._averageDistance;\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON string and Alphabet. This should be the same Alphabet\r\n * from which the descriptors were originally created, which must be serialized and\r\n * deserialized independently so that it can be passed in here.\r\n * @param json JSON string representation\r\n * @param alphabet Alphabet from which TrajectoryDescriptors were originally created\r\n * @returns deserialized TrajectoryDescriptor\r\n */\r\n public static Deserialize(json: string, alphabet: Levenshtein.Alphabet<number>): TrajectoryClass {\r\n const jsonObject = JSON.parse(json);\r\n const described = new TrajectoryClass();\r\n described._descriptors = jsonObject.descriptors.map((s: string) => TrajectoryDescriptor.Deserialize(s, alphabet));\r\n described._centroidIdx = jsonObject.centroidIdx;\r\n described._averageDistance = jsonObject.averageDistance;\r\n return described;\r\n }\r\n\r\n /**\r\n * Create a new DescribedTrajectory.\r\n * @param descriptors currently-known TrajectoryDescriptors, if any\r\n */\r\n public constructor(descriptors: TrajectoryDescriptor[] = []) {\r\n this._descriptors = descriptors;\r\n this._centroidIdx = -1;\r\n this._averageDistance = 0;\r\n\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Add a new TrajectoryDescriptor to the list of descriptors known to describe\r\n * this same DescribedTrajectory.\r\n * @param descriptor descriptor to be added\r\n */\r\n public add(descriptor: TrajectoryDescriptor): void {\r\n this._descriptors.push(descriptor);\r\n this._refreshDescription();\r\n }\r\n\r\n /**\r\n * Compute the cost, which is inversely related to the likelihood that the provided\r\n * TrajectoryDescriptor describes a Trajectory that is considered to be the same as\r\n * the class represented by this DescribedTrajectory.\r\n * @param descriptor the descriptor to be costed\r\n * @returns cost of the match, which is a nonnegative similarity metric where larger values indicate dissimilarity\r\n */\r\n public getMatchCost(descriptor: TrajectoryDescriptor): number {\r\n return descriptor.distance(this._descriptors[this._centroidIdx]) / this._averageDistance;\r\n }\r\n\r\n /**\r\n * Compute the minimum distance between the queried TrajectoryDescriptor and a\r\n * descriptor which is a member of this collection. This is an alternative way of\r\n * conceptualizing match cost from getMatchCost(), and it serves a different function.\r\n * @param descriptor the descriptor to find the minimum distance to\r\n * @returns minimum descriptor distance to a member descriptor of this DescribedTrajectory\r\n */\r\n public getMatchMinimumDistance(descriptor: TrajectoryDescriptor): number {\r\n return Math.min(...this._descriptors.map((desc) => desc.distance(descriptor)));\r\n }\r\n\r\n /**\r\n * Refreshes the internal representation of this DescribedTrajectory.\r\n */\r\n private _refreshDescription(): void {\r\n this._centroidIdx = -1;\r\n let sum: number;\r\n const distances = this._descriptors.map((a) => {\r\n sum = 0;\r\n this._descriptors.forEach((b) => {\r\n sum += a.distance(b);\r\n });\r\n return sum;\r\n });\r\n for (let idx = 0; idx < distances.length; ++idx) {\r\n if (this._centroidIdx < 0 || distances[idx] < distances[this._centroidIdx]) {\r\n this._centroidIdx = idx;\r\n }\r\n }\r\n\r\n this._averageDistance = 0;\r\n this._descriptors.forEach((desc) => {\r\n this._averageDistance += desc.distance(this._descriptors[this._centroidIdx]);\r\n });\r\n if (this._descriptors.length > 0) {\r\n this._averageDistance = Math.max(this._averageDistance / this._descriptors.length, TrajectoryClass._MIN_AVERAGE_DISTANCE);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Class representing a set of known, named trajectories to which Trajectories can be\r\n * added and using which Trajectories can be recognized.\r\n */\r\nexport class TrajectoryClassifier {\r\n private _maximumAllowableMatchCost: number = 4;\r\n private _vector3Alphabet: Vector3Alphabet;\r\n private _levenshteinAlphabet: Levenshtein.Alphabet<number>;\r\n private _nameToDescribedTrajectory: Map<string, TrajectoryClass>;\r\n\r\n /**\r\n * Serialize to JSON.\r\n * @returns JSON serialization\r\n */\r\n public serialize(): string {\r\n const jsonObject: any = {};\r\n jsonObject.maximumAllowableMatchCost = this._maximumAllowableMatchCost;\r\n jsonObject.vector3Alphabet = this._vector3Alphabet.serialize();\r\n jsonObject.levenshteinAlphabet = this._levenshteinAlphabet.serialize();\r\n jsonObject.nameToDescribedTrajectory = [];\r\n this._nameToDescribedTrajectory.forEach((described, name) => {\r\n jsonObject.nameToDescribedTrajectory.push(name);\r\n jsonObject.nameToDescribedTrajectory.push(described.serialize());\r\n });\r\n return JSON.stringify(jsonObject);\r\n }\r\n\r\n /**\r\n * Deserialize from JSON.\r\n * @param json JSON serialization\r\n * @returns deserialized TrajectorySet\r\n */\r\n public static Deserialize(json: string): TrajectoryClassifier {\r\n const jsonObject = JSON.parse(json);\r\n const classifier = new TrajectoryClassifier();\r\n classifier._maximumAllowableMatchCost = jsonObject.maximumAllowableMatchCost;\r\n classifier._vector3Alphabet = Vector3Alphabet.Deserialize(jsonObject.vector3Alphabet);\r\n classifier._levenshteinAlphabet = Levenshtein.Alphabet.Deserialize<number>(jsonObject.levenshteinAlphabet);\r\n for (let idx = 0; idx < jsonObject.nameToDescribedTrajectory.length; idx += 2) {\r\n classifier._nameToDescribedTrajectory.set(\r\n jsonObject.nameToDescribedTrajectory[idx],\r\n TrajectoryClass.Deserialize(jsonObject.nameToDescribedTrajectory[idx + 1], classifier._levenshteinAlphabet)\r\n );\r\n }\r\n return classifier;\r\n }\r\n\r\n /**\r\n * Initialize a new empty TrajectorySet with auto-generated Alphabets.\r\n * VERY naive, need to be generating these things from known\r\n * sets. Better version later, probably eliminating this one.\r\n * @returns auto-generated TrajectorySet\r\n */\r\n public static Generate(): TrajectoryClassifier {\r\n const vecs = Vector3Alphabet.Generate(64, 256, 0.1, 0.001, [Vector3.Forward()]);\r\n\r\n const charIdxs = new Array(vecs.chars.length);\r\n for (let idx = 0; idx < charIdxs.length; ++idx) {\r\n charIdxs[idx] = idx;\r\n }\r\n\r\n const alphabet = new Levenshtein.Alphabet<number>(\r\n charIdxs,\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (idx) => (idx === 0 ? 0 : 1),\r\n (a, b) => Math.min(1 - Vector3.Dot(vecs.chars[a], vecs.chars[b]), 1)\r\n );\r\n\r\n const trajectorySet = new TrajectoryClassifier();\r\n trajectorySet._vector3Alphabet = vecs;\r\n trajectorySet._levenshteinAlphabet = alphabet;\r\n return trajectorySet;\r\n }\r\n\r\n private constructor() {\r\n this._nameToDescribedTrajectory = new Map<string, TrajectoryClass>();\r\n }\r\n\r\n /**\r\n * Add a new Trajectory to the set with a given name.\r\n * @param trajectory new Trajectory to be added\r\n * @param classification name to which to add the Trajectory\r\n */\r\n public addTrajectoryToClassification(trajectory: Trajectory, classification: string): void {\r\n if (!this._nameToDescribedTrajectory.has(classification)) {\r\n this._nameToDescribedTrajectory.set(classification, new TrajectoryClass());\r\n }\r\n\r\n this._nameToDescribedTrajectory.get(classification)!.add(TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet));\r\n }\r\n\r\n /**\r\n * Remove a known named trajectory and all Trajectories associated with it.\r\n * @param classification name to remove\r\n * @returns whether anything was removed\r\n */\r\n public deleteClassification(classification: string): boolean {\r\n return this._nameToDescribedTrajectory.delete(classification);\r\n }\r\n\r\n /**\r\n * Attempt to recognize a Trajectory from among all the classifications\r\n * already known to the classifier.\r\n * @param trajectory Trajectory to be recognized\r\n * @returns classification of Trajectory if recognized, null otherwise\r\n */\r\n public classifyTrajectory(trajectory: Trajectory): Nullable<string> {\r\n const descriptor = TrajectoryDescriptor.CreateFromTrajectory(trajectory, this._vector3Alphabet, this._levenshteinAlphabet);\r\n\r\n const allowableMatches: string[] = [];\r\n this._nameToDescribedTrajectory.forEach((trajectoryClass, classification) => {\r\n if (trajectoryClass.getMatchCost(descriptor) < this._maximumAllowableMatchCost) {\r\n allowableMatches.push(classification);\r\n }\r\n });\r\n\r\n if (allowableMatches.length === 0) {\r\n return null;\r\n }\r\n\r\n let bestIdx = 0;\r\n let bestMatch = this._nameToDescribedTrajectory.get(allowableMatches[bestIdx])!.getMatchMinimumDistance(descriptor);\r\n let match: number;\r\n for (let idx = 0; idx < allowableMatches.length; ++idx) {\r\n match = this._nameToDescribedTrajectory.get(allowableMatches[idx])!.getMatchMinimumDistance(descriptor);\r\n if (match < bestMatch) {\r\n bestMatch = match;\r\n bestIdx = idx;\r\n }\r\n }\r\n return allowableMatches[bestIdx];\r\n }\r\n}\r\n"]}
@@ -159,11 +159,12 @@ export class MeshParticleEmitter {
159
159
  * @returns the JSON object
160
160
  */
161
161
  serialize() {
162
+ var _a;
162
163
  const serializationObject = {};
163
164
  serializationObject.type = this.getClassName();
164
165
  serializationObject.direction1 = this.direction1.asArray();
165
166
  serializationObject.direction2 = this.direction2.asArray();
166
- serializationObject.meshId = this.mesh?.id;
167
+ serializationObject.meshId = (_a = this.mesh) === null || _a === void 0 ? void 0 : _a.id;
167
168
  serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;
168
169
  return serializationObject;
169
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"meshParticleEmitter.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Particles/EmitterTypes/meshParticleEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepCopier } from \"../../Misc/deepCopier\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { Particle } from \"../../Particles/particle\";\r\nimport type { IParticleEmitterType } from \"./IParticleEmitterType\";\r\nimport type { IndicesArray, Nullable, FloatArray } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\n/**\r\n * Particle emitter emitting particles from the inside of a box.\r\n * It emits the particles randomly between 2 given directions.\r\n */\r\nexport class MeshParticleEmitter implements IParticleEmitterType {\r\n private _indices: Nullable<IndicesArray> = null;\r\n private _positions: Nullable<FloatArray> = null;\r\n private _normals: Nullable<FloatArray> = null;\r\n private _storedNormal = Vector3.Zero();\r\n private _mesh: Nullable<AbstractMesh> = null;\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction1 = new Vector3(0, 1.0, 0);\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction2 = new Vector3(0, 1.0, 0);\r\n\r\n /**\r\n * Gets or sets a boolean indicating that particle directions must be built from mesh face normals\r\n */\r\n public useMeshNormalsForDirection = true;\r\n\r\n /** Defines the mesh to use as source */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n return this._mesh;\r\n }\r\n\r\n public set mesh(value: Nullable<AbstractMesh>) {\r\n if (this._mesh === value) {\r\n return;\r\n }\r\n\r\n this._mesh = value;\r\n\r\n if (value) {\r\n this._indices = value.getIndices();\r\n this._positions = value.getVerticesData(VertexBuffer.PositionKind);\r\n this._normals = value.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n this._indices = null;\r\n this._positions = null;\r\n this._normals = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance MeshParticleEmitter\r\n * @param mesh defines the mesh to use as source\r\n */\r\n constructor(mesh: Nullable<AbstractMesh> = null) {\r\n this.mesh = mesh;\r\n }\r\n\r\n /**\r\n * Called by the particle System when the direction is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param directionToUpdate is the direction vector to update with the result\r\n * @param particle is the particle we are computed the direction for\r\n * @param isLocal defines if the direction should be set in local space\r\n */\r\n public startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.TransformNormalToRef(this._storedNormal, worldMatrix, directionToUpdate);\r\n return;\r\n }\r\n\r\n const randX = Scalar.RandomRange(this.direction1.x, this.direction2.x);\r\n const randY = Scalar.RandomRange(this.direction1.y, this.direction2.y);\r\n const randZ = Scalar.RandomRange(this.direction1.z, this.direction2.z);\r\n\r\n if (isLocal) {\r\n directionToUpdate.copyFromFloats(randX, randY, randZ);\r\n return;\r\n }\r\n\r\n Vector3.TransformNormalFromFloatsToRef(randX, randY, randZ, worldMatrix, directionToUpdate);\r\n }\r\n\r\n /**\r\n * Called by the particle System when the position is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param positionToUpdate is the position vector to update with the result\r\n * @param particle is the particle we are computed the position for\r\n * @param isLocal defines if the position should be set in local space\r\n */\r\n public startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (!this._indices || !this._positions) {\r\n return;\r\n }\r\n\r\n const randomFaceIndex = (3 * Math.random() * (this._indices.length / 3)) | 0;\r\n const bu = Math.random();\r\n const bv = Math.random() * (1.0 - bu);\r\n const bw = 1.0 - bu - bv;\r\n\r\n const faceIndexA = this._indices[randomFaceIndex];\r\n const faceIndexB = this._indices[randomFaceIndex + 1];\r\n const faceIndexC = this._indices[randomFaceIndex + 2];\r\n const vertexA = TmpVectors.Vector3[0];\r\n const vertexB = TmpVectors.Vector3[1];\r\n const vertexC = TmpVectors.Vector3[2];\r\n const randomVertex = TmpVectors.Vector3[3];\r\n\r\n Vector3.FromArrayToRef(this._positions, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._positions, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._positions, faceIndexC * 3, vertexC);\r\n\r\n randomVertex.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n randomVertex.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n randomVertex.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n\r\n if (isLocal) {\r\n positionToUpdate.copyFromFloats(randomVertex.x, randomVertex.y, randomVertex.z);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(randomVertex.x, randomVertex.y, randomVertex.z, worldMatrix, positionToUpdate);\r\n }\r\n\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.FromArrayToRef(this._normals, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._normals, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._normals, faceIndexC * 3, vertexC);\r\n\r\n this._storedNormal.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n this._storedNormal.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n this._storedNormal.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current emitter and returns a copy of it\r\n * @returns the new emitter\r\n */\r\n public clone(): MeshParticleEmitter {\r\n const newOne = new MeshParticleEmitter(this.mesh);\r\n\r\n DeepCopier.DeepCopy(this, newOne);\r\n\r\n return newOne;\r\n }\r\n\r\n /**\r\n * Called by the GPUParticleSystem to setup the update shader\r\n * @param uboOrEffect defines the update shader\r\n */\r\n public applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void {\r\n uboOrEffect.setVector3(\"direction1\", this.direction1);\r\n uboOrEffect.setVector3(\"direction2\", this.direction2);\r\n }\r\n\r\n /**\r\n * Creates the structure of the ubo for this particle emitter\r\n * @param ubo ubo to create the structure for\r\n */\r\n public buildUniformLayout(ubo: UniformBuffer): void {\r\n ubo.addUniform(\"direction1\", 3);\r\n ubo.addUniform(\"direction2\", 3);\r\n }\r\n\r\n /**\r\n * Returns a string to use to update the GPU particles update shader\r\n * @returns a string containing the defines string\r\n */\r\n public getEffectDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Returns the string \"BoxParticleEmitter\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"MeshParticleEmitter\";\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object.\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.type = this.getClassName();\r\n serializationObject.direction1 = this.direction1.asArray();\r\n serializationObject.direction2 = this.direction2.asArray();\r\n serializationObject.meshId = this.mesh?.id;\r\n serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse properties from a JSON object\r\n * @param serializationObject defines the JSON object\r\n * @param scene defines the hosting scene\r\n */\r\n public parse(serializationObject: any, scene: Nullable<Scene>): void {\r\n Vector3.FromArrayToRef(serializationObject.direction1, 0, this.direction1);\r\n Vector3.FromArrayToRef(serializationObject.direction2, 0, this.direction2);\r\n\r\n if (serializationObject.meshId && scene) {\r\n this.mesh = scene.getLastMeshById(serializationObject.meshId);\r\n }\r\n\r\n this.useMeshNormalsForDirection = serializationObject.useMeshNormalsForDirection;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"meshParticleEmitter.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Particles/EmitterTypes/meshParticleEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepCopier } from \"../../Misc/deepCopier\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport { Vector3, TmpVectors } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport type { Particle } from \"../../Particles/particle\";\r\nimport type { IParticleEmitterType } from \"./IParticleEmitterType\";\r\nimport type { IndicesArray, Nullable, FloatArray } from \"../../types\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { UniformBufferEffectCommonAccessor } from \"../../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\n/**\r\n * Particle emitter emitting particles from the inside of a box.\r\n * It emits the particles randomly between 2 given directions.\r\n */\r\nexport class MeshParticleEmitter implements IParticleEmitterType {\r\n private _indices: Nullable<IndicesArray> = null;\r\n private _positions: Nullable<FloatArray> = null;\r\n private _normals: Nullable<FloatArray> = null;\r\n private _storedNormal = Vector3.Zero();\r\n private _mesh: Nullable<AbstractMesh> = null;\r\n\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction1 = new Vector3(0, 1.0, 0);\r\n /**\r\n * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.\r\n */\r\n public direction2 = new Vector3(0, 1.0, 0);\r\n\r\n /**\r\n * Gets or sets a boolean indicating that particle directions must be built from mesh face normals\r\n */\r\n public useMeshNormalsForDirection = true;\r\n\r\n /** Defines the mesh to use as source */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n return this._mesh;\r\n }\r\n\r\n public set mesh(value: Nullable<AbstractMesh>) {\r\n if (this._mesh === value) {\r\n return;\r\n }\r\n\r\n this._mesh = value;\r\n\r\n if (value) {\r\n this._indices = value.getIndices();\r\n this._positions = value.getVerticesData(VertexBuffer.PositionKind);\r\n this._normals = value.getVerticesData(VertexBuffer.NormalKind);\r\n } else {\r\n this._indices = null;\r\n this._positions = null;\r\n this._normals = null;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new instance MeshParticleEmitter\r\n * @param mesh defines the mesh to use as source\r\n */\r\n constructor(mesh: Nullable<AbstractMesh> = null) {\r\n this.mesh = mesh;\r\n }\r\n\r\n /**\r\n * Called by the particle System when the direction is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param directionToUpdate is the direction vector to update with the result\r\n * @param particle is the particle we are computed the direction for\r\n * @param isLocal defines if the direction should be set in local space\r\n */\r\n public startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.TransformNormalToRef(this._storedNormal, worldMatrix, directionToUpdate);\r\n return;\r\n }\r\n\r\n const randX = Scalar.RandomRange(this.direction1.x, this.direction2.x);\r\n const randY = Scalar.RandomRange(this.direction1.y, this.direction2.y);\r\n const randZ = Scalar.RandomRange(this.direction1.z, this.direction2.z);\r\n\r\n if (isLocal) {\r\n directionToUpdate.copyFromFloats(randX, randY, randZ);\r\n return;\r\n }\r\n\r\n Vector3.TransformNormalFromFloatsToRef(randX, randY, randZ, worldMatrix, directionToUpdate);\r\n }\r\n\r\n /**\r\n * Called by the particle System when the position is computed for the created particle.\r\n * @param worldMatrix is the world matrix of the particle system\r\n * @param positionToUpdate is the position vector to update with the result\r\n * @param particle is the particle we are computed the position for\r\n * @param isLocal defines if the position should be set in local space\r\n */\r\n public startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void {\r\n if (!this._indices || !this._positions) {\r\n return;\r\n }\r\n\r\n const randomFaceIndex = (3 * Math.random() * (this._indices.length / 3)) | 0;\r\n const bu = Math.random();\r\n const bv = Math.random() * (1.0 - bu);\r\n const bw = 1.0 - bu - bv;\r\n\r\n const faceIndexA = this._indices[randomFaceIndex];\r\n const faceIndexB = this._indices[randomFaceIndex + 1];\r\n const faceIndexC = this._indices[randomFaceIndex + 2];\r\n const vertexA = TmpVectors.Vector3[0];\r\n const vertexB = TmpVectors.Vector3[1];\r\n const vertexC = TmpVectors.Vector3[2];\r\n const randomVertex = TmpVectors.Vector3[3];\r\n\r\n Vector3.FromArrayToRef(this._positions, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._positions, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._positions, faceIndexC * 3, vertexC);\r\n\r\n randomVertex.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n randomVertex.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n randomVertex.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n\r\n if (isLocal) {\r\n positionToUpdate.copyFromFloats(randomVertex.x, randomVertex.y, randomVertex.z);\r\n } else {\r\n Vector3.TransformCoordinatesFromFloatsToRef(randomVertex.x, randomVertex.y, randomVertex.z, worldMatrix, positionToUpdate);\r\n }\r\n\r\n if (this.useMeshNormalsForDirection && this._normals) {\r\n Vector3.FromArrayToRef(this._normals, faceIndexA * 3, vertexA);\r\n Vector3.FromArrayToRef(this._normals, faceIndexB * 3, vertexB);\r\n Vector3.FromArrayToRef(this._normals, faceIndexC * 3, vertexC);\r\n\r\n this._storedNormal.x = bu * vertexA.x + bv * vertexB.x + bw * vertexC.x;\r\n this._storedNormal.y = bu * vertexA.y + bv * vertexB.y + bw * vertexC.y;\r\n this._storedNormal.z = bu * vertexA.z + bv * vertexB.z + bw * vertexC.z;\r\n }\r\n }\r\n\r\n /**\r\n * Clones the current emitter and returns a copy of it\r\n * @returns the new emitter\r\n */\r\n public clone(): MeshParticleEmitter {\r\n const newOne = new MeshParticleEmitter(this.mesh);\r\n\r\n DeepCopier.DeepCopy(this, newOne);\r\n\r\n return newOne;\r\n }\r\n\r\n /**\r\n * Called by the GPUParticleSystem to setup the update shader\r\n * @param uboOrEffect defines the update shader\r\n */\r\n public applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void {\r\n uboOrEffect.setVector3(\"direction1\", this.direction1);\r\n uboOrEffect.setVector3(\"direction2\", this.direction2);\r\n }\r\n\r\n /**\r\n * Creates the structure of the ubo for this particle emitter\r\n * @param ubo ubo to create the structure for\r\n */\r\n public buildUniformLayout(ubo: UniformBuffer): void {\r\n ubo.addUniform(\"direction1\", 3);\r\n ubo.addUniform(\"direction2\", 3);\r\n }\r\n\r\n /**\r\n * Returns a string to use to update the GPU particles update shader\r\n * @returns a string containing the defines string\r\n */\r\n public getEffectDefines(): string {\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Returns the string \"BoxParticleEmitter\"\r\n * @returns a string containing the class name\r\n */\r\n public getClassName(): string {\r\n return \"MeshParticleEmitter\";\r\n }\r\n\r\n /**\r\n * Serializes the particle system to a JSON object.\r\n * @returns the JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.type = this.getClassName();\r\n serializationObject.direction1 = this.direction1.asArray();\r\n serializationObject.direction2 = this.direction2.asArray();\r\n serializationObject.meshId = this.mesh?.id;\r\n serializationObject.useMeshNormalsForDirection = this.useMeshNormalsForDirection;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse properties from a JSON object\r\n * @param serializationObject defines the JSON object\r\n * @param scene defines the hosting scene\r\n */\r\n public parse(serializationObject: any, scene: Nullable<Scene>): void {\r\n Vector3.FromArrayToRef(serializationObject.direction1, 0, this.direction1);\r\n Vector3.FromArrayToRef(serializationObject.direction2, 0, this.direction2);\r\n\r\n if (serializationObject.meshId && scene) {\r\n this.mesh = scene.getLastMeshById(serializationObject.meshId);\r\n }\r\n\r\n this.useMeshNormalsForDirection = serializationObject.useMeshNormalsForDirection;\r\n }\r\n}\r\n"]}
@@ -18,9 +18,11 @@ export class ComputeShaderParticleSystem {
18
18
  return !!this._updateComputeShader;
19
19
  }
20
20
  isUpdateBufferReady() {
21
- return this._updateComputeShader?.isReady() ?? false;
21
+ var _a, _b;
22
+ return (_b = (_a = this._updateComputeShader) === null || _a === void 0 ? void 0 : _a.isReady()) !== null && _b !== void 0 ? _b : false;
22
23
  }
23
24
  createUpdateBuffer(defines) {
25
+ var _a;
24
26
  const bindingsMapping = {
25
27
  params: { group: 0, binding: 0 },
26
28
  particlesIn: { group: 0, binding: 1 },
@@ -47,7 +49,7 @@ export class ComputeShaderParticleSystem {
47
49
  bindingsMapping["noiseTexture"] = { group: 1, binding: 11 };
48
50
  }
49
51
  this._updateComputeShader = new ComputeShader("updateParticles", this._engine, "gpuUpdateParticles", { bindingsMapping, defines: defines.split("\n") });
50
- this._simParamsComputeShader?.dispose();
52
+ (_a = this._simParamsComputeShader) === null || _a === void 0 ? void 0 : _a.dispose();
51
53
  this._simParamsComputeShader = new UniformBuffer(this._engine);
52
54
  this._simParamsComputeShader.addUniform("currentCount", 1);
53
55
  this._simParamsComputeShader.addUniform("timeDelta", 1);
@@ -121,11 +123,12 @@ export class ComputeShaderParticleSystem {
121
123
  this._updateComputeShader.dispatch(Math.ceil(currentActiveCount / 64));
122
124
  }
123
125
  releaseBuffers() {
126
+ var _a;
124
127
  for (let i = 0; i < this._bufferComputeShader.length; ++i) {
125
128
  this._bufferComputeShader[i].dispose();
126
129
  }
127
130
  this._bufferComputeShader.length = 0;
128
- this._simParamsComputeShader?.dispose();
131
+ (_a = this._simParamsComputeShader) === null || _a === void 0 ? void 0 : _a.dispose();
129
132
  this._simParamsComputeShader = null;
130
133
  this._updateComputeShader = null;
131
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"computeShaderParticleSystem.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Particles/computeShaderParticleSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { ComputeShader } from \"../Compute/computeShader\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport type { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport type { DataArray } from \"../types\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport \"../ShadersWGSL/gpuUpdateParticles.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderParticleSystem implements IGPUParticleSystemPlatform {\r\n private _parent: GPUParticleSystem;\r\n private _engine: ThinEngine;\r\n private _updateComputeShader: ComputeShader;\r\n private _simParamsComputeShader: UniformBuffer;\r\n private _bufferComputeShader: StorageBuffer[] = [];\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n\r\n public readonly alignDataInBuffer = true;\r\n\r\n constructor(parent: GPUParticleSystem, engine: ThinEngine) {\r\n this._parent = parent;\r\n this._engine = engine;\r\n }\r\n\r\n public isUpdateBufferCreated(): boolean {\r\n return !!this._updateComputeShader;\r\n }\r\n\r\n public isUpdateBufferReady(): boolean {\r\n return this._updateComputeShader?.isReady() ?? false;\r\n }\r\n\r\n public createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n params: { group: 0, binding: 0 },\r\n particlesIn: { group: 0, binding: 1 },\r\n particlesOut: { group: 0, binding: 2 },\r\n randomTexture: { group: 0, binding: 3 },\r\n randomTexture2: { group: 0, binding: 4 },\r\n };\r\n if (this._parent._sizeGradientsTexture) {\r\n bindingsMapping[\"sizeGradientTexture\"] = { group: 1, binding: 1 };\r\n }\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n bindingsMapping[\"angularSpeedGradientTexture\"] = { group: 1, binding: 3 };\r\n }\r\n if (this._parent._velocityGradientsTexture) {\r\n bindingsMapping[\"velocityGradientTexture\"] = { group: 1, binding: 5 };\r\n }\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n bindingsMapping[\"limitVelocityGradientTexture\"] = { group: 1, binding: 7 };\r\n }\r\n if (this._parent._dragGradientsTexture) {\r\n bindingsMapping[\"dragGradientTexture\"] = { group: 1, binding: 9 };\r\n }\r\n if (this._parent.noiseTexture) {\r\n bindingsMapping[\"noiseTexture\"] = { group: 1, binding: 11 };\r\n }\r\n\r\n this._updateComputeShader = new ComputeShader(\"updateParticles\", this._engine, \"gpuUpdateParticles\", { bindingsMapping, defines: defines.split(\"\\n\") });\r\n\r\n this._simParamsComputeShader?.dispose();\r\n this._simParamsComputeShader = new UniformBuffer(this._engine);\r\n\r\n this._simParamsComputeShader.addUniform(\"currentCount\", 1);\r\n this._simParamsComputeShader.addUniform(\"timeDelta\", 1);\r\n this._simParamsComputeShader.addUniform(\"stopFactor\", 1);\r\n this._simParamsComputeShader.addUniform(\"randomTextureSize\", 1);\r\n this._simParamsComputeShader.addUniform(\"lifeTime\", 2);\r\n this._simParamsComputeShader.addUniform(\"emitPower\", 2);\r\n if (!this._parent._colorGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"color1\", 4);\r\n this._simParamsComputeShader.addUniform(\"color2\", 4);\r\n }\r\n this._simParamsComputeShader.addUniform(\"sizeRange\", 2);\r\n this._simParamsComputeShader.addUniform(\"scaleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"angleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"gravity\", 3);\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"limitVelocityDamping\", 1);\r\n }\r\n if (this._parent.isAnimationSheetEnabled) {\r\n this._simParamsComputeShader.addUniform(\"cellInfos\", 4);\r\n }\r\n if (this._parent.noiseTexture) {\r\n this._simParamsComputeShader.addUniform(\"noiseStrength\", 3);\r\n }\r\n if (!this._parent.isLocal) {\r\n this._simParamsComputeShader.addUniform(\"emitterWM\", 16);\r\n }\r\n if (this._parent.particleEmitterType) {\r\n this._parent.particleEmitterType.buildUniformLayout(this._simParamsComputeShader);\r\n }\r\n\r\n this._updateComputeShader.setUniformBuffer(\"params\", this._simParamsComputeShader);\r\n\r\n return new UniformBufferEffectCommonAccessor(this._simParamsComputeShader);\r\n }\r\n\r\n public createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: { [key: string]: VertexBuffer }): void {\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n }\r\n\r\n public createParticleBuffer(data: number[]): DataArray | DataBuffer {\r\n const buffer = new StorageBuffer(this._engine, data.length * 4, Constants.BUFFER_CREATIONFLAG_READWRITE | Constants.BUFFER_CREATIONFLAG_VERTEX);\r\n\r\n buffer.update(data);\r\n this._bufferComputeShader.push(buffer);\r\n\r\n return buffer.getBuffer();\r\n }\r\n\r\n public bindDrawBuffers(index: number, effect: Effect): void {\r\n this._engine.bindBuffers(this._renderVertexBuffers[index], null, effect);\r\n }\r\n\r\n public preUpdateParticleBuffer(): void {}\r\n\r\n public updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void {\r\n this._simParamsComputeShader.update();\r\n\r\n this._updateComputeShader.setTexture(\"randomTexture\", this._parent._randomTexture, false);\r\n this._updateComputeShader.setTexture(\"randomTexture2\", this._parent._randomTexture2, false);\r\n if (this._parent._sizeGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"sizeGradientTexture\", this._parent._sizeGradientsTexture);\r\n }\r\n\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"angularSpeedGradientTexture\", this._parent._angularSpeedGradientsTexture);\r\n }\r\n\r\n if (this._parent._velocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"velocityGradientTexture\", this._parent._velocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"limitVelocityGradientTexture\", this._parent._limitVelocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._dragGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"dragGradientTexture\", this._parent._dragGradientsTexture);\r\n }\r\n\r\n if (this._parent.noiseTexture) {\r\n this._updateComputeShader.setTexture(\"noiseTexture\", this._parent.noiseTexture);\r\n }\r\n\r\n this._updateComputeShader.setStorageBuffer(\"particlesIn\", this._bufferComputeShader[index]);\r\n this._updateComputeShader.setStorageBuffer(\"particlesOut\", this._bufferComputeShader[index ^ 1]);\r\n\r\n this._updateComputeShader.dispatch(Math.ceil(currentActiveCount / 64));\r\n }\r\n\r\n public releaseBuffers(): void {\r\n for (let i = 0; i < this._bufferComputeShader.length; ++i) {\r\n this._bufferComputeShader[i].dispose();\r\n }\r\n\r\n this._bufferComputeShader.length = 0;\r\n\r\n this._simParamsComputeShader?.dispose();\r\n (<any>this._simParamsComputeShader) = null;\r\n\r\n (<any>this._updateComputeShader) = null;\r\n }\r\n\r\n public releaseVertexBuffers(): void {\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShaderParticleSystem\", ComputeShaderParticleSystem);\r\n"]}
1
+ {"version":3,"file":"computeShaderParticleSystem.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Particles/computeShaderParticleSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAO3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,iCAAiC,EAAE,MAAM,gDAAgD,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,2CAA2C,CAAC;AAEnD,gBAAgB;AAChB,MAAM,OAAO,2BAA2B;IAUpC,YAAY,MAAyB,EAAE,MAAkB;QALjD,yBAAoB,GAAoB,EAAE,CAAC;QAC3C,yBAAoB,GAA2C,EAAE,CAAC;QAE1D,sBAAiB,GAAG,IAAI,CAAC;QAGrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAEM,qBAAqB;QACxB,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;IACvC,CAAC;IAEM,mBAAmB;;QACtB,OAAO,MAAA,MAAA,IAAI,CAAC,oBAAoB,0CAAE,OAAO,EAAE,mCAAI,KAAK,CAAC;IACzD,CAAC;IAEM,kBAAkB,CAAC,OAAe;;QACrC,MAAM,eAAe,GAA0B;YAC3C,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAChC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACrC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACtC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YACvC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;SAC3C,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACpC,eAAe,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACrE;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE;YAC5C,eAAe,CAAC,6BAA6B,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SAC7E;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACxC,eAAe,CAAC,yBAAyB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACzE;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE;YAC7C,eAAe,CAAC,8BAA8B,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SAC9E;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACpC,eAAe,CAAC,qBAAqB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;SACrE;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC3B,eAAe,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;SAC/D;QAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExJ,MAAA,IAAI,CAAC,uBAAuB,0CAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,uBAAuB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACtC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;SACxD;QACD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE;YAC7C,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC;SACtE;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACtC,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;SAC3D;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC3B,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;SAC/D;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACvB,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;SAC5D;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;YAClC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;SACrF;QAED,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEnF,OAAO,IAAI,iCAAiC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAEM,mBAAmB,CAAC,YAAoB,EAAE,mBAAoD;QACjG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxD,CAAC;IAEM,oBAAoB,CAAC,IAAc;QACtC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,CAAC,6BAA6B,GAAG,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAEhJ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IAC9B,CAAC;IAEM,eAAe,CAAC,KAAa,EAAE,MAAc;QAChD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAEM,uBAAuB,KAAU,CAAC;IAElC,oBAAoB,CAAC,KAAa,EAAE,YAAoB,EAAE,kBAA0B;QACvF,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;QAEtC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC1F,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACpC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SACnG;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE;YAC5C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,6BAA6B,EAAE,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;SACnH;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACxC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;SAC3G;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE;YAC7C,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,8BAA8B,EAAE,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;SACrH;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACpC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SACnG;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC3B,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SACnF;QAED,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEM,cAAc;;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACvD,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC1C;QAED,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QAErC,MAAA,IAAI,CAAC,uBAAuB,0CAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,uBAAwB,GAAG,IAAI,CAAC;QAErC,IAAI,CAAC,oBAAqB,GAAG,IAAI,CAAC;IAC5C,CAAC;IAEM,oBAAoB;QACvB,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,CAAC;CACJ;AAED,aAAa,CAAC,qCAAqC,EAAE,2BAA2B,CAAC,CAAC","sourcesContent":["import type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { StorageBuffer } from \"../Buffers/storageBuffer\";\r\nimport { ComputeShader } from \"../Compute/computeShader\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport type { IGPUParticleSystemPlatform } from \"./IGPUParticleSystemPlatform\";\r\nimport type { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { GPUParticleSystem } from \"./gpuParticleSystem\";\r\n\r\nimport type { DataArray } from \"../types\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { UniformBufferEffectCommonAccessor } from \"../Materials/uniformBufferEffectCommonAccessor\";\r\nimport type { ComputeBindingMapping } from \"../Engines/Extensions/engine.computeShader\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\nimport \"../ShadersWGSL/gpuUpdateParticles.compute\";\r\n\r\n/** @internal */\r\nexport class ComputeShaderParticleSystem implements IGPUParticleSystemPlatform {\r\n private _parent: GPUParticleSystem;\r\n private _engine: ThinEngine;\r\n private _updateComputeShader: ComputeShader;\r\n private _simParamsComputeShader: UniformBuffer;\r\n private _bufferComputeShader: StorageBuffer[] = [];\r\n private _renderVertexBuffers: Array<{ [key: string]: VertexBuffer }> = [];\r\n\r\n public readonly alignDataInBuffer = true;\r\n\r\n constructor(parent: GPUParticleSystem, engine: ThinEngine) {\r\n this._parent = parent;\r\n this._engine = engine;\r\n }\r\n\r\n public isUpdateBufferCreated(): boolean {\r\n return !!this._updateComputeShader;\r\n }\r\n\r\n public isUpdateBufferReady(): boolean {\r\n return this._updateComputeShader?.isReady() ?? false;\r\n }\r\n\r\n public createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor {\r\n const bindingsMapping: ComputeBindingMapping = {\r\n params: { group: 0, binding: 0 },\r\n particlesIn: { group: 0, binding: 1 },\r\n particlesOut: { group: 0, binding: 2 },\r\n randomTexture: { group: 0, binding: 3 },\r\n randomTexture2: { group: 0, binding: 4 },\r\n };\r\n if (this._parent._sizeGradientsTexture) {\r\n bindingsMapping[\"sizeGradientTexture\"] = { group: 1, binding: 1 };\r\n }\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n bindingsMapping[\"angularSpeedGradientTexture\"] = { group: 1, binding: 3 };\r\n }\r\n if (this._parent._velocityGradientsTexture) {\r\n bindingsMapping[\"velocityGradientTexture\"] = { group: 1, binding: 5 };\r\n }\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n bindingsMapping[\"limitVelocityGradientTexture\"] = { group: 1, binding: 7 };\r\n }\r\n if (this._parent._dragGradientsTexture) {\r\n bindingsMapping[\"dragGradientTexture\"] = { group: 1, binding: 9 };\r\n }\r\n if (this._parent.noiseTexture) {\r\n bindingsMapping[\"noiseTexture\"] = { group: 1, binding: 11 };\r\n }\r\n\r\n this._updateComputeShader = new ComputeShader(\"updateParticles\", this._engine, \"gpuUpdateParticles\", { bindingsMapping, defines: defines.split(\"\\n\") });\r\n\r\n this._simParamsComputeShader?.dispose();\r\n this._simParamsComputeShader = new UniformBuffer(this._engine);\r\n\r\n this._simParamsComputeShader.addUniform(\"currentCount\", 1);\r\n this._simParamsComputeShader.addUniform(\"timeDelta\", 1);\r\n this._simParamsComputeShader.addUniform(\"stopFactor\", 1);\r\n this._simParamsComputeShader.addUniform(\"randomTextureSize\", 1);\r\n this._simParamsComputeShader.addUniform(\"lifeTime\", 2);\r\n this._simParamsComputeShader.addUniform(\"emitPower\", 2);\r\n if (!this._parent._colorGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"color1\", 4);\r\n this._simParamsComputeShader.addUniform(\"color2\", 4);\r\n }\r\n this._simParamsComputeShader.addUniform(\"sizeRange\", 2);\r\n this._simParamsComputeShader.addUniform(\"scaleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"angleRange\", 4);\r\n this._simParamsComputeShader.addUniform(\"gravity\", 3);\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._simParamsComputeShader.addUniform(\"limitVelocityDamping\", 1);\r\n }\r\n if (this._parent.isAnimationSheetEnabled) {\r\n this._simParamsComputeShader.addUniform(\"cellInfos\", 4);\r\n }\r\n if (this._parent.noiseTexture) {\r\n this._simParamsComputeShader.addUniform(\"noiseStrength\", 3);\r\n }\r\n if (!this._parent.isLocal) {\r\n this._simParamsComputeShader.addUniform(\"emitterWM\", 16);\r\n }\r\n if (this._parent.particleEmitterType) {\r\n this._parent.particleEmitterType.buildUniformLayout(this._simParamsComputeShader);\r\n }\r\n\r\n this._updateComputeShader.setUniformBuffer(\"params\", this._simParamsComputeShader);\r\n\r\n return new UniformBufferEffectCommonAccessor(this._simParamsComputeShader);\r\n }\r\n\r\n public createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: { [key: string]: VertexBuffer }): void {\r\n this._renderVertexBuffers.push(renderVertexBuffers);\r\n }\r\n\r\n public createParticleBuffer(data: number[]): DataArray | DataBuffer {\r\n const buffer = new StorageBuffer(this._engine, data.length * 4, Constants.BUFFER_CREATIONFLAG_READWRITE | Constants.BUFFER_CREATIONFLAG_VERTEX);\r\n\r\n buffer.update(data);\r\n this._bufferComputeShader.push(buffer);\r\n\r\n return buffer.getBuffer();\r\n }\r\n\r\n public bindDrawBuffers(index: number, effect: Effect): void {\r\n this._engine.bindBuffers(this._renderVertexBuffers[index], null, effect);\r\n }\r\n\r\n public preUpdateParticleBuffer(): void {}\r\n\r\n public updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void {\r\n this._simParamsComputeShader.update();\r\n\r\n this._updateComputeShader.setTexture(\"randomTexture\", this._parent._randomTexture, false);\r\n this._updateComputeShader.setTexture(\"randomTexture2\", this._parent._randomTexture2, false);\r\n if (this._parent._sizeGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"sizeGradientTexture\", this._parent._sizeGradientsTexture);\r\n }\r\n\r\n if (this._parent._angularSpeedGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"angularSpeedGradientTexture\", this._parent._angularSpeedGradientsTexture);\r\n }\r\n\r\n if (this._parent._velocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"velocityGradientTexture\", this._parent._velocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._limitVelocityGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"limitVelocityGradientTexture\", this._parent._limitVelocityGradientsTexture);\r\n }\r\n\r\n if (this._parent._dragGradientsTexture) {\r\n this._updateComputeShader.setTexture(\"dragGradientTexture\", this._parent._dragGradientsTexture);\r\n }\r\n\r\n if (this._parent.noiseTexture) {\r\n this._updateComputeShader.setTexture(\"noiseTexture\", this._parent.noiseTexture);\r\n }\r\n\r\n this._updateComputeShader.setStorageBuffer(\"particlesIn\", this._bufferComputeShader[index]);\r\n this._updateComputeShader.setStorageBuffer(\"particlesOut\", this._bufferComputeShader[index ^ 1]);\r\n\r\n this._updateComputeShader.dispatch(Math.ceil(currentActiveCount / 64));\r\n }\r\n\r\n public releaseBuffers(): void {\r\n for (let i = 0; i < this._bufferComputeShader.length; ++i) {\r\n this._bufferComputeShader[i].dispose();\r\n }\r\n\r\n this._bufferComputeShader.length = 0;\r\n\r\n this._simParamsComputeShader?.dispose();\r\n (<any>this._simParamsComputeShader) = null;\r\n\r\n (<any>this._updateComputeShader) = null;\r\n }\r\n\r\n public releaseVertexBuffers(): void {\r\n this._renderVertexBuffers.length = 0;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ComputeShaderParticleSystem\", ComputeShaderParticleSystem);\r\n"]}
@@ -98,7 +98,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
98
98
  }
99
99
  // Setup the default processing configuration to the scene.
100
100
  this._attachImageProcessingConfiguration(null);
101
- options = options ?? {};
101
+ options = options !== null && options !== void 0 ? options : {};
102
102
  if (!options.randomTextureSize) {
103
103
  delete options.randomTextureSize;
104
104
  }
@@ -276,10 +276,12 @@ export class GPUParticleSystem extends BaseParticleSystem {
276
276
  * @returns The effect
277
277
  */
278
278
  getCustomEffect(blendMode = 0) {
279
- return this._customWrappers[blendMode]?.effect ?? this._customWrappers[0].effect;
279
+ var _a, _b;
280
+ return (_b = (_a = this._customWrappers[blendMode]) === null || _a === void 0 ? void 0 : _a.effect) !== null && _b !== void 0 ? _b : this._customWrappers[0].effect;
280
281
  }
281
282
  _getCustomDrawWrapper(blendMode = 0) {
282
- return this._customWrappers[blendMode] ?? this._customWrappers[0];
283
+ var _a;
284
+ return (_a = this._customWrappers[blendMode]) !== null && _a !== void 0 ? _a : this._customWrappers[0];
283
285
  }
284
286
  /**
285
287
  * Sets the custom effect used to render the particles
@@ -369,9 +371,10 @@ export class GPUParticleSystem extends BaseParticleSystem {
369
371
  * Resets the draw wrappers cache
370
372
  */
371
373
  resetDrawCache() {
374
+ var _a;
372
375
  for (const blendMode in this._drawWrappers) {
373
376
  const drawWrapper = this._drawWrappers[blendMode];
374
- drawWrapper.drawContext?.reset();
377
+ (_a = drawWrapper.drawContext) === null || _a === void 0 ? void 0 : _a.reset();
375
378
  }
376
379
  }
377
380
  _addFactorGradient(factorGradients, gradient, factor) {
@@ -920,7 +923,7 @@ export class GPUParticleSystem extends BaseParticleSystem {
920
923
  */
921
924
  _getWrapper(blendMode) {
922
925
  const customWrapper = this._getCustomDrawWrapper(blendMode);
923
- if (customWrapper?.effect) {
926
+ if (customWrapper === null || customWrapper === void 0 ? void 0 : customWrapper.effect) {
924
927
  return customWrapper;
925
928
  }
926
929
  const defines = [];
@@ -1074,7 +1077,8 @@ export class GPUParticleSystem extends BaseParticleSystem {
1074
1077
  * @param preWarm defines if we are in the pre-warmimg phase
1075
1078
  */
1076
1079
  animate(preWarm = false) {
1077
- this._timeDelta = this.updateSpeed * (preWarm ? this.preWarmStepOffset : this._scene?.getAnimationRatio() || 1);
1080
+ var _a;
1081
+ this._timeDelta = this.updateSpeed * (preWarm ? this.preWarmStepOffset : ((_a = this._scene) === null || _a === void 0 ? void 0 : _a.getAnimationRatio()) || 1);
1078
1082
  this._actualFrame += this._timeDelta;
1079
1083
  if (!this._stopped) {
1080
1084
  if (this.targetStopDuration && this._actualFrame >= this.targetStopDuration) {
@@ -1130,13 +1134,14 @@ export class GPUParticleSystem extends BaseParticleSystem {
1130
1134
  this._colorGradientsTexture = RawTexture.CreateRGBATexture(data, this._rawTextureWidth, 1, this._scene, false, false, 1);
1131
1135
  }
1132
1136
  _render(blendMode, emitterWM) {
1137
+ var _a, _b;
1133
1138
  // Enable render effect
1134
1139
  const drawWrapper = this._getWrapper(blendMode);
1135
1140
  const effect = drawWrapper.effect;
1136
1141
  this._engine.enableEffect(drawWrapper);
1137
- const viewMatrix = this._scene?.getViewMatrix() || Matrix.IdentityReadOnly;
1142
+ const viewMatrix = ((_a = this._scene) === null || _a === void 0 ? void 0 : _a.getViewMatrix()) || Matrix.IdentityReadOnly;
1138
1143
  effect.setMatrix("view", viewMatrix);
1139
- effect.setMatrix("projection", this.defaultProjectionMatrix ?? this._scene.getProjectionMatrix());
1144
+ effect.setMatrix("projection", (_b = this.defaultProjectionMatrix) !== null && _b !== void 0 ? _b : this._scene.getProjectionMatrix());
1140
1145
  effect.setTexture("diffuseSampler", this.particleTexture);
1141
1146
  effect.setVector2("translationPivot", this.translationPivot);
1142
1147
  effect.setVector3("worldOffset", this.worldOffset);