@babylonjs/core 6.8.0 → 6.9.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 (517) hide show
  1. package/Actions/abstractActionManager.js.map +1 -1
  2. package/Actions/action.d.ts +4 -5
  3. package/Actions/action.js.map +1 -1
  4. package/Actions/condition.d.ts +1 -2
  5. package/Actions/condition.js.map +1 -1
  6. package/Actions/directActions.d.ts +1 -2
  7. package/Actions/directActions.js.map +1 -1
  8. package/Animations/animatable.interface.d.ts +1 -2
  9. package/Animations/animatable.interface.js.map +1 -1
  10. package/Animations/animation.d.ts +3 -4
  11. package/Animations/animation.js.map +1 -1
  12. package/Animations/animationGroup.d.ts +5 -0
  13. package/Animations/animationGroup.js +12 -0
  14. package/Animations/animationGroup.js.map +1 -1
  15. package/Animations/easing.js.map +1 -1
  16. package/Animations/runtimeAnimation.d.ts +1 -2
  17. package/Animations/runtimeAnimation.js.map +1 -1
  18. package/Audio/audioSceneComponent.js.map +1 -1
  19. package/Audio/sound.js.map +1 -1
  20. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
  21. package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
  22. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  24. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  25. package/Bones/bone.d.ts +3 -3
  26. package/Bones/bone.js.map +1 -1
  27. package/Bones/boneIKController.js.map +1 -1
  28. package/Bones/boneLookController.js.map +1 -1
  29. package/Buffers/dataBuffer.js.map +1 -1
  30. package/Cameras/Inputs/BaseCameraMouseWheelInput.js.map +1 -1
  31. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  32. package/Cameras/Inputs/arcRotateCameraGamepadInput.js.map +1 -1
  33. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
  34. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  35. package/Cameras/Inputs/arcRotateCameraPointersInput.js.map +1 -1
  36. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  37. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  38. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  39. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  40. package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
  41. package/Cameras/Inputs/freeCameraGamepadInput.js.map +1 -1
  42. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  43. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  44. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  45. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  46. package/Cameras/arcRotateCamera.d.ts +1 -2
  47. package/Cameras/arcRotateCamera.js.map +1 -1
  48. package/Cameras/camera.d.ts +6 -7
  49. package/Cameras/camera.js.map +1 -1
  50. package/Cameras/flyCamera.js.map +1 -1
  51. package/Cameras/followCamera.js.map +1 -1
  52. package/Cameras/freeCamera.js.map +1 -1
  53. package/Cameras/targetCamera.js.map +1 -1
  54. package/Collisions/collider.js.map +1 -1
  55. package/Collisions/meshCollisionData.d.ts +1 -2
  56. package/Collisions/meshCollisionData.js.map +1 -1
  57. package/Collisions/pickingInfo.d.ts +1 -2
  58. package/Collisions/pickingInfo.js.map +1 -1
  59. package/Compute/computeEffect.d.ts +1 -2
  60. package/Compute/computeEffect.js.map +1 -1
  61. package/Compute/computeShader.js +1 -5
  62. package/Compute/computeShader.js.map +1 -1
  63. package/Culling/Octrees/octree.js.map +1 -1
  64. package/Culling/Octrees/octreeSceneComponent.d.ts +1 -2
  65. package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
  66. package/Culling/boundingBox.d.ts +1 -2
  67. package/Culling/boundingBox.js.map +1 -1
  68. package/Culling/boundingInfo.d.ts +1 -2
  69. package/Culling/boundingInfo.js.map +1 -1
  70. package/Culling/boundingSphere.js.map +1 -1
  71. package/Culling/ray.js.map +1 -1
  72. package/Debug/debugLayer.js +1 -9
  73. package/Debug/debugLayer.js.map +1 -1
  74. package/Debug/skeletonViewer.js.map +1 -1
  75. package/Engines/Extensions/engine.cubeTexture.js +1 -6
  76. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  77. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  78. package/Engines/Extensions/engine.renderTarget.js +1 -6
  79. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  80. package/Engines/Extensions/engine.renderTargetCube.js +1 -9
  81. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  82. package/Engines/Extensions/engine.storageBuffer.d.ts +1 -2
  83. package/Engines/Extensions/engine.storageBuffer.js.map +1 -1
  84. package/Engines/Extensions/engine.textureSampler.d.ts +1 -2
  85. package/Engines/Extensions/engine.textureSampler.js.map +1 -1
  86. package/Engines/Extensions/engine.webVR.js +1 -5
  87. package/Engines/Extensions/engine.webVR.js.map +1 -1
  88. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js +3 -0
  89. package/Engines/Processors/Expressions/Operators/shaderDefineArithmeticOperator.js.map +1 -1
  90. package/Engines/Processors/iShaderProcessor.d.ts +1 -2
  91. package/Engines/Processors/iShaderProcessor.js.map +1 -1
  92. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  93. package/Engines/Processors/shaderProcessor.d.ts +5 -6
  94. package/Engines/Processors/shaderProcessor.js +10 -3
  95. package/Engines/Processors/shaderProcessor.js.map +1 -1
  96. package/Engines/WebGL/webGLShaderProcessors.d.ts +1 -2
  97. package/Engines/WebGL/webGLShaderProcessors.js.map +1 -1
  98. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +1 -7
  99. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  100. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  101. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  102. package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -8
  103. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  104. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +1 -10
  105. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  106. package/Engines/WebGPU/Extensions/engine.storageBuffer.d.ts +1 -2
  107. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  108. package/Engines/WebGPU/Extensions/engine.textureSampler.d.ts +1 -2
  109. package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
  110. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  111. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  112. package/Engines/WebGPU/webgpuCacheSampler.js +1 -6
  113. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  114. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +1 -2
  115. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  116. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  117. package/Engines/WebGPU/webgpuTintWASM.js +1 -4
  118. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  119. package/Engines/engine.d.ts +3 -3
  120. package/Engines/engine.js.map +1 -1
  121. package/Engines/engineStore.d.ts +4 -5
  122. package/Engines/engineStore.js.map +1 -1
  123. package/Engines/nativeEngine.js.map +1 -1
  124. package/Engines/nullEngine.js +1 -9
  125. package/Engines/nullEngine.js.map +1 -1
  126. package/Engines/thinEngine.js +3 -2
  127. package/Engines/thinEngine.js.map +1 -1
  128. package/Engines/webgpuEngine.d.ts +1 -2
  129. package/Engines/webgpuEngine.js +3 -14
  130. package/Engines/webgpuEngine.js.map +1 -1
  131. package/Events/pointerEvents.d.ts +1 -2
  132. package/Events/pointerEvents.js.map +1 -1
  133. package/Gamepads/Controllers/gearVRController.js.map +1 -1
  134. package/Gamepads/Controllers/oculusTouchController.js.map +1 -1
  135. package/Gamepads/Controllers/poseEnabledController.js.map +1 -1
  136. package/Gamepads/Controllers/windowsMotionController.js.map +1 -1
  137. package/Gamepads/gamepad.js.map +1 -1
  138. package/Gizmos/cameraGizmo.js.map +1 -1
  139. package/Gizmos/gizmo.js.map +1 -1
  140. package/Gizmos/lightGizmo.js.map +1 -1
  141. package/Gizmos/planeRotationGizmo.js.map +1 -1
  142. package/Helpers/environmentHelper.js +2 -8
  143. package/Helpers/environmentHelper.js.map +1 -1
  144. package/Helpers/textureDome.js.map +1 -1
  145. package/Inputs/scene.inputManager.d.ts +1 -2
  146. package/Inputs/scene.inputManager.js +4 -1
  147. package/Inputs/scene.inputManager.js.map +1 -1
  148. package/Layers/effectLayer.js +1 -8
  149. package/Layers/effectLayer.js.map +1 -1
  150. package/Layers/glowLayer.js +1 -12
  151. package/Layers/glowLayer.js.map +1 -1
  152. package/Layers/highlightLayer.js +1 -11
  153. package/Layers/highlightLayer.js.map +1 -1
  154. package/Legacy/legacy.js +1 -1
  155. package/Legacy/legacy.js.map +1 -1
  156. package/LensFlares/lensFlareSystem.js.map +1 -1
  157. package/Lights/Shadows/shadowGenerator.js +1 -4
  158. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  159. package/Lights/directionalLight.js.map +1 -1
  160. package/Lights/hemisphericLight.js.map +1 -1
  161. package/Lights/light.js.map +1 -1
  162. package/Lights/spotLight.js.map +1 -1
  163. package/Loading/loadingScreen.js.map +1 -1
  164. package/Materials/Background/backgroundMaterial.js.map +1 -1
  165. package/Materials/Node/Blocks/Dual/currentScreenBlock.d.ts +2 -3
  166. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  167. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  168. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  169. package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +2 -3
  170. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  171. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +3 -4
  172. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  173. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  174. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  175. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  176. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  177. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  178. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  179. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  180. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  181. package/Materials/Node/Blocks/Particle/particleTextureBlock.d.ts +1 -2
  182. package/Materials/Node/Blocks/Particle/particleTextureBlock.js.map +1 -1
  183. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  184. package/Materials/Node/Blocks/addBlock.js +2 -0
  185. package/Materials/Node/Blocks/addBlock.js.map +1 -1
  186. package/Materials/Node/Blocks/clampBlock.js.map +1 -1
  187. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  188. package/Materials/Node/Blocks/customBlock.d.ts +1 -0
  189. package/Materials/Node/Blocks/customBlock.js +18 -2
  190. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  191. package/Materials/Node/Blocks/divideBlock.js +2 -0
  192. package/Materials/Node/Blocks/divideBlock.js.map +1 -1
  193. package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
  194. package/Materials/Node/Blocks/multiplyBlock.js +2 -0
  195. package/Materials/Node/Blocks/multiplyBlock.js.map +1 -1
  196. package/Materials/Node/Blocks/remapBlock.js.map +1 -1
  197. package/Materials/Node/Blocks/subtractBlock.js +2 -0
  198. package/Materials/Node/Blocks/subtractBlock.js.map +1 -1
  199. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  200. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  201. package/Materials/Node/nodeMaterial.js +2 -8
  202. package/Materials/Node/nodeMaterial.js.map +1 -1
  203. package/Materials/Node/nodeMaterialDecorator.d.ts +2 -3
  204. package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
  205. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +3 -4
  206. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  207. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  208. package/Materials/PBR/pbrBaseMaterial.js +1 -5
  209. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  210. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  211. package/Materials/PBR/pbrClearCoatConfiguration.d.ts +3 -4
  212. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  213. package/Materials/PBR/pbrIridescenceConfiguration.d.ts +3 -4
  214. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
  215. package/Materials/PBR/pbrMaterial.d.ts +2 -1
  216. package/Materials/PBR/pbrMaterial.js +6 -13
  217. package/Materials/PBR/pbrMaterial.js.map +1 -1
  218. package/Materials/PBR/pbrMetallicRoughnessMaterial.js.map +1 -1
  219. package/Materials/PBR/pbrSheenConfiguration.d.ts +3 -4
  220. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  221. package/Materials/PBR/pbrSpecularGlossinessMaterial.js.map +1 -1
  222. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +3 -4
  223. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  224. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  225. package/Materials/Textures/baseTexture.d.ts +2 -1
  226. package/Materials/Textures/baseTexture.js.map +1 -1
  227. package/Materials/Textures/cubeTexture.js.map +1 -1
  228. package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
  229. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  230. package/Materials/Textures/htmlElementTexture.d.ts +2 -3
  231. package/Materials/Textures/htmlElementTexture.js +1 -4
  232. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  233. package/Materials/Textures/internalTexture.d.ts +3 -4
  234. package/Materials/Textures/internalTexture.js.map +1 -1
  235. package/Materials/Textures/rawTexture.d.ts +1 -2
  236. package/Materials/Textures/rawTexture.js.map +1 -1
  237. package/Materials/Textures/rawTexture2DArray.d.ts +1 -2
  238. package/Materials/Textures/rawTexture2DArray.js.map +1 -1
  239. package/Materials/Textures/renderTargetTexture.d.ts +1 -2
  240. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  241. package/Materials/Textures/texture.d.ts +4 -5
  242. package/Materials/Textures/texture.js.map +1 -1
  243. package/Materials/Textures/videoTexture.js +9 -22
  244. package/Materials/Textures/videoTexture.js.map +1 -1
  245. package/Materials/colorCurves.js.map +1 -1
  246. package/Materials/drawWrapper.d.ts +3 -4
  247. package/Materials/drawWrapper.js.map +1 -1
  248. package/Materials/effect.d.ts +5 -6
  249. package/Materials/effect.js.map +1 -1
  250. package/Materials/effectFallbacks.d.ts +2 -3
  251. package/Materials/effectFallbacks.js.map +1 -1
  252. package/Materials/greasedLinePluginMaterial.d.ts +307 -0
  253. package/Materials/greasedLinePluginMaterial.js +553 -0
  254. package/Materials/greasedLinePluginMaterial.js.map +1 -0
  255. package/Materials/iEffectFallbacks.d.ts +1 -2
  256. package/Materials/iEffectFallbacks.js.map +1 -1
  257. package/Materials/imageProcessingConfiguration.d.ts +2 -3
  258. package/Materials/imageProcessingConfiguration.js.map +1 -1
  259. package/Materials/index.d.ts +1 -0
  260. package/Materials/index.js +1 -0
  261. package/Materials/index.js.map +1 -1
  262. package/Materials/material.d.ts +6 -4
  263. package/Materials/material.decalMapConfiguration.js.map +1 -1
  264. package/Materials/material.detailMapConfiguration.d.ts +4 -5
  265. package/Materials/material.detailMapConfiguration.js.map +1 -1
  266. package/Materials/material.js +40 -5
  267. package/Materials/material.js.map +1 -1
  268. package/Materials/materialPluginBase.d.ts +13 -14
  269. package/Materials/materialPluginBase.js +2 -2
  270. package/Materials/materialPluginBase.js.map +1 -1
  271. package/Materials/materialPluginEvent.d.ts +8 -9
  272. package/Materials/materialPluginEvent.js.map +1 -1
  273. package/Materials/materialPluginFactoryExport.d.ts +1 -2
  274. package/Materials/materialPluginFactoryExport.js.map +1 -1
  275. package/Materials/materialPluginManager.d.ts +6 -6
  276. package/Materials/materialPluginManager.js +3 -1
  277. package/Materials/materialPluginManager.js.map +1 -1
  278. package/Materials/materialStencilState.d.ts +1 -2
  279. package/Materials/materialStencilState.js.map +1 -1
  280. package/Materials/shaderMaterial.d.ts +4 -5
  281. package/Materials/shaderMaterial.js +6 -19
  282. package/Materials/shaderMaterial.js.map +1 -1
  283. package/Materials/standardMaterial.d.ts +2 -1
  284. package/Materials/standardMaterial.js +4 -1
  285. package/Materials/standardMaterial.js.map +1 -1
  286. package/Materials/uniformBuffer.js.map +1 -1
  287. package/Maths/math.vector.d.ts +2 -1
  288. package/Maths/math.vector.js +3 -2
  289. package/Maths/math.vector.js.map +1 -1
  290. package/Meshes/Builders/decalBuilder.js +4 -4
  291. package/Meshes/Builders/decalBuilder.js.map +1 -1
  292. package/Meshes/Builders/greasedLineBuilder.d.ts +105 -0
  293. package/Meshes/Builders/greasedLineBuilder.js +330 -0
  294. package/Meshes/Builders/greasedLineBuilder.js.map +1 -0
  295. package/Meshes/Builders/index.d.ts +1 -0
  296. package/Meshes/Builders/index.js +1 -0
  297. package/Meshes/Builders/index.js.map +1 -1
  298. package/Meshes/Builders/linesBuilder.d.ts +1 -2
  299. package/Meshes/Builders/linesBuilder.js.map +1 -1
  300. package/Meshes/Builders/textBuilder.d.ts +34 -0
  301. package/Meshes/Builders/textBuilder.js +10 -2
  302. package/Meshes/Builders/textBuilder.js.map +1 -1
  303. package/Meshes/abstractMesh.d.ts +6 -6
  304. package/Meshes/abstractMesh.js +3 -2
  305. package/Meshes/abstractMesh.js.map +1 -1
  306. package/Meshes/geometry.d.ts +1 -2
  307. package/Meshes/geometry.js.map +1 -1
  308. package/Meshes/greasedLineMesh.d.ts +189 -0
  309. package/Meshes/greasedLineMesh.js +437 -0
  310. package/Meshes/greasedLineMesh.js.map +1 -0
  311. package/Meshes/index.d.ts +1 -0
  312. package/Meshes/index.js +1 -0
  313. package/Meshes/index.js.map +1 -1
  314. package/Meshes/mesh.d.ts +10 -6
  315. package/Meshes/mesh.js +20 -10
  316. package/Meshes/mesh.js.map +1 -1
  317. package/Meshes/mesh.vertexData.d.ts +2 -3
  318. package/Meshes/mesh.vertexData.js.map +1 -1
  319. package/Meshes/meshUVSpaceRenderer.js +1 -8
  320. package/Meshes/meshUVSpaceRenderer.js.map +1 -1
  321. package/Meshes/subMesh.d.ts +7 -8
  322. package/Meshes/subMesh.js.map +1 -1
  323. package/Meshes/transformNode.js.map +1 -1
  324. package/Misc/basis.js.map +1 -1
  325. package/Misc/copyTools.d.ts +1 -2
  326. package/Misc/copyTools.js.map +1 -1
  327. package/Misc/decorators.d.ts +5 -6
  328. package/Misc/decorators.js.map +1 -1
  329. package/Misc/deepCopier.js +7 -1
  330. package/Misc/deepCopier.js.map +1 -1
  331. package/Misc/dumpTools.d.ts +4 -3
  332. package/Misc/dumpTools.js +5 -4
  333. package/Misc/dumpTools.js.map +1 -1
  334. package/Misc/environmentTextureTools.js +1 -1
  335. package/Misc/environmentTextureTools.js.map +1 -1
  336. package/Misc/fileTools.js +10 -10
  337. package/Misc/fileTools.js.map +1 -1
  338. package/Misc/greasedLineTools.d.ts +153 -0
  339. package/Misc/greasedLineTools.js +299 -0
  340. package/Misc/greasedLineTools.js.map +1 -0
  341. package/Misc/index.d.ts +1 -0
  342. package/Misc/index.js +1 -0
  343. package/Misc/index.js.map +1 -1
  344. package/Misc/khronosTextureContainer.js.map +1 -1
  345. package/Misc/rgbdTextureTools.d.ts +3 -4
  346. package/Misc/rgbdTextureTools.js.map +1 -1
  347. package/Misc/sceneOptimizer.js.map +1 -1
  348. package/Misc/screenshotTools.d.ts +16 -7
  349. package/Misc/screenshotTools.js +23 -13
  350. package/Misc/screenshotTools.js.map +1 -1
  351. package/Misc/smartArray.js.map +1 -1
  352. package/Misc/tools.d.ts +21 -9
  353. package/Misc/tools.js +21 -9
  354. package/Misc/tools.js.map +1 -1
  355. package/Misc/videoRecorder.js +1 -4
  356. package/Misc/videoRecorder.js.map +1 -1
  357. package/Misc/virtualJoystick.js +1 -4
  358. package/Misc/virtualJoystick.js.map +1 -1
  359. package/Misc/webRequest.js.map +1 -1
  360. package/Morph/morphTarget.d.ts +2 -1
  361. package/Morph/morphTarget.js.map +1 -1
  362. package/Morph/morphTargetManager.js.map +1 -1
  363. package/Offline/database.js.map +1 -1
  364. package/Particles/EmitterTypes/IParticleEmitterType.d.ts +1 -2
  365. package/Particles/EmitterTypes/IParticleEmitterType.js.map +1 -1
  366. package/Particles/IParticleSystem.d.ts +2 -3
  367. package/Particles/IParticleSystem.js.map +1 -1
  368. package/Particles/baseParticleSystem.js.map +1 -1
  369. package/Particles/gpuParticleSystem.d.ts +1 -2
  370. package/Particles/gpuParticleSystem.js +2 -6
  371. package/Particles/gpuParticleSystem.js.map +1 -1
  372. package/Particles/particle.js.map +1 -1
  373. package/Particles/particleSystem.d.ts +1 -2
  374. package/Particles/particleSystem.js +1 -1
  375. package/Particles/particleSystem.js.map +1 -1
  376. package/Particles/particleSystemSet.js.map +1 -1
  377. package/Particles/subEmitter.d.ts +2 -3
  378. package/Particles/subEmitter.js.map +1 -1
  379. package/Particles/webgl2ParticleSystem.js.map +1 -1
  380. package/Physics/physicsHelper.js +4 -4
  381. package/Physics/physicsHelper.js.map +1 -1
  382. package/Physics/physicsRaycastResult.d.ts +3 -1
  383. package/Physics/physicsRaycastResult.js +10 -1
  384. package/Physics/physicsRaycastResult.js.map +1 -1
  385. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  386. package/Physics/v1/physicsImpostor.js.map +1 -1
  387. package/Physics/v2/IPhysicsEnginePlugin.d.ts +10 -0
  388. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  389. package/Physics/v2/Plugins/havokPlugin.d.ts +3 -2
  390. package/Physics/v2/Plugins/havokPlugin.js +9 -6
  391. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  392. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.d.ts +1 -2
  393. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  394. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  395. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  396. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  397. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.d.ts +1 -2
  398. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  399. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +1 -2
  400. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  401. package/PostProcesses/blackAndWhitePostProcess.d.ts +1 -2
  402. package/PostProcesses/blackAndWhitePostProcess.js.map +1 -1
  403. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  404. package/PostProcesses/blurPostProcess.d.ts +1 -2
  405. package/PostProcesses/blurPostProcess.js.map +1 -1
  406. package/PostProcesses/chromaticAberrationPostProcess.d.ts +1 -2
  407. package/PostProcesses/chromaticAberrationPostProcess.js.map +1 -1
  408. package/PostProcesses/circleOfConfusionPostProcess.js.map +1 -1
  409. package/PostProcesses/colorCorrectionPostProcess.d.ts +1 -2
  410. package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
  411. package/PostProcesses/convolutionPostProcess.d.ts +1 -2
  412. package/PostProcesses/convolutionPostProcess.js.map +1 -1
  413. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  414. package/PostProcesses/displayPassPostProcess.d.ts +1 -2
  415. package/PostProcesses/displayPassPostProcess.js.map +1 -1
  416. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  417. package/PostProcesses/filterPostProcess.d.ts +1 -2
  418. package/PostProcesses/filterPostProcess.js.map +1 -1
  419. package/PostProcesses/fxaaPostProcess.d.ts +1 -2
  420. package/PostProcesses/fxaaPostProcess.js.map +1 -1
  421. package/PostProcesses/grainPostProcess.d.ts +1 -2
  422. package/PostProcesses/grainPostProcess.js.map +1 -1
  423. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  424. package/PostProcesses/motionBlurPostProcess.d.ts +2 -3
  425. package/PostProcesses/motionBlurPostProcess.js.map +1 -1
  426. package/PostProcesses/passPostProcess.d.ts +1 -2
  427. package/PostProcesses/passPostProcess.js.map +1 -1
  428. package/PostProcesses/postProcess.d.ts +6 -6
  429. package/PostProcesses/postProcess.js.map +1 -1
  430. package/PostProcesses/postProcessManager.d.ts +1 -2
  431. package/PostProcesses/postProcessManager.js.map +1 -1
  432. package/PostProcesses/refractionPostProcess.d.ts +1 -2
  433. package/PostProcesses/refractionPostProcess.js.map +1 -1
  434. package/PostProcesses/screenSpaceCurvaturePostProcess.d.ts +2 -3
  435. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  436. package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +2 -3
  437. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  438. package/PostProcesses/sharpenPostProcess.d.ts +2 -3
  439. package/PostProcesses/sharpenPostProcess.js.map +1 -1
  440. package/PostProcesses/tonemapPostProcess.d.ts +1 -2
  441. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  442. package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +1 -2
  443. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  444. package/Probes/reflectionProbe.js.map +1 -1
  445. package/Rendering/depthPeelingRenderer.js.map +1 -1
  446. package/Rendering/depthRenderer.d.ts +2 -3
  447. package/Rendering/depthRenderer.js.map +1 -1
  448. package/Rendering/geometryBufferRenderer.js +2 -2
  449. package/Rendering/geometryBufferRenderer.js.map +1 -1
  450. package/Rendering/outlineRenderer.js.map +1 -1
  451. package/Rendering/prePassRenderer.js.map +1 -1
  452. package/Rendering/renderingGroup.js.map +1 -1
  453. package/Rendering/renderingManager.d.ts +5 -6
  454. package/Rendering/renderingManager.js.map +1 -1
  455. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  456. package/Rendering/utilityLayerRenderer.js.map +1 -1
  457. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +4 -2
  458. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  459. package/Shaders/ShadersInclude/pbrDebug.js +3 -1
  460. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  461. package/Sprites/sprite.d.ts +1 -2
  462. package/Sprites/sprite.js.map +1 -1
  463. package/Sprites/spriteManager.d.ts +1 -2
  464. package/Sprites/spriteManager.js.map +1 -1
  465. package/Sprites/spriteRenderer.d.ts +2 -3
  466. package/Sprites/spriteRenderer.js.map +1 -1
  467. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  468. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  469. package/XR/features/WebXRControllerMovement.js.map +1 -1
  470. package/XR/features/WebXRControllerPhysics.js +4 -13
  471. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  472. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  473. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  474. package/XR/features/WebXRDOMOverlay.js.map +1 -1
  475. package/XR/features/WebXRDepthSensing.js.map +1 -1
  476. package/XR/features/WebXREyeTracking.js.map +1 -1
  477. package/XR/features/WebXRFeaturePointSystem.js.map +1 -1
  478. package/XR/features/WebXRHandTracking.js +2 -8
  479. package/XR/features/WebXRHandTracking.js.map +1 -1
  480. package/XR/features/WebXRHitTest.js.map +1 -1
  481. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  482. package/XR/features/WebXRImageTracking.js.map +1 -1
  483. package/XR/features/WebXRLayers.js +2 -2
  484. package/XR/features/WebXRLayers.js.map +1 -1
  485. package/XR/features/WebXRLightEstimation.js.map +1 -1
  486. package/XR/features/WebXRMeshDetector.js.map +1 -1
  487. package/XR/features/WebXRNearInteraction.js.map +1 -1
  488. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  489. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  490. package/XR/motionController/webXRAbstractMotionController.js +1 -4
  491. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  492. package/XR/motionController/webXRControllerComponent.js.map +1 -1
  493. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  494. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  495. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  496. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  497. package/XR/webXRCamera.js.map +1 -1
  498. package/XR/webXRDefaultExperience.js +6 -28
  499. package/XR/webXRDefaultExperience.js.map +1 -1
  500. package/XR/webXRExperienceHelper.js +1 -0
  501. package/XR/webXRExperienceHelper.js.map +1 -1
  502. package/XR/webXRFeaturesManager.js +1 -4
  503. package/XR/webXRFeaturesManager.js.map +1 -1
  504. package/XR/webXRInput.js +1 -6
  505. package/XR/webXRInput.js.map +1 -1
  506. package/abstractScene.d.ts +3 -3
  507. package/abstractScene.js.map +1 -1
  508. package/assetContainer.js +1 -4
  509. package/assetContainer.js.map +1 -1
  510. package/node.d.ts +6 -7
  511. package/node.js.map +1 -1
  512. package/package.json +2 -4
  513. package/scene.d.ts +49 -50
  514. package/scene.js +4 -10
  515. package/scene.js.map +1 -1
  516. package/sceneComponent.d.ts +6 -7
  517. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"spriteManager.js","sourceRoot":"","sources":["../../../../lts/core/generated/Sprites/spriteManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector\";\r\nimport { Sprite } from \"./sprite\";\r\nimport { SpriteSceneComponent } from \"./spriteSceneComponent\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { SpriteRenderer } from \"./spriteRenderer\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\r\ndeclare const Reflect: any;\r\n\r\n/**\r\n * Defines the minimum interface to fulfill in order to be a sprite manager.\r\n */\r\nexport interface ISpriteManager extends IDisposable {\r\n /**\r\n * Gets manager's name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render spriteManager.layerMask & camera.layerMask!== 0\r\n */\r\n layerMask: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n isPickable: boolean;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n renderingGroupId: number;\r\n\r\n /**\r\n * Defines the list of sprites managed by the manager.\r\n */\r\n sprites: Array<Sprite>;\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n texture: Texture;\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n cellWidth: number;\r\n /** Defines the default height of a cell in the spritesheet */\r\n cellHeight: number;\r\n\r\n /** @internal */\r\n _wasDispatched: boolean;\r\n\r\n /**\r\n * Tests the intersection of a sprite with a specific ray.\r\n * @param ray The ray we are sending to test the collision\r\n * @param camera The camera space we are sending rays in\r\n * @param predicate A predicate allowing excluding sprites from the list of object to test\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info or null.\r\n */\r\n intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;\r\n\r\n /**\r\n * Renders the list of sprites on screen.\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n rebuild(): void;\r\n}\r\n\r\n/**\r\n * Class used to manage multiple sprites on the same spritesheet\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites\r\n */\r\nexport class SpriteManager implements ISpriteManager {\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the manager was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /** Gets the list of sprites */\r\n public sprites = new Array<Sprite>();\r\n /** Gets or sets the rendering group id (0 by default) */\r\n public renderingGroupId = 0;\r\n /** Gets or sets camera layer mask */\r\n public layerMask: number = 0x0fffffff;\r\n /** Gets or sets a boolean indicating if the sprites are pickable */\r\n public isPickable = false;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the sprite manager\r\n */\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /**\r\n * An event triggered when the manager is disposed.\r\n */\r\n public onDisposeObservable = new Observable<SpriteManager>();\r\n\r\n /**\r\n * Callback called when the manager is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the sprite\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets the array of sprites\r\n */\r\n public get children() {\r\n return this.sprites;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._spriteRenderer.capacity;\r\n }\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n public get texture(): Texture {\r\n return this._spriteRenderer.texture as Texture;\r\n }\r\n public set texture(value: Texture) {\r\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._spriteRenderer.texture = value;\r\n this._textureContent = null;\r\n }\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n public get cellWidth(): number {\r\n return this._spriteRenderer.cellWidth;\r\n }\r\n public set cellWidth(value: number) {\r\n this._spriteRenderer.cellWidth = value;\r\n }\r\n\r\n /** Defines the default height of a cell in the spritesheet */\r\n public get cellHeight(): number {\r\n return this._spriteRenderer.cellHeight;\r\n }\r\n public set cellHeight(value: number) {\r\n this._spriteRenderer.cellHeight = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._spriteRenderer.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._spriteRenderer.fogEnabled = value;\r\n }\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public get blendMode() {\r\n return this._spriteRenderer.blendMode;\r\n }\r\n public set blendMode(blendMode: number) {\r\n this._spriteRenderer.blendMode = blendMode;\r\n }\r\n\r\n private _disableDepthWrite: boolean = false;\r\n /** Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public get disableDepthWrite() {\r\n return this._disableDepthWrite;\r\n }\r\n\r\n public set disableDepthWrite(value: boolean) {\r\n this._disableDepthWrite = value;\r\n this._spriteRenderer.disableDepthWrite = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * In this mode, sprites are rendered as \"pixel art\", which means that they appear as pixelated but remain stable when moving or when rotated or scaled.\r\n * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!\r\n */\r\n public get pixelPerfect() {\r\n return this._spriteRenderer.pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n this._spriteRenderer.pixelPerfect = value;\r\n if (value && this.texture.samplingMode !== Constants.TEXTURE_TRILINEAR_SAMPLINGMODE) {\r\n this.texture.updateSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE);\r\n }\r\n }\r\n\r\n private _spriteRenderer: SpriteRenderer;\r\n /** Associative array from JSON sprite data file */\r\n private _cellData: any;\r\n /** Array of sprite names from JSON sprite data file */\r\n private _spriteMap: Array<string>;\r\n /** True when packed cell data from JSON file is ready*/\r\n private _packedAndReady: boolean = false;\r\n private _textureContent: Nullable<Uint8Array>;\r\n private _onDisposeObserver: Nullable<Observer<SpriteManager>>;\r\n private _fromPacked: boolean;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Creates a new sprite manager\r\n * @param name defines the manager's name\r\n * @param imgUrl defines the sprite sheet url\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param cellSize defines the size of a sprite cell\r\n * @param scene defines the hosting scene\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param samplingMode defines the sampling mode to use with spritesheet\r\n * @param fromPacked set to false; do not alter\r\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\r\n */\r\n constructor(\r\n /** defines the manager's name */\r\n public name: string,\r\n imgUrl: string,\r\n capacity: number,\r\n cellSize: any,\r\n scene: Scene,\r\n epsilon: number = 0.01,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n fromPacked: boolean = false,\r\n spriteJSON: any | null = null\r\n ) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene!;\r\n }\r\n\r\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\r\n scene._addComponent(new SpriteSceneComponent(scene));\r\n }\r\n this._fromPacked = fromPacked;\r\n\r\n this._scene = scene;\r\n const engine = this._scene.getEngine();\r\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene);\r\n\r\n if (cellSize.width && cellSize.height) {\r\n this.cellWidth = cellSize.width;\r\n this.cellHeight = cellSize.height;\r\n } else if (cellSize !== undefined) {\r\n this.cellWidth = cellSize;\r\n this.cellHeight = cellSize;\r\n } else {\r\n this._spriteRenderer = <any>null;\r\n return;\r\n }\r\n\r\n this._scene.spriteManagers && this._scene.spriteManagers.push(this);\r\n this.uniqueId = this.scene.getUniqueId();\r\n\r\n if (imgUrl) {\r\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\r\n }\r\n\r\n if (this._fromPacked) {\r\n this._makePacked(imgUrl, spriteJSON);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the string \"SpriteManager\"\r\n * @returns \"SpriteManager\"\r\n */\r\n public getClassName(): string {\r\n return \"SpriteManager\";\r\n }\r\n\r\n private _makePacked(imgUrl: string, spriteJSON: any) {\r\n if (spriteJSON !== null) {\r\n try {\r\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\r\n let celldata: any;\r\n if (typeof spriteJSON === \"string\") {\r\n celldata = JSON.parse(spriteJSON);\r\n } else {\r\n celldata = spriteJSON;\r\n }\r\n\r\n if (celldata.frames.length) {\r\n const frametemp: any = {};\r\n for (let i = 0; i < celldata.frames.length; i++) {\r\n const _f = celldata.frames[i];\r\n if (typeof Object.keys(_f)[0] !== \"string\") {\r\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\r\n }\r\n\r\n const name: string = _f[Object.keys(_f)[0]];\r\n frametemp[name] = _f;\r\n }\r\n celldata.frames = frametemp;\r\n }\r\n\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\r\n }\r\n } else {\r\n const re = /\\./g;\r\n let li: number;\r\n do {\r\n li = re.lastIndex;\r\n re.test(imgUrl);\r\n } while (re.lastIndex > 0);\r\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\r\n const onerror = () => {\r\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n };\r\n const onload = (data: string | ArrayBuffer) => {\r\n try {\r\n const celldata = JSON.parse(data as string);\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\r\n }\r\n };\r\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\r\n }\r\n }\r\n\r\n private _checkTextureAlpha(sprite: Sprite, ray: Ray, distance: number, min: Vector3, max: Vector3) {\r\n if (!sprite.useAlphaForPicking || !this.texture) {\r\n return true;\r\n }\r\n\r\n const textureSize = this.texture.getSize();\r\n if (!this._textureContent) {\r\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\r\n this.texture.readPixels(0, 0, this._textureContent);\r\n }\r\n\r\n const contactPoint = TmpVectors.Vector3[0];\r\n\r\n contactPoint.copyFrom(ray.direction);\r\n\r\n contactPoint.normalize();\r\n contactPoint.scaleInPlace(distance);\r\n contactPoint.addInPlace(ray.origin);\r\n\r\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x);\r\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y);\r\n\r\n const u = (sprite._xOffset * textureSize.width + contactPointU * sprite._xSize) | 0;\r\n const v = (sprite._yOffset * textureSize.height + contactPointV * sprite._ySize) | 0;\r\n\r\n const alpha = this._textureContent![(u + v * textureSize.width) * 4 + 3];\r\n\r\n return alpha > 0.5;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\r\n * @returns null if no hit or a PickingInfo\r\n */\r\n public intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance = Number.MAX_VALUE;\r\n let currentSprite: Nullable<Sprite> = null;\r\n const pickedPoint = TmpVectors.Vector3[0];\r\n const cameraSpacePosition = TmpVectors.Vector3[1];\r\n const cameraView = camera.getViewMatrix();\r\n let activeRay: Ray = ray;\r\n let pickedRay: Ray = ray;\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n if (sprite.angle) {\r\n // Create a rotation matrix to rotate the ray to the sprite's rotation\r\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\r\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\r\n Matrix.RotationZToRef(-sprite.angle, TmpVectors.Matrix[3]);\r\n\r\n // inv translation x rotation x translation\r\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\r\n\r\n activeRay = ray.clone();\r\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\r\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\r\n } else {\r\n activeRay = ray;\r\n }\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (activeRay.intersectsBoxMinMax(min, max)) {\r\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\r\n\r\n if (distance > currentDistance) {\r\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\r\n continue;\r\n }\r\n\r\n pickedRay = activeRay;\r\n distance = currentDistance;\r\n currentSprite = sprite;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (currentSprite) {\r\n const result = new PickingInfo();\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = currentSprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(pickedRay.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n pickedRay.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n\r\n return result;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n public multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance: number;\r\n const results: Nullable<PickingInfo[]> = [];\r\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\r\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\r\n const cameraView = camera.getViewMatrix();\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (ray.intersectsBoxMinMax(min, max)) {\r\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\r\n\r\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\r\n continue;\r\n }\r\n\r\n const result = new PickingInfo();\r\n results.push(result);\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = sprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(ray.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n ray.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n */\r\n public render(): void {\r\n // Check\r\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const deltaTime = engine.getDeltaTime();\r\n if (this._packedAndReady) {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\r\n } else {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\r\n }\r\n }\r\n\r\n private _customUpdate = (sprite: ThinSprite, baseSize: ISize): void => {\r\n if (!sprite.cellRef) {\r\n sprite.cellIndex = 0;\r\n }\r\n const num = sprite.cellIndex;\r\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\r\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\r\n }\r\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\r\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\r\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\r\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\r\n };\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n this._spriteRenderer?.rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._spriteRenderer) {\r\n this._spriteRenderer.dispose();\r\n (<any>this._spriteRenderer) = null;\r\n }\r\n\r\n this._textureContent = null;\r\n\r\n // Remove from scene\r\n if (this._scene.spriteManagers) {\r\n const index = this._scene.spriteManagers.indexOf(this);\r\n this._scene.spriteManagers.splice(index, 1);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.metadata = null;\r\n }\r\n\r\n /**\r\n * Serializes the sprite manager to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.capacity = this.capacity;\r\n serializationObject.cellWidth = this.cellWidth;\r\n serializationObject.cellHeight = this.cellHeight;\r\n serializationObject.fogEnabled = this.fogEnabled;\r\n serializationObject.blendMode = this.blendMode;\r\n serializationObject.disableDepthWrite = this.disableDepthWrite;\r\n serializationObject.pixelPerfect = this.pixelPerfect;\r\n\r\n if (this.texture) {\r\n if (serializeTexture) {\r\n serializationObject.texture = this.texture.serialize();\r\n } else {\r\n serializationObject.textureUrl = this.texture.name;\r\n serializationObject.invertY = this.texture._invertY;\r\n }\r\n }\r\n\r\n serializationObject.sprites = [];\r\n\r\n for (const sprite of this.sprites) {\r\n serializationObject.sprites.push(sprite.serialize());\r\n }\r\n\r\n serializationObject.metadata = this.metadata;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a new sprite manager.\r\n * @param parsedManager The JSON object to parse\r\n * @param scene The scene to create the sprite manager\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @returns the new sprite manager\r\n */\r\n public static Parse(parsedManager: any, scene: Scene, rootUrl: string): SpriteManager {\r\n const manager = new SpriteManager(\r\n parsedManager.name,\r\n \"\",\r\n parsedManager.capacity,\r\n {\r\n width: parsedManager.cellWidth,\r\n height: parsedManager.cellHeight,\r\n },\r\n scene\r\n );\r\n\r\n if (parsedManager.fogEnabled !== undefined) {\r\n manager.fogEnabled = parsedManager.fogEnabled;\r\n }\r\n if (parsedManager.blendMode !== undefined) {\r\n manager.blendMode = parsedManager.blendMode;\r\n }\r\n if (parsedManager.disableDepthWrite !== undefined) {\r\n manager.disableDepthWrite = parsedManager.disableDepthWrite;\r\n }\r\n if (parsedManager.pixelPerfect !== undefined) {\r\n manager.pixelPerfect = parsedManager.pixelPerfect;\r\n }\r\n\r\n if (parsedManager.metadata !== undefined) {\r\n manager.metadata = parsedManager.metadata;\r\n }\r\n\r\n if (parsedManager.texture) {\r\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl) as Texture;\r\n } else if (parsedManager.textureName) {\r\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\r\n }\r\n\r\n for (const parsedSprite of parsedManager.sprites) {\r\n Sprite.Parse(parsedSprite, manager);\r\n }\r\n\r\n return manager;\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved in a remote file\r\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the sprite manager\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.spriteManager);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;\r\n}\r\n"]}
1
+ {"version":3,"file":"spriteManager.js","sourceRoot":"","sources":["../../../../lts/core/generated/Sprites/spriteManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAsFjD;;;GAGG;AACH,MAAM,OAAO,aAAa;IA6BtB;;OAEG;IACH,IAAW,SAAS,CAAC,QAAoB;QACrC,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SAC5D;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IAOD;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,OAAkB,CAAC;IACnD,CAAC;IACD,IAAW,OAAO,CAAC,KAAc;QAC7B,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACxC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACxC,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,6DAA6D;IAC7D,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;IAC1C,CAAC;IACD,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED,8DAA8D;IAC9D,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;IAC3C,CAAC;IACD,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,8FAA8F;IAC9F,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;IAC3C,CAAC;IACD,IAAW,UAAU,CAAC,KAAc;QAChC,IAAI,CAAC,eAAe,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;IAC1C,CAAC;IACD,IAAW,SAAS,CAAC,SAAiB;QAClC,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/C,CAAC;IAGD;;;OAGG;IACH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAc;QACvC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,eAAe,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;IAC7C,CAAC;IAED,IAAW,YAAY,CAAC,KAAc;QAClC,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1C,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,8BAA8B,EAAE;YACjF,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;SAC7E;IACL,CAAC;IAcD;;;;;;;;;;;OAWG;IACH;IACI,iCAAiC;IAC1B,IAAY,EACnB,MAAc,EACd,QAAgB,EAChB,QAAa,EACb,KAAY,EACZ,UAAkB,IAAI,EACtB,eAAuB,OAAO,CAAC,sBAAsB,EACrD,aAAsB,KAAK,EAC3B,aAAyB,IAAI;QARtB,SAAI,GAAJ,IAAI,CAAQ;QAnKvB,+BAA+B;QACxB,YAAO,GAAG,IAAI,KAAK,EAAU,CAAC;QACrC,yDAAyD;QAClD,qBAAgB,GAAG,CAAC,CAAC;QAC5B,qCAAqC;QAC9B,cAAS,GAAW,UAAU,CAAC;QACtC,oEAAoE;QAC7D,eAAU,GAAG,KAAK,CAAC;QAE1B;;WAEG;QACI,aAAQ,GAAQ,IAAI,CAAC;QAE5B,gBAAgB;QACT,mBAAc,GAAG,KAAK,CAAC;QAE9B;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAiB,CAAC;QAuFrD,uBAAkB,GAAY,KAAK,CAAC;QAmC5C,wDAAwD;QAChD,oBAAe,GAAY,KAAK,CAAC;QA8VjC,kBAAa,GAAG,CAAC,MAAkB,EAAE,QAAe,EAAQ,EAAE;YAClE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACjB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE;gBACrE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACtD;YACD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC1E,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC3E,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC;QA5UE,IAAI,CAAC,KAAK,EAAE;YACR,KAAK,GAAG,WAAW,CAAC,gBAAiB,CAAC;SACzC;QAED,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE;YAC3D,KAAK,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;SACxD;QACD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE5E,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;SACrC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;SAC9B;aAAM;YACH,IAAI,CAAC,eAAe,GAAQ,IAAI,CAAC;YACjC,OAAO;SACV;QAED,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAEzC,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;SACxE;QAED,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;SACxC;IACL,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,eAAe,CAAC;IAC3B,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,UAAe;QAC/C,IAAI,UAAU,KAAK,IAAI,EAAE;YACrB,IAAI;gBACA,6FAA6F;gBAC7F,IAAI,QAAa,CAAC;gBAClB,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;oBAChC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;iBACrC;qBAAM;oBACH,QAAQ,GAAG,UAAU,CAAC;iBACzB;gBAED,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;oBACxB,MAAM,SAAS,GAAQ,EAAE,CAAC;oBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBAC9B,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;4BACxC,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;yBAClH;wBAED,MAAM,IAAI,GAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5C,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;qBACxB;oBACD,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;iBAC/B;gBAED,MAAM,SAAS,GAAa,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE7D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;aACpC;YAAC,OAAO,CAAC,EAAE;gBACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;aAC7F;SACJ;aAAM;YACH,MAAM,EAAE,GAAG,KAAK,CAAC;YACjB,IAAI,EAAU,CAAC;YACf,GAAG;gBACC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;gBAClB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACnB,QAAQ,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE;YAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YACtD,MAAM,OAAO,GAAG,GAAG,EAAE;gBACjB,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACtD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YACjC,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,CAAC,IAA0B,EAAE,EAAE;gBAC1C,IAAI;oBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;oBAC5C,MAAM,SAAS,GAAa,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC7D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;oBAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;iBACpC;gBAAC,OAAO,CAAC,EAAE;oBACR,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;iBACjG;YACL,CAAC,CAAC;YACF,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;SACzE;IACL,CAAC;IAEO,kBAAkB,CAAC,MAAc,EAAE,GAAQ,EAAE,QAAgB,EAAE,GAAY,EAAE,GAAY;QAC7F,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7C,OAAO,IAAI,CAAC;SACf;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SACvD;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE3C,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAErC,YAAY,CAAC,SAAS,EAAE,CAAC;QACzB,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAErF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzE,OAAO,KAAK,GAAG,GAAG,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACI,UAAU,CAAC,GAAQ,EAAE,MAAc,EAAE,SAAuC,EAAE,SAAmB;QACpG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAChC,IAAI,aAAa,GAAqB,IAAI,CAAC;QAC3C,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1C,IAAI,SAAS,GAAQ,GAAG,CAAC;QACzB,IAAI,SAAS,GAAQ,GAAG,CAAC;QAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,IAAI,SAAS,EAAE;gBACX,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;oBACpB,SAAS;iBACZ;aACJ;iBAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC3B,SAAS;aACZ;YAED,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;YAEpF,IAAI,MAAM,CAAC,KAAK,EAAE;gBACd,sEAAsE;gBACtE,MAAM,CAAC,gBAAgB,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjG,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/F,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE3D,2CAA2C;gBAC3C,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE/E,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBACtF,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;aAC1F;iBAAM;gBACH,SAAS,GAAG,GAAG,CAAC;aACnB;YAED,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC/H,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAE/H,IAAI,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBACzC,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAEhF,IAAI,QAAQ,GAAG,eAAe,EAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;wBACxE,SAAS;qBACZ;oBAED,SAAS,GAAG,SAAS,CAAC;oBACtB,QAAQ,GAAG,eAAe,CAAC;oBAC3B,aAAa,GAAG,MAAM,CAAC;oBAEvB,IAAI,SAAS,EAAE;wBACX,MAAM;qBACT;iBACJ;aACJ;SACJ;QAED,IAAI,aAAa,EAAE;YACf,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAEjC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;YAClB,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC;YACpC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAE3B,mBAAmB;YACnB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACxC,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEjC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAErF,OAAO,MAAM,CAAC;SACjB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,eAAe,CAAC,GAAQ,EAAE,MAAc,EAAE,SAAuC;QACpF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,QAAgB,CAAC;QACrB,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAE1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,IAAI,SAAS,EAAE;gBACX,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;oBACpB,SAAS;iBACZ;aACJ;iBAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC3B,SAAS;aACZ;YAED,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;YAEpF,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC/H,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAE/H,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBACnC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAE7D,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;oBAC3D,SAAS;iBACZ;gBAED,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAErB,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;gBAClB,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;gBAC7B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAE3B,mBAAmB;gBACnB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClC,SAAS,CAAC,SAAS,EAAE,CAAC;gBACtB,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAEjC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC5C,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACxF;SACJ;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,MAAM;QACT,QAAQ;QACR,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACpF,OAAO;SACV;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;SAC5I;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;SACxH;IACL,CAAC;IAgBD;;OAEG;IACI,OAAO;;QACV,MAAA,IAAI,CAAC,eAAe,0CAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,eAAgB,GAAG,IAAI,CAAC;SACtC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC/C;QAED,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAEjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,gBAAgB,GAAG,KAAK;QACrC,MAAM,mBAAmB,GAAQ,EAAE,CAAC;QAEpC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC7C,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/C,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjD,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjD,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/C,mBAAmB,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC/D,mBAAmB,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAErD,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,gBAAgB,EAAE;gBAClB,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;aAC1D;iBAAM;gBACH,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBACnD,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;aACvD;SACJ;QAED,mBAAmB,CAAC,OAAO,GAAG,EAAE,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;SACxD;QAED,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE7C,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,aAAkB,EAAE,KAAY,EAAE,OAAe;QACjE,MAAM,OAAO,GAAG,IAAI,aAAa,CAC7B,aAAa,CAAC,IAAI,EAClB,EAAE,EACF,aAAa,CAAC,QAAQ,EACtB;YACI,KAAK,EAAE,aAAa,CAAC,SAAS;YAC9B,MAAM,EAAE,aAAa,CAAC,UAAU;SACnC,EACD,KAAK,CACR,CAAC;QAEF,IAAI,aAAa,CAAC,UAAU,KAAK,SAAS,EAAE;YACxC,OAAO,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;SACjD;QACD,IAAI,aAAa,CAAC,SAAS,KAAK,SAAS,EAAE;YACvC,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;SAC/C;QACD,IAAI,aAAa,CAAC,iBAAiB,KAAK,SAAS,EAAE;YAC/C,OAAO,CAAC,iBAAiB,GAAG,aAAa,CAAC,iBAAiB,CAAC;SAC/D;QACD,IAAI,aAAa,CAAC,YAAY,KAAK,SAAS,EAAE;YAC1C,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;SACrD;QAED,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;SAC7C;QAED,IAAI,aAAa,CAAC,OAAO,EAAE;YACvB,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAY,CAAC;SACrF;aAAM,IAAI,aAAa,CAAC,WAAW,EAAE;YAClC,OAAO,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACvJ;QAED,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,OAAO,EAAE;YAC9C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SACvC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,kBAAkB,CAAC,IAAsB,EAAE,GAAW,EAAE,KAAY,EAAE,UAAkB,EAAE;QACpG,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;gBAC9C,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE;oBACzB,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE;wBACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;wBAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,IAAI,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;wBAExG,IAAI,IAAI,EAAE;4BACN,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;yBACtB;wBAED,OAAO,CAAC,MAAM,CAAC,CAAC;qBACnB;yBAAM;wBACH,MAAM,CAAC,mCAAmC,CAAC,CAAC;qBAC/C;iBACJ;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,qBAAqB,CAAC,SAAiB,EAAE,KAAY,EAAE,UAAkB,EAAE;QACrF,IAAI,SAAS,KAAK,QAAQ,EAAE;YACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,wBAAwB,EAAE,gDAAgD,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;SACzI;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;YACjC,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;gBAC9C,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE;oBACzB,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE;wBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;wBACzE,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;wBAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,IAAI,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;wBAExG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;wBAE7B,OAAO,CAAC,MAAM,CAAC,CAAC;qBACnB;yBAAM;wBACH,MAAM,CAAC,6BAA6B,GAAG,SAAS,CAAC,CAAC;qBACrD;iBACJ;YACL,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC;;AAxrBD,sCAAsC;AACxB,wBAAU,GAAG,SAAS,CAAC,UAAU,AAAvB,CAAwB;AAyrBhD;;;;;;;GAOG;AACW,oCAAsB,GAAG,aAAa,CAAC,qBAAqB,AAAtC,CAAuC","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector\";\r\nimport { Sprite } from \"./sprite\";\r\nimport { SpriteSceneComponent } from \"./spriteSceneComponent\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { SpriteRenderer } from \"./spriteRenderer\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\nimport type { Ray } from \"../Culling/ray\";\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\r\ndeclare const Reflect: any;\r\n\r\n/**\r\n * Defines the minimum interface to fulfill in order to be a sprite manager.\r\n */\r\nexport interface ISpriteManager extends IDisposable {\r\n /**\r\n * Gets manager's name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render spriteManager.layerMask & camera.layerMask!== 0\r\n */\r\n layerMask: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n isPickable: boolean;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups\r\n */\r\n renderingGroupId: number;\r\n\r\n /**\r\n * Defines the list of sprites managed by the manager.\r\n */\r\n sprites: Array<Sprite>;\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n texture: Texture;\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n cellWidth: number;\r\n /** Defines the default height of a cell in the spritesheet */\r\n cellHeight: number;\r\n\r\n /** @internal */\r\n _wasDispatched: boolean;\r\n\r\n /**\r\n * Tests the intersection of a sprite with a specific ray.\r\n * @param ray The ray we are sending to test the collision\r\n * @param camera The camera space we are sending rays in\r\n * @param predicate A predicate allowing excluding sprites from the list of object to test\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info or null.\r\n */\r\n intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;\r\n\r\n /**\r\n * Renders the list of sprites on screen.\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n rebuild(): void;\r\n}\r\n\r\n/**\r\n * Class used to manage multiple sprites on the same spritesheet\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites\r\n */\r\nexport class SpriteManager implements ISpriteManager {\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the manager was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /** Gets the list of sprites */\r\n public sprites = new Array<Sprite>();\r\n /** Gets or sets the rendering group id (0 by default) */\r\n public renderingGroupId = 0;\r\n /** Gets or sets camera layer mask */\r\n public layerMask: number = 0x0fffffff;\r\n /** Gets or sets a boolean indicating if the sprites are pickable */\r\n public isPickable = false;\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the sprite manager\r\n */\r\n public metadata: any = null;\r\n\r\n /** @internal */\r\n public _wasDispatched = false;\r\n\r\n /**\r\n * An event triggered when the manager is disposed.\r\n */\r\n public onDisposeObservable = new Observable<SpriteManager>();\r\n\r\n /**\r\n * Callback called when the manager is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the sprite\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets the array of sprites\r\n */\r\n public get children() {\r\n return this.sprites;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._spriteRenderer.capacity;\r\n }\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n public get texture(): Texture {\r\n return this._spriteRenderer.texture as Texture;\r\n }\r\n public set texture(value: Texture) {\r\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._spriteRenderer.texture = value;\r\n this._textureContent = null;\r\n }\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n public get cellWidth(): number {\r\n return this._spriteRenderer.cellWidth;\r\n }\r\n public set cellWidth(value: number) {\r\n this._spriteRenderer.cellWidth = value;\r\n }\r\n\r\n /** Defines the default height of a cell in the spritesheet */\r\n public get cellHeight(): number {\r\n return this._spriteRenderer.cellHeight;\r\n }\r\n public set cellHeight(value: number) {\r\n this._spriteRenderer.cellHeight = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._spriteRenderer.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._spriteRenderer.fogEnabled = value;\r\n }\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public get blendMode() {\r\n return this._spriteRenderer.blendMode;\r\n }\r\n public set blendMode(blendMode: number) {\r\n this._spriteRenderer.blendMode = blendMode;\r\n }\r\n\r\n private _disableDepthWrite: boolean = false;\r\n /** Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public get disableDepthWrite() {\r\n return this._disableDepthWrite;\r\n }\r\n\r\n public set disableDepthWrite(value: boolean) {\r\n this._disableDepthWrite = value;\r\n this._spriteRenderer.disableDepthWrite = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * In this mode, sprites are rendered as \"pixel art\", which means that they appear as pixelated but remain stable when moving or when rotated or scaled.\r\n * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!\r\n */\r\n public get pixelPerfect() {\r\n return this._spriteRenderer.pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n this._spriteRenderer.pixelPerfect = value;\r\n if (value && this.texture.samplingMode !== Constants.TEXTURE_TRILINEAR_SAMPLINGMODE) {\r\n this.texture.updateSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE);\r\n }\r\n }\r\n\r\n private _spriteRenderer: SpriteRenderer;\r\n /** Associative array from JSON sprite data file */\r\n private _cellData: any;\r\n /** Array of sprite names from JSON sprite data file */\r\n private _spriteMap: Array<string>;\r\n /** True when packed cell data from JSON file is ready*/\r\n private _packedAndReady: boolean = false;\r\n private _textureContent: Nullable<Uint8Array>;\r\n private _onDisposeObserver: Nullable<Observer<SpriteManager>>;\r\n private _fromPacked: boolean;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Creates a new sprite manager\r\n * @param name defines the manager's name\r\n * @param imgUrl defines the sprite sheet url\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param cellSize defines the size of a sprite cell\r\n * @param scene defines the hosting scene\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param samplingMode defines the sampling mode to use with spritesheet\r\n * @param fromPacked set to false; do not alter\r\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\r\n */\r\n constructor(\r\n /** defines the manager's name */\r\n public name: string,\r\n imgUrl: string,\r\n capacity: number,\r\n cellSize: any,\r\n scene: Scene,\r\n epsilon: number = 0.01,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n fromPacked: boolean = false,\r\n spriteJSON: any | null = null\r\n ) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene!;\r\n }\r\n\r\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\r\n scene._addComponent(new SpriteSceneComponent(scene));\r\n }\r\n this._fromPacked = fromPacked;\r\n\r\n this._scene = scene;\r\n const engine = this._scene.getEngine();\r\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene);\r\n\r\n if (cellSize.width && cellSize.height) {\r\n this.cellWidth = cellSize.width;\r\n this.cellHeight = cellSize.height;\r\n } else if (cellSize !== undefined) {\r\n this.cellWidth = cellSize;\r\n this.cellHeight = cellSize;\r\n } else {\r\n this._spriteRenderer = <any>null;\r\n return;\r\n }\r\n\r\n this._scene.spriteManagers && this._scene.spriteManagers.push(this);\r\n this.uniqueId = this.scene.getUniqueId();\r\n\r\n if (imgUrl) {\r\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\r\n }\r\n\r\n if (this._fromPacked) {\r\n this._makePacked(imgUrl, spriteJSON);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the string \"SpriteManager\"\r\n * @returns \"SpriteManager\"\r\n */\r\n public getClassName(): string {\r\n return \"SpriteManager\";\r\n }\r\n\r\n private _makePacked(imgUrl: string, spriteJSON: any) {\r\n if (spriteJSON !== null) {\r\n try {\r\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\r\n let celldata: any;\r\n if (typeof spriteJSON === \"string\") {\r\n celldata = JSON.parse(spriteJSON);\r\n } else {\r\n celldata = spriteJSON;\r\n }\r\n\r\n if (celldata.frames.length) {\r\n const frametemp: any = {};\r\n for (let i = 0; i < celldata.frames.length; i++) {\r\n const _f = celldata.frames[i];\r\n if (typeof Object.keys(_f)[0] !== \"string\") {\r\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\r\n }\r\n\r\n const name: string = _f[Object.keys(_f)[0]];\r\n frametemp[name] = _f;\r\n }\r\n celldata.frames = frametemp;\r\n }\r\n\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\r\n }\r\n } else {\r\n const re = /\\./g;\r\n let li: number;\r\n do {\r\n li = re.lastIndex;\r\n re.test(imgUrl);\r\n } while (re.lastIndex > 0);\r\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\r\n const onerror = () => {\r\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n };\r\n const onload = (data: string | ArrayBuffer) => {\r\n try {\r\n const celldata = JSON.parse(data as string);\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\r\n }\r\n };\r\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\r\n }\r\n }\r\n\r\n private _checkTextureAlpha(sprite: Sprite, ray: Ray, distance: number, min: Vector3, max: Vector3) {\r\n if (!sprite.useAlphaForPicking || !this.texture) {\r\n return true;\r\n }\r\n\r\n const textureSize = this.texture.getSize();\r\n if (!this._textureContent) {\r\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\r\n this.texture.readPixels(0, 0, this._textureContent);\r\n }\r\n\r\n const contactPoint = TmpVectors.Vector3[0];\r\n\r\n contactPoint.copyFrom(ray.direction);\r\n\r\n contactPoint.normalize();\r\n contactPoint.scaleInPlace(distance);\r\n contactPoint.addInPlace(ray.origin);\r\n\r\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x);\r\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y);\r\n\r\n const u = (sprite._xOffset * textureSize.width + contactPointU * sprite._xSize) | 0;\r\n const v = (sprite._yOffset * textureSize.height + contactPointV * sprite._ySize) | 0;\r\n\r\n const alpha = this._textureContent![(u + v * textureSize.width) * 4 + 3];\r\n\r\n return alpha > 0.5;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\r\n * @returns null if no hit or a PickingInfo\r\n */\r\n public intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance = Number.MAX_VALUE;\r\n let currentSprite: Nullable<Sprite> = null;\r\n const pickedPoint = TmpVectors.Vector3[0];\r\n const cameraSpacePosition = TmpVectors.Vector3[1];\r\n const cameraView = camera.getViewMatrix();\r\n let activeRay: Ray = ray;\r\n let pickedRay: Ray = ray;\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n if (sprite.angle) {\r\n // Create a rotation matrix to rotate the ray to the sprite's rotation\r\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\r\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\r\n Matrix.RotationZToRef(-sprite.angle, TmpVectors.Matrix[3]);\r\n\r\n // inv translation x rotation x translation\r\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\r\n\r\n activeRay = ray.clone();\r\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\r\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\r\n } else {\r\n activeRay = ray;\r\n }\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (activeRay.intersectsBoxMinMax(min, max)) {\r\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\r\n\r\n if (distance > currentDistance) {\r\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\r\n continue;\r\n }\r\n\r\n pickedRay = activeRay;\r\n distance = currentDistance;\r\n currentSprite = sprite;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (currentSprite) {\r\n const result = new PickingInfo();\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = currentSprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(pickedRay.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n pickedRay.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n\r\n return result;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n public multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance: number;\r\n const results: Nullable<PickingInfo[]> = [];\r\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\r\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\r\n const cameraView = camera.getViewMatrix();\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (ray.intersectsBoxMinMax(min, max)) {\r\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\r\n\r\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\r\n continue;\r\n }\r\n\r\n const result = new PickingInfo();\r\n results.push(result);\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = sprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(ray.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n ray.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n */\r\n public render(): void {\r\n // Check\r\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const deltaTime = engine.getDeltaTime();\r\n if (this._packedAndReady) {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\r\n } else {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\r\n }\r\n }\r\n\r\n private _customUpdate = (sprite: ThinSprite, baseSize: ISize): void => {\r\n if (!sprite.cellRef) {\r\n sprite.cellIndex = 0;\r\n }\r\n const num = sprite.cellIndex;\r\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\r\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\r\n }\r\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\r\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\r\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\r\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\r\n };\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n this._spriteRenderer?.rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._spriteRenderer) {\r\n this._spriteRenderer.dispose();\r\n (<any>this._spriteRenderer) = null;\r\n }\r\n\r\n this._textureContent = null;\r\n\r\n // Remove from scene\r\n if (this._scene.spriteManagers) {\r\n const index = this._scene.spriteManagers.indexOf(this);\r\n this._scene.spriteManagers.splice(index, 1);\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n\r\n this.metadata = null;\r\n }\r\n\r\n /**\r\n * Serializes the sprite manager to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.capacity = this.capacity;\r\n serializationObject.cellWidth = this.cellWidth;\r\n serializationObject.cellHeight = this.cellHeight;\r\n serializationObject.fogEnabled = this.fogEnabled;\r\n serializationObject.blendMode = this.blendMode;\r\n serializationObject.disableDepthWrite = this.disableDepthWrite;\r\n serializationObject.pixelPerfect = this.pixelPerfect;\r\n\r\n if (this.texture) {\r\n if (serializeTexture) {\r\n serializationObject.texture = this.texture.serialize();\r\n } else {\r\n serializationObject.textureUrl = this.texture.name;\r\n serializationObject.invertY = this.texture._invertY;\r\n }\r\n }\r\n\r\n serializationObject.sprites = [];\r\n\r\n for (const sprite of this.sprites) {\r\n serializationObject.sprites.push(sprite.serialize());\r\n }\r\n\r\n serializationObject.metadata = this.metadata;\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a new sprite manager.\r\n * @param parsedManager The JSON object to parse\r\n * @param scene The scene to create the sprite manager\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @returns the new sprite manager\r\n */\r\n public static Parse(parsedManager: any, scene: Scene, rootUrl: string): SpriteManager {\r\n const manager = new SpriteManager(\r\n parsedManager.name,\r\n \"\",\r\n parsedManager.capacity,\r\n {\r\n width: parsedManager.cellWidth,\r\n height: parsedManager.cellHeight,\r\n },\r\n scene\r\n );\r\n\r\n if (parsedManager.fogEnabled !== undefined) {\r\n manager.fogEnabled = parsedManager.fogEnabled;\r\n }\r\n if (parsedManager.blendMode !== undefined) {\r\n manager.blendMode = parsedManager.blendMode;\r\n }\r\n if (parsedManager.disableDepthWrite !== undefined) {\r\n manager.disableDepthWrite = parsedManager.disableDepthWrite;\r\n }\r\n if (parsedManager.pixelPerfect !== undefined) {\r\n manager.pixelPerfect = parsedManager.pixelPerfect;\r\n }\r\n\r\n if (parsedManager.metadata !== undefined) {\r\n manager.metadata = parsedManager.metadata;\r\n }\r\n\r\n if (parsedManager.texture) {\r\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl) as Texture;\r\n } else if (parsedManager.textureName) {\r\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\r\n }\r\n\r\n for (const parsedSprite of parsedManager.sprites) {\r\n Sprite.Parse(parsedSprite, manager);\r\n }\r\n\r\n return manager;\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved in a remote file\r\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the sprite manager\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.spriteManager);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;\r\n}\r\n"]}
@@ -3,8 +3,8 @@ import type { IMatrixLike } from "../Maths/math.like";
3
3
  import type { ThinEngine } from "../Engines/thinEngine";
4
4
  import type { ThinSprite } from "./thinSprite";
5
5
  import type { ISize } from "../Maths/math.size";
6
- declare type ThinTexture = import("../Materials/Textures/thinTexture").ThinTexture;
7
- declare type Scene = import("../scene").Scene;
6
+ import type { ThinTexture } from "../Materials/Textures/thinTexture";
7
+ import type { Scene } from "../scene";
8
8
  import "../Engines/Extensions/engine.alpha";
9
9
  import "../Engines/Extensions/engine.dynamicBuffer";
10
10
  import "../Shaders/sprites.fragment";
@@ -105,4 +105,3 @@ export declare class SpriteRenderer {
105
105
  */
106
106
  dispose(): void;
107
107
  }
108
- export {};
@@ -1 +1 @@
1
- {"version":3,"file":"spriteRenderer.js","sourceRoot":"","sources":["../../../../lts/core/generated/Sprites/spriteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IMatrixLike } from \"../Maths/math.like\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\n\r\ndeclare type ThinTexture = import(\"../Materials/Textures/thinTexture\").ThinTexture;\r\ndeclare type Scene = import(\"../scene\").Scene;\r\n\r\nimport \"../Engines/Extensions/engine.alpha\";\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\n\r\nimport \"../Shaders/sprites.fragment\";\r\nimport \"../Shaders/sprites.vertex\";\r\n\r\n/**\r\n * Class used to render sprites.\r\n *\r\n * It can be used either to render Sprites or ThinSprites with ThinEngine only.\r\n */\r\nexport class SpriteRenderer {\r\n /**\r\n * Defines the texture of the spritesheet\r\n */\r\n public texture: Nullable<ThinTexture>;\r\n\r\n /**\r\n * Defines the default width of a cell in the spritesheet\r\n */\r\n public cellWidth: number;\r\n\r\n /**\r\n * Defines the default height of a cell in the spritesheet\r\n */\r\n public cellHeight: number;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public blendMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if alpha mode is automatically\r\n * reset.\r\n */\r\n public autoResetAlpha = true;\r\n\r\n /**\r\n * Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public disableDepthWrite: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the manager must consider scene fog when rendering\r\n */\r\n public fogEnabled = true;\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n private _pixelPerfect = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * Note that pixel perfect mode is not supported in WebGL 1\r\n */\r\n public get pixelPerfect() {\r\n return this._pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n if (this._pixelPerfect === value) {\r\n return;\r\n }\r\n\r\n this._pixelPerfect = value;\r\n this._createEffects();\r\n }\r\n\r\n private readonly _engine: ThinEngine;\r\n private readonly _useVAO: boolean = false;\r\n private readonly _useInstancing: boolean = false;\r\n private readonly _scene: Nullable<Scene>;\r\n\r\n private readonly _capacity: number;\r\n private readonly _epsilon: number;\r\n\r\n private _vertexBufferSize: number;\r\n private _vertexData: Float32Array;\r\n private _buffer: Buffer;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: DataBuffer;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _drawWrapperFog: DrawWrapper;\r\n private _drawWrapperDepth: DrawWrapper;\r\n private _drawWrapperFogDepth: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n\r\n /**\r\n * Creates a new sprite Renderer\r\n * @param engine defines the engine the renderer works with\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(engine: ThinEngine, capacity: number, epsilon: number = 0.01, scene: Nullable<Scene> = null) {\r\n this._capacity = capacity;\r\n this._epsilon = epsilon;\r\n\r\n this._engine = engine;\r\n this._useInstancing = engine.getCaps().instancedArrays && engine._features.supportSpriteInstancing;\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n this._scene = scene;\r\n\r\n if (!this._useInstancing) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // VBO\r\n // 18 floats per sprite (x, y, z, angle, sizeX, sizeY, offsetX, offsetY, invertU, invertV, cellLeft, cellTop, cellWidth, cellHeight, color r, color g, color b, color a)\r\n // 16 when using instances\r\n this._vertexBufferSize = this._useInstancing ? 16 : 18;\r\n this._vertexData = new Float32Array(capacity * this._vertexBufferSize * (this._useInstancing ? 1 : 4));\r\n this._buffer = new Buffer(engine, this._vertexData, true, this._vertexBufferSize);\r\n\r\n const positions = this._buffer.createVertexBuffer(VertexBuffer.PositionKind, 0, 4, this._vertexBufferSize, this._useInstancing);\r\n const options = this._buffer.createVertexBuffer(\"options\", 4, 2, this._vertexBufferSize, this._useInstancing);\r\n\r\n let offset = 6;\r\n let offsets: VertexBuffer;\r\n\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n } else {\r\n offsets = this._buffer.createVertexBuffer(\"offsets\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n offset += 2;\r\n }\r\n\r\n const inverts = this._buffer.createVertexBuffer(\"inverts\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n const cellInfo = this._buffer.createVertexBuffer(\"cellInfo\", offset + 2, 4, this._vertexBufferSize, this._useInstancing);\r\n const colors = this._buffer.createVertexBuffer(VertexBuffer.ColorKind, offset + 6, 4, this._vertexBufferSize, this._useInstancing);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n this._vertexBuffers[\"options\"] = options;\r\n this._vertexBuffers[\"offsets\"] = offsets;\r\n this._vertexBuffers[\"inverts\"] = inverts;\r\n this._vertexBuffers[\"cellInfo\"] = cellInfo;\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n\r\n this._createEffects();\r\n }\r\n\r\n private _createEffects() {\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperFog?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n this._drawWrapperFogDepth?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n this._drawWrapperFog = new DrawWrapper(this._engine);\r\n this._drawWrapperDepth = new DrawWrapper(this._engine, false);\r\n this._drawWrapperFogDepth = new DrawWrapper(this._engine, false);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperFog.drawContext) {\r\n this._drawWrapperFog.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperDepth.drawContext) {\r\n this._drawWrapperDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperFogDepth.drawContext) {\r\n this._drawWrapperFogDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n\r\n const defines = this._pixelPerfect ? \"#define PIXEL_PERFECT\\n\" : \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\"],\r\n [\"diffuseSampler\"],\r\n defines\r\n );\r\n\r\n this._drawWrapperDepth.effect = this._drawWrapperBase.effect;\r\n this._drawWrapperDepth.materialContext = this._drawWrapperBase.materialContext;\r\n\r\n if (this._scene) {\r\n this._drawWrapperFog.effect = this._scene\r\n .getEngine()\r\n .createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\", \"vFogInfos\", \"vFogColor\"],\r\n [\"diffuseSampler\"],\r\n defines + \"#define FOG\"\r\n );\r\n this._drawWrapperFogDepth.effect = this._drawWrapperFog.effect;\r\n this._drawWrapperFogDepth.materialContext = this._drawWrapperFog.materialContext;\r\n }\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n * @param sprites defines the list of sprites to render\r\n * @param deltaTime defines the time since last frame\r\n * @param viewMatrix defines the viewMatrix to use to render the sprites\r\n * @param projectionMatrix defines the projectionMatrix to use to render the sprites\r\n * @param customSpriteUpdate defines a custom function to update the sprites data before they render\r\n */\r\n public render(\r\n sprites: ThinSprite[],\r\n deltaTime: number,\r\n viewMatrix: IMatrixLike,\r\n projectionMatrix: IMatrixLike,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void> = null\r\n ): void {\r\n if (!this.texture || !this.texture.isReady() || !sprites.length) {\r\n return;\r\n }\r\n\r\n let drawWrapper = this._drawWrapperBase;\r\n let drawWrapperDepth = this._drawWrapperDepth;\r\n let shouldRenderFog = false;\r\n if (this.fogEnabled && this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0) {\r\n drawWrapper = this._drawWrapperFog;\r\n drawWrapperDepth = this._drawWrapperFogDepth;\r\n shouldRenderFog = true;\r\n }\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const useRightHandedSystem = !!(this._scene && this._scene.useRightHandedSystem);\r\n const baseSize = this.texture.getBaseSize();\r\n\r\n // Sprites\r\n const max = Math.min(this._capacity, sprites.length);\r\n\r\n let offset = 0;\r\n let noSprite = true;\r\n for (let index = 0; index < max; index++) {\r\n const sprite = sprites[index];\r\n if (!sprite || !sprite.isVisible) {\r\n continue;\r\n }\r\n\r\n noSprite = false;\r\n sprite._animate(deltaTime);\r\n\r\n this._appendSpriteVertex(offset++, sprite, 0, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n if (!this._useInstancing) {\r\n this._appendSpriteVertex(offset++, sprite, 1, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 1, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 0, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n }\r\n }\r\n\r\n if (noSprite) {\r\n return;\r\n }\r\n\r\n this._buffer.update(this._vertexData);\r\n\r\n const culling = !!engine.depthCullingState.cull;\r\n const zOffset = engine.depthCullingState.zOffset;\r\n const zOffsetUnits = engine.depthCullingState.zOffsetUnits;\r\n\r\n engine.setState(culling, zOffset, false, false, undefined, undefined, zOffsetUnits);\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n effect.setTexture(\"diffuseSampler\", this.texture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n // Scene Info\r\n if (shouldRenderFog) {\r\n const scene = this._scene!;\r\n\r\n // Fog\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = engine.recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n engine.bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n // Draw order\r\n engine.depthCullingState.depthFunc = engine.useReverseDepthBuffer ? Constants.GEQUAL : Constants.LEQUAL;\r\n if (!this.disableDepthWrite) {\r\n effect.setBool(\"alphaTest\", true);\r\n engine.setColorWrite(false);\r\n engine.enableEffect(drawWrapperDepth);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n engine.enableEffect(drawWrapper);\r\n engine.setColorWrite(true);\r\n effect.setBool(\"alphaTest\", false);\r\n }\r\n\r\n engine.setAlphaMode(this.blendMode);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n\r\n if (this.autoResetAlpha) {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Right Handed\r\n if (useRightHandedSystem) {\r\n this._scene!.getEngine().setState(culling, zOffset, false, true, undefined, undefined, zOffsetUnits);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n private _appendSpriteVertex(\r\n index: number,\r\n sprite: ThinSprite,\r\n offsetX: number,\r\n offsetY: number,\r\n baseSize: ISize,\r\n useRightHandedSystem: boolean,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void>\r\n ): void {\r\n let arrayOffset = index * this._vertexBufferSize;\r\n\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n\r\n if (customSpriteUpdate) {\r\n customSpriteUpdate(sprite, baseSize);\r\n } else {\r\n if (!sprite.cellIndex) {\r\n sprite.cellIndex = 0;\r\n }\r\n\r\n const rowSize = baseSize.width / this.cellWidth;\r\n const offset = (sprite.cellIndex / rowSize) >> 0;\r\n sprite._xOffset = ((sprite.cellIndex - offset * rowSize) * this.cellWidth) / baseSize.width;\r\n sprite._yOffset = (offset * this.cellHeight) / baseSize.height;\r\n sprite._xSize = this.cellWidth;\r\n sprite._ySize = this.cellHeight;\r\n }\r\n\r\n // Positions\r\n this._vertexData[arrayOffset] = sprite.position.x;\r\n this._vertexData[arrayOffset + 1] = sprite.position.y;\r\n this._vertexData[arrayOffset + 2] = sprite.position.z;\r\n this._vertexData[arrayOffset + 3] = sprite.angle;\r\n // Options\r\n this._vertexData[arrayOffset + 4] = sprite.width;\r\n this._vertexData[arrayOffset + 5] = sprite.height;\r\n\r\n if (!this._useInstancing) {\r\n this._vertexData[arrayOffset + 6] = offsetX;\r\n this._vertexData[arrayOffset + 7] = offsetY;\r\n } else {\r\n arrayOffset -= 2;\r\n }\r\n\r\n // Inverts according to Right Handed\r\n if (useRightHandedSystem) {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 0 : 1;\r\n } else {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 1 : 0;\r\n }\r\n\r\n this._vertexData[arrayOffset + 9] = sprite.invertV ? 1 : 0;\r\n\r\n this._vertexData[arrayOffset + 10] = sprite._xOffset;\r\n this._vertexData[arrayOffset + 11] = sprite._yOffset;\r\n this._vertexData[arrayOffset + 12] = sprite._xSize / baseSize.width;\r\n this._vertexData[arrayOffset + 13] = sprite._ySize / baseSize.height;\r\n\r\n // Color\r\n this._vertexData[arrayOffset + 14] = sprite.color.r;\r\n this._vertexData[arrayOffset + 15] = sprite.color.g;\r\n this._vertexData[arrayOffset + 16] = sprite.color.b;\r\n this._vertexData[arrayOffset + 17] = sprite.color.a;\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n const indices = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the renderer (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n if (this._indexBuffer) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n if (this._useVAO) {\r\n this._vertexArrayObject = undefined as any;\r\n }\r\n\r\n this._buffer._rebuild();\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = <VertexBuffer>this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n\r\n this._spriteBuffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._buffer) {\r\n this._buffer.dispose();\r\n (<any>this._buffer) = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n (<any>this._indexBuffer) = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n (<any>this.texture) = null;\r\n }\r\n this._drawWrapperBase.dispose();\r\n this._drawWrapperFog.dispose();\r\n this._drawWrapperDepth.dispose();\r\n this._drawWrapperFogDepth.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"spriteRenderer.js","sourceRoot":"","sources":["../../../../lts/core/generated/Sprites/spriteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IMatrixLike } from \"../Maths/math.like\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\n\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { Scene } from \"../scene\";\r\n\r\nimport \"../Engines/Extensions/engine.alpha\";\r\nimport \"../Engines/Extensions/engine.dynamicBuffer\";\r\n\r\nimport \"../Shaders/sprites.fragment\";\r\nimport \"../Shaders/sprites.vertex\";\r\n\r\n/**\r\n * Class used to render sprites.\r\n *\r\n * It can be used either to render Sprites or ThinSprites with ThinEngine only.\r\n */\r\nexport class SpriteRenderer {\r\n /**\r\n * Defines the texture of the spritesheet\r\n */\r\n public texture: Nullable<ThinTexture>;\r\n\r\n /**\r\n * Defines the default width of a cell in the spritesheet\r\n */\r\n public cellWidth: number;\r\n\r\n /**\r\n * Defines the default height of a cell in the spritesheet\r\n */\r\n public cellHeight: number;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public blendMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if alpha mode is automatically\r\n * reset.\r\n */\r\n public autoResetAlpha = true;\r\n\r\n /**\r\n * Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public disableDepthWrite: boolean = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the manager must consider scene fog when rendering\r\n */\r\n public fogEnabled = true;\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n private _pixelPerfect = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * Note that pixel perfect mode is not supported in WebGL 1\r\n */\r\n public get pixelPerfect() {\r\n return this._pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n if (this._pixelPerfect === value) {\r\n return;\r\n }\r\n\r\n this._pixelPerfect = value;\r\n this._createEffects();\r\n }\r\n\r\n private readonly _engine: ThinEngine;\r\n private readonly _useVAO: boolean = false;\r\n private readonly _useInstancing: boolean = false;\r\n private readonly _scene: Nullable<Scene>;\r\n\r\n private readonly _capacity: number;\r\n private readonly _epsilon: number;\r\n\r\n private _vertexBufferSize: number;\r\n private _vertexData: Float32Array;\r\n private _buffer: Buffer;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: DataBuffer;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _drawWrapperFog: DrawWrapper;\r\n private _drawWrapperDepth: DrawWrapper;\r\n private _drawWrapperFogDepth: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n\r\n /**\r\n * Creates a new sprite Renderer\r\n * @param engine defines the engine the renderer works with\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(engine: ThinEngine, capacity: number, epsilon: number = 0.01, scene: Nullable<Scene> = null) {\r\n this._capacity = capacity;\r\n this._epsilon = epsilon;\r\n\r\n this._engine = engine;\r\n this._useInstancing = engine.getCaps().instancedArrays && engine._features.supportSpriteInstancing;\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n this._scene = scene;\r\n\r\n if (!this._useInstancing) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // VBO\r\n // 18 floats per sprite (x, y, z, angle, sizeX, sizeY, offsetX, offsetY, invertU, invertV, cellLeft, cellTop, cellWidth, cellHeight, color r, color g, color b, color a)\r\n // 16 when using instances\r\n this._vertexBufferSize = this._useInstancing ? 16 : 18;\r\n this._vertexData = new Float32Array(capacity * this._vertexBufferSize * (this._useInstancing ? 1 : 4));\r\n this._buffer = new Buffer(engine, this._vertexData, true, this._vertexBufferSize);\r\n\r\n const positions = this._buffer.createVertexBuffer(VertexBuffer.PositionKind, 0, 4, this._vertexBufferSize, this._useInstancing);\r\n const options = this._buffer.createVertexBuffer(\"options\", 4, 2, this._vertexBufferSize, this._useInstancing);\r\n\r\n let offset = 6;\r\n let offsets: VertexBuffer;\r\n\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n } else {\r\n offsets = this._buffer.createVertexBuffer(\"offsets\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n offset += 2;\r\n }\r\n\r\n const inverts = this._buffer.createVertexBuffer(\"inverts\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n const cellInfo = this._buffer.createVertexBuffer(\"cellInfo\", offset + 2, 4, this._vertexBufferSize, this._useInstancing);\r\n const colors = this._buffer.createVertexBuffer(VertexBuffer.ColorKind, offset + 6, 4, this._vertexBufferSize, this._useInstancing);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n this._vertexBuffers[\"options\"] = options;\r\n this._vertexBuffers[\"offsets\"] = offsets;\r\n this._vertexBuffers[\"inverts\"] = inverts;\r\n this._vertexBuffers[\"cellInfo\"] = cellInfo;\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n\r\n this._createEffects();\r\n }\r\n\r\n private _createEffects() {\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperFog?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n this._drawWrapperFogDepth?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n this._drawWrapperFog = new DrawWrapper(this._engine);\r\n this._drawWrapperDepth = new DrawWrapper(this._engine, false);\r\n this._drawWrapperFogDepth = new DrawWrapper(this._engine, false);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperFog.drawContext) {\r\n this._drawWrapperFog.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperDepth.drawContext) {\r\n this._drawWrapperDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperFogDepth.drawContext) {\r\n this._drawWrapperFogDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n\r\n const defines = this._pixelPerfect ? \"#define PIXEL_PERFECT\\n\" : \"\";\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\"],\r\n [\"diffuseSampler\"],\r\n defines\r\n );\r\n\r\n this._drawWrapperDepth.effect = this._drawWrapperBase.effect;\r\n this._drawWrapperDepth.materialContext = this._drawWrapperBase.materialContext;\r\n\r\n if (this._scene) {\r\n this._drawWrapperFog.effect = this._scene\r\n .getEngine()\r\n .createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\", \"vFogInfos\", \"vFogColor\"],\r\n [\"diffuseSampler\"],\r\n defines + \"#define FOG\"\r\n );\r\n this._drawWrapperFogDepth.effect = this._drawWrapperFog.effect;\r\n this._drawWrapperFogDepth.materialContext = this._drawWrapperFog.materialContext;\r\n }\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n * @param sprites defines the list of sprites to render\r\n * @param deltaTime defines the time since last frame\r\n * @param viewMatrix defines the viewMatrix to use to render the sprites\r\n * @param projectionMatrix defines the projectionMatrix to use to render the sprites\r\n * @param customSpriteUpdate defines a custom function to update the sprites data before they render\r\n */\r\n public render(\r\n sprites: ThinSprite[],\r\n deltaTime: number,\r\n viewMatrix: IMatrixLike,\r\n projectionMatrix: IMatrixLike,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void> = null\r\n ): void {\r\n if (!this.texture || !this.texture.isReady() || !sprites.length) {\r\n return;\r\n }\r\n\r\n let drawWrapper = this._drawWrapperBase;\r\n let drawWrapperDepth = this._drawWrapperDepth;\r\n let shouldRenderFog = false;\r\n if (this.fogEnabled && this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0) {\r\n drawWrapper = this._drawWrapperFog;\r\n drawWrapperDepth = this._drawWrapperFogDepth;\r\n shouldRenderFog = true;\r\n }\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const useRightHandedSystem = !!(this._scene && this._scene.useRightHandedSystem);\r\n const baseSize = this.texture.getBaseSize();\r\n\r\n // Sprites\r\n const max = Math.min(this._capacity, sprites.length);\r\n\r\n let offset = 0;\r\n let noSprite = true;\r\n for (let index = 0; index < max; index++) {\r\n const sprite = sprites[index];\r\n if (!sprite || !sprite.isVisible) {\r\n continue;\r\n }\r\n\r\n noSprite = false;\r\n sprite._animate(deltaTime);\r\n\r\n this._appendSpriteVertex(offset++, sprite, 0, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n if (!this._useInstancing) {\r\n this._appendSpriteVertex(offset++, sprite, 1, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 1, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 0, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n }\r\n }\r\n\r\n if (noSprite) {\r\n return;\r\n }\r\n\r\n this._buffer.update(this._vertexData);\r\n\r\n const culling = !!engine.depthCullingState.cull;\r\n const zOffset = engine.depthCullingState.zOffset;\r\n const zOffsetUnits = engine.depthCullingState.zOffsetUnits;\r\n\r\n engine.setState(culling, zOffset, false, false, undefined, undefined, zOffsetUnits);\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n effect.setTexture(\"diffuseSampler\", this.texture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n // Scene Info\r\n if (shouldRenderFog) {\r\n const scene = this._scene!;\r\n\r\n // Fog\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = engine.recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n engine.bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n // Draw order\r\n engine.depthCullingState.depthFunc = engine.useReverseDepthBuffer ? Constants.GEQUAL : Constants.LEQUAL;\r\n if (!this.disableDepthWrite) {\r\n effect.setBool(\"alphaTest\", true);\r\n engine.setColorWrite(false);\r\n engine.enableEffect(drawWrapperDepth);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n engine.enableEffect(drawWrapper);\r\n engine.setColorWrite(true);\r\n effect.setBool(\"alphaTest\", false);\r\n }\r\n\r\n engine.setAlphaMode(this.blendMode);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n\r\n if (this.autoResetAlpha) {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Right Handed\r\n if (useRightHandedSystem) {\r\n this._scene!.getEngine().setState(culling, zOffset, false, true, undefined, undefined, zOffsetUnits);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n private _appendSpriteVertex(\r\n index: number,\r\n sprite: ThinSprite,\r\n offsetX: number,\r\n offsetY: number,\r\n baseSize: ISize,\r\n useRightHandedSystem: boolean,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void>\r\n ): void {\r\n let arrayOffset = index * this._vertexBufferSize;\r\n\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n\r\n if (customSpriteUpdate) {\r\n customSpriteUpdate(sprite, baseSize);\r\n } else {\r\n if (!sprite.cellIndex) {\r\n sprite.cellIndex = 0;\r\n }\r\n\r\n const rowSize = baseSize.width / this.cellWidth;\r\n const offset = (sprite.cellIndex / rowSize) >> 0;\r\n sprite._xOffset = ((sprite.cellIndex - offset * rowSize) * this.cellWidth) / baseSize.width;\r\n sprite._yOffset = (offset * this.cellHeight) / baseSize.height;\r\n sprite._xSize = this.cellWidth;\r\n sprite._ySize = this.cellHeight;\r\n }\r\n\r\n // Positions\r\n this._vertexData[arrayOffset] = sprite.position.x;\r\n this._vertexData[arrayOffset + 1] = sprite.position.y;\r\n this._vertexData[arrayOffset + 2] = sprite.position.z;\r\n this._vertexData[arrayOffset + 3] = sprite.angle;\r\n // Options\r\n this._vertexData[arrayOffset + 4] = sprite.width;\r\n this._vertexData[arrayOffset + 5] = sprite.height;\r\n\r\n if (!this._useInstancing) {\r\n this._vertexData[arrayOffset + 6] = offsetX;\r\n this._vertexData[arrayOffset + 7] = offsetY;\r\n } else {\r\n arrayOffset -= 2;\r\n }\r\n\r\n // Inverts according to Right Handed\r\n if (useRightHandedSystem) {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 0 : 1;\r\n } else {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 1 : 0;\r\n }\r\n\r\n this._vertexData[arrayOffset + 9] = sprite.invertV ? 1 : 0;\r\n\r\n this._vertexData[arrayOffset + 10] = sprite._xOffset;\r\n this._vertexData[arrayOffset + 11] = sprite._yOffset;\r\n this._vertexData[arrayOffset + 12] = sprite._xSize / baseSize.width;\r\n this._vertexData[arrayOffset + 13] = sprite._ySize / baseSize.height;\r\n\r\n // Color\r\n this._vertexData[arrayOffset + 14] = sprite.color.r;\r\n this._vertexData[arrayOffset + 15] = sprite.color.g;\r\n this._vertexData[arrayOffset + 16] = sprite.color.b;\r\n this._vertexData[arrayOffset + 17] = sprite.color.a;\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n const indices = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the renderer (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n if (this._indexBuffer) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n if (this._useVAO) {\r\n this._vertexArrayObject = undefined as any;\r\n }\r\n\r\n this._buffer._rebuild();\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = <VertexBuffer>this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n\r\n this._spriteBuffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._buffer) {\r\n this._buffer.dispose();\r\n (<any>this._buffer) = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n (<any>this._indexBuffer) = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n this._engine.releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n (<any>this.texture) = null;\r\n }\r\n this._drawWrapperBase.dispose();\r\n this._drawWrapperFog.dispose();\r\n this._drawWrapperDepth.dispose();\r\n this._drawWrapperFogDepth.dispose();\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRAnchorSystem.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRAnchorSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Matrix, Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { IWebXRHitResult } from \"./WebXRHitTest\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Configuration options of the anchor system\r\n */\r\nexport interface IWebXRAnchorSystemOptions {\r\n /**\r\n * a node that will be used to convert local to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n\r\n /**\r\n * If set to true a reference of the created anchors will be kept until the next session starts\r\n * If not defined, anchors will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveAnchorsOnSessionEnded?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon container for an XR Anchor\r\n */\r\nexport interface IWebXRAnchor {\r\n /**\r\n * A babylon-assigned ID for this anchor\r\n */\r\n id: number;\r\n /**\r\n * Transformation matrix to apply to an object attached to this anchor\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native anchor object\r\n */\r\n xrAnchor: XRAnchor;\r\n\r\n /**\r\n * if defined, this object will be constantly updated by the anchor's position and rotation\r\n */\r\n attachedNode?: TransformNode;\r\n\r\n /**\r\n * Remove this anchor from the scene\r\n */\r\n remove(): void;\r\n}\r\n\r\n/**\r\n * An internal interface for a future (promise based) anchor\r\n */\r\ninterface IWebXRFutureAnchor {\r\n /**\r\n * The native anchor\r\n */\r\n nativeAnchor?: XRAnchor;\r\n /**\r\n * Was this request submitted to the xr frame?\r\n */\r\n submitted: boolean;\r\n /**\r\n * Was this promise resolved already?\r\n */\r\n resolved: boolean;\r\n /**\r\n * A resolve function\r\n */\r\n resolve: (xrAnchor: IWebXRAnchor) => void;\r\n /**\r\n * A reject function\r\n */\r\n reject: (msg?: string) => void;\r\n /**\r\n * The XR Transformation of the future anchor\r\n */\r\n xrTransformation: XRRigidTransform;\r\n}\r\n\r\nlet anchorIdProvider = 0;\r\n\r\n/**\r\n * An implementation of the anchor system for WebXR.\r\n * For further information see https://github.com/immersive-web/anchors/\r\n */\r\nexport class WebXRAnchorSystem extends WebXRAbstractFeature {\r\n private _lastFrameDetected: XRAnchorSet = new Set();\r\n\r\n private _trackedAnchors: Array<IWebXRAnchor> = [];\r\n\r\n private _referenceSpaceForFrameAnchors: XRReferenceSpace;\r\n\r\n private _futureAnchors: IWebXRFutureAnchor[] = [];\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.ANCHOR_SYSTEM;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Observers registered here will be executed when a new anchor was added to the session\r\n */\r\n public onAnchorAddedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an anchor was removed from the session\r\n */\r\n public onAnchorRemovedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing anchor updates\r\n * This can execute N times every frame\r\n */\r\n public onAnchorUpdatedObservable: Observable<IWebXRAnchor> = new Observable();\r\n\r\n /**\r\n * Set the reference space to use for anchor creation, when not using a hit test.\r\n * Will default to the session's reference space if not defined\r\n */\r\n public set referenceSpaceForFrameAnchors(referenceSpace: XRReferenceSpace) {\r\n this._referenceSpaceForFrameAnchors = referenceSpace;\r\n }\r\n\r\n /**\r\n * constructs a new anchor system\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param _options configuration object for this feature\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager, private _options: IWebXRAnchorSystemOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n }\r\n\r\n private _tmpVector = new Vector3();\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n private _populateTmpTransformation(position: Vector3, rotationQuaternion: Quaternion) {\r\n this._tmpVector.copyFrom(position);\r\n this._tmpQuaternion.copyFrom(rotationQuaternion);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpVector.z *= -1;\r\n this._tmpQuaternion.z *= -1;\r\n this._tmpQuaternion.w *= -1;\r\n }\r\n return {\r\n position: this._tmpVector,\r\n rotationQuaternion: this._tmpQuaternion,\r\n };\r\n }\r\n\r\n /**\r\n * Create a new anchor point using a hit test result at a specific point in the scene\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param hitTestResult The hit test result to use for this anchor creation\r\n * @param position an optional position offset for this anchor\r\n * @param rotationQuaternion an optional rotation offset for this anchor\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorPointUsingHitTestResultAsync(\r\n hitTestResult: IWebXRHitResult,\r\n position: Vector3 = new Vector3(),\r\n rotationQuaternion: Quaternion = new Quaternion()\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const m = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n if (!hitTestResult.xrHitResult.createAnchor) {\r\n this.detach();\r\n throw new Error(\"Anchors not enabled in this environment/browser\");\r\n } else {\r\n try {\r\n const nativeAnchor = await hitTestResult.xrHitResult.createAnchor(m);\r\n return new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor,\r\n resolved: false,\r\n submitted: true,\r\n xrTransformation: m,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add a new anchor at a specific position and rotation\r\n * This function will add a new anchor per default in the next available frame. Unless forced, the createAnchor function\r\n * will be called in the next xrFrame loop to make sure that the anchor can be created correctly.\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param position the position in which to add an anchor\r\n * @param rotationQuaternion an optional rotation for the anchor transformation\r\n * @param forceCreateInCurrentFrame force the creation of this anchor in the current frame. Must be called inside xrFrame loop!\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorAtPositionAndRotationAsync(\r\n position: Vector3,\r\n rotationQuaternion: Quaternion = new Quaternion(),\r\n forceCreateInCurrentFrame = false\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const xrTransformation = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n const xrAnchor =\r\n forceCreateInCurrentFrame && this.attached && this._xrSessionManager.currentFrame\r\n ? await this._createAnchorAtTransformation(xrTransformation, this._xrSessionManager.currentFrame)\r\n : undefined;\r\n // add the transformation to the future anchors list\r\n return new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor: xrAnchor,\r\n resolved: false,\r\n submitted: false,\r\n xrTransformation,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the list of anchors currently being tracked by the system\r\n */\r\n public get anchors(): IWebXRAnchor[] {\r\n return this._trackedAnchors;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n if (!this._options.doNotRemoveAnchorsOnSessionEnded) {\r\n while (this._trackedAnchors.length) {\r\n const toRemove = this._trackedAnchors.pop();\r\n if (toRemove) {\r\n try {\r\n // try to natively remove it as well\r\n toRemove.remove();\r\n } catch (e) {\r\n // no-op\r\n }\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n this._futureAnchors.length = 0;\r\n super.dispose();\r\n this.onAnchorAddedObservable.clear();\r\n this.onAnchorRemovedObservable.clear();\r\n this.onAnchorUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const trackedAnchors = frame.trackedAnchors;\r\n if (trackedAnchors) {\r\n const toRemove = this._trackedAnchors\r\n .filter((anchor) => !trackedAnchors.has(anchor.xrAnchor))\r\n .map((anchor) => {\r\n const index = this._trackedAnchors.indexOf(anchor);\r\n return index;\r\n });\r\n let idxTracker = 0;\r\n toRemove.forEach((index) => {\r\n const anchor = this._trackedAnchors.splice(index - idxTracker, 1)[0];\r\n this.onAnchorRemovedObservable.notifyObservers(anchor);\r\n idxTracker++;\r\n });\r\n // now check for new ones\r\n trackedAnchors.forEach((xrAnchor) => {\r\n if (!this._lastFrameDetected.has(xrAnchor)) {\r\n const newAnchor: Partial<IWebXRAnchor> = {\r\n id: anchorIdProvider++,\r\n xrAnchor: xrAnchor,\r\n remove: () => xrAnchor.delete(),\r\n };\r\n const anchor = this._updateAnchorWithXRFrame(xrAnchor, newAnchor, frame);\r\n this._trackedAnchors.push(anchor);\r\n this.onAnchorAddedObservable.notifyObservers(anchor);\r\n // search for the future anchor promise that matches this\r\n const results = this._futureAnchors.filter((futureAnchor) => futureAnchor.nativeAnchor === xrAnchor);\r\n const result = results[0];\r\n if (result) {\r\n result.resolve(anchor);\r\n result.resolved = true;\r\n }\r\n } else {\r\n const index = this._findIndexInAnchorArray(xrAnchor);\r\n const anchor = this._trackedAnchors[index];\r\n try {\r\n // anchors update every frame\r\n this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);\r\n if (anchor.attachedNode) {\r\n anchor.attachedNode.rotationQuaternion = anchor.attachedNode.rotationQuaternion || new Quaternion();\r\n anchor.transformationMatrix.decompose(anchor.attachedNode.scaling, anchor.attachedNode.rotationQuaternion, anchor.attachedNode.position);\r\n }\r\n this.onAnchorUpdatedObservable.notifyObservers(anchor);\r\n } catch (e) {\r\n Tools.Warn(`Anchor could not be updated`);\r\n }\r\n }\r\n });\r\n this._lastFrameDetected = trackedAnchors;\r\n }\r\n\r\n // process future anchors\r\n this._futureAnchors.forEach((futureAnchor) => {\r\n if (!futureAnchor.resolved && !futureAnchor.submitted) {\r\n this._createAnchorAtTransformation(futureAnchor.xrTransformation, frame).then(\r\n (nativeAnchor) => {\r\n futureAnchor.nativeAnchor = nativeAnchor;\r\n },\r\n (error) => {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(error);\r\n }\r\n );\r\n futureAnchor.submitted = true;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrAnchor the plane to find in the array\r\n */\r\n private _findIndexInAnchorArray(xrAnchor: XRAnchor) {\r\n for (let i = 0; i < this._trackedAnchors.length; ++i) {\r\n if (this._trackedAnchors[i].xrAnchor === xrAnchor) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private _updateAnchorWithXRFrame(xrAnchor: XRAnchor, anchor: Partial<IWebXRAnchor>, xrFrame: XRFrame): IWebXRAnchor {\r\n // matrix\r\n const pose = xrFrame.getPose(xrAnchor.anchorSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = anchor.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n anchor.transformationMatrix = mat;\r\n if (!this._options.worldParentNode) {\r\n // Logger.Warn(\"Please provide a world parent node to apply world transformation\");\r\n } else {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRAnchor>anchor;\r\n }\r\n\r\n private async _createAnchorAtTransformation(xrTransformation: XRRigidTransform, xrFrame: XRFrame) {\r\n if (xrFrame.createAnchor) {\r\n try {\r\n return xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace);\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n } else {\r\n this.detach();\r\n throw new Error(\"Anchors are not enabled in your browser\");\r\n }\r\n }\r\n}\r\n\r\n// register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRAnchorSystem.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRAnchorSystem(xrSessionManager, options);\r\n },\r\n WebXRAnchorSystem.Version\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRAnchorSystem.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/features/WebXRAnchorSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AA4EzC,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,oBAAoB;IAkCvD;;;OAGG;IACH,IAAW,6BAA6B,CAAC,cAAgC;QACrE,IAAI,CAAC,8BAA8B,GAAG,cAAc,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,YAAY,iBAAsC,EAAU,WAAsC,EAAE;QAChG,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAD+B,aAAQ,GAAR,QAAQ,CAAgC;QA9C5F,uBAAkB,GAAgB,IAAI,GAAG,EAAE,CAAC;QAE5C,oBAAe,GAAwB,EAAE,CAAC;QAI1C,mBAAc,GAAyB,EAAE,CAAC;QAalD;;WAEG;QACI,4BAAuB,GAA6B,IAAI,UAAU,EAAE,CAAC;QAC5E;;WAEG;QACI,8BAAyB,GAA6B,IAAI,UAAU,EAAE,CAAC;QAC9E;;;WAGG;QACI,8BAAyB,GAA6B,IAAI,UAAU,EAAE,CAAC;QAoBtE,eAAU,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,mBAAc,GAAG,IAAI,UAAU,EAAE,CAAC;QAJtC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACzC,CAAC;IAKO,0BAA0B,CAAC,QAAiB,EAAE,kBAA8B;QAChF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE;YACpD,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC/B;QACD,OAAO;YACH,QAAQ,EAAE,IAAI,CAAC,UAAU;YACzB,kBAAkB,EAAE,IAAI,CAAC,cAAc;SAC1C,CAAC;IACN,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,qCAAqC,CAC9C,aAA8B,EAC9B,WAAoB,IAAI,OAAO,EAAE,EACjC,qBAAiC,IAAI,UAAU,EAAE;QAEjD,+CAA+C;QAC/C,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC9D,4BAA4B;QAC5B,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAC1B,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EACpE,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAC7G,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;aAAM;YACH,IAAI;gBACA,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACrE,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACrB,YAAY;wBACZ,QAAQ,EAAE,KAAK;wBACf,SAAS,EAAE,IAAI;wBACf,gBAAgB,EAAE,CAAC;wBACnB,OAAO;wBACP,MAAM;qBACT,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;aACN;YAAC,OAAO,KAAK,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;aAC1B;SACJ;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,mCAAmC,CAC5C,QAAiB,EACjB,qBAAiC,IAAI,UAAU,EAAE,EACjD,yBAAyB,GAAG,KAAK;QAEjC,+CAA+C;QAC/C,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC9D,4BAA4B;QAC5B,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CACzC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EACpE,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAC7G,CAAC;QACF,MAAM,QAAQ,GACV,yBAAyB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY;YAC7E,CAAC,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACjG,CAAC,CAAC,SAAS,CAAC;QACpB,oDAAoD;QACpD,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,YAAY,EAAE,QAAQ;gBACtB,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,KAAK;gBAChB,gBAAgB;gBAChB,OAAO;gBACP,MAAM;aACT,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACI,MAAM;QACT,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACjB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,gCAAgC,EAAE;YACjD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC5C,IAAI,QAAQ,EAAE;oBACV,IAAI;wBACA,oCAAoC;wBACpC,QAAQ,CAAC,MAAM,EAAE,CAAC;qBACrB;oBAAC,OAAO,CAAC,EAAE;wBACR,QAAQ;qBACX;oBACD,8DAA8D;oBAC9D,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;iBAC5D;aACJ;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAES,UAAU,CAAC,KAAc;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;YAC1B,OAAO;SACV;QAED,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,cAAc,EAAE;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;iBAChC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;iBACxD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnD,OAAO,KAAK,CAAC;YACjB,CAAC,CAAC,CAAC;YACP,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBACvD,UAAU,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,yBAAyB;YACzB,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBACxC,MAAM,SAAS,GAA0B;wBACrC,EAAE,EAAE,gBAAgB,EAAE;wBACtB,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;qBAClC,CAAC;oBACF,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBACzE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAClC,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;oBACrD,yDAAyD;oBACzD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC;oBACrG,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1B,IAAI,MAAM,EAAE;wBACR,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACvB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;qBAC1B;iBACJ;qBAAM;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;oBACrD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBAC3C,IAAI;wBACA,6BAA6B;wBAC7B,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;wBACvD,IAAI,MAAM,CAAC,YAAY,EAAE;4BACrB,MAAM,CAAC,YAAY,CAAC,kBAAkB,GAAG,MAAM,CAAC,YAAY,CAAC,kBAAkB,IAAI,IAAI,UAAU,EAAE,CAAC;4BACpG,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;yBAC5I;wBACD,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;qBAC1D;oBAAC,OAAO,CAAC,EAAE;wBACR,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;qBAC7C;iBACJ;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;SAC5C;QAED,yBAAyB;QACzB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACzC,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;gBACnD,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,IAAI,CACzE,CAAC,YAAY,EAAE,EAAE;oBACb,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC;gBAC7C,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;oBACN,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAC7B,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC,CACJ,CAAC;gBACF,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC;aACjC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACK,uBAAuB,CAAC,QAAkB;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YAClD,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAC/C,OAAO,CAAC,CAAC;aACZ;SACJ;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAEO,wBAAwB,CAAC,QAAkB,EAAE,MAA6B,EAAE,OAAgB;QAChG,SAAS;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC1F,IAAI,IAAI,EAAE;YACN,MAAM,GAAG,GAAG,MAAM,CAAC,oBAAoB,IAAI,IAAI,MAAM,EAAE,CAAC;YACxD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACpD,GAAG,CAAC,4BAA4B,EAAE,CAAC;aACtC;YACD,MAAM,CAAC,oBAAoB,GAAG,GAAG,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;gBAChC,mFAAmF;aACtF;iBAAM;gBACH,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;aAC1E;SACJ;QAED,OAAqB,MAAM,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,6BAA6B,CAAC,gBAAkC,EAAE,OAAgB;;QAC5F,IAAI,OAAO,CAAC,YAAY,EAAE;YACtB,IAAI;gBACA,OAAO,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAA,IAAI,CAAC,8BAA8B,mCAAI,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;aAC/H;YAAC,OAAO,KAAK,EAAE;gBACZ,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;aAC1B;SACJ;aAAM;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;SAC9D;IACL,CAAC;;AAtTD;;GAEG;AACoB,sBAAI,GAAG,gBAAgB,CAAC,aAAa,AAAjC,CAAkC;AAC7D;;;;GAIG;AACoB,yBAAO,GAAG,CAAC,AAAJ,CAAK;AAgTvC,sBAAsB;AACtB,oBAAoB,CAAC,eAAe,CAChC,iBAAiB,CAAC,IAAI,EACtB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;IAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC,EACD,iBAAiB,CAAC,OAAO,CAC5B,CAAC","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Matrix, Vector3, Quaternion } from \"../../Maths/math.vector\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { IWebXRHitResult } from \"./WebXRHitTest\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Configuration options of the anchor system\r\n */\r\nexport interface IWebXRAnchorSystemOptions {\r\n /**\r\n * a node that will be used to convert local to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n\r\n /**\r\n * If set to true a reference of the created anchors will be kept until the next session starts\r\n * If not defined, anchors will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveAnchorsOnSessionEnded?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon container for an XR Anchor\r\n */\r\nexport interface IWebXRAnchor {\r\n /**\r\n * A babylon-assigned ID for this anchor\r\n */\r\n id: number;\r\n /**\r\n * Transformation matrix to apply to an object attached to this anchor\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native anchor object\r\n */\r\n xrAnchor: XRAnchor;\r\n\r\n /**\r\n * if defined, this object will be constantly updated by the anchor's position and rotation\r\n */\r\n attachedNode?: TransformNode;\r\n\r\n /**\r\n * Remove this anchor from the scene\r\n */\r\n remove(): void;\r\n}\r\n\r\n/**\r\n * An internal interface for a future (promise based) anchor\r\n */\r\ninterface IWebXRFutureAnchor {\r\n /**\r\n * The native anchor\r\n */\r\n nativeAnchor?: XRAnchor;\r\n /**\r\n * Was this request submitted to the xr frame?\r\n */\r\n submitted: boolean;\r\n /**\r\n * Was this promise resolved already?\r\n */\r\n resolved: boolean;\r\n /**\r\n * A resolve function\r\n */\r\n resolve: (xrAnchor: IWebXRAnchor) => void;\r\n /**\r\n * A reject function\r\n */\r\n reject: (msg?: string) => void;\r\n /**\r\n * The XR Transformation of the future anchor\r\n */\r\n xrTransformation: XRRigidTransform;\r\n}\r\n\r\nlet anchorIdProvider = 0;\r\n\r\n/**\r\n * An implementation of the anchor system for WebXR.\r\n * For further information see https://github.com/immersive-web/anchors/\r\n */\r\nexport class WebXRAnchorSystem extends WebXRAbstractFeature {\r\n private _lastFrameDetected: XRAnchorSet = new Set();\r\n\r\n private _trackedAnchors: Array<IWebXRAnchor> = [];\r\n\r\n private _referenceSpaceForFrameAnchors: XRReferenceSpace;\r\n\r\n private _futureAnchors: IWebXRFutureAnchor[] = [];\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.ANCHOR_SYSTEM;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Observers registered here will be executed when a new anchor was added to the session\r\n */\r\n public onAnchorAddedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an anchor was removed from the session\r\n */\r\n public onAnchorRemovedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing anchor updates\r\n * This can execute N times every frame\r\n */\r\n public onAnchorUpdatedObservable: Observable<IWebXRAnchor> = new Observable();\r\n\r\n /**\r\n * Set the reference space to use for anchor creation, when not using a hit test.\r\n * Will default to the session's reference space if not defined\r\n */\r\n public set referenceSpaceForFrameAnchors(referenceSpace: XRReferenceSpace) {\r\n this._referenceSpaceForFrameAnchors = referenceSpace;\r\n }\r\n\r\n /**\r\n * constructs a new anchor system\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param _options configuration object for this feature\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager, private _options: IWebXRAnchorSystemOptions = {}) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n }\r\n\r\n private _tmpVector = new Vector3();\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n private _populateTmpTransformation(position: Vector3, rotationQuaternion: Quaternion) {\r\n this._tmpVector.copyFrom(position);\r\n this._tmpQuaternion.copyFrom(rotationQuaternion);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpVector.z *= -1;\r\n this._tmpQuaternion.z *= -1;\r\n this._tmpQuaternion.w *= -1;\r\n }\r\n return {\r\n position: this._tmpVector,\r\n rotationQuaternion: this._tmpQuaternion,\r\n };\r\n }\r\n\r\n /**\r\n * Create a new anchor point using a hit test result at a specific point in the scene\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param hitTestResult The hit test result to use for this anchor creation\r\n * @param position an optional position offset for this anchor\r\n * @param rotationQuaternion an optional rotation offset for this anchor\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorPointUsingHitTestResultAsync(\r\n hitTestResult: IWebXRHitResult,\r\n position: Vector3 = new Vector3(),\r\n rotationQuaternion: Quaternion = new Quaternion()\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const m = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n if (!hitTestResult.xrHitResult.createAnchor) {\r\n this.detach();\r\n throw new Error(\"Anchors not enabled in this environment/browser\");\r\n } else {\r\n try {\r\n const nativeAnchor = await hitTestResult.xrHitResult.createAnchor(m);\r\n return new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor,\r\n resolved: false,\r\n submitted: true,\r\n xrTransformation: m,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add a new anchor at a specific position and rotation\r\n * This function will add a new anchor per default in the next available frame. Unless forced, the createAnchor function\r\n * will be called in the next xrFrame loop to make sure that the anchor can be created correctly.\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param position the position in which to add an anchor\r\n * @param rotationQuaternion an optional rotation for the anchor transformation\r\n * @param forceCreateInCurrentFrame force the creation of this anchor in the current frame. Must be called inside xrFrame loop!\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorAtPositionAndRotationAsync(\r\n position: Vector3,\r\n rotationQuaternion: Quaternion = new Quaternion(),\r\n forceCreateInCurrentFrame = false\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const xrTransformation = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n const xrAnchor =\r\n forceCreateInCurrentFrame && this.attached && this._xrSessionManager.currentFrame\r\n ? await this._createAnchorAtTransformation(xrTransformation, this._xrSessionManager.currentFrame)\r\n : undefined;\r\n // add the transformation to the future anchors list\r\n return new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor: xrAnchor,\r\n resolved: false,\r\n submitted: false,\r\n xrTransformation,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the list of anchors currently being tracked by the system\r\n */\r\n public get anchors(): IWebXRAnchor[] {\r\n return this._trackedAnchors;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n if (!this._options.doNotRemoveAnchorsOnSessionEnded) {\r\n while (this._trackedAnchors.length) {\r\n const toRemove = this._trackedAnchors.pop();\r\n if (toRemove) {\r\n try {\r\n // try to natively remove it as well\r\n toRemove.remove();\r\n } catch (e) {\r\n // no-op\r\n }\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public dispose(): void {\r\n this._futureAnchors.length = 0;\r\n super.dispose();\r\n this.onAnchorAddedObservable.clear();\r\n this.onAnchorRemovedObservable.clear();\r\n this.onAnchorUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const trackedAnchors = frame.trackedAnchors;\r\n if (trackedAnchors) {\r\n const toRemove = this._trackedAnchors\r\n .filter((anchor) => !trackedAnchors.has(anchor.xrAnchor))\r\n .map((anchor) => {\r\n const index = this._trackedAnchors.indexOf(anchor);\r\n return index;\r\n });\r\n let idxTracker = 0;\r\n toRemove.forEach((index) => {\r\n const anchor = this._trackedAnchors.splice(index - idxTracker, 1)[0];\r\n this.onAnchorRemovedObservable.notifyObservers(anchor);\r\n idxTracker++;\r\n });\r\n // now check for new ones\r\n trackedAnchors.forEach((xrAnchor) => {\r\n if (!this._lastFrameDetected.has(xrAnchor)) {\r\n const newAnchor: Partial<IWebXRAnchor> = {\r\n id: anchorIdProvider++,\r\n xrAnchor: xrAnchor,\r\n remove: () => xrAnchor.delete(),\r\n };\r\n const anchor = this._updateAnchorWithXRFrame(xrAnchor, newAnchor, frame);\r\n this._trackedAnchors.push(anchor);\r\n this.onAnchorAddedObservable.notifyObservers(anchor);\r\n // search for the future anchor promise that matches this\r\n const results = this._futureAnchors.filter((futureAnchor) => futureAnchor.nativeAnchor === xrAnchor);\r\n const result = results[0];\r\n if (result) {\r\n result.resolve(anchor);\r\n result.resolved = true;\r\n }\r\n } else {\r\n const index = this._findIndexInAnchorArray(xrAnchor);\r\n const anchor = this._trackedAnchors[index];\r\n try {\r\n // anchors update every frame\r\n this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);\r\n if (anchor.attachedNode) {\r\n anchor.attachedNode.rotationQuaternion = anchor.attachedNode.rotationQuaternion || new Quaternion();\r\n anchor.transformationMatrix.decompose(anchor.attachedNode.scaling, anchor.attachedNode.rotationQuaternion, anchor.attachedNode.position);\r\n }\r\n this.onAnchorUpdatedObservable.notifyObservers(anchor);\r\n } catch (e) {\r\n Tools.Warn(`Anchor could not be updated`);\r\n }\r\n }\r\n });\r\n this._lastFrameDetected = trackedAnchors;\r\n }\r\n\r\n // process future anchors\r\n this._futureAnchors.forEach((futureAnchor) => {\r\n if (!futureAnchor.resolved && !futureAnchor.submitted) {\r\n this._createAnchorAtTransformation(futureAnchor.xrTransformation, frame).then(\r\n (nativeAnchor) => {\r\n futureAnchor.nativeAnchor = nativeAnchor;\r\n },\r\n (error) => {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(error);\r\n }\r\n );\r\n futureAnchor.submitted = true;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrAnchor the plane to find in the array\r\n */\r\n private _findIndexInAnchorArray(xrAnchor: XRAnchor) {\r\n for (let i = 0; i < this._trackedAnchors.length; ++i) {\r\n if (this._trackedAnchors[i].xrAnchor === xrAnchor) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private _updateAnchorWithXRFrame(xrAnchor: XRAnchor, anchor: Partial<IWebXRAnchor>, xrFrame: XRFrame): IWebXRAnchor {\r\n // matrix\r\n const pose = xrFrame.getPose(xrAnchor.anchorSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = anchor.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n anchor.transformationMatrix = mat;\r\n if (!this._options.worldParentNode) {\r\n // Logger.Warn(\"Please provide a world parent node to apply world transformation\");\r\n } else {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRAnchor>anchor;\r\n }\r\n\r\n private async _createAnchorAtTransformation(xrTransformation: XRRigidTransform, xrFrame: XRFrame) {\r\n if (xrFrame.createAnchor) {\r\n try {\r\n return xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace);\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n } else {\r\n this.detach();\r\n throw new Error(\"Anchors are not enabled in your browser\");\r\n }\r\n }\r\n}\r\n\r\n// register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRAnchorSystem.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRAnchorSystem(xrSessionManager, options);\r\n },\r\n WebXRAnchorSystem.Version\r\n);\r\n"]}