@babylonjs/core 8.3.1 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Processors/shaderCodeNode.js +2 -2
  49. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  50. package/Engines/abstractEngine.d.ts +1 -0
  51. package/Engines/abstractEngine.js +14 -8
  52. package/Engines/abstractEngine.js.map +1 -1
  53. package/Engines/constants.d.ts +27 -5
  54. package/Engines/constants.js +27 -5
  55. package/Engines/constants.js.map +1 -1
  56. package/Engines/engine.js +8 -8
  57. package/Engines/engine.js.map +1 -1
  58. package/Engines/webgpuEngine.js +6 -2
  59. package/Engines/webgpuEngine.js.map +1 -1
  60. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  61. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  62. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  63. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  64. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  65. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  67. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  69. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  70. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  71. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  72. package/FlowGraph/flowGraphBlock.js +3 -2
  73. package/FlowGraph/flowGraphBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphCoordinator.js +10 -6
  75. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  76. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  77. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  78. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  79. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  80. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  81. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  82. package/Gamepads/gamepadManager.js +2 -2
  83. package/Gamepads/gamepadManager.js.map +1 -1
  84. package/Gizmos/axisDragGizmo.js +3 -2
  85. package/Gizmos/axisDragGizmo.js.map +1 -1
  86. package/Gizmos/axisScaleGizmo.js +6 -4
  87. package/Gizmos/axisScaleGizmo.js.map +1 -1
  88. package/Gizmos/boundingBoxGizmo.js +28 -26
  89. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  90. package/Gizmos/cameraGizmo.js +6 -3
  91. package/Gizmos/cameraGizmo.js.map +1 -1
  92. package/Gizmos/gizmo.js +11 -10
  93. package/Gizmos/gizmo.js.map +1 -1
  94. package/Gizmos/gizmoManager.js +16 -12
  95. package/Gizmos/gizmoManager.js.map +1 -1
  96. package/Gizmos/lightGizmo.js +3 -2
  97. package/Gizmos/lightGizmo.js.map +1 -1
  98. package/Gizmos/planeDragGizmo.js +3 -2
  99. package/Gizmos/planeDragGizmo.js.map +1 -1
  100. package/Gizmos/planeRotationGizmo.js +3 -2
  101. package/Gizmos/planeRotationGizmo.js.map +1 -1
  102. package/Gizmos/positionGizmo.js +41 -28
  103. package/Gizmos/positionGizmo.js.map +1 -1
  104. package/Gizmos/rotationGizmo.js +26 -18
  105. package/Gizmos/rotationGizmo.js.map +1 -1
  106. package/Gizmos/scaleGizmo.js +47 -32
  107. package/Gizmos/scaleGizmo.js.map +1 -1
  108. package/Layers/effectLayerSceneComponent.js +4 -4
  109. package/Layers/effectLayerSceneComponent.js.map +1 -1
  110. package/Layers/layerSceneComponent.js +4 -4
  111. package/Layers/layerSceneComponent.js.map +1 -1
  112. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  113. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  114. package/Lights/Shadows/shadowGenerator.js +3 -3
  115. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  116. package/Lights/light.js +4 -4
  117. package/Lights/light.js.map +1 -1
  118. package/Loading/Plugins/babylonFileLoader.js +54 -46
  119. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  120. package/Loading/loadingScreen.js +4 -3
  121. package/Loading/loadingScreen.js.map +1 -1
  122. package/Loading/sceneLoader.js +15 -12
  123. package/Loading/sceneLoader.js.map +1 -1
  124. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  125. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  126. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  127. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  128. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  129. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  131. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/customBlock.js +53 -43
  133. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  134. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  135. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  136. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  137. package/Materials/Node/nodeMaterial.d.ts +5 -0
  138. package/Materials/Node/nodeMaterial.js +33 -20
  139. package/Materials/Node/nodeMaterial.js.map +1 -1
  140. package/Materials/Node/nodeMaterialBlock.js +7 -4
  141. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  142. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  143. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  144. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  145. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  146. package/Materials/Node/nodeMaterialDefault.js +28 -0
  147. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  148. package/Materials/Textures/cubeTexture.js +3 -1
  149. package/Materials/Textures/cubeTexture.js.map +1 -1
  150. package/Materials/Textures/videoTexture.js +5 -4
  151. package/Materials/Textures/videoTexture.js.map +1 -1
  152. package/Materials/materialDefines.js +3 -1
  153. package/Materials/materialDefines.js.map +1 -1
  154. package/Materials/multiMaterial.js +3 -1
  155. package/Materials/multiMaterial.js.map +1 -1
  156. package/Materials/shaderMaterial.js +3 -2
  157. package/Materials/shaderMaterial.js.map +1 -1
  158. package/Meshes/Compression/dracoEncoder.js +2 -2
  159. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  160. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  161. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  162. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  163. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  164. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  165. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  166. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  167. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  168. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  169. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  170. package/Meshes/abstractMesh.js +2 -2
  171. package/Meshes/abstractMesh.js.map +1 -1
  172. package/Meshes/geodesicMesh.js +2 -2
  173. package/Meshes/geodesicMesh.js.map +1 -1
  174. package/Meshes/mesh.js +6 -6
  175. package/Meshes/mesh.js.map +1 -1
  176. package/Meshes/mesh.vertexData.functions.js +11 -10
  177. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  178. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  179. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  180. package/Meshes/meshSimplification.js +10 -10
  181. package/Meshes/meshSimplification.js.map +1 -1
  182. package/Meshes/meshUtils.js +6 -3
  183. package/Meshes/meshUtils.js.map +1 -1
  184. package/Meshes/polygonMesh.js +10 -10
  185. package/Meshes/polygonMesh.js.map +1 -1
  186. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  187. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  188. package/Misc/arrayTools.js +2 -2
  189. package/Misc/arrayTools.js.map +1 -1
  190. package/Misc/asyncLock.js +9 -9
  191. package/Misc/asyncLock.js.map +1 -1
  192. package/Misc/basis.js +4 -2
  193. package/Misc/basis.js.map +1 -1
  194. package/Misc/deepCopier.js +3 -2
  195. package/Misc/deepCopier.js.map +1 -1
  196. package/Misc/deepMerger.js +3 -2
  197. package/Misc/deepMerger.js.map +1 -1
  198. package/Misc/fileTools.js +4 -4
  199. package/Misc/fileTools.js.map +1 -1
  200. package/Misc/greasedLineTools.js +14 -13
  201. package/Misc/greasedLineTools.js.map +1 -1
  202. package/Misc/logger.js +3 -2
  203. package/Misc/logger.js.map +1 -1
  204. package/Misc/observable.extensions.js +4 -4
  205. package/Misc/observable.extensions.js.map +1 -1
  206. package/Misc/sceneSerializer.js +5 -4
  207. package/Misc/sceneSerializer.js.map +1 -1
  208. package/Misc/snapshotRenderingHelper.js +3 -1
  209. package/Misc/snapshotRenderingHelper.js.map +1 -1
  210. package/Misc/tags.js +2 -2
  211. package/Misc/tags.js.map +1 -1
  212. package/Misc/trajectoryClassifier.js +8 -8
  213. package/Misc/trajectoryClassifier.js.map +1 -1
  214. package/Particles/IParticleSystem.d.ts +1 -1
  215. package/Particles/IParticleSystem.js.map +1 -1
  216. package/Particles/baseParticleSystem.d.ts +11 -3
  217. package/Particles/baseParticleSystem.js +37 -3
  218. package/Particles/baseParticleSystem.js.map +1 -1
  219. package/Particles/gpuParticleSystem.js +1 -14
  220. package/Particles/gpuParticleSystem.js.map +1 -1
  221. package/Particles/particle.js +2 -2
  222. package/Particles/particle.js.map +1 -1
  223. package/Particles/particleSystem.js +15 -13
  224. package/Particles/particleSystem.js.map +1 -1
  225. package/Particles/thinParticleSystem.js +3 -16
  226. package/Particles/thinParticleSystem.js.map +1 -1
  227. package/Physics/physicsHelper.js +18 -14
  228. package/Physics/physicsHelper.js.map +1 -1
  229. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  230. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  231. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  232. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  233. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  234. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  235. package/Physics/v1/physicsEngine.js +4 -4
  236. package/Physics/v1/physicsEngine.js.map +1 -1
  237. package/Physics/v1/physicsImpostor.js +10 -21
  238. package/Physics/v1/physicsImpostor.js.map +1 -1
  239. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  240. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  241. package/Physics/v2/ragdoll.js +4 -4
  242. package/Physics/v2/ragdoll.js.map +1 -1
  243. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  244. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  245. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  246. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  247. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  248. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  249. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  250. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  251. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  252. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  253. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  254. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  255. package/Rendering/iblCdfGenerator.js +4 -4
  256. package/Rendering/iblCdfGenerator.js.map +1 -1
  257. package/Rendering/objectRenderer.js +2 -2
  258. package/Rendering/objectRenderer.js.map +1 -1
  259. package/Rendering/reflectiveShadowMap.js +7 -5
  260. package/Rendering/reflectiveShadowMap.js.map +1 -1
  261. package/Sprites/spriteMap.js +2 -2
  262. package/Sprites/spriteMap.js.map +1 -1
  263. package/XR/features/WebXRAbstractFeature.js +2 -2
  264. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  265. package/XR/features/WebXRAnchorSystem.js +4 -4
  266. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  267. package/XR/features/WebXRBackgroundRemover.js +3 -1
  268. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  269. package/XR/features/WebXRControllerMovement.js +6 -3
  270. package/XR/features/WebXRControllerMovement.js.map +1 -1
  271. package/XR/features/WebXRControllerPhysics.js +12 -7
  272. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  273. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  274. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  275. package/XR/features/WebXRControllerTeleportation.js +11 -7
  276. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  277. package/XR/features/WebXRDepthSensing.js +6 -6
  278. package/XR/features/WebXRDepthSensing.js.map +1 -1
  279. package/XR/features/WebXRHandTracking.js +60 -24
  280. package/XR/features/WebXRHandTracking.js.map +1 -1
  281. package/XR/features/WebXRHitTest.js +4 -4
  282. package/XR/features/WebXRHitTest.js.map +1 -1
  283. package/XR/features/WebXRImageTracking.js +2 -2
  284. package/XR/features/WebXRImageTracking.js.map +1 -1
  285. package/XR/features/WebXRLayers.js +2 -2
  286. package/XR/features/WebXRLayers.js.map +1 -1
  287. package/XR/features/WebXRNearInteraction.js +12 -7
  288. package/XR/features/WebXRNearInteraction.js.map +1 -1
  289. package/XR/features/WebXRRawCameraAccess.js +9 -4
  290. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  291. package/XR/features/WebXRSpaceWarp.js +2 -2
  292. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  293. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  294. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  295. package/XR/motionController/webXRGenericMotionController.js +2 -2
  296. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  297. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  298. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  299. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  300. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  301. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  302. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  303. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  304. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  305. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  306. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  307. package/XR/webXRCamera.js +3 -2
  308. package/XR/webXRCamera.js.map +1 -1
  309. package/XR/webXREnterExitUI.js +5 -4
  310. package/XR/webXREnterExitUI.js.map +1 -1
  311. package/XR/webXRExperienceHelper.js +2 -2
  312. package/XR/webXRExperienceHelper.js.map +1 -1
  313. package/XR/webXRFeaturesManager.js +10 -7
  314. package/XR/webXRFeaturesManager.js.map +1 -1
  315. package/XR/webXRInput.js +8 -8
  316. package/XR/webXRInput.js.map +1 -1
  317. package/XR/webXRInputSource.js +4 -1
  318. package/XR/webXRInputSource.js.map +1 -1
  319. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  320. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  321. package/assetContainer.js +156 -135
  322. package/assetContainer.js.map +1 -1
  323. package/node.js +2 -2
  324. package/node.js.map +1 -1
  325. package/package.json +1 -1
  326. package/scene.js +18 -11
  327. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"spriteMap.js","sourceRoot":"","sources":["../../../../dev/core/src/Sprites/spriteMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { ISpriteJSONSprite, ISpriteJSONAtlas } from \"./ISprites\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport \"../Shaders/spriteMap.fragment\";\r\nimport \"../Shaders/spriteMap.vertex\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nexport enum SpriteMapFrameRotationDirection {\r\n CCW = 0,\r\n CW = 1,\r\n}\r\n\r\n/**\r\n * Defines the basic options interface of a SpriteMap\r\n */\r\nexport interface ISpriteMapOptions {\r\n /**\r\n * Vector2 of the number of cells in the grid.\r\n */\r\n stageSize?: Vector2;\r\n\r\n /**\r\n * Vector2 of the size of the output plane in World Units.\r\n */\r\n outputSize?: Vector2;\r\n\r\n /**\r\n * Vector3 of the position of the output plane in World Units.\r\n */\r\n outputPosition?: Vector3;\r\n\r\n /**\r\n * Vector3 of the rotation of the output plane.\r\n */\r\n outputRotation?: Vector3;\r\n\r\n /**\r\n * number of layers that the system will reserve in resources.\r\n */\r\n layerCount?: number;\r\n\r\n /**\r\n * number of max animation frames a single cell will reserve in resources.\r\n */\r\n maxAnimationFrames?: number;\r\n\r\n /**\r\n * number cell index of the base tile when the system compiles.\r\n */\r\n baseTile?: number;\r\n\r\n /**\r\n * boolean flip the sprite after its been repositioned by the framing data.\r\n */\r\n flipU?: boolean;\r\n\r\n /**\r\n * Vector3 scalar of the global RGB values of the SpriteMap.\r\n */\r\n colorMultiply?: Vector3;\r\n\r\n /**\r\n * Rotation direction of the frame by 90 degrees.\r\n * Applied when the the frame's \"rotated\" parameter is true.\r\n * Default is CCW.\r\n */\r\n frameRotationDirection?: SpriteMapFrameRotationDirection;\r\n}\r\n\r\n/**\r\n * Defines the IDisposable interface in order to be cleanable from resources.\r\n */\r\nexport interface ISpriteMap extends IDisposable {\r\n /**\r\n * String name of the SpriteMap.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The JSON Array file from a https://www.codeandweb.com/texturepacker export. Or similar structure.\r\n */\r\n atlasJSON: ISpriteJSONAtlas;\r\n\r\n /**\r\n * Texture of the SpriteMap.\r\n */\r\n spriteSheet: Texture;\r\n\r\n /**\r\n * The parameters to initialize the SpriteMap with.\r\n */\r\n options: ISpriteMapOptions;\r\n}\r\n\r\n/**\r\n * Class used to manage a grid restricted sprite deployment on an Output plane.\r\n */\r\nexport class SpriteMap implements ISpriteMap {\r\n /** The Name of the spriteMap */\r\n public name: string;\r\n\r\n /** The JSON file with the frame and meta data */\r\n public atlasJSON: ISpriteJSONAtlas;\r\n\r\n /** The systems Sprite Sheet Texture */\r\n public spriteSheet: Texture;\r\n\r\n /** Arguments passed with the Constructor */\r\n public options: ISpriteMapOptions;\r\n\r\n /** Public Sprite Storage array, parsed from atlasJSON */\r\n public sprites: Array<ISpriteJSONSprite>;\r\n\r\n /** Returns the Number of Sprites in the System */\r\n public get spriteCount(): number {\r\n return this.sprites.length;\r\n }\r\n\r\n /** Returns the Position of Output Plane*/\r\n public get position(): Vector3 {\r\n return this._output.position;\r\n }\r\n\r\n /** Returns the Position of Output Plane*/\r\n public set position(v: Vector3) {\r\n this._output.position = v;\r\n }\r\n\r\n /** Returns the Rotation of Output Plane*/\r\n public get rotation(): Vector3 {\r\n return this._output.rotation;\r\n }\r\n\r\n /** Returns the Rotation of Output Plane*/\r\n public set rotation(v: Vector3) {\r\n this._output.rotation = v;\r\n }\r\n\r\n /** Sets the AnimationMap*/\r\n public get animationMap() {\r\n return this._animationMap;\r\n }\r\n\r\n /** Sets the AnimationMap*/\r\n public set animationMap(v: RawTexture) {\r\n const buffer = v!._texture!._bufferView;\r\n const am = this._createTileAnimationBuffer(buffer);\r\n this._animationMap.dispose();\r\n this._animationMap = am;\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the sprite map must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._material.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._material.fogEnabled = value;\r\n }\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /** Gets or sets a boolean indicating if the sprite map must use logarithmic depth when rendering */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._material.useLogarithmicDepth;\r\n }\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._material.useLogarithmicDepth = value;\r\n }\r\n\r\n /** Scene that the SpriteMap was created in */\r\n private _scene: Scene;\r\n\r\n /** Texture Buffer of Float32 that holds tile frame data*/\r\n private _frameMap: RawTexture;\r\n\r\n /** Texture Buffers of Float32 that holds tileMap data*/\r\n private _tileMaps: RawTexture[];\r\n\r\n /** Texture Buffer of Float32 that holds Animation Data*/\r\n private _animationMap: RawTexture;\r\n\r\n /** Custom ShaderMaterial Central to the System*/\r\n private _material: ShaderMaterial;\r\n\r\n /** Custom ShaderMaterial Central to the System*/\r\n private _output: Mesh;\r\n\r\n /** Systems Time Ticker*/\r\n private _time: number;\r\n\r\n /**\r\n * Creates a new SpriteMap\r\n * @param name defines the SpriteMaps Name\r\n * @param atlasJSON is the JSON file that controls the Sprites Frames and Meta\r\n * @param spriteSheet is the Texture that the Sprites are on.\r\n * @param options a basic deployment configuration\r\n * @param scene The Scene that the map is deployed on\r\n */\r\n constructor(name: string, atlasJSON: ISpriteJSONAtlas, spriteSheet: Texture, options: ISpriteMapOptions, scene: Scene) {\r\n this.name = name;\r\n this.sprites = [];\r\n this.atlasJSON = atlasJSON;\r\n this.sprites = this.atlasJSON[\"frames\"];\r\n this.spriteSheet = spriteSheet;\r\n\r\n /**\r\n * Run through the options and set what ever defaults are needed that where not declared.\r\n */\r\n this.options = options;\r\n options.stageSize = options.stageSize || new Vector2(1, 1);\r\n options.outputSize = options.outputSize || options.stageSize;\r\n options.outputPosition = options.outputPosition || Vector3.Zero();\r\n options.outputRotation = options.outputRotation || Vector3.Zero();\r\n options.layerCount = options.layerCount || 1;\r\n options.maxAnimationFrames = options.maxAnimationFrames || 0;\r\n options.baseTile = options.baseTile || 0;\r\n options.flipU = options.flipU || false;\r\n options.colorMultiply = options.colorMultiply || new Vector3(1, 1, 1);\r\n\r\n this._scene = scene;\r\n\r\n this._frameMap = this._createFrameBuffer();\r\n\r\n this._tileMaps = new Array();\r\n for (let i = 0; i < options.layerCount; i++) {\r\n this._tileMaps.push(this._createTileBuffer(null, i));\r\n }\r\n\r\n this._animationMap = this._createTileAnimationBuffer(null);\r\n\r\n const defines = [];\r\n defines.push(\"#define LAYERS \" + options.layerCount);\r\n\r\n if (options?.frameRotationDirection === SpriteMapFrameRotationDirection.CW) {\r\n defines.push(\"#define FR_CW\");\r\n }\r\n\r\n if (options.flipU) {\r\n defines.push(\"#define FLIPU\");\r\n }\r\n\r\n defines.push(`#define MAX_ANIMATION_FRAMES ${options.maxAnimationFrames}.0`);\r\n\r\n const shaderString: string = Effect.ShadersStore[\"spriteMapPixelShader\"];\r\n\r\n let layerSampleString: string;\r\n if (!scene.getEngine()._features.supportSwitchCaseInShader) {\r\n layerSampleString = \"\";\r\n for (let i = 0; i < options.layerCount; i++) {\r\n layerSampleString += `if (${i} == i) { frameID = texture2D(tileMaps[${i}], (tileID + 0.5) / stageSize, 0.).x; }`;\r\n }\r\n } else {\r\n layerSampleString = \"switch(i) {\";\r\n for (let i = 0; i < options.layerCount; i++) {\r\n layerSampleString += \"case \" + i + \" : frameID = texture(tileMaps[\" + i + \"], (tileID + 0.5) / stageSize, 0.).x;\";\r\n layerSampleString += \"break;\";\r\n }\r\n layerSampleString += \"}\";\r\n }\r\n\r\n Effect.ShadersStore[\"spriteMap\" + this.name + \"PixelShader\"] = shaderString.replace(\"#define LAYER_ID_SWITCH\", layerSampleString);\r\n\r\n this._material = new ShaderMaterial(\r\n \"spriteMap:\" + this.name,\r\n this._scene,\r\n {\r\n vertex: \"spriteMap\",\r\n fragment: \"spriteMap\" + this.name,\r\n },\r\n {\r\n defines,\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"time\",\r\n \"stageSize\",\r\n \"outputSize\",\r\n \"spriteMapSize\",\r\n \"spriteCount\",\r\n \"time\",\r\n \"colorMul\",\r\n \"mousePosition\",\r\n \"curTile\",\r\n \"flipU\",\r\n ],\r\n samplers: [\"spriteSheet\", \"frameMap\", \"tileMaps\", \"animationMap\"],\r\n needAlphaBlending: true,\r\n }\r\n );\r\n\r\n this._time = 0;\r\n\r\n this._material.setFloat(\"spriteCount\", this.spriteCount);\r\n this._material.setVector2(\"stageSize\", options.stageSize);\r\n this._material.setVector2(\"outputSize\", options.outputSize);\r\n this._material.setTexture(\"spriteSheet\", this.spriteSheet);\r\n this._material.setVector2(\"spriteMapSize\", new Vector2(1, 1));\r\n this._material.setVector3(\"colorMul\", options.colorMultiply);\r\n\r\n let tickSave = 0;\r\n\r\n const bindSpriteTexture = () => {\r\n if (this.spriteSheet && this.spriteSheet.isReady()) {\r\n if (this.spriteSheet._texture) {\r\n this._material.setVector2(\"spriteMapSize\", new Vector2(this.spriteSheet._texture.baseWidth || 1, this.spriteSheet._texture.baseHeight || 1));\r\n return;\r\n }\r\n }\r\n if (tickSave < 100) {\r\n setTimeout(() => {\r\n tickSave++;\r\n bindSpriteTexture();\r\n }, 100);\r\n }\r\n };\r\n\r\n bindSpriteTexture();\r\n\r\n this._material.setVector3(\"colorMul\", options.colorMultiply);\r\n this._material.setTexture(\"frameMap\", this._frameMap);\r\n this._material.setTextureArray(\"tileMaps\", this._tileMaps);\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n this._material.setFloat(\"time\", this._time);\r\n\r\n this._output = CreatePlane(name + \":output\", { size: 1, updatable: true }, scene);\r\n this._output.scaling.x = options.outputSize.x;\r\n this._output.scaling.y = options.outputSize.y;\r\n this.position = options.outputPosition;\r\n this.rotation = options.outputRotation;\r\n\r\n const obfunction = () => {\r\n this._time += this._scene.getEngine().getDeltaTime();\r\n this._material.setFloat(\"time\", this._time);\r\n };\r\n\r\n this._scene.onBeforeRenderObservable.add(obfunction);\r\n this._output.material = this._material;\r\n }\r\n\r\n /**\r\n * Returns the index of the frame for a given filename\r\n * @param name filename of the frame\r\n * @returns index of the frame\r\n */\r\n public getTileIdxByName(name: string): number {\r\n const idx = this.atlasJSON.frames.findIndex((f) => f.filename === name);\r\n return idx;\r\n }\r\n\r\n /**\r\n * Returns tileID location\r\n * @returns Vector2 the cell position ID\r\n */\r\n public getTileID(): Vector2 {\r\n const p = this.getMousePosition();\r\n p.multiplyInPlace(this.options.stageSize || Vector2.Zero());\r\n p.x = Math.floor(p.x);\r\n p.y = Math.floor(p.y);\r\n return p;\r\n }\r\n\r\n /**\r\n * Gets the UV location of the mouse over the SpriteMap.\r\n * @returns Vector2 the UV position of the mouse interaction\r\n */\r\n public getMousePosition(): Vector2 {\r\n const out = this._output;\r\n const pickinfo: Nullable<PickingInfo> = this._scene.pick(this._scene.pointerX, this._scene.pointerY, (mesh) => {\r\n if (mesh !== out) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (!pickinfo || !pickinfo.hit || !pickinfo.getTextureCoordinates) {\r\n return new Vector2(-1, -1);\r\n }\r\n\r\n const coords = pickinfo.getTextureCoordinates();\r\n if (coords) {\r\n return coords;\r\n }\r\n\r\n return new Vector2(-1, -1);\r\n }\r\n\r\n /**\r\n * Creates the \"frame\" texture Buffer\r\n * -------------------------------------\r\n * Structure of frames\r\n * \"filename\": \"Falling-Water-2.png\",\r\n * \"frame\": {\"x\":69,\"y\":103,\"w\":24,\"h\":32},\r\n * \"rotated\": true,\r\n * \"trimmed\": true,\r\n * \"spriteSourceSize\": {\"x\":4,\"y\":0,\"w\":24,\"h\":32},\r\n * \"sourceSize\": {\"w\":32,\"h\":32}\r\n * @returns RawTexture of the frameMap\r\n */\r\n private _createFrameBuffer(): RawTexture {\r\n const data = [];\r\n //Do two Passes\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n data.push(0, 0, 0, 0); //frame\r\n data.push(0, 0, 0, 0); //spriteSourceSize\r\n data.push(0, 0, 0, 0); //sourceSize, rotated, trimmed\r\n data.push(0, 0, 0, 0); //Keep it pow2 cause I\"m cool like that... it helps with sampling accuracy as well. Plus then we have 4 other parameters for future stuff.\r\n }\r\n //Second Pass\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n const f = this.sprites[i][\"frame\"];\r\n const sss = this.sprites[i][\"spriteSourceSize\"];\r\n const ss = this.sprites[i][\"sourceSize\"];\r\n const r = this.sprites[i][\"rotated\"] ? 1 : 0;\r\n const t = this.sprites[i][\"trimmed\"] ? 1 : 0;\r\n\r\n //frame\r\n data[i * 4] = f.x;\r\n data[i * 4 + 1] = f.y;\r\n data[i * 4 + 2] = f.w;\r\n data[i * 4 + 3] = f.h;\r\n //spriteSourceSize\r\n data[i * 4 + this.spriteCount * 4] = sss.x;\r\n data[i * 4 + 1 + this.spriteCount * 4] = sss.y;\r\n data[i * 4 + 3 + this.spriteCount * 4] = sss.h;\r\n //sourceSize, rotated, trimmed\r\n data[i * 4 + this.spriteCount * 8] = ss.w;\r\n data[i * 4 + 1 + this.spriteCount * 8] = ss.h;\r\n data[i * 4 + 2 + this.spriteCount * 8] = r;\r\n data[i * 4 + 3 + this.spriteCount * 8] = t;\r\n }\r\n\r\n const floatArray = new Float32Array(data);\r\n\r\n const t = RawTexture.CreateRGBATexture(floatArray, this.spriteCount, 4, this._scene, false, false, Texture.NEAREST_NEAREST, Constants.TEXTURETYPE_FLOAT);\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Creates the tileMap texture Buffer\r\n * @param buffer normally and array of numbers, or a false to generate from scratch\r\n * @param _layer indicates what layer for a logic trigger dealing with the baseTile. The system uses this\r\n * @returns RawTexture of the tileMap\r\n */\r\n private _createTileBuffer(buffer: any, _layer: number = 0): RawTexture {\r\n let data = [];\r\n const _ty = this.options.stageSize!.y || 0;\r\n const _tx = this.options.stageSize!.x || 0;\r\n\r\n if (!buffer) {\r\n let bt = this.options.baseTile;\r\n if (_layer != 0) {\r\n bt = 0;\r\n }\r\n\r\n for (let y = 0; y < _ty; y++) {\r\n for (let x = 0; x < _tx * 4; x += 4) {\r\n data.push(bt, 0, 0, 0);\r\n }\r\n }\r\n } else {\r\n data = buffer;\r\n }\r\n\r\n const floatArray = new Float32Array(data);\r\n const t = RawTexture.CreateRGBATexture(floatArray, _tx, _ty, this._scene, false, false, Texture.NEAREST_NEAREST, Constants.TEXTURETYPE_FLOAT);\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Modifies the data of the tileMaps\r\n * @param _layer is the ID of the layer you want to edit on the SpriteMap\r\n * @param pos is the iVector2 Coordinates of the Tile\r\n * @param tile The SpriteIndex of the new Tile\r\n */\r\n public changeTiles(_layer: number = 0, pos: Vector2 | Vector2[], tile: number = 0): void {\r\n const buffer = this._tileMaps[_layer]!._texture!._bufferView;\r\n if (buffer === null) {\r\n return;\r\n }\r\n\r\n let p = [];\r\n if (pos instanceof Vector2) {\r\n p.push(pos);\r\n } else {\r\n p = pos;\r\n }\r\n\r\n const _tx = this.options.stageSize!.x || 0;\r\n\r\n for (let i = 0; i < p.length; i++) {\r\n const _p = p[i];\r\n _p.x = Math.floor(_p.x);\r\n _p.y = Math.floor(_p.y);\r\n const id: number = _p.x * 4 + _p.y * (_tx * 4);\r\n (buffer as any)[id] = tile;\r\n }\r\n\r\n const t = this._createTileBuffer(buffer);\r\n this._tileMaps[_layer].dispose();\r\n this._tileMaps[_layer] = t;\r\n this._material.setTextureArray(\"tileMap\", this._tileMaps);\r\n }\r\n\r\n /**\r\n * Creates the animationMap texture Buffer\r\n * @param buffer normally and array of numbers, or a false to generate from scratch\r\n * @returns RawTexture of the animationMap\r\n */\r\n private _createTileAnimationBuffer(buffer: Nullable<ArrayBufferView>): RawTexture {\r\n const data = [];\r\n let floatArray;\r\n if (!buffer) {\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n data.push(0, 0, 0, 0);\r\n let count = 1;\r\n while (count < (this.options.maxAnimationFrames || 4)) {\r\n data.push(0, 0, 0, 0);\r\n count++;\r\n }\r\n }\r\n floatArray = new Float32Array(data);\r\n } else {\r\n floatArray = buffer;\r\n }\r\n\r\n const t = RawTexture.CreateRGBATexture(\r\n floatArray,\r\n this.spriteCount,\r\n this.options.maxAnimationFrames || 4,\r\n this._scene,\r\n false,\r\n false,\r\n Texture.NEAREST_NEAREST,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Modifies the data of the animationMap\r\n * @param cellID is the Index of the Sprite\r\n * @param _frame is the target Animation frame\r\n * @param toCell is the Target Index of the next frame of the animation\r\n * @param time is a value between 0-1 that is the trigger for when the frame should change tiles\r\n * @param speed is a global scalar of the time variable on the map.\r\n */\r\n public addAnimationToTile(cellID: number = 0, _frame: number = 0, toCell: number = 0, time: number = 0, speed: number = 1): void {\r\n const buffer: any = this._animationMap!._texture!._bufferView;\r\n const id: number = cellID * 4 + this.spriteCount * 4 * _frame;\r\n if (!buffer) {\r\n return;\r\n }\r\n buffer[id] = toCell;\r\n buffer[id + 1] = time;\r\n buffer[id + 2] = speed;\r\n const t = this._createTileAnimationBuffer(buffer);\r\n this._animationMap.dispose();\r\n this._animationMap = t;\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n }\r\n\r\n /**\r\n * Exports the .tilemaps file\r\n */\r\n public saveTileMaps(): void {\r\n let maps = \"\";\r\n for (let i = 0; i < this._tileMaps.length; i++) {\r\n if (i > 0) {\r\n maps += \"\\n\\r\";\r\n }\r\n\r\n maps += this._tileMaps[i]!._texture!._bufferView!.toString();\r\n }\r\n const hiddenElement = document.createElement(\"a\");\r\n hiddenElement.href = \"data:octet/stream;charset=utf-8,\" + encodeURI(maps);\r\n hiddenElement.target = \"_blank\";\r\n hiddenElement.download = this.name + \".tilemaps\";\r\n hiddenElement.click();\r\n hiddenElement.remove();\r\n }\r\n\r\n /**\r\n * Imports the .tilemaps file\r\n * @param url of the .tilemaps file\r\n */\r\n public loadTileMaps(url: string): void {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url);\r\n\r\n const _lc = this.options!.layerCount || 0;\r\n\r\n xhr.onload = () => {\r\n const data = xhr.response.split(\"\\n\\r\");\r\n for (let i = 0; i < _lc; i++) {\r\n const d = data[i].split(\",\").map(Number);\r\n const t = this._createTileBuffer(d);\r\n this._tileMaps[i].dispose();\r\n this._tileMaps[i] = t;\r\n }\r\n this._material.setTextureArray(\"tileMap\", this._tileMaps);\r\n };\r\n xhr.send();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n this._output.dispose();\r\n this._material.dispose();\r\n this._animationMap.dispose();\r\n this._tileMaps.forEach((tm) => {\r\n tm.dispose();\r\n });\r\n this._frameMap.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"spriteMap.js","sourceRoot":"","sources":["../../../../dev/core/src/Sprites/spriteMap.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { ISpriteJSONSprite, ISpriteJSONAtlas } from \"./ISprites\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport \"../Shaders/spriteMap.fragment\";\r\nimport \"../Shaders/spriteMap.vertex\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nexport enum SpriteMapFrameRotationDirection {\r\n CCW = 0,\r\n CW = 1,\r\n}\r\n\r\n/**\r\n * Defines the basic options interface of a SpriteMap\r\n */\r\nexport interface ISpriteMapOptions {\r\n /**\r\n * Vector2 of the number of cells in the grid.\r\n */\r\n stageSize?: Vector2;\r\n\r\n /**\r\n * Vector2 of the size of the output plane in World Units.\r\n */\r\n outputSize?: Vector2;\r\n\r\n /**\r\n * Vector3 of the position of the output plane in World Units.\r\n */\r\n outputPosition?: Vector3;\r\n\r\n /**\r\n * Vector3 of the rotation of the output plane.\r\n */\r\n outputRotation?: Vector3;\r\n\r\n /**\r\n * number of layers that the system will reserve in resources.\r\n */\r\n layerCount?: number;\r\n\r\n /**\r\n * number of max animation frames a single cell will reserve in resources.\r\n */\r\n maxAnimationFrames?: number;\r\n\r\n /**\r\n * number cell index of the base tile when the system compiles.\r\n */\r\n baseTile?: number;\r\n\r\n /**\r\n * boolean flip the sprite after its been repositioned by the framing data.\r\n */\r\n flipU?: boolean;\r\n\r\n /**\r\n * Vector3 scalar of the global RGB values of the SpriteMap.\r\n */\r\n colorMultiply?: Vector3;\r\n\r\n /**\r\n * Rotation direction of the frame by 90 degrees.\r\n * Applied when the the frame's \"rotated\" parameter is true.\r\n * Default is CCW.\r\n */\r\n frameRotationDirection?: SpriteMapFrameRotationDirection;\r\n}\r\n\r\n/**\r\n * Defines the IDisposable interface in order to be cleanable from resources.\r\n */\r\nexport interface ISpriteMap extends IDisposable {\r\n /**\r\n * String name of the SpriteMap.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The JSON Array file from a https://www.codeandweb.com/texturepacker export. Or similar structure.\r\n */\r\n atlasJSON: ISpriteJSONAtlas;\r\n\r\n /**\r\n * Texture of the SpriteMap.\r\n */\r\n spriteSheet: Texture;\r\n\r\n /**\r\n * The parameters to initialize the SpriteMap with.\r\n */\r\n options: ISpriteMapOptions;\r\n}\r\n\r\n/**\r\n * Class used to manage a grid restricted sprite deployment on an Output plane.\r\n */\r\nexport class SpriteMap implements ISpriteMap {\r\n /** The Name of the spriteMap */\r\n public name: string;\r\n\r\n /** The JSON file with the frame and meta data */\r\n public atlasJSON: ISpriteJSONAtlas;\r\n\r\n /** The systems Sprite Sheet Texture */\r\n public spriteSheet: Texture;\r\n\r\n /** Arguments passed with the Constructor */\r\n public options: ISpriteMapOptions;\r\n\r\n /** Public Sprite Storage array, parsed from atlasJSON */\r\n public sprites: Array<ISpriteJSONSprite>;\r\n\r\n /** Returns the Number of Sprites in the System */\r\n public get spriteCount(): number {\r\n return this.sprites.length;\r\n }\r\n\r\n /** Returns the Position of Output Plane*/\r\n public get position(): Vector3 {\r\n return this._output.position;\r\n }\r\n\r\n /** Returns the Position of Output Plane*/\r\n public set position(v: Vector3) {\r\n this._output.position = v;\r\n }\r\n\r\n /** Returns the Rotation of Output Plane*/\r\n public get rotation(): Vector3 {\r\n return this._output.rotation;\r\n }\r\n\r\n /** Returns the Rotation of Output Plane*/\r\n public set rotation(v: Vector3) {\r\n this._output.rotation = v;\r\n }\r\n\r\n /** Sets the AnimationMap*/\r\n public get animationMap() {\r\n return this._animationMap;\r\n }\r\n\r\n /** Sets the AnimationMap*/\r\n public set animationMap(v: RawTexture) {\r\n const buffer = v!._texture!._bufferView;\r\n const am = this._createTileAnimationBuffer(buffer);\r\n this._animationMap.dispose();\r\n this._animationMap = am;\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the sprite map must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._material.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._material.fogEnabled = value;\r\n }\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /** Gets or sets a boolean indicating if the sprite map must use logarithmic depth when rendering */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._material.useLogarithmicDepth;\r\n }\r\n public set useLogarithmicDepth(value: boolean) {\r\n this._material.useLogarithmicDepth = value;\r\n }\r\n\r\n /** Scene that the SpriteMap was created in */\r\n private _scene: Scene;\r\n\r\n /** Texture Buffer of Float32 that holds tile frame data*/\r\n private _frameMap: RawTexture;\r\n\r\n /** Texture Buffers of Float32 that holds tileMap data*/\r\n private _tileMaps: RawTexture[];\r\n\r\n /** Texture Buffer of Float32 that holds Animation Data*/\r\n private _animationMap: RawTexture;\r\n\r\n /** Custom ShaderMaterial Central to the System*/\r\n private _material: ShaderMaterial;\r\n\r\n /** Custom ShaderMaterial Central to the System*/\r\n private _output: Mesh;\r\n\r\n /** Systems Time Ticker*/\r\n private _time: number;\r\n\r\n /**\r\n * Creates a new SpriteMap\r\n * @param name defines the SpriteMaps Name\r\n * @param atlasJSON is the JSON file that controls the Sprites Frames and Meta\r\n * @param spriteSheet is the Texture that the Sprites are on.\r\n * @param options a basic deployment configuration\r\n * @param scene The Scene that the map is deployed on\r\n */\r\n constructor(name: string, atlasJSON: ISpriteJSONAtlas, spriteSheet: Texture, options: ISpriteMapOptions, scene: Scene) {\r\n this.name = name;\r\n this.sprites = [];\r\n this.atlasJSON = atlasJSON;\r\n this.sprites = this.atlasJSON[\"frames\"];\r\n this.spriteSheet = spriteSheet;\r\n\r\n /**\r\n * Run through the options and set what ever defaults are needed that where not declared.\r\n */\r\n this.options = options;\r\n options.stageSize = options.stageSize || new Vector2(1, 1);\r\n options.outputSize = options.outputSize || options.stageSize;\r\n options.outputPosition = options.outputPosition || Vector3.Zero();\r\n options.outputRotation = options.outputRotation || Vector3.Zero();\r\n options.layerCount = options.layerCount || 1;\r\n options.maxAnimationFrames = options.maxAnimationFrames || 0;\r\n options.baseTile = options.baseTile || 0;\r\n options.flipU = options.flipU || false;\r\n options.colorMultiply = options.colorMultiply || new Vector3(1, 1, 1);\r\n\r\n this._scene = scene;\r\n\r\n this._frameMap = this._createFrameBuffer();\r\n\r\n this._tileMaps = new Array();\r\n for (let i = 0; i < options.layerCount; i++) {\r\n this._tileMaps.push(this._createTileBuffer(null, i));\r\n }\r\n\r\n this._animationMap = this._createTileAnimationBuffer(null);\r\n\r\n const defines = [];\r\n defines.push(\"#define LAYERS \" + options.layerCount);\r\n\r\n if (options?.frameRotationDirection === SpriteMapFrameRotationDirection.CW) {\r\n defines.push(\"#define FR_CW\");\r\n }\r\n\r\n if (options.flipU) {\r\n defines.push(\"#define FLIPU\");\r\n }\r\n\r\n defines.push(`#define MAX_ANIMATION_FRAMES ${options.maxAnimationFrames}.0`);\r\n\r\n const shaderString: string = Effect.ShadersStore[\"spriteMapPixelShader\"];\r\n\r\n let layerSampleString: string;\r\n if (!scene.getEngine()._features.supportSwitchCaseInShader) {\r\n layerSampleString = \"\";\r\n for (let i = 0; i < options.layerCount; i++) {\r\n layerSampleString += `if (${i} == i) { frameID = texture2D(tileMaps[${i}], (tileID + 0.5) / stageSize, 0.).x; }`;\r\n }\r\n } else {\r\n layerSampleString = \"switch(i) {\";\r\n for (let i = 0; i < options.layerCount; i++) {\r\n layerSampleString += \"case \" + i + \" : frameID = texture(tileMaps[\" + i + \"], (tileID + 0.5) / stageSize, 0.).x;\";\r\n layerSampleString += \"break;\";\r\n }\r\n layerSampleString += \"}\";\r\n }\r\n\r\n Effect.ShadersStore[\"spriteMap\" + this.name + \"PixelShader\"] = shaderString.replace(\"#define LAYER_ID_SWITCH\", layerSampleString);\r\n\r\n this._material = new ShaderMaterial(\r\n \"spriteMap:\" + this.name,\r\n this._scene,\r\n {\r\n vertex: \"spriteMap\",\r\n fragment: \"spriteMap\" + this.name,\r\n },\r\n {\r\n defines,\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"time\",\r\n \"stageSize\",\r\n \"outputSize\",\r\n \"spriteMapSize\",\r\n \"spriteCount\",\r\n \"time\",\r\n \"colorMul\",\r\n \"mousePosition\",\r\n \"curTile\",\r\n \"flipU\",\r\n ],\r\n samplers: [\"spriteSheet\", \"frameMap\", \"tileMaps\", \"animationMap\"],\r\n needAlphaBlending: true,\r\n }\r\n );\r\n\r\n this._time = 0;\r\n\r\n this._material.setFloat(\"spriteCount\", this.spriteCount);\r\n this._material.setVector2(\"stageSize\", options.stageSize);\r\n this._material.setVector2(\"outputSize\", options.outputSize);\r\n this._material.setTexture(\"spriteSheet\", this.spriteSheet);\r\n this._material.setVector2(\"spriteMapSize\", new Vector2(1, 1));\r\n this._material.setVector3(\"colorMul\", options.colorMultiply);\r\n\r\n let tickSave = 0;\r\n\r\n const bindSpriteTexture = () => {\r\n if (this.spriteSheet && this.spriteSheet.isReady()) {\r\n if (this.spriteSheet._texture) {\r\n this._material.setVector2(\"spriteMapSize\", new Vector2(this.spriteSheet._texture.baseWidth || 1, this.spriteSheet._texture.baseHeight || 1));\r\n return;\r\n }\r\n }\r\n if (tickSave < 100) {\r\n setTimeout(() => {\r\n tickSave++;\r\n bindSpriteTexture();\r\n }, 100);\r\n }\r\n };\r\n\r\n bindSpriteTexture();\r\n\r\n this._material.setVector3(\"colorMul\", options.colorMultiply);\r\n this._material.setTexture(\"frameMap\", this._frameMap);\r\n this._material.setTextureArray(\"tileMaps\", this._tileMaps);\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n this._material.setFloat(\"time\", this._time);\r\n\r\n this._output = CreatePlane(name + \":output\", { size: 1, updatable: true }, scene);\r\n this._output.scaling.x = options.outputSize.x;\r\n this._output.scaling.y = options.outputSize.y;\r\n this.position = options.outputPosition;\r\n this.rotation = options.outputRotation;\r\n\r\n const obfunction = () => {\r\n this._time += this._scene.getEngine().getDeltaTime();\r\n this._material.setFloat(\"time\", this._time);\r\n };\r\n\r\n this._scene.onBeforeRenderObservable.add(obfunction);\r\n this._output.material = this._material;\r\n }\r\n\r\n /**\r\n * Returns the index of the frame for a given filename\r\n * @param name filename of the frame\r\n * @returns index of the frame\r\n */\r\n public getTileIdxByName(name: string): number {\r\n const idx = this.atlasJSON.frames.findIndex((f) => f.filename === name);\r\n return idx;\r\n }\r\n\r\n /**\r\n * Returns tileID location\r\n * @returns Vector2 the cell position ID\r\n */\r\n public getTileID(): Vector2 {\r\n const p = this.getMousePosition();\r\n p.multiplyInPlace(this.options.stageSize || Vector2.Zero());\r\n p.x = Math.floor(p.x);\r\n p.y = Math.floor(p.y);\r\n return p;\r\n }\r\n\r\n /**\r\n * Gets the UV location of the mouse over the SpriteMap.\r\n * @returns Vector2 the UV position of the mouse interaction\r\n */\r\n public getMousePosition(): Vector2 {\r\n const out = this._output;\r\n const pickinfo: Nullable<PickingInfo> = this._scene.pick(this._scene.pointerX, this._scene.pointerY, (mesh) => {\r\n if (mesh !== out) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (!pickinfo || !pickinfo.hit || !pickinfo.getTextureCoordinates) {\r\n return new Vector2(-1, -1);\r\n }\r\n\r\n const coords = pickinfo.getTextureCoordinates();\r\n if (coords) {\r\n return coords;\r\n }\r\n\r\n return new Vector2(-1, -1);\r\n }\r\n\r\n /**\r\n * Creates the \"frame\" texture Buffer\r\n * -------------------------------------\r\n * Structure of frames\r\n * \"filename\": \"Falling-Water-2.png\",\r\n * \"frame\": {\"x\":69,\"y\":103,\"w\":24,\"h\":32},\r\n * \"rotated\": true,\r\n * \"trimmed\": true,\r\n * \"spriteSourceSize\": {\"x\":4,\"y\":0,\"w\":24,\"h\":32},\r\n * \"sourceSize\": {\"w\":32,\"h\":32}\r\n * @returns RawTexture of the frameMap\r\n */\r\n private _createFrameBuffer(): RawTexture {\r\n const data = [];\r\n //Do two Passes\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n data.push(0, 0, 0, 0); //frame\r\n data.push(0, 0, 0, 0); //spriteSourceSize\r\n data.push(0, 0, 0, 0); //sourceSize, rotated, trimmed\r\n data.push(0, 0, 0, 0); //Keep it pow2 cause I\"m cool like that... it helps with sampling accuracy as well. Plus then we have 4 other parameters for future stuff.\r\n }\r\n //Second Pass\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n const f = this.sprites[i][\"frame\"];\r\n const sss = this.sprites[i][\"spriteSourceSize\"];\r\n const ss = this.sprites[i][\"sourceSize\"];\r\n const r = this.sprites[i][\"rotated\"] ? 1 : 0;\r\n const t = this.sprites[i][\"trimmed\"] ? 1 : 0;\r\n\r\n //frame\r\n data[i * 4] = f.x;\r\n data[i * 4 + 1] = f.y;\r\n data[i * 4 + 2] = f.w;\r\n data[i * 4 + 3] = f.h;\r\n //spriteSourceSize\r\n data[i * 4 + this.spriteCount * 4] = sss.x;\r\n data[i * 4 + 1 + this.spriteCount * 4] = sss.y;\r\n data[i * 4 + 3 + this.spriteCount * 4] = sss.h;\r\n //sourceSize, rotated, trimmed\r\n data[i * 4 + this.spriteCount * 8] = ss.w;\r\n data[i * 4 + 1 + this.spriteCount * 8] = ss.h;\r\n data[i * 4 + 2 + this.spriteCount * 8] = r;\r\n data[i * 4 + 3 + this.spriteCount * 8] = t;\r\n }\r\n\r\n const floatArray = new Float32Array(data);\r\n\r\n const t = RawTexture.CreateRGBATexture(floatArray, this.spriteCount, 4, this._scene, false, false, Texture.NEAREST_NEAREST, Constants.TEXTURETYPE_FLOAT);\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Creates the tileMap texture Buffer\r\n * @param buffer normally and array of numbers, or a false to generate from scratch\r\n * @param _layer indicates what layer for a logic trigger dealing with the baseTile. The system uses this\r\n * @returns RawTexture of the tileMap\r\n */\r\n private _createTileBuffer(buffer: any, _layer: number = 0): RawTexture {\r\n let data = [];\r\n const _ty = this.options.stageSize!.y || 0;\r\n const _tx = this.options.stageSize!.x || 0;\r\n\r\n if (!buffer) {\r\n let bt = this.options.baseTile;\r\n if (_layer != 0) {\r\n bt = 0;\r\n }\r\n\r\n for (let y = 0; y < _ty; y++) {\r\n for (let x = 0; x < _tx * 4; x += 4) {\r\n data.push(bt, 0, 0, 0);\r\n }\r\n }\r\n } else {\r\n data = buffer;\r\n }\r\n\r\n const floatArray = new Float32Array(data);\r\n const t = RawTexture.CreateRGBATexture(floatArray, _tx, _ty, this._scene, false, false, Texture.NEAREST_NEAREST, Constants.TEXTURETYPE_FLOAT);\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Modifies the data of the tileMaps\r\n * @param _layer is the ID of the layer you want to edit on the SpriteMap\r\n * @param pos is the iVector2 Coordinates of the Tile\r\n * @param tile The SpriteIndex of the new Tile\r\n */\r\n public changeTiles(_layer: number = 0, pos: Vector2 | Vector2[], tile: number = 0): void {\r\n const buffer = this._tileMaps[_layer]!._texture!._bufferView;\r\n if (buffer === null) {\r\n return;\r\n }\r\n\r\n let p = [];\r\n if (pos instanceof Vector2) {\r\n p.push(pos);\r\n } else {\r\n p = pos;\r\n }\r\n\r\n const _tx = this.options.stageSize!.x || 0;\r\n\r\n for (let i = 0; i < p.length; i++) {\r\n const _p = p[i];\r\n _p.x = Math.floor(_p.x);\r\n _p.y = Math.floor(_p.y);\r\n const id: number = _p.x * 4 + _p.y * (_tx * 4);\r\n (buffer as any)[id] = tile;\r\n }\r\n\r\n const t = this._createTileBuffer(buffer);\r\n this._tileMaps[_layer].dispose();\r\n this._tileMaps[_layer] = t;\r\n this._material.setTextureArray(\"tileMap\", this._tileMaps);\r\n }\r\n\r\n /**\r\n * Creates the animationMap texture Buffer\r\n * @param buffer normally and array of numbers, or a false to generate from scratch\r\n * @returns RawTexture of the animationMap\r\n */\r\n private _createTileAnimationBuffer(buffer: Nullable<ArrayBufferView>): RawTexture {\r\n const data = [];\r\n let floatArray;\r\n if (!buffer) {\r\n for (let i = 0; i < this.spriteCount; i++) {\r\n data.push(0, 0, 0, 0);\r\n let count = 1;\r\n while (count < (this.options.maxAnimationFrames || 4)) {\r\n data.push(0, 0, 0, 0);\r\n count++;\r\n }\r\n }\r\n floatArray = new Float32Array(data);\r\n } else {\r\n floatArray = buffer;\r\n }\r\n\r\n const t = RawTexture.CreateRGBATexture(\r\n floatArray,\r\n this.spriteCount,\r\n this.options.maxAnimationFrames || 4,\r\n this._scene,\r\n false,\r\n false,\r\n Texture.NEAREST_NEAREST,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n\r\n return t;\r\n }\r\n\r\n /**\r\n * Modifies the data of the animationMap\r\n * @param cellID is the Index of the Sprite\r\n * @param _frame is the target Animation frame\r\n * @param toCell is the Target Index of the next frame of the animation\r\n * @param time is a value between 0-1 that is the trigger for when the frame should change tiles\r\n * @param speed is a global scalar of the time variable on the map.\r\n */\r\n public addAnimationToTile(cellID: number = 0, _frame: number = 0, toCell: number = 0, time: number = 0, speed: number = 1): void {\r\n const buffer: any = this._animationMap!._texture!._bufferView;\r\n const id: number = cellID * 4 + this.spriteCount * 4 * _frame;\r\n if (!buffer) {\r\n return;\r\n }\r\n buffer[id] = toCell;\r\n buffer[id + 1] = time;\r\n buffer[id + 2] = speed;\r\n const t = this._createTileAnimationBuffer(buffer);\r\n this._animationMap.dispose();\r\n this._animationMap = t;\r\n this._material.setTexture(\"animationMap\", this._animationMap);\r\n }\r\n\r\n /**\r\n * Exports the .tilemaps file\r\n */\r\n public saveTileMaps(): void {\r\n let maps = \"\";\r\n for (let i = 0; i < this._tileMaps.length; i++) {\r\n if (i > 0) {\r\n maps += \"\\n\\r\";\r\n }\r\n\r\n maps += this._tileMaps[i]!._texture!._bufferView!.toString();\r\n }\r\n const hiddenElement = document.createElement(\"a\");\r\n hiddenElement.href = \"data:octet/stream;charset=utf-8,\" + encodeURI(maps);\r\n hiddenElement.target = \"_blank\";\r\n hiddenElement.download = this.name + \".tilemaps\";\r\n hiddenElement.click();\r\n hiddenElement.remove();\r\n }\r\n\r\n /**\r\n * Imports the .tilemaps file\r\n * @param url of the .tilemaps file\r\n */\r\n public loadTileMaps(url: string): void {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url);\r\n\r\n const _lc = this.options!.layerCount || 0;\r\n\r\n xhr.onload = () => {\r\n const data = xhr.response.split(\"\\n\\r\");\r\n for (let i = 0; i < _lc; i++) {\r\n const d = data[i].split(\",\").map(Number);\r\n const t = this._createTileBuffer(d);\r\n this._tileMaps[i].dispose();\r\n this._tileMaps[i] = t;\r\n }\r\n this._material.setTextureArray(\"tileMap\", this._tileMaps);\r\n };\r\n xhr.send();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n this._output.dispose();\r\n this._material.dispose();\r\n this._animationMap.dispose();\r\n for (const tm of this._tileMaps) {\r\n tm.dispose();\r\n }\r\n this._frameMap.dispose();\r\n }\r\n}\r\n"]}
@@ -98,9 +98,9 @@ export class WebXRAbstractFeature {
98
98
  return false;
99
99
  }
100
100
  this._attached = false;
101
- this._removeOnDetach.forEach((toRemove) => {
101
+ for (const toRemove of this._removeOnDetach) {
102
102
  toRemove.observable.remove(toRemove.observer);
103
- });
103
+ }
104
104
  this.onFeatureDetachObservable.notifyObservers(this);
105
105
  return true;
106
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRAbstractFeature.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRAbstractFeature.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport type { Observer, EventState } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * This is the base class for all WebXR features.\r\n * Since most features require almost the same resources and callbacks, this class can be used to simplify the development\r\n * Note that since the features manager is using the `IWebXRFeature` you are in no way obligated to use this class\r\n */\r\nexport abstract class WebXRAbstractFeature implements IWebXRFeature {\r\n private _attached: boolean = false;\r\n private _removeOnDetach: {\r\n observer: Nullable<Observer<any>>;\r\n observable: Observable<any>;\r\n }[] = [];\r\n\r\n /**\r\n * Is this feature disposed?\r\n */\r\n public isDisposed: boolean = false;\r\n\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n public disableAutoAttach: boolean = false;\r\n\r\n protected _xrNativeFeatureName: string = \"\";\r\n\r\n /**\r\n * The name of the native xr feature name (like anchor, hit-test, or hand-tracking)\r\n */\r\n public get xrNativeFeatureName() {\r\n return this._xrNativeFeatureName;\r\n }\r\n\r\n public set xrNativeFeatureName(name: string) {\r\n // check if feature was initialized while in session but needs to be initialized before the session starts\r\n if (!this._xrSessionManager.isNative && name && this._xrSessionManager.inXRSession && this._xrSessionManager.enabledFeatures?.indexOf(name) === -1) {\r\n Logger.Warn(`The feature ${name} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`);\r\n }\r\n this._xrNativeFeatureName = name;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when the feature is attached\r\n */\r\n public onFeatureAttachObservable: Observable<IWebXRFeature> = new Observable();\r\n /**\r\n * Observers registered here will be executed when the feature is detached\r\n */\r\n public onFeatureDetachObservable: Observable<IWebXRFeature> = new Observable();\r\n\r\n /**\r\n * The dependencies of this feature, if any\r\n */\r\n public dependsOn?: string[];\r\n\r\n /**\r\n * Construct a new (abstract) WebXR feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(protected _xrSessionManager: WebXRSessionManager) {}\r\n\r\n /**\r\n * Is this feature attached\r\n */\r\n public get attached() {\r\n return this._attached;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful, false is failed or already attached\r\n */\r\n public attach(force?: boolean): boolean {\r\n // do not attach a disposed feature\r\n if (this.isDisposed) {\r\n return false;\r\n }\r\n if (!force) {\r\n if (this.attached) {\r\n return false;\r\n }\r\n } else {\r\n if (this.attached) {\r\n // detach first, to be sure\r\n this.detach();\r\n }\r\n }\r\n\r\n // if this is a native WebXR feature, check if it is enabled on the session\r\n // For now only check if not using babylon native\r\n // vision OS doesn't support the enabledFeatures array, so just warn instead of failing\r\n if (!this._xrSessionManager.enabledFeatures) {\r\n Logger.Warn(\"session.enabledFeatures is not available on this device. It is possible that this feature is not supported.\");\r\n } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) {\r\n return false;\r\n }\r\n\r\n this._attached = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame));\r\n this.onFeatureAttachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n *\r\n * @returns true if successful, false if failed or already detached\r\n */\r\n public detach(): boolean {\r\n if (!this._attached) {\r\n this.disableAutoAttach = true;\r\n return false;\r\n }\r\n this._attached = false;\r\n this._removeOnDetach.forEach((toRemove) => {\r\n toRemove.observable.remove(toRemove.observer);\r\n });\r\n this.onFeatureDetachObservable.notifyObservers(this);\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.detach();\r\n this.isDisposed = true;\r\n this.onFeatureAttachObservable.clear();\r\n this.onFeatureDetachObservable.clear();\r\n }\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n public isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * This is used to register callbacks that will automatically be removed when detach is called.\r\n * @param observable the observable to which the observer will be attached\r\n * @param callback the callback to register\r\n * @param insertFirst should the callback be executed as soon as it is registered\r\n */\r\n protected _addNewAttachObserver<T>(observable: Observable<T>, callback: (eventData: T, eventState: EventState) => void, insertFirst?: boolean) {\r\n this._removeOnDetach.push({\r\n observable,\r\n observer: observable.add(callback, undefined, insertFirst),\r\n });\r\n }\r\n\r\n /**\r\n * Code in this function will be executed on each xrFrame received from the browser.\r\n * This function will not execute after the feature is detached.\r\n * @param _xrFrame the current frame\r\n */\r\n protected abstract _onXRFrame(_xrFrame: XRFrame): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"WebXRAbstractFeature.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRAbstractFeature.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IWebXRFeature } from \"../webXRFeaturesManager\";\r\nimport type { Observer, EventState } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * This is the base class for all WebXR features.\r\n * Since most features require almost the same resources and callbacks, this class can be used to simplify the development\r\n * Note that since the features manager is using the `IWebXRFeature` you are in no way obligated to use this class\r\n */\r\nexport abstract class WebXRAbstractFeature implements IWebXRFeature {\r\n private _attached: boolean = false;\r\n private _removeOnDetach: {\r\n observer: Nullable<Observer<any>>;\r\n observable: Observable<any>;\r\n }[] = [];\r\n\r\n /**\r\n * Is this feature disposed?\r\n */\r\n public isDisposed: boolean = false;\r\n\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n public disableAutoAttach: boolean = false;\r\n\r\n protected _xrNativeFeatureName: string = \"\";\r\n\r\n /**\r\n * The name of the native xr feature name (like anchor, hit-test, or hand-tracking)\r\n */\r\n public get xrNativeFeatureName() {\r\n return this._xrNativeFeatureName;\r\n }\r\n\r\n public set xrNativeFeatureName(name: string) {\r\n // check if feature was initialized while in session but needs to be initialized before the session starts\r\n if (!this._xrSessionManager.isNative && name && this._xrSessionManager.inXRSession && this._xrSessionManager.enabledFeatures?.indexOf(name) === -1) {\r\n Logger.Warn(`The feature ${name} needs to be enabled before starting the XR session. Note - It is still possible it is not supported.`);\r\n }\r\n this._xrNativeFeatureName = name;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when the feature is attached\r\n */\r\n public onFeatureAttachObservable: Observable<IWebXRFeature> = new Observable();\r\n /**\r\n * Observers registered here will be executed when the feature is detached\r\n */\r\n public onFeatureDetachObservable: Observable<IWebXRFeature> = new Observable();\r\n\r\n /**\r\n * The dependencies of this feature, if any\r\n */\r\n public dependsOn?: string[];\r\n\r\n /**\r\n * Construct a new (abstract) WebXR feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(protected _xrSessionManager: WebXRSessionManager) {}\r\n\r\n /**\r\n * Is this feature attached\r\n */\r\n public get attached() {\r\n return this._attached;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful, false is failed or already attached\r\n */\r\n public attach(force?: boolean): boolean {\r\n // do not attach a disposed feature\r\n if (this.isDisposed) {\r\n return false;\r\n }\r\n if (!force) {\r\n if (this.attached) {\r\n return false;\r\n }\r\n } else {\r\n if (this.attached) {\r\n // detach first, to be sure\r\n this.detach();\r\n }\r\n }\r\n\r\n // if this is a native WebXR feature, check if it is enabled on the session\r\n // For now only check if not using babylon native\r\n // vision OS doesn't support the enabledFeatures array, so just warn instead of failing\r\n if (!this._xrSessionManager.enabledFeatures) {\r\n Logger.Warn(\"session.enabledFeatures is not available on this device. It is possible that this feature is not supported.\");\r\n } else if (!this._xrSessionManager.isNative && this.xrNativeFeatureName && this._xrSessionManager.enabledFeatures.indexOf(this.xrNativeFeatureName) === -1) {\r\n return false;\r\n }\r\n\r\n this._attached = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRFrameObservable, (frame) => this._onXRFrame(frame));\r\n this.onFeatureAttachObservable.notifyObservers(this);\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n *\r\n * @returns true if successful, false if failed or already detached\r\n */\r\n public detach(): boolean {\r\n if (!this._attached) {\r\n this.disableAutoAttach = true;\r\n return false;\r\n }\r\n this._attached = false;\r\n for (const toRemove of this._removeOnDetach) {\r\n toRemove.observable.remove(toRemove.observer);\r\n }\r\n this.onFeatureDetachObservable.notifyObservers(this);\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.detach();\r\n this.isDisposed = true;\r\n this.onFeatureAttachObservable.clear();\r\n this.onFeatureDetachObservable.clear();\r\n }\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n public isCompatible(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * This is used to register callbacks that will automatically be removed when detach is called.\r\n * @param observable the observable to which the observer will be attached\r\n * @param callback the callback to register\r\n * @param insertFirst should the callback be executed as soon as it is registered\r\n */\r\n protected _addNewAttachObserver<T>(observable: Observable<T>, callback: (eventData: T, eventState: EventState) => void, insertFirst?: boolean) {\r\n this._removeOnDetach.push({\r\n observable,\r\n observer: observable.add(callback, undefined, insertFirst),\r\n });\r\n }\r\n\r\n /**\r\n * Code in this function will be executed on each xrFrame received from the browser.\r\n * This function will not execute after the feature is detached.\r\n * @param _xrFrame the current frame\r\n */\r\n protected abstract _onXRFrame(_xrFrame: XRFrame): void;\r\n}\r\n"]}
@@ -185,12 +185,12 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
185
185
  return this._trackedAnchors.indexOf(anchor);
186
186
  });
187
187
  let idxTracker = 0;
188
- toRemove.forEach((index) => {
188
+ for (const index of toRemove) {
189
189
  const anchor = this._trackedAnchors.splice(index - idxTracker, 1)[0];
190
190
  anchor.xrAnchor.delete();
191
191
  this.onAnchorRemovedObservable.notifyObservers(anchor);
192
192
  idxTracker++;
193
- });
193
+ }
194
194
  // now check for new ones
195
195
  trackedAnchors.forEach((xrAnchor) => {
196
196
  if (!this._lastFrameDetected.has(xrAnchor)) {
@@ -232,7 +232,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
232
232
  this._lastFrameDetected = trackedAnchors;
233
233
  }
234
234
  // process future anchors
235
- this._futureAnchors.forEach((futureAnchor) => {
235
+ for (const futureAnchor of this._futureAnchors) {
236
236
  if (!futureAnchor.resolved && !futureAnchor.submitted) {
237
237
  this._createAnchorAtTransformation(futureAnchor.xrTransformation, frame).then((nativeAnchor) => {
238
238
  futureAnchor.nativeAnchor = nativeAnchor;
@@ -242,7 +242,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
242
242
  });
243
243
  futureAnchor.submitted = true;
244
244
  }
245
- });
245
+ }
246
246
  }
247
247
  /**
248
248
  * avoiding using Array.find for global support.
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRAnchorSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/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 * If set to true, all anchor arrays will be cleared when the session initializes\r\n */\r\n clearAnchorsOnSessionInit?: 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 * @internal - set to true when the anchor was removed\r\n */\r\n _removed: boolean;\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(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRAnchorSystemOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n\r\n if (this._options.clearAnchorsOnSessionInit) {\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._trackedAnchors.length = 0;\r\n this._futureAnchors.length = 0;\r\n this._lastFrameDetected.clear();\r\n });\r\n }\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 override 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 && !toRemove._removed) {\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n toRemove._removed = true;\r\n // no need to call the remove fn as the anchor is already removed from the session\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 override 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) => anchor._removed)\r\n .map((anchor) => {\r\n return this._trackedAnchors.indexOf(anchor);\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 anchor.xrAnchor.delete();\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: () => {\r\n newAnchor._removed = true;\r\n },\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 * @returns the index of the anchor in the array or -1 if not found\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":["../../../../../dev/core/src/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 * If set to true, all anchor arrays will be cleared when the session initializes\r\n */\r\n clearAnchorsOnSessionInit?: 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 * @internal - set to true when the anchor was removed\r\n */\r\n _removed: boolean;\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(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRAnchorSystemOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n\r\n if (this._options.clearAnchorsOnSessionInit) {\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._trackedAnchors.length = 0;\r\n this._futureAnchors.length = 0;\r\n this._lastFrameDetected.clear();\r\n });\r\n }\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 override 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 && !toRemove._removed) {\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n toRemove._removed = true;\r\n // no need to call the remove fn as the anchor is already removed from the session\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 override 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) => anchor._removed)\r\n .map((anchor) => {\r\n return this._trackedAnchors.indexOf(anchor);\r\n });\r\n let idxTracker = 0;\r\n for (const index of toRemove) {\r\n const anchor = this._trackedAnchors.splice(index - idxTracker, 1)[0];\r\n anchor.xrAnchor.delete();\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: () => {\r\n newAnchor._removed = true;\r\n },\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 for (const futureAnchor of this._futureAnchors) {\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 * @returns the index of the anchor in the array or -1 if not found\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"]}
@@ -77,7 +77,9 @@ export class WebXRBackgroundRemover extends WebXRAbstractFeature {
77
77
  }
78
78
  }
79
79
  if (this.options.backgroundMeshes) {
80
- this.options.backgroundMeshes.forEach((mesh) => mesh.setEnabled(newState));
80
+ for (const mesh of this.options.backgroundMeshes) {
81
+ mesh.setEnabled(newState);
82
+ }
81
83
  }
82
84
  this.onBackgroundStateChangedObservable.notifyObservers(newState);
83
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRBackgroundRemover.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRBackgroundRemover.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRBackgroundRemoverOptions {\r\n /**\r\n * Further background meshes to disable when entering AR\r\n */\r\n backgroundMeshes?: AbstractMesh[];\r\n /**\r\n * flags to configure the removal of the environment helper.\r\n * If not set, the entire background will be removed. If set, flags should be set as well.\r\n */\r\n environmentHelperRemovalFlags?: {\r\n /**\r\n * Should the skybox be removed (default false)\r\n */\r\n skyBox?: boolean;\r\n /**\r\n * Should the ground be removed (default false)\r\n */\r\n ground?: boolean;\r\n };\r\n /**\r\n * don't disable the environment helper\r\n */\r\n ignoreEnvironmentHelper?: boolean;\r\n}\r\n\r\n/**\r\n * A module that will automatically disable background meshes when entering AR and will enable them when leaving AR.\r\n */\r\nexport class WebXRBackgroundRemover extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.BACKGROUND_REMOVER;\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 * registered observers will be triggered when the background state changes\r\n */\r\n public onBackgroundStateChangedObservable: Observable<boolean> = new Observable();\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * [Empty Object] read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRBackgroundRemoverOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n }\r\n\r\n /**\r\n * attach 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 override attach(): boolean {\r\n this._setBackgroundState(false);\r\n return super.attach();\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 override detach(): boolean {\r\n this._setBackgroundState(true);\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onBackgroundStateChangedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n // no-op\r\n }\r\n\r\n private _setBackgroundState(newState: boolean) {\r\n const scene = this._xrSessionManager.scene;\r\n if (!this.options.ignoreEnvironmentHelper) {\r\n if (this.options.environmentHelperRemovalFlags) {\r\n if (this.options.environmentHelperRemovalFlags.skyBox) {\r\n const backgroundSkybox = scene.getMeshByName(\"BackgroundSkybox\");\r\n if (backgroundSkybox) {\r\n backgroundSkybox.setEnabled(newState);\r\n }\r\n }\r\n if (this.options.environmentHelperRemovalFlags.ground) {\r\n const backgroundPlane = scene.getMeshByName(\"BackgroundPlane\");\r\n if (backgroundPlane) {\r\n backgroundPlane.setEnabled(newState);\r\n }\r\n }\r\n } else {\r\n const backgroundHelper = scene.getMeshByName(\"BackgroundHelper\");\r\n if (backgroundHelper) {\r\n backgroundHelper.setEnabled(newState);\r\n }\r\n }\r\n }\r\n\r\n if (this.options.backgroundMeshes) {\r\n this.options.backgroundMeshes.forEach((mesh) => mesh.setEnabled(newState));\r\n }\r\n\r\n this.onBackgroundStateChangedObservable.notifyObservers(newState);\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRBackgroundRemover.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRBackgroundRemover(xrSessionManager, options);\r\n },\r\n WebXRBackgroundRemover.Version,\r\n true\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRBackgroundRemover.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRBackgroundRemover.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRBackgroundRemoverOptions {\r\n /**\r\n * Further background meshes to disable when entering AR\r\n */\r\n backgroundMeshes?: AbstractMesh[];\r\n /**\r\n * flags to configure the removal of the environment helper.\r\n * If not set, the entire background will be removed. If set, flags should be set as well.\r\n */\r\n environmentHelperRemovalFlags?: {\r\n /**\r\n * Should the skybox be removed (default false)\r\n */\r\n skyBox?: boolean;\r\n /**\r\n * Should the ground be removed (default false)\r\n */\r\n ground?: boolean;\r\n };\r\n /**\r\n * don't disable the environment helper\r\n */\r\n ignoreEnvironmentHelper?: boolean;\r\n}\r\n\r\n/**\r\n * A module that will automatically disable background meshes when entering AR and will enable them when leaving AR.\r\n */\r\nexport class WebXRBackgroundRemover extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.BACKGROUND_REMOVER;\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 * registered observers will be triggered when the background state changes\r\n */\r\n public onBackgroundStateChangedObservable: Observable<boolean> = new Observable();\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * [Empty Object] read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRBackgroundRemoverOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n }\r\n\r\n /**\r\n * attach 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 override attach(): boolean {\r\n this._setBackgroundState(false);\r\n return super.attach();\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 override detach(): boolean {\r\n this._setBackgroundState(true);\r\n return super.detach();\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onBackgroundStateChangedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n // no-op\r\n }\r\n\r\n private _setBackgroundState(newState: boolean) {\r\n const scene = this._xrSessionManager.scene;\r\n if (!this.options.ignoreEnvironmentHelper) {\r\n if (this.options.environmentHelperRemovalFlags) {\r\n if (this.options.environmentHelperRemovalFlags.skyBox) {\r\n const backgroundSkybox = scene.getMeshByName(\"BackgroundSkybox\");\r\n if (backgroundSkybox) {\r\n backgroundSkybox.setEnabled(newState);\r\n }\r\n }\r\n if (this.options.environmentHelperRemovalFlags.ground) {\r\n const backgroundPlane = scene.getMeshByName(\"BackgroundPlane\");\r\n if (backgroundPlane) {\r\n backgroundPlane.setEnabled(newState);\r\n }\r\n }\r\n } else {\r\n const backgroundHelper = scene.getMeshByName(\"BackgroundHelper\");\r\n if (backgroundHelper) {\r\n backgroundHelper.setEnabled(newState);\r\n }\r\n }\r\n }\r\n\r\n if (this.options.backgroundMeshes) {\r\n for (const mesh of this.options.backgroundMeshes) {\r\n mesh.setEnabled(newState);\r\n }\r\n }\r\n\r\n this.onBackgroundStateChangedObservable.notifyObservers(newState);\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRBackgroundRemover.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRBackgroundRemover(xrSessionManager, options);\r\n },\r\n WebXRBackgroundRemover.Version,\r\n true\r\n);\r\n"]}
@@ -231,7 +231,9 @@ export class WebXRControllerMovement extends WebXRAbstractFeature {
231
231
  if (!super.attach()) {
232
232
  return false;
233
233
  }
234
- this._xrInput.controllers.forEach(this._attachController);
234
+ for (const controller of this._xrInput.controllers) {
235
+ this._attachController(controller);
236
+ }
235
237
  this._addNewAttachObserver(this._xrInput.onControllerAddedObservable, this._attachController);
236
238
  this._addNewAttachObserver(this._xrInput.onControllerRemovedObservable, (controller) => {
237
239
  // REMOVE the controller
@@ -243,9 +245,10 @@ export class WebXRControllerMovement extends WebXRAbstractFeature {
243
245
  if (!super.detach()) {
244
246
  return false;
245
247
  }
246
- Object.keys(this._controllers).forEach((controllerId) => {
248
+ const keys = Object.keys(this._controllers);
249
+ for (const controllerId of keys) {
247
250
  this._detachController(controllerId);
248
- });
251
+ }
249
252
  this._controllers = {};
250
253
  return true;
251
254
  }