@babylonjs/core 5.9.1 → 5.12.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 (87) hide show
  1. package/Cameras/Inputs/freeCameraTouchInput.d.ts +1 -0
  2. package/Cameras/Inputs/freeCameraTouchInput.js +3 -2
  3. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  4. package/Engines/Extensions/engine.query.js +1 -1
  5. package/Engines/Extensions/engine.query.js.map +1 -1
  6. package/Engines/ICanvas.d.ts +5 -0
  7. package/Engines/ICanvas.js.map +1 -1
  8. package/Engines/WebGPU/webgpuConstants.d.ts +1 -1
  9. package/Engines/WebGPU/webgpuConstants.js +5 -5
  10. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  11. package/Engines/engine.d.ts +2 -2
  12. package/Engines/thinEngine.js +2 -2
  13. package/Engines/thinEngine.js.map +1 -1
  14. package/Engines/webgpuEngine.js +1 -1
  15. package/Engines/webgpuEngine.js.map +1 -1
  16. package/Materials/Background/backgroundMaterial.js +2 -1
  17. package/Materials/Background/backgroundMaterial.js.map +1 -1
  18. package/Materials/Node/nodeMaterial.js +2 -1
  19. package/Materials/Node/nodeMaterial.js.map +1 -1
  20. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +1 -1
  21. package/Materials/PBR/pbrAnisotropicConfiguration.js +1 -1
  22. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  23. package/Materials/PBR/pbrBaseMaterial.js +9 -4
  24. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  25. package/Materials/Textures/baseTexture.d.ts +2 -1
  26. package/Materials/Textures/baseTexture.js +6 -3
  27. package/Materials/Textures/baseTexture.js.map +1 -1
  28. package/Materials/Textures/cubeTexture.js +1 -1
  29. package/Materials/Textures/cubeTexture.js.map +1 -1
  30. package/Materials/Textures/equiRectangularCubeTexture.js +1 -1
  31. package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
  32. package/Materials/Textures/hdrCubeTexture.js +1 -1
  33. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  34. package/Materials/effect.d.ts +5 -0
  35. package/Materials/effect.js +5 -0
  36. package/Materials/effect.js.map +1 -1
  37. package/Materials/material.d.ts +2 -0
  38. package/Materials/material.js +4 -1
  39. package/Materials/material.js.map +1 -1
  40. package/Materials/materialPluginBase.d.ts +14 -0
  41. package/Materials/materialPluginBase.js +16 -0
  42. package/Materials/materialPluginBase.js.map +1 -1
  43. package/Materials/materialPluginEvent.d.ts +2 -0
  44. package/Materials/materialPluginEvent.js.map +1 -1
  45. package/Materials/materialPluginManager.d.ts +1 -0
  46. package/Materials/materialPluginManager.js +13 -1
  47. package/Materials/materialPluginManager.js.map +1 -1
  48. package/Materials/shaderMaterial.d.ts +17 -2
  49. package/Materials/shaderMaterial.js +65 -4
  50. package/Materials/shaderMaterial.js.map +1 -1
  51. package/Materials/standardMaterial.js +8 -3
  52. package/Materials/standardMaterial.js.map +1 -1
  53. package/Maths/math.vector.d.ts +7 -0
  54. package/Maths/math.vector.js +43 -11
  55. package/Maths/math.vector.js.map +1 -1
  56. package/Meshes/Builders/shapeBuilder.d.ts +12 -0
  57. package/Meshes/Builders/shapeBuilder.js +48 -10
  58. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  59. package/Meshes/mesh.js +1 -1
  60. package/Meshes/mesh.js.map +1 -1
  61. package/Meshes/subMesh.d.ts +2 -1
  62. package/Meshes/subMesh.js +4 -2
  63. package/Meshes/subMesh.js.map +1 -1
  64. package/Misc/computePressure.js +4 -3
  65. package/Misc/computePressure.js.map +1 -1
  66. package/Misc/iInspectable.d.ts +1 -1
  67. package/Misc/iInspectable.js.map +1 -1
  68. package/Misc/screenshotTools.js +31 -14
  69. package/Misc/screenshotTools.js.map +1 -1
  70. package/Misc/tools.d.ts +16 -0
  71. package/Misc/tools.js +44 -30
  72. package/Misc/tools.js.map +1 -1
  73. package/Offline/database.js +2 -2
  74. package/Offline/database.js.map +1 -1
  75. package/PostProcesses/volumetricLightScatteringPostProcess.d.ts +1 -1
  76. package/PostProcesses/volumetricLightScatteringPostProcess.js +1 -1
  77. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  78. package/Rendering/prePassRendererSceneComponent.js +2 -2
  79. package/Rendering/prePassRendererSceneComponent.js.map +1 -1
  80. package/XR/webXRCamera.js +11 -0
  81. package/XR/webXRCamera.js.map +1 -1
  82. package/XR/webXRExperienceHelper.js +2 -1
  83. package/XR/webXRExperienceHelper.js.map +1 -1
  84. package/package.json +2 -2
  85. package/sceneComponent.d.ts +2 -2
  86. package/sceneComponent.js +2 -2
  87. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/how_to/webxr_camera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @hidden\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(name: string, scene: Scene, private _xrSessionManager: WebXRSessionManager) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n }\r\n\r\n private _rotate180 = new Quaternion(0, 1, 0, 0);\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n pose.views.forEach((view: XRView, i: number) => {\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z);\r\n currentRig.rotationQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n } else {\r\n currentRig.rotationQuaternion.multiplyInPlace(this._rotate180);\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // first camera?\r\n if (i === 0) {\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n });\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x,\r\n y: this._referencedPosition.y,\r\n z: this._referencedPosition.z,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/how_to/webxr_camera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @hidden\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(name: string, scene: Scene, private _xrSessionManager: WebXRSessionManager) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n }\r\n\r\n private _rotate180 = new Quaternion(0, 1, 0, 0);\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n // check min/max Z and update if not the same as in cache\r\n if (this.minZ !== this._cache.minZ || this.maxZ !== this._cache.maxZ) {\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.maxZ || 10000,\r\n depthNear: this.minZ,\r\n };\r\n\r\n this._xrSessionManager.updateRenderState(xrRenderState);\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = this.maxZ;\r\n }\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n pose.views.forEach((view: XRView, i: number) => {\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z);\r\n currentRig.rotationQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n } else {\r\n currentRig.rotationQuaternion.multiplyInPlace(this._rotate180);\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // first camera?\r\n if (i === 0) {\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n });\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x,\r\n y: this._referencedPosition.y,\r\n z: this._referencedPosition.z,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
@@ -128,7 +128,8 @@ var WebXRExperienceHelper = /** @class */ (function () {
128
128
  case 5:
129
129
  baseLayer = _c.sent();
130
130
  xrRenderState = {
131
- depthFar: this.camera.maxZ,
131
+ // if maxZ is 0 it should be "Infinity", but it doesn't work with the WebXR API. Setting to a large number.
132
+ depthFar: this.camera.maxZ || 10000,
132
133
  depthNear: this.camera.minZ,
133
134
  };
134
135
  // The layers feature will have already initialized the xr session's layers on session init.
@@ -1 +1 @@
1
- {"version":3,"file":"webXRExperienceHelper.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport type { WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { WebXRState } from \"./webXRTypes\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"./webXRFeaturesManager\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { UniversalCamera } from \"../Cameras/universalCamera\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)\r\n * @see https://doc.babylonjs.com/how_to/webxr_experience_helpers\r\n */\r\nexport class WebXRExperienceHelper implements IDisposable {\r\n private _nonVRCamera: Nullable<Camera> = null;\r\n private _attachedToElement: boolean = false;\r\n private _spectatorCamera: Nullable<UniversalCamera> = null;\r\n private _originalSceneAutoClear = true;\r\n private _supported = false;\r\n private _spectatorMode = false;\r\n\r\n /**\r\n * Camera used to render xr content\r\n */\r\n public camera: WebXRCamera;\r\n /** A features manager for this xr session */\r\n public featuresManager: WebXRFeaturesManager;\r\n /**\r\n * Observers registered here will be triggered after the camera's initial transformation is set\r\n * This can be used to set a different ground level or an extra rotation.\r\n *\r\n * Note that ground level is considered to be at 0. The height defined by the XR camera will be added\r\n * to the position set after this observable is done executing.\r\n */\r\n public onInitialXRPoseSetObservable = new Observable<WebXRCamera>();\r\n /**\r\n * Fires when the state of the experience helper has changed\r\n */\r\n public onStateChangedObservable = new Observable<WebXRState>();\r\n /** Session manager used to keep track of xr session */\r\n public sessionManager: WebXRSessionManager;\r\n /**\r\n * The current state of the XR experience (eg. transitioning, in XR or not in XR)\r\n */\r\n public state: WebXRState = WebXRState.NOT_IN_XR;\r\n\r\n /**\r\n * Creates a WebXRExperienceHelper\r\n * @param _scene The scene the helper should be created in\r\n */\r\n private constructor(private _scene: Scene) {\r\n this.sessionManager = new WebXRSessionManager(_scene);\r\n this.camera = new WebXRCamera(\"webxr\", _scene, this.sessionManager);\r\n this.featuresManager = new WebXRFeaturesManager(this.sessionManager);\r\n\r\n _scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n /**\r\n * Creates the experience helper\r\n * @param scene the scene to attach the experience helper to\r\n * @returns a promise for the experience helper\r\n */\r\n public static CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n const helper = new WebXRExperienceHelper(scene);\r\n return helper.sessionManager\r\n .initializeAsync()\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n .catch((e) => {\r\n helper._setState(WebXRState.NOT_IN_XR);\r\n helper.dispose();\r\n throw e;\r\n });\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n this.exitXRAsync();\r\n this.camera.dispose();\r\n this.onStateChangedObservable.clear();\r\n this.onInitialXRPoseSetObservable.clear();\r\n this.sessionManager.dispose();\r\n this._spectatorCamera?.dispose();\r\n if (this._nonVRCamera) {\r\n this._scene.activeCamera = this._nonVRCamera;\r\n }\r\n }\r\n\r\n /**\r\n * Enters XR mode (This must be done within a user interaction in most browsers eg. button click)\r\n * @param sessionMode options for the XR session\r\n * @param referenceSpaceType frame of reference of the XR session\r\n * @param renderTarget the output canvas that will be used to enter XR mode\r\n * @param sessionCreationOptions optional XRSessionInit object to init the session with\r\n * @returns promise that resolves after xr mode has entered\r\n */\r\n public async enterXRAsync(\r\n sessionMode: XRSessionMode,\r\n referenceSpaceType: XRReferenceSpaceType,\r\n renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(),\r\n sessionCreationOptions: XRSessionInit = {}\r\n ): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n throw \"WebXR not supported in this browser or environment\";\r\n }\r\n this._setState(WebXRState.ENTERING_XR);\r\n if (referenceSpaceType !== \"viewer\" && referenceSpaceType !== \"local\") {\r\n sessionCreationOptions.optionalFeatures = sessionCreationOptions.optionalFeatures || [];\r\n sessionCreationOptions.optionalFeatures.push(referenceSpaceType);\r\n }\r\n sessionCreationOptions = await this.featuresManager._extendXRSessionInitObject(sessionCreationOptions);\r\n // we currently recommend \"unbounded\" space in AR (#7959)\r\n if (sessionMode === \"immersive-ar\" && referenceSpaceType !== \"unbounded\") {\r\n Logger.Warn(\"We recommend using 'unbounded' reference space type when using 'immersive-ar' session mode\");\r\n }\r\n // make sure that the session mode is supported\r\n try {\r\n await this.sessionManager.initializeSessionAsync(sessionMode, sessionCreationOptions);\r\n await this.sessionManager.setReferenceSpaceTypeAsync(referenceSpaceType);\r\n const baseLayer = await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\r\n\r\n const xrRenderState: XRRenderStateInit = {\r\n depthFar: this.camera.maxZ,\r\n depthNear: this.camera.minZ,\r\n };\r\n\r\n // The layers feature will have already initialized the xr session's layers on session init.\r\n if (!this.featuresManager.getEnabledFeature(WebXRFeatureName.LAYERS)) {\r\n xrRenderState.baseLayer = baseLayer;\r\n }\r\n\r\n this.sessionManager.updateRenderState(xrRenderState);\r\n // run the render loop\r\n this.sessionManager.runXRRenderLoop();\r\n // Cache pre xr scene settings\r\n this._originalSceneAutoClear = this._scene.autoClear;\r\n this._nonVRCamera = this._scene.activeCamera;\r\n this._attachedToElement = !!this._nonVRCamera?.inputs.attachedToElement;\r\n this._nonVRCamera?.detachControl();\r\n\r\n this._scene.activeCamera = this.camera;\r\n // do not compensate when AR session is used\r\n if (sessionMode !== \"immersive-ar\") {\r\n this._nonXRToXRCamera();\r\n } else {\r\n // Kept here, TODO - check if needed\r\n this._scene.autoClear = false;\r\n this.camera.compensateOnFirstFrame = false;\r\n // reset the camera's position to the origin\r\n this.camera.position.set(0, 0, 0);\r\n this.camera.rotationQuaternion.set(0, 0, 0, 1);\r\n }\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // when using the back button and not the exit button (default on mobile), the session is ending but the EXITING state was not set\r\n if (this.state !== WebXRState.EXITING_XR) {\r\n this._setState(WebXRState.EXITING_XR);\r\n }\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n this.camera.rigCameras.forEach((c) => {\r\n c.outputRenderTarget = null;\r\n });\r\n\r\n // Restore scene settings\r\n this._scene.autoClear = this._originalSceneAutoClear;\r\n this._scene.activeCamera = this._nonVRCamera;\r\n if (this._attachedToElement && this._nonVRCamera) {\r\n this._nonVRCamera.attachControl(!!this._nonVRCamera.inputs.noPreventDefault);\r\n }\r\n if (sessionMode !== \"immersive-ar\" && this.camera.compensateOnFirstFrame) {\r\n if ((<any>this._nonVRCamera).setPosition) {\r\n (<any>this._nonVRCamera).setPosition(this.camera.position);\r\n } else {\r\n this._nonVRCamera!.position.copyFrom(this.camera.position);\r\n }\r\n }\r\n\r\n this._setState(WebXRState.NOT_IN_XR);\r\n });\r\n\r\n // Wait until the first frame arrives before setting state to in xr\r\n this.sessionManager.onXRFrameObservable.addOnce(() => {\r\n this._setState(WebXRState.IN_XR);\r\n });\r\n return this.sessionManager;\r\n } catch (e) {\r\n console.log(e);\r\n console.log(e.message);\r\n this._setState(WebXRState.NOT_IN_XR);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Exits XR mode and returns the scene to its original state\r\n * @returns promise that resolves after xr mode has exited\r\n */\r\n public exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return Promise.resolve();\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return this.sessionManager.exitXRAsync();\r\n }\r\n\r\n /**\r\n * Enable spectator mode for desktop VR experiences.\r\n * When spectator mode is enabled a camera will be attached to the desktop canvas and will\r\n * display the first rig camera's view on the desktop canvas.\r\n * Please note that this will degrade performance, as it requires another camera render.\r\n * It is also not recommended to enable this in devices like the quest, as it brings no benefit there.\r\n */\r\n public enableSpectatorMode(): void {\r\n if (!this._spectatorMode) {\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[0].globalPosition);\r\n this._spectatorCamera.rotationQuaternion.copyFrom(this.camera.rigCameras[0].absoluteRotation);\r\n }\r\n };\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera = new UniversalCamera(\"webxr-spectator\", Vector3.Zero(), this._scene);\r\n this._spectatorCamera.rotationQuaternion = new Quaternion();\r\n this._scene.activeCameras = [this.camera, this._spectatorCamera];\r\n this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this._scene.onAfterRenderCameraObservable.add((camera) => {\r\n if (camera === this.camera) {\r\n // reset the dimensions object for correct resizing\r\n this._scene.getEngine().framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.removeCallback(updateSpectatorCamera);\r\n this._scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorMode = true;\r\n this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n }\r\n }\r\n\r\n private _nonXRToXRCamera() {\r\n this.camera.setTransformationFromNonVRCamera(this._nonVRCamera!);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n private _setState(val: WebXRState) {\r\n if (this.state === val) {\r\n return;\r\n }\r\n this.state = val;\r\n this.onStateChangedObservable.notifyObservers(this.state);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRExperienceHelper.js","sourceRoot":"","sources":["../../../../../lts/core/generated/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { IDisposable, Scene } from \"../scene\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport type { WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { WebXRState } from \"./webXRTypes\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"./webXRFeaturesManager\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { UniversalCamera } from \"../Cameras/universalCamera\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)\r\n * @see https://doc.babylonjs.com/how_to/webxr_experience_helpers\r\n */\r\nexport class WebXRExperienceHelper implements IDisposable {\r\n private _nonVRCamera: Nullable<Camera> = null;\r\n private _attachedToElement: boolean = false;\r\n private _spectatorCamera: Nullable<UniversalCamera> = null;\r\n private _originalSceneAutoClear = true;\r\n private _supported = false;\r\n private _spectatorMode = false;\r\n\r\n /**\r\n * Camera used to render xr content\r\n */\r\n public camera: WebXRCamera;\r\n /** A features manager for this xr session */\r\n public featuresManager: WebXRFeaturesManager;\r\n /**\r\n * Observers registered here will be triggered after the camera's initial transformation is set\r\n * This can be used to set a different ground level or an extra rotation.\r\n *\r\n * Note that ground level is considered to be at 0. The height defined by the XR camera will be added\r\n * to the position set after this observable is done executing.\r\n */\r\n public onInitialXRPoseSetObservable = new Observable<WebXRCamera>();\r\n /**\r\n * Fires when the state of the experience helper has changed\r\n */\r\n public onStateChangedObservable = new Observable<WebXRState>();\r\n /** Session manager used to keep track of xr session */\r\n public sessionManager: WebXRSessionManager;\r\n /**\r\n * The current state of the XR experience (eg. transitioning, in XR or not in XR)\r\n */\r\n public state: WebXRState = WebXRState.NOT_IN_XR;\r\n\r\n /**\r\n * Creates a WebXRExperienceHelper\r\n * @param _scene The scene the helper should be created in\r\n */\r\n private constructor(private _scene: Scene) {\r\n this.sessionManager = new WebXRSessionManager(_scene);\r\n this.camera = new WebXRCamera(\"webxr\", _scene, this.sessionManager);\r\n this.featuresManager = new WebXRFeaturesManager(this.sessionManager);\r\n\r\n _scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n }\r\n\r\n /**\r\n * Creates the experience helper\r\n * @param scene the scene to attach the experience helper to\r\n * @returns a promise for the experience helper\r\n */\r\n public static CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n const helper = new WebXRExperienceHelper(scene);\r\n return helper.sessionManager\r\n .initializeAsync()\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n .catch((e) => {\r\n helper._setState(WebXRState.NOT_IN_XR);\r\n helper.dispose();\r\n throw e;\r\n });\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n this.exitXRAsync();\r\n this.camera.dispose();\r\n this.onStateChangedObservable.clear();\r\n this.onInitialXRPoseSetObservable.clear();\r\n this.sessionManager.dispose();\r\n this._spectatorCamera?.dispose();\r\n if (this._nonVRCamera) {\r\n this._scene.activeCamera = this._nonVRCamera;\r\n }\r\n }\r\n\r\n /**\r\n * Enters XR mode (This must be done within a user interaction in most browsers eg. button click)\r\n * @param sessionMode options for the XR session\r\n * @param referenceSpaceType frame of reference of the XR session\r\n * @param renderTarget the output canvas that will be used to enter XR mode\r\n * @param sessionCreationOptions optional XRSessionInit object to init the session with\r\n * @returns promise that resolves after xr mode has entered\r\n */\r\n public async enterXRAsync(\r\n sessionMode: XRSessionMode,\r\n referenceSpaceType: XRReferenceSpaceType,\r\n renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(),\r\n sessionCreationOptions: XRSessionInit = {}\r\n ): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n throw \"WebXR not supported in this browser or environment\";\r\n }\r\n this._setState(WebXRState.ENTERING_XR);\r\n if (referenceSpaceType !== \"viewer\" && referenceSpaceType !== \"local\") {\r\n sessionCreationOptions.optionalFeatures = sessionCreationOptions.optionalFeatures || [];\r\n sessionCreationOptions.optionalFeatures.push(referenceSpaceType);\r\n }\r\n sessionCreationOptions = await this.featuresManager._extendXRSessionInitObject(sessionCreationOptions);\r\n // we currently recommend \"unbounded\" space in AR (#7959)\r\n if (sessionMode === \"immersive-ar\" && referenceSpaceType !== \"unbounded\") {\r\n Logger.Warn(\"We recommend using 'unbounded' reference space type when using 'immersive-ar' session mode\");\r\n }\r\n // make sure that the session mode is supported\r\n try {\r\n await this.sessionManager.initializeSessionAsync(sessionMode, sessionCreationOptions);\r\n await this.sessionManager.setReferenceSpaceTypeAsync(referenceSpaceType);\r\n const baseLayer = await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\r\n\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.camera.maxZ || 10000,\r\n depthNear: this.camera.minZ,\r\n };\r\n\r\n // The layers feature will have already initialized the xr session's layers on session init.\r\n if (!this.featuresManager.getEnabledFeature(WebXRFeatureName.LAYERS)) {\r\n xrRenderState.baseLayer = baseLayer;\r\n }\r\n\r\n this.sessionManager.updateRenderState(xrRenderState);\r\n // run the render loop\r\n this.sessionManager.runXRRenderLoop();\r\n // Cache pre xr scene settings\r\n this._originalSceneAutoClear = this._scene.autoClear;\r\n this._nonVRCamera = this._scene.activeCamera;\r\n this._attachedToElement = !!this._nonVRCamera?.inputs.attachedToElement;\r\n this._nonVRCamera?.detachControl();\r\n\r\n this._scene.activeCamera = this.camera;\r\n // do not compensate when AR session is used\r\n if (sessionMode !== \"immersive-ar\") {\r\n this._nonXRToXRCamera();\r\n } else {\r\n // Kept here, TODO - check if needed\r\n this._scene.autoClear = false;\r\n this.camera.compensateOnFirstFrame = false;\r\n // reset the camera's position to the origin\r\n this.camera.position.set(0, 0, 0);\r\n this.camera.rotationQuaternion.set(0, 0, 0, 1);\r\n }\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // when using the back button and not the exit button (default on mobile), the session is ending but the EXITING state was not set\r\n if (this.state !== WebXRState.EXITING_XR) {\r\n this._setState(WebXRState.EXITING_XR);\r\n }\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n this.camera.rigCameras.forEach((c) => {\r\n c.outputRenderTarget = null;\r\n });\r\n\r\n // Restore scene settings\r\n this._scene.autoClear = this._originalSceneAutoClear;\r\n this._scene.activeCamera = this._nonVRCamera;\r\n if (this._attachedToElement && this._nonVRCamera) {\r\n this._nonVRCamera.attachControl(!!this._nonVRCamera.inputs.noPreventDefault);\r\n }\r\n if (sessionMode !== \"immersive-ar\" && this.camera.compensateOnFirstFrame) {\r\n if ((<any>this._nonVRCamera).setPosition) {\r\n (<any>this._nonVRCamera).setPosition(this.camera.position);\r\n } else {\r\n this._nonVRCamera!.position.copyFrom(this.camera.position);\r\n }\r\n }\r\n\r\n this._setState(WebXRState.NOT_IN_XR);\r\n });\r\n\r\n // Wait until the first frame arrives before setting state to in xr\r\n this.sessionManager.onXRFrameObservable.addOnce(() => {\r\n this._setState(WebXRState.IN_XR);\r\n });\r\n return this.sessionManager;\r\n } catch (e) {\r\n console.log(e);\r\n console.log(e.message);\r\n this._setState(WebXRState.NOT_IN_XR);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Exits XR mode and returns the scene to its original state\r\n * @returns promise that resolves after xr mode has exited\r\n */\r\n public exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return Promise.resolve();\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return this.sessionManager.exitXRAsync();\r\n }\r\n\r\n /**\r\n * Enable spectator mode for desktop VR experiences.\r\n * When spectator mode is enabled a camera will be attached to the desktop canvas and will\r\n * display the first rig camera's view on the desktop canvas.\r\n * Please note that this will degrade performance, as it requires another camera render.\r\n * It is also not recommended to enable this in devices like the quest, as it brings no benefit there.\r\n */\r\n public enableSpectatorMode(): void {\r\n if (!this._spectatorMode) {\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[0].globalPosition);\r\n this._spectatorCamera.rotationQuaternion.copyFrom(this.camera.rigCameras[0].absoluteRotation);\r\n }\r\n };\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera = new UniversalCamera(\"webxr-spectator\", Vector3.Zero(), this._scene);\r\n this._spectatorCamera.rotationQuaternion = new Quaternion();\r\n this._scene.activeCameras = [this.camera, this._spectatorCamera];\r\n this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this._scene.onAfterRenderCameraObservable.add((camera) => {\r\n if (camera === this.camera) {\r\n // reset the dimensions object for correct resizing\r\n this._scene.getEngine().framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.removeCallback(updateSpectatorCamera);\r\n this._scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorMode = true;\r\n this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n }\r\n }\r\n\r\n private _nonXRToXRCamera() {\r\n this.camera.setTransformationFromNonVRCamera(this._nonVRCamera!);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n private _setState(val: WebXRState) {\r\n if (this.state === val) {\r\n return;\r\n }\r\n this.state = val;\r\n this.onStateChangedObservable.notifyObservers(this.state);\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/core",
3
- "version": "5.9.1",
3
+ "version": "5.12.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -19,7 +19,7 @@
19
19
  "prepublishOnly": "build-tools -c prepare-es6-build -cf Engines/constants.js"
20
20
  },
21
21
  "dependencies": {
22
- "tslib": "^2.3.1"
22
+ "tslib": "^2.4.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@dev/build-tools": "^1.0.0",
@@ -54,6 +54,8 @@ export declare class SceneComponentConstants {
54
54
  static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;
55
55
  static readonly STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;
56
56
  static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;
57
+ static readonly STEP_BEFORECLEAR_PREPASS = 1;
58
+ static readonly STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;
57
59
  static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;
58
60
  static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;
59
61
  static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;
@@ -67,8 +69,6 @@ export declare class SceneComponentConstants {
67
69
  static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;
68
70
  static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;
69
71
  static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;
70
- static readonly STEP_BEFORECLEARSTAGE_PREPASS = 0;
71
- static readonly STEP_BEFORERENDERTARGETCLEARSTAGE_PREPASS = 0;
72
72
  static readonly STEP_POINTERMOVE_SPRITE = 0;
73
73
  static readonly STEP_POINTERDOWN_SPRITE = 0;
74
74
  static readonly STEP_POINTERUP_SPRITE = 0;
package/sceneComponent.js CHANGED
@@ -45,6 +45,8 @@ var SceneComponentConstants = /** @class */ (function () {
45
45
  SceneComponentConstants.STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;
46
46
  SceneComponentConstants.STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;
47
47
  SceneComponentConstants.STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;
48
+ SceneComponentConstants.STEP_BEFORECLEAR_PREPASS = 1;
49
+ SceneComponentConstants.STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;
48
50
  SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;
49
51
  SceneComponentConstants.STEP_AFTERRENDERTARGETDRAW_LAYER = 1;
50
52
  SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS = 0;
@@ -58,8 +60,6 @@ var SceneComponentConstants = /** @class */ (function () {
58
60
  SceneComponentConstants.STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;
59
61
  SceneComponentConstants.STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;
60
62
  SceneComponentConstants.STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;
61
- SceneComponentConstants.STEP_BEFORECLEARSTAGE_PREPASS = 0;
62
- SceneComponentConstants.STEP_BEFORERENDERTARGETCLEARSTAGE_PREPASS = 0;
63
63
  SceneComponentConstants.STEP_POINTERMOVE_SPRITE = 0;
64
64
  SceneComponentConstants.STEP_POINTERDOWN_SPRITE = 0;
65
65
  SceneComponentConstants.STEP_POINTERUP_SPRITE = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"sceneComponent.js","sourceRoot":"","sources":["../../../../lts/core/generated/sceneComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"./scene\";\r\nimport type { SmartArrayNoDuplicate } from \"./Misc/smartArray\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\n\r\ndeclare type Mesh = import(\"./Meshes/mesh\").Mesh;\r\ndeclare type Effect = import(\"./Materials/effect\").Effect;\r\ndeclare type Camera = import(\"./Cameras/camera\").Camera;\r\ndeclare type AbstractMesh = import(\"./Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type SubMesh = import(\"./Meshes/subMesh\").SubMesh;\r\ndeclare type RenderTargetTexture = import(\"./Materials/Textures/renderTargetTexture\").RenderTargetTexture;\r\n\r\n/**\r\n * Groups all the scene component constants in one place to ease maintenance.\r\n * @hidden\r\n */\r\nexport class SceneComponentConstants {\r\n public static readonly NAME_EFFECTLAYER = \"EffectLayer\";\r\n public static readonly NAME_LAYER = \"Layer\";\r\n public static readonly NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\r\n public static readonly NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\r\n public static readonly NAME_PARTICLESYSTEM = \"ParticleSystem\";\r\n public static readonly NAME_GAMEPAD = \"Gamepad\";\r\n public static readonly NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\r\n public static readonly NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\r\n public static readonly NAME_PREPASSRENDERER = \"PrePassRenderer\";\r\n public static readonly NAME_DEPTHRENDERER = \"DepthRenderer\";\r\n public static readonly NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\r\n public static readonly NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\r\n public static readonly NAME_SPRITE = \"Sprite\";\r\n public static readonly NAME_SUBSURFACE = \"SubSurface\";\r\n public static readonly NAME_OUTLINERENDERER = \"Outline\";\r\n public static readonly NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\r\n public static readonly NAME_SHADOWGENERATOR = \"ShadowGenerator\";\r\n public static readonly NAME_OCTREE = \"Octree\";\r\n public static readonly NAME_PHYSICSENGINE = \"PhysicsEngine\";\r\n public static readonly NAME_AUDIO = \"Audio\";\r\n\r\n public static readonly STEP_ISREADYFORMESH_EFFECTLAYER = 0;\r\n\r\n public static readonly STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_BEFORECAMERADRAW_LAYER = 2;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_BEFORERENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\r\n public static readonly STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\r\n\r\n public static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\r\n public static readonly STEP_AFTERCAMERADRAW_LAYER = 4;\r\n\r\n public static readonly STEP_AFTERRENDER_AUDIO = 0;\r\n\r\n public static readonly STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\r\n public static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\r\n public static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\r\n\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\r\n\r\n public static readonly STEP_BEFORECLEARSTAGE_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERTARGETCLEARSTAGE_PREPASS = 0;\r\n\r\n public static readonly STEP_POINTERMOVE_SPRITE = 0;\r\n public static readonly STEP_POINTERDOWN_SPRITE = 0;\r\n public static readonly STEP_POINTERUP_SPRITE = 0;\r\n}\r\n\r\n/**\r\n * This represents a scene component.\r\n *\r\n * This is used to decouple the dependency the scene is having on the different workloads like\r\n * layers, post processes...\r\n */\r\nexport interface ISceneComponent {\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n register(): void;\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n rebuild(): void;\r\n\r\n /**\r\n * Disposes the component and the associated ressources.\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * This represents a SERIALIZABLE scene component.\r\n *\r\n * This extends Scene Component to add Serialization methods on top.\r\n */\r\nexport interface ISceneSerializableComponent extends ISceneComponent {\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n addFromContainer(container: AbstractScene): void;\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n removeFromContainer(container: AbstractScene, dispose?: boolean): void;\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n serialize(serializationObject: any): void;\r\n}\r\n\r\n/**\r\n * Strong typing of a Mesh related stage step action\r\n */\r\nexport type MeshStageAction = (mesh: AbstractMesh, hardwareInstancedRendering: boolean) => boolean;\r\n\r\n/**\r\n * Strong typing of a Evaluate Sub Mesh related stage step action\r\n */\r\nexport type EvaluateSubMeshStageAction = (mesh: AbstractMesh, subMesh: SubMesh) => void;\r\n\r\n/**\r\n * Strong typing of a pre active Mesh related stage step action\r\n */\r\nexport type PreActiveMeshStageAction = (mesh: AbstractMesh) => void;\r\n\r\n/**\r\n * Strong typing of a Camera related stage step action\r\n */\r\nexport type CameraStageAction = (camera: Camera) => void;\r\n\r\n/**\r\n * Strong typing of a Camera Frame buffer related stage step action\r\n */\r\nexport type CameraStageFrameBufferAction = (camera: Camera) => boolean;\r\n\r\n/**\r\n * Strong typing of a Render Target related stage step action\r\n */\r\nexport type RenderTargetStageAction = (renderTarget: RenderTargetTexture, faceIndex?: number, layer?: number) => void;\r\n\r\n/**\r\n * Strong typing of a RenderingGroup related stage step action\r\n */\r\nexport type RenderingGroupStageAction = (renderingGroupId: number) => void;\r\n\r\n/**\r\n * Strong typing of a Mesh Render related stage step action\r\n */\r\nexport type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: any, effect: Nullable<Effect>) => void;\r\n\r\n/**\r\n * Strong typing of a simple stage step action\r\n */\r\nexport type SimpleStageAction = () => void;\r\n\r\n/**\r\n * Strong typing of a render target action.\r\n */\r\nexport type RenderTargetsStageAction = (renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>) => void;\r\n\r\n/**\r\n * Strong typing of a pointer move action.\r\n */\r\nexport type PointerMoveStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable<PickingInfo>,\r\n isMeshPicked: boolean,\r\n element: Nullable<HTMLElement>\r\n) => Nullable<PickingInfo>;\r\n\r\n/**\r\n * Strong typing of a pointer up/down action.\r\n */\r\nexport type PointerUpDownStageAction = (unTranslatedPointerX: number, unTranslatedPointerY: number, pickResult: Nullable<PickingInfo>, evt: IPointerEvent) => Nullable<PickingInfo>;\r\n\r\n/**\r\n * Representation of a stage in the scene (Basically a list of ordered steps)\r\n * @hidden\r\n */\r\nexport class Stage<T extends Function> extends Array<{ index: number; component: ISceneComponent; action: T }> {\r\n /**\r\n * Hide ctor from the rest of the world.\r\n * @param items The items to add.\r\n */\r\n private constructor(items?: { index: number; component: ISceneComponent; action: T }[]) {\r\n super(...(<any>items));\r\n }\r\n\r\n /**\r\n * Creates a new Stage.\r\n * @returns A new instance of a Stage\r\n */\r\n static Create<T extends Function>(): Stage<T> {\r\n return Object.create(Stage.prototype);\r\n }\r\n\r\n /**\r\n * Registers a step in an ordered way in the targeted stage.\r\n * @param index Defines the position to register the step in\r\n * @param component Defines the component attached to the step\r\n * @param action Defines the action to launch during the step\r\n */\r\n public registerStep(index: number, component: ISceneComponent, action: T): void {\r\n let i = 0;\r\n let maxIndex = Number.MAX_VALUE;\r\n for (; i < this.length; i++) {\r\n const step = this[i];\r\n maxIndex = step.index;\r\n if (index < maxIndex) {\r\n break;\r\n }\r\n }\r\n this.splice(i, 0, { index, component, action: action.bind(component) });\r\n }\r\n\r\n /**\r\n * Clears all the steps from the stage.\r\n */\r\n public clear(): void {\r\n this.length = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sceneComponent.js","sourceRoot":"","sources":["../../../../lts/core/generated/sceneComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"./scene\";\r\nimport type { SmartArrayNoDuplicate } from \"./Misc/smartArray\";\r\nimport type { Nullable } from \"./types\";\r\nimport type { PickingInfo } from \"./Collisions/pickingInfo\";\r\nimport type { AbstractScene } from \"./abstractScene\";\r\nimport type { IPointerEvent } from \"./Events/deviceInputEvents\";\r\n\r\ndeclare type Mesh = import(\"./Meshes/mesh\").Mesh;\r\ndeclare type Effect = import(\"./Materials/effect\").Effect;\r\ndeclare type Camera = import(\"./Cameras/camera\").Camera;\r\ndeclare type AbstractMesh = import(\"./Meshes/abstractMesh\").AbstractMesh;\r\ndeclare type SubMesh = import(\"./Meshes/subMesh\").SubMesh;\r\ndeclare type RenderTargetTexture = import(\"./Materials/Textures/renderTargetTexture\").RenderTargetTexture;\r\n\r\n/**\r\n * Groups all the scene component constants in one place to ease maintenance.\r\n * @hidden\r\n */\r\nexport class SceneComponentConstants {\r\n public static readonly NAME_EFFECTLAYER = \"EffectLayer\";\r\n public static readonly NAME_LAYER = \"Layer\";\r\n public static readonly NAME_LENSFLARESYSTEM = \"LensFlareSystem\";\r\n public static readonly NAME_BOUNDINGBOXRENDERER = \"BoundingBoxRenderer\";\r\n public static readonly NAME_PARTICLESYSTEM = \"ParticleSystem\";\r\n public static readonly NAME_GAMEPAD = \"Gamepad\";\r\n public static readonly NAME_SIMPLIFICATIONQUEUE = \"SimplificationQueue\";\r\n public static readonly NAME_GEOMETRYBUFFERRENDERER = \"GeometryBufferRenderer\";\r\n public static readonly NAME_PREPASSRENDERER = \"PrePassRenderer\";\r\n public static readonly NAME_DEPTHRENDERER = \"DepthRenderer\";\r\n public static readonly NAME_DEPTHPEELINGRENDERER = \"DepthPeelingRenderer\";\r\n public static readonly NAME_POSTPROCESSRENDERPIPELINEMANAGER = \"PostProcessRenderPipelineManager\";\r\n public static readonly NAME_SPRITE = \"Sprite\";\r\n public static readonly NAME_SUBSURFACE = \"SubSurface\";\r\n public static readonly NAME_OUTLINERENDERER = \"Outline\";\r\n public static readonly NAME_PROCEDURALTEXTURE = \"ProceduralTexture\";\r\n public static readonly NAME_SHADOWGENERATOR = \"ShadowGenerator\";\r\n public static readonly NAME_OCTREE = \"Octree\";\r\n public static readonly NAME_PHYSICSENGINE = \"PhysicsEngine\";\r\n public static readonly NAME_AUDIO = \"Audio\";\r\n\r\n public static readonly STEP_ISREADYFORMESH_EFFECTLAYER = 0;\r\n\r\n public static readonly STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;\r\n\r\n public static readonly STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_BEFORECAMERADRAW_LAYER = 2;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_BEFORERENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_BEFORERENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGMESH_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERINGMESH_OUTLINE = 1;\r\n\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;\r\n public static readonly STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;\r\n\r\n public static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;\r\n public static readonly STEP_BEFORECAMERAUPDATE_GAMEPAD = 1;\r\n\r\n public static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;\r\n public static readonly STEP_BEFORECLEAR_PREPASS = 1;\r\n\r\n public static readonly STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;\r\n\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;\r\n\r\n public static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;\r\n public static readonly STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;\r\n public static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;\r\n public static readonly STEP_AFTERCAMERADRAW_LAYER = 4;\r\n\r\n public static readonly STEP_AFTERRENDER_AUDIO = 0;\r\n\r\n public static readonly STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;\r\n public static readonly STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;\r\n public static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;\r\n public static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;\r\n\r\n public static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;\r\n\r\n public static readonly STEP_POINTERMOVE_SPRITE = 0;\r\n public static readonly STEP_POINTERDOWN_SPRITE = 0;\r\n public static readonly STEP_POINTERUP_SPRITE = 0;\r\n}\r\n\r\n/**\r\n * This represents a scene component.\r\n *\r\n * This is used to decouple the dependency the scene is having on the different workloads like\r\n * layers, post processes...\r\n */\r\nexport interface ISceneComponent {\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n name: string;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n register(): void;\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n rebuild(): void;\r\n\r\n /**\r\n * Disposes the component and the associated ressources.\r\n */\r\n dispose(): void;\r\n}\r\n\r\n/**\r\n * This represents a SERIALIZABLE scene component.\r\n *\r\n * This extends Scene Component to add Serialization methods on top.\r\n */\r\nexport interface ISceneSerializableComponent extends ISceneComponent {\r\n /**\r\n * Adds all the elements from the container to the scene\r\n * @param container the container holding the elements\r\n */\r\n addFromContainer(container: AbstractScene): void;\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n * @param container contains the elements to remove\r\n * @param dispose if the removed element should be disposed (default: false)\r\n */\r\n removeFromContainer(container: AbstractScene, dispose?: boolean): void;\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n serialize(serializationObject: any): void;\r\n}\r\n\r\n/**\r\n * Strong typing of a Mesh related stage step action\r\n */\r\nexport type MeshStageAction = (mesh: AbstractMesh, hardwareInstancedRendering: boolean) => boolean;\r\n\r\n/**\r\n * Strong typing of a Evaluate Sub Mesh related stage step action\r\n */\r\nexport type EvaluateSubMeshStageAction = (mesh: AbstractMesh, subMesh: SubMesh) => void;\r\n\r\n/**\r\n * Strong typing of a pre active Mesh related stage step action\r\n */\r\nexport type PreActiveMeshStageAction = (mesh: AbstractMesh) => void;\r\n\r\n/**\r\n * Strong typing of a Camera related stage step action\r\n */\r\nexport type CameraStageAction = (camera: Camera) => void;\r\n\r\n/**\r\n * Strong typing of a Camera Frame buffer related stage step action\r\n */\r\nexport type CameraStageFrameBufferAction = (camera: Camera) => boolean;\r\n\r\n/**\r\n * Strong typing of a Render Target related stage step action\r\n */\r\nexport type RenderTargetStageAction = (renderTarget: RenderTargetTexture, faceIndex?: number, layer?: number) => void;\r\n\r\n/**\r\n * Strong typing of a RenderingGroup related stage step action\r\n */\r\nexport type RenderingGroupStageAction = (renderingGroupId: number) => void;\r\n\r\n/**\r\n * Strong typing of a Mesh Render related stage step action\r\n */\r\nexport type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: any, effect: Nullable<Effect>) => void;\r\n\r\n/**\r\n * Strong typing of a simple stage step action\r\n */\r\nexport type SimpleStageAction = () => void;\r\n\r\n/**\r\n * Strong typing of a render target action.\r\n */\r\nexport type RenderTargetsStageAction = (renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>) => void;\r\n\r\n/**\r\n * Strong typing of a pointer move action.\r\n */\r\nexport type PointerMoveStageAction = (\r\n unTranslatedPointerX: number,\r\n unTranslatedPointerY: number,\r\n pickResult: Nullable<PickingInfo>,\r\n isMeshPicked: boolean,\r\n element: Nullable<HTMLElement>\r\n) => Nullable<PickingInfo>;\r\n\r\n/**\r\n * Strong typing of a pointer up/down action.\r\n */\r\nexport type PointerUpDownStageAction = (unTranslatedPointerX: number, unTranslatedPointerY: number, pickResult: Nullable<PickingInfo>, evt: IPointerEvent) => Nullable<PickingInfo>;\r\n\r\n/**\r\n * Representation of a stage in the scene (Basically a list of ordered steps)\r\n * @hidden\r\n */\r\nexport class Stage<T extends Function> extends Array<{ index: number; component: ISceneComponent; action: T }> {\r\n /**\r\n * Hide ctor from the rest of the world.\r\n * @param items The items to add.\r\n */\r\n private constructor(items?: { index: number; component: ISceneComponent; action: T }[]) {\r\n super(...(<any>items));\r\n }\r\n\r\n /**\r\n * Creates a new Stage.\r\n * @returns A new instance of a Stage\r\n */\r\n static Create<T extends Function>(): Stage<T> {\r\n return Object.create(Stage.prototype);\r\n }\r\n\r\n /**\r\n * Registers a step in an ordered way in the targeted stage.\r\n * @param index Defines the position to register the step in\r\n * @param component Defines the component attached to the step\r\n * @param action Defines the action to launch during the step\r\n */\r\n public registerStep(index: number, component: ISceneComponent, action: T): void {\r\n let i = 0;\r\n let maxIndex = Number.MAX_VALUE;\r\n for (; i < this.length; i++) {\r\n const step = this[i];\r\n maxIndex = step.index;\r\n if (index < maxIndex) {\r\n break;\r\n }\r\n }\r\n this.splice(i, 0, { index, component, action: action.bind(component) });\r\n }\r\n\r\n /**\r\n * Clears all the steps from the stage.\r\n */\r\n public clear(): void {\r\n this.length = 0;\r\n }\r\n}\r\n"]}