@babylonjs/core 5.25.0 → 5.26.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 (107) hide show
  1. package/Audio/audioEngine.js +1 -2
  2. package/Audio/audioEngine.js.map +1 -1
  3. package/Cameras/Inputs/freeCameraDeviceOrientationInput.d.ts +4 -1
  4. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +17 -4
  5. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  6. package/Cameras/VR/vrExperienceHelper.js +1 -24
  7. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  8. package/Culling/Octrees/octreeSceneComponent.js +1 -5
  9. package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
  10. package/DeviceInput/webDeviceInputSystem.js +0 -18
  11. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  12. package/Engines/Extensions/engine.cubeTexture.js +3 -2
  13. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  14. package/Engines/engine.js +3 -34
  15. package/Engines/engine.js.map +1 -1
  16. package/Engines/thinEngine.js +2 -14
  17. package/Engines/thinEngine.js.map +1 -1
  18. package/Gamepads/gamepadManager.js +2 -2
  19. package/Gamepads/gamepadManager.js.map +1 -1
  20. package/Layers/layer.d.ts +7 -0
  21. package/Layers/layer.js +11 -0
  22. package/Layers/layer.js.map +1 -1
  23. package/Layers/layerSceneComponent.d.ts +4 -2
  24. package/Layers/layerSceneComponent.js +27 -11
  25. package/Layers/layerSceneComponent.js.map +1 -1
  26. package/Loading/loadingScreen.js +6 -6
  27. package/Loading/loadingScreen.js.map +1 -1
  28. package/Materials/Textures/renderTargetTexture.js +3 -0
  29. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  30. package/Materials/Textures/thinRenderTargetTexture.js +1 -1
  31. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  32. package/Materials/Textures/videoTexture.js +2 -2
  33. package/Materials/Textures/videoTexture.js.map +1 -1
  34. package/Materials/material.js +5 -2
  35. package/Materials/material.js.map +1 -1
  36. package/Materials/materialHelper.js +1 -6
  37. package/Materials/materialHelper.js.map +1 -1
  38. package/Maths/math.vector.d.ts +47 -10
  39. package/Maths/math.vector.js +89 -10
  40. package/Maths/math.vector.js.map +1 -1
  41. package/Meshes/instancedMesh.js +1 -1
  42. package/Meshes/instancedMesh.js.map +1 -1
  43. package/Meshes/mesh.d.ts +1 -1
  44. package/Meshes/mesh.js +4 -6
  45. package/Meshes/mesh.js.map +1 -1
  46. package/Meshes/subMesh.d.ts +2 -0
  47. package/Meshes/subMesh.js +2 -0
  48. package/Meshes/subMesh.js.map +1 -1
  49. package/Misc/tools.d.ts +9 -0
  50. package/Misc/tools.js +14 -5
  51. package/Misc/tools.js.map +1 -1
  52. package/Misc/virtualJoystick.js +0 -1
  53. package/Misc/virtualJoystick.js.map +1 -1
  54. package/Particles/IParticleSystem.d.ts +6 -0
  55. package/Particles/IParticleSystem.js.map +1 -1
  56. package/Particles/baseParticleSystem.d.ts +8 -0
  57. package/Particles/baseParticleSystem.js +12 -0
  58. package/Particles/baseParticleSystem.js.map +1 -1
  59. package/Particles/gpuParticleSystem.d.ts +1 -1
  60. package/Particles/gpuParticleSystem.js +12 -2
  61. package/Particles/gpuParticleSystem.js.map +1 -1
  62. package/Particles/particleSystem.d.ts +1 -1
  63. package/Particles/particleSystem.js +17 -2
  64. package/Particles/particleSystem.js.map +1 -1
  65. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +1 -1
  66. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  67. package/Rendering/renderingManager.d.ts +11 -0
  68. package/Rendering/renderingManager.js +55 -9
  69. package/Rendering/renderingManager.js.map +1 -1
  70. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +2 -2
  71. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  72. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +1 -1
  73. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  74. package/Shaders/ShadersInclude/vertexColorMixing.js +1 -1
  75. package/Shaders/ShadersInclude/vertexColorMixing.js.map +1 -1
  76. package/Shaders/color.fragment.js +3 -2
  77. package/Shaders/color.fragment.js.map +1 -1
  78. package/Shaders/color.vertex.js +1 -1
  79. package/Shaders/color.vertex.js.map +1 -1
  80. package/Shaders/default.fragment.js +3 -3
  81. package/Shaders/default.fragment.js.map +1 -1
  82. package/Shaders/default.vertex.js +1 -1
  83. package/Shaders/default.vertex.js.map +1 -1
  84. package/Shaders/gpuRenderParticles.fragment.d.ts +2 -0
  85. package/Shaders/gpuRenderParticles.fragment.js +8 -1
  86. package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
  87. package/Shaders/gpuRenderParticles.vertex.d.ts +2 -0
  88. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  89. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  90. package/Shaders/particles.fragment.d.ts +2 -0
  91. package/Shaders/particles.fragment.js +8 -1
  92. package/Shaders/particles.fragment.js.map +1 -1
  93. package/Shaders/particles.vertex.d.ts +2 -0
  94. package/Shaders/particles.vertex.js +4 -0
  95. package/Shaders/particles.vertex.js.map +1 -1
  96. package/Shaders/pbr.vertex.js +1 -1
  97. package/Shaders/pbr.vertex.js.map +1 -1
  98. package/Sprites/spriteManager.d.ts +4 -0
  99. package/Sprites/spriteManager.js +2 -0
  100. package/Sprites/spriteManager.js.map +1 -1
  101. package/package.json +1 -1
  102. package/scene.d.ts +14 -0
  103. package/scene.js +37 -12
  104. package/scene.js.map +1 -1
  105. package/sceneComponent.d.ts +2 -0
  106. package/sceneComponent.js +2 -0
  107. package/sceneComponent.js.map +1 -1
@@ -70,8 +70,7 @@ export class AudioEngine {
70
70
  if (!IsWindowObjectExist()) {
71
71
  return;
72
72
  }
73
- if (typeof window.AudioContext !== "undefined" || typeof window.webkitAudioContext !== "undefined") {
74
- window.AudioContext = window.AudioContext || window.webkitAudioContext;
73
+ if (typeof window.AudioContext !== "undefined") {
75
74
  this.canUseWebAudio = true;
76
75
  }
77
76
  const audioElem = document.createElement("audio");
@@ -1 +1 @@
1
- {"version":3,"file":"audioEngine.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Audio/audioEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Analyser } from \"./analyser\";\r\n\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { IAudioEngine } from \"./Interfaces/IAudioEngine\";\r\nimport { IsWindowObjectExist } from \"../Misc/domManagement\";\r\n\r\n// Sets the default audio engine to Babylon.js\r\nEngine.AudioEngineFactory = (\r\n hostElement: Nullable<HTMLElement>,\r\n audioContext: Nullable<AudioContext>,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>\r\n) => {\r\n return new AudioEngine(hostElement, audioContext, audioDestination);\r\n};\r\n\r\n/**\r\n * This represents the default audio engine used in babylon.\r\n * It is responsible to play, synchronize and analyse sounds throughout the application.\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music\r\n */\r\nexport class AudioEngine implements IAudioEngine {\r\n private _audioContext: Nullable<AudioContext> = null;\r\n private _audioContextInitialized = false;\r\n private _muteButton: Nullable<HTMLButtonElement> = null;\r\n private _hostElement: Nullable<HTMLElement>;\r\n private _audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> = null;\r\n\r\n /**\r\n * Gets whether the current host supports Web Audio and thus could create AudioContexts.\r\n */\r\n public canUseWebAudio: boolean = false;\r\n\r\n /**\r\n * The master gain node defines the global audio volume of your audio engine.\r\n */\r\n public masterGain: GainNode;\r\n\r\n /**\r\n * Defines if Babylon should emit a warning if WebAudio is not supported.\r\n * @ignoreNaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public WarnedWebAudioUnsupported: boolean = false;\r\n\r\n /**\r\n * Gets whether or not mp3 are supported by your browser.\r\n */\r\n public isMP3supported: boolean = false;\r\n\r\n /**\r\n * Gets whether or not ogg are supported by your browser.\r\n */\r\n public isOGGsupported: boolean = false;\r\n\r\n /**\r\n * Gets whether audio has been unlocked on the device.\r\n * Some Browsers have strong restrictions about Audio and won t autoplay unless\r\n * a user interaction has happened.\r\n */\r\n public unlocked: boolean = true;\r\n\r\n /**\r\n * Defines if the audio engine relies on a custom unlocked button.\r\n * In this case, the embedded button will not be displayed.\r\n */\r\n public useCustomUnlockedButton: boolean = false;\r\n\r\n /**\r\n * Event raised when audio has been unlocked on the browser.\r\n */\r\n public onAudioUnlockedObservable = new Observable<IAudioEngine>();\r\n\r\n /**\r\n * Event raised when audio has been locked on the browser.\r\n */\r\n public onAudioLockedObservable = new Observable<IAudioEngine>();\r\n\r\n /**\r\n * Gets the current AudioContext if available.\r\n */\r\n public get audioContext(): Nullable<AudioContext> {\r\n if (!this._audioContextInitialized) {\r\n this._initializeAudioContext();\r\n } else {\r\n if (!this.unlocked && !this._muteButton) {\r\n this._displayMuteButton();\r\n }\r\n }\r\n return this._audioContext;\r\n }\r\n\r\n private _connectedAnalyser: Nullable<Analyser>;\r\n\r\n /**\r\n * Instantiates a new audio engine.\r\n *\r\n * There should be only one per page as some browsers restrict the number\r\n * of audio contexts you can create.\r\n * @param hostElement defines the host element where to display the mute icon if necessary\r\n * @param audioContext defines the audio context to be used by the audio engine\r\n * @param audioDestination defines the audio destination node to be used by audio engine\r\n */\r\n constructor(\r\n hostElement: Nullable<HTMLElement> = null,\r\n audioContext: Nullable<AudioContext> = null,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> = null\r\n ) {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n if (typeof window.AudioContext !== \"undefined\" || typeof window.webkitAudioContext !== \"undefined\") {\r\n window.AudioContext = window.AudioContext || window.webkitAudioContext;\r\n this.canUseWebAudio = true;\r\n }\r\n\r\n const audioElem = document.createElement(\"audio\");\r\n this._hostElement = hostElement;\r\n this._audioContext = audioContext;\r\n this._audioDestination = audioDestination;\r\n\r\n try {\r\n if (\r\n audioElem &&\r\n !!audioElem.canPlayType &&\r\n (audioElem.canPlayType('audio/mpeg; codecs=\"mp3\"').replace(/^no$/, \"\") || audioElem.canPlayType(\"audio/mp3\").replace(/^no$/, \"\"))\r\n ) {\r\n this.isMP3supported = true;\r\n }\r\n } catch (e) {\r\n // protect error during capability check.\r\n }\r\n\r\n try {\r\n if (audioElem && !!audioElem.canPlayType && audioElem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\")) {\r\n this.isOGGsupported = true;\r\n }\r\n } catch (e) {\r\n // protect error during capability check.\r\n }\r\n }\r\n\r\n /**\r\n * Flags the audio engine in Locked state.\r\n * This happens due to new browser policies preventing audio to autoplay.\r\n */\r\n public lock() {\r\n this._triggerSuspendedState();\r\n }\r\n\r\n /**\r\n * Unlocks the audio engine once a user action has been done on the dom.\r\n * This is helpful to resume play once browser policies have been satisfied.\r\n */\r\n public unlock() {\r\n this._triggerRunningState();\r\n }\r\n\r\n private _resumeAudioContext(): Promise<void> {\r\n let result: Promise<void>;\r\n if (this._audioContext!.resume !== undefined) {\r\n result = this._audioContext!.resume();\r\n }\r\n return result! || Promise.resolve();\r\n }\r\n\r\n private _initializeAudioContext() {\r\n try {\r\n if (this.canUseWebAudio) {\r\n if (!this._audioContext) {\r\n this._audioContext = new AudioContext();\r\n }\r\n // create a global volume gain node\r\n this.masterGain = this._audioContext.createGain();\r\n this.masterGain.gain.value = 1;\r\n if (!this._audioDestination) {\r\n this._audioDestination = this._audioContext.destination;\r\n }\r\n this.masterGain.connect(this._audioDestination);\r\n this._audioContextInitialized = true;\r\n if (this._audioContext.state === \"running\") {\r\n // Do not wait for the promise to unlock.\r\n this._triggerRunningState();\r\n }\r\n }\r\n } catch (e) {\r\n this.canUseWebAudio = false;\r\n Logger.Error(\"Web Audio: \" + e.message);\r\n }\r\n }\r\n\r\n private _tryToRun = false;\r\n private _triggerRunningState() {\r\n if (this._tryToRun) {\r\n return;\r\n }\r\n this._tryToRun = true;\r\n\r\n this._resumeAudioContext()\r\n .then(() => {\r\n this._tryToRun = false;\r\n if (this._muteButton) {\r\n this._hideMuteButton();\r\n }\r\n // Notify users that the audio stack is unlocked/unmuted\r\n this.unlocked = true;\r\n this.onAudioUnlockedObservable.notifyObservers(this);\r\n })\r\n .catch(() => {\r\n this._tryToRun = false;\r\n this.unlocked = false;\r\n });\r\n }\r\n\r\n private _triggerSuspendedState() {\r\n this.unlocked = false;\r\n this.onAudioLockedObservable.notifyObservers(this);\r\n this._displayMuteButton();\r\n }\r\n\r\n private _displayMuteButton() {\r\n if (this.useCustomUnlockedButton || this._muteButton) {\r\n return;\r\n }\r\n\r\n this._muteButton = <HTMLButtonElement>document.createElement(\"BUTTON\");\r\n this._muteButton.className = \"babylonUnmuteIcon\";\r\n this._muteButton.id = \"babylonUnmuteIconBtn\";\r\n this._muteButton.title = \"Unmute\";\r\n const imageUrl = !window.SVGSVGElement\r\n ? \"https://cdn.babylonjs.com/Assets/audio.png\"\r\n : \"data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2239%22%20height%3D%2232%22%20viewBox%3D%220%200%2039%2032%22%3E%3Cpath%20fill%3D%22white%22%20d%3D%22M9.625%2018.938l-0.031%200.016h-4.953q-0.016%200-0.031-0.016v-12.453q0-0.016%200.031-0.016h4.953q0.031%200%200.031%200.016v12.453zM12.125%207.688l8.719-8.703v27.453l-8.719-8.719-0.016-0.047v-9.938zM23.359%207.875l1.406-1.406%204.219%204.203%204.203-4.203%201.422%201.406-4.219%204.219%204.219%204.203-1.484%201.359-4.141-4.156-4.219%204.219-1.406-1.422%204.219-4.203z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E\";\r\n\r\n const css =\r\n \".babylonUnmuteIcon { position: absolute; left: 20px; top: 20px; height: 40px; width: 60px; background-color: rgba(51,51,51,0.7); background-image: url(\" +\r\n imageUrl +\r\n \"); background-size: 80%; background-repeat:no-repeat; background-position: center; background-position-y: 4px; border: none; outline: none; transition: transform 0.125s ease-out; cursor: pointer; z-index: 9999; } .babylonUnmuteIcon:hover { transform: scale(1.05) } .babylonUnmuteIcon:active { background-color: rgba(51,51,51,1) }\";\r\n\r\n const style = document.createElement(\"style\");\r\n style.appendChild(document.createTextNode(css));\r\n document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n\r\n document.body.appendChild(this._muteButton);\r\n\r\n this._moveButtonToTopLeft();\r\n\r\n this._muteButton.addEventListener(\r\n \"touchend\",\r\n () => {\r\n this._triggerRunningState();\r\n },\r\n true\r\n );\r\n this._muteButton.addEventListener(\r\n \"click\",\r\n () => {\r\n this._triggerRunningState();\r\n },\r\n true\r\n );\r\n\r\n window.addEventListener(\"resize\", this._onResize);\r\n }\r\n\r\n private _moveButtonToTopLeft() {\r\n if (this._hostElement && this._muteButton) {\r\n this._muteButton.style.top = this._hostElement.offsetTop + 20 + \"px\";\r\n this._muteButton.style.left = this._hostElement.offsetLeft + 20 + \"px\";\r\n }\r\n }\r\n\r\n private _onResize = () => {\r\n this._moveButtonToTopLeft();\r\n };\r\n\r\n private _hideMuteButton() {\r\n if (this._muteButton) {\r\n document.body.removeChild(this._muteButton);\r\n this._muteButton = null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy and release the resources associated with the audio context.\r\n */\r\n public dispose(): void {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n if (this._connectedAnalyser && this._audioContext) {\r\n this._connectedAnalyser.stopDebugCanvas();\r\n this._connectedAnalyser.dispose();\r\n this.masterGain.disconnect();\r\n this.masterGain.connect(this._audioContext.destination);\r\n this._connectedAnalyser = null;\r\n }\r\n this.masterGain.gain.value = 1;\r\n }\r\n this.WarnedWebAudioUnsupported = false;\r\n this._hideMuteButton();\r\n window.removeEventListener(\"resize\", this._onResize);\r\n\r\n this.onAudioUnlockedObservable.clear();\r\n this.onAudioLockedObservable.clear();\r\n }\r\n\r\n /**\r\n * Gets the global volume sets on the master gain.\r\n * @returns the global volume if set or -1 otherwise\r\n */\r\n public getGlobalVolume(): number {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n return this.masterGain.gain.value;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the global volume of your experience (sets on the master gain).\r\n * @param newVolume Defines the new global volume of the application\r\n */\r\n public setGlobalVolume(newVolume: number): void {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n this.masterGain.gain.value = newVolume;\r\n }\r\n }\r\n\r\n /**\r\n * Connect the audio engine to an audio analyser allowing some amazing\r\n * synchronization between the sounds/music and your visualization (VuMeter for instance).\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music#using-the-analyser\r\n * @param analyser The analyser to connect to the engine\r\n */\r\n public connectToAnalyser(analyser: Analyser): void {\r\n if (this._connectedAnalyser) {\r\n this._connectedAnalyser.stopDebugCanvas();\r\n }\r\n if (this.canUseWebAudio && this._audioContextInitialized && this._audioContext) {\r\n this._connectedAnalyser = analyser;\r\n this.masterGain.disconnect();\r\n this._connectedAnalyser.connectAudioNodes(this.masterGain, this._audioContext.destination);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"audioEngine.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Audio/audioEngine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,8CAA8C;AAC9C,MAAM,CAAC,kBAAkB,GAAG,CACxB,WAAkC,EAClC,YAAoC,EACpC,gBAAkF,EACpF,EAAE;IACA,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,WAAW;IAyEpB;;;;;;;;OAQG;IACH,YACI,cAAqC,IAAI,EACzC,eAAuC,IAAI,EAC3C,mBAAqF,IAAI;QApFrF,kBAAa,GAA2B,IAAI,CAAC;QAC7C,6BAAwB,GAAG,KAAK,CAAC;QACjC,gBAAW,GAAgC,IAAI,CAAC;QAEhD,sBAAiB,GAAqE,IAAI,CAAC;QAEnG;;WAEG;QACI,mBAAc,GAAY,KAAK,CAAC;QAOvC;;;WAGG;QACH,gEAAgE;QACzD,8BAAyB,GAAY,KAAK,CAAC;QAElD;;WAEG;QACI,mBAAc,GAAY,KAAK,CAAC;QAEvC;;WAEG;QACI,mBAAc,GAAY,KAAK,CAAC;QAEvC;;;;WAIG;QACI,aAAQ,GAAY,IAAI,CAAC;QAEhC;;;WAGG;QACI,4BAAuB,GAAY,KAAK,CAAC;QAEhD;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAElE;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAgB,CAAC;QAkHxD,cAAS,GAAG,KAAK,CAAC;QAgFlB,cAAS,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,CAAC;QApKE,IAAI,CAAC,mBAAmB,EAAE,EAAE;YACxB,OAAO;SACV;QACD,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,WAAW,EAAE;YAC5C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAE1C,IAAI;YACA,IACI,SAAS;gBACT,CAAC,CAAC,SAAS,CAAC,WAAW;gBACvB,CAAC,SAAS,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EACnI;gBACE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;aAC9B;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,yCAAyC;SAC5C;QAED,IAAI;YACA,IAAI,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACjH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;aAC9B;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,yCAAyC;SAC5C;IACL,CAAC;IA7DD;;OAEG;IACH,IAAW,YAAY;QACnB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAClC;aAAM;YACH,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;aAC7B;SACJ;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAmDD;;;OAGG;IACI,IAAI;QACP,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,MAAM;QACT,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAEO,mBAAmB;QACvB,IAAI,MAAqB,CAAC;QAC1B,IAAI,IAAI,CAAC,aAAc,CAAC,MAAM,KAAK,SAAS,EAAE;YAC1C,MAAM,GAAG,IAAI,CAAC,aAAc,CAAC,MAAM,EAAE,CAAC;SACzC;QACD,OAAO,MAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEO,uBAAuB;QAC3B,IAAI;YACA,IAAI,IAAI,CAAC,cAAc,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;oBACrB,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;iBAC3C;gBACD,mCAAmC;gBACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;gBAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;oBACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;iBAC3D;gBACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAChD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;gBACrC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,SAAS,EAAE;oBACxC,yCAAyC;oBACzC,IAAI,CAAC,oBAAoB,EAAE,CAAC;iBAC/B;aACJ;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;SAC3C;IACL,CAAC;IAGO,oBAAoB;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,OAAO;SACV;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,mBAAmB,EAAE;aACrB,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;YACD,wDAAwD;YACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC,CAAC;IACX,CAAC;IAEO,sBAAsB;QAC1B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAEO,kBAAkB;QACtB,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,WAAW,EAAE;YAClD,OAAO;SACV;QAED,IAAI,CAAC,WAAW,GAAsB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,mBAAmB,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,sBAAsB,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,aAAa;YAClC,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,onBAAonB,CAAC;QAE3nB,MAAM,GAAG,GACL,yJAAyJ;YACzJ,QAAQ;YACR,4UAA4U,CAAC;QAEjV,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAE5D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC7B,UAAU,EACV,GAAG,EAAE;YACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,EACD,IAAI,CACP,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAC7B,OAAO,EACP,GAAG,EAAE;YACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,EACD,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAEO,oBAAoB;QACxB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE;YACvC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC;YACrE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;SAC1E;IACL,CAAC;IAMO,eAAe;QACnB,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SAC3B;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACtD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,aAAa,EAAE;gBAC/C,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;gBAC1C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;aAClC;YACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC;QACD,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACI,eAAe;QAClB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACtD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;SACrC;aAAM;YACH,OAAO,CAAC,CAAC,CAAC;SACb;IACL,CAAC;IAED;;;OAGG;IACI,eAAe,CAAC,SAAiB;QACpC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;SAC1C;IACL,CAAC;IAED;;;;;OAKG;IACI,iBAAiB,CAAC,QAAkB;QACvC,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;SAC7C;QACD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,aAAa,EAAE;YAC5E,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;SAC9F;IACL,CAAC;CACJ","sourcesContent":["import type { Analyser } from \"./analyser\";\r\n\r\nimport type { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Engine } from \"../Engines/engine\";\r\nimport type { IAudioEngine } from \"./Interfaces/IAudioEngine\";\r\nimport { IsWindowObjectExist } from \"../Misc/domManagement\";\r\n\r\n// Sets the default audio engine to Babylon.js\r\nEngine.AudioEngineFactory = (\r\n hostElement: Nullable<HTMLElement>,\r\n audioContext: Nullable<AudioContext>,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode>\r\n) => {\r\n return new AudioEngine(hostElement, audioContext, audioDestination);\r\n};\r\n\r\n/**\r\n * This represents the default audio engine used in babylon.\r\n * It is responsible to play, synchronize and analyse sounds throughout the application.\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music\r\n */\r\nexport class AudioEngine implements IAudioEngine {\r\n private _audioContext: Nullable<AudioContext> = null;\r\n private _audioContextInitialized = false;\r\n private _muteButton: Nullable<HTMLButtonElement> = null;\r\n private _hostElement: Nullable<HTMLElement>;\r\n private _audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> = null;\r\n\r\n /**\r\n * Gets whether the current host supports Web Audio and thus could create AudioContexts.\r\n */\r\n public canUseWebAudio: boolean = false;\r\n\r\n /**\r\n * The master gain node defines the global audio volume of your audio engine.\r\n */\r\n public masterGain: GainNode;\r\n\r\n /**\r\n * Defines if Babylon should emit a warning if WebAudio is not supported.\r\n * @ignoreNaming\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public WarnedWebAudioUnsupported: boolean = false;\r\n\r\n /**\r\n * Gets whether or not mp3 are supported by your browser.\r\n */\r\n public isMP3supported: boolean = false;\r\n\r\n /**\r\n * Gets whether or not ogg are supported by your browser.\r\n */\r\n public isOGGsupported: boolean = false;\r\n\r\n /**\r\n * Gets whether audio has been unlocked on the device.\r\n * Some Browsers have strong restrictions about Audio and won t autoplay unless\r\n * a user interaction has happened.\r\n */\r\n public unlocked: boolean = true;\r\n\r\n /**\r\n * Defines if the audio engine relies on a custom unlocked button.\r\n * In this case, the embedded button will not be displayed.\r\n */\r\n public useCustomUnlockedButton: boolean = false;\r\n\r\n /**\r\n * Event raised when audio has been unlocked on the browser.\r\n */\r\n public onAudioUnlockedObservable = new Observable<IAudioEngine>();\r\n\r\n /**\r\n * Event raised when audio has been locked on the browser.\r\n */\r\n public onAudioLockedObservable = new Observable<IAudioEngine>();\r\n\r\n /**\r\n * Gets the current AudioContext if available.\r\n */\r\n public get audioContext(): Nullable<AudioContext> {\r\n if (!this._audioContextInitialized) {\r\n this._initializeAudioContext();\r\n } else {\r\n if (!this.unlocked && !this._muteButton) {\r\n this._displayMuteButton();\r\n }\r\n }\r\n return this._audioContext;\r\n }\r\n\r\n private _connectedAnalyser: Nullable<Analyser>;\r\n\r\n /**\r\n * Instantiates a new audio engine.\r\n *\r\n * There should be only one per page as some browsers restrict the number\r\n * of audio contexts you can create.\r\n * @param hostElement defines the host element where to display the mute icon if necessary\r\n * @param audioContext defines the audio context to be used by the audio engine\r\n * @param audioDestination defines the audio destination node to be used by audio engine\r\n */\r\n constructor(\r\n hostElement: Nullable<HTMLElement> = null,\r\n audioContext: Nullable<AudioContext> = null,\r\n audioDestination: Nullable<AudioDestinationNode | MediaStreamAudioDestinationNode> = null\r\n ) {\r\n if (!IsWindowObjectExist()) {\r\n return;\r\n }\r\n if (typeof window.AudioContext !== \"undefined\") {\r\n this.canUseWebAudio = true;\r\n }\r\n\r\n const audioElem = document.createElement(\"audio\");\r\n this._hostElement = hostElement;\r\n this._audioContext = audioContext;\r\n this._audioDestination = audioDestination;\r\n\r\n try {\r\n if (\r\n audioElem &&\r\n !!audioElem.canPlayType &&\r\n (audioElem.canPlayType('audio/mpeg; codecs=\"mp3\"').replace(/^no$/, \"\") || audioElem.canPlayType(\"audio/mp3\").replace(/^no$/, \"\"))\r\n ) {\r\n this.isMP3supported = true;\r\n }\r\n } catch (e) {\r\n // protect error during capability check.\r\n }\r\n\r\n try {\r\n if (audioElem && !!audioElem.canPlayType && audioElem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\")) {\r\n this.isOGGsupported = true;\r\n }\r\n } catch (e) {\r\n // protect error during capability check.\r\n }\r\n }\r\n\r\n /**\r\n * Flags the audio engine in Locked state.\r\n * This happens due to new browser policies preventing audio to autoplay.\r\n */\r\n public lock() {\r\n this._triggerSuspendedState();\r\n }\r\n\r\n /**\r\n * Unlocks the audio engine once a user action has been done on the dom.\r\n * This is helpful to resume play once browser policies have been satisfied.\r\n */\r\n public unlock() {\r\n this._triggerRunningState();\r\n }\r\n\r\n private _resumeAudioContext(): Promise<void> {\r\n let result: Promise<void>;\r\n if (this._audioContext!.resume !== undefined) {\r\n result = this._audioContext!.resume();\r\n }\r\n return result! || Promise.resolve();\r\n }\r\n\r\n private _initializeAudioContext() {\r\n try {\r\n if (this.canUseWebAudio) {\r\n if (!this._audioContext) {\r\n this._audioContext = new AudioContext();\r\n }\r\n // create a global volume gain node\r\n this.masterGain = this._audioContext.createGain();\r\n this.masterGain.gain.value = 1;\r\n if (!this._audioDestination) {\r\n this._audioDestination = this._audioContext.destination;\r\n }\r\n this.masterGain.connect(this._audioDestination);\r\n this._audioContextInitialized = true;\r\n if (this._audioContext.state === \"running\") {\r\n // Do not wait for the promise to unlock.\r\n this._triggerRunningState();\r\n }\r\n }\r\n } catch (e) {\r\n this.canUseWebAudio = false;\r\n Logger.Error(\"Web Audio: \" + e.message);\r\n }\r\n }\r\n\r\n private _tryToRun = false;\r\n private _triggerRunningState() {\r\n if (this._tryToRun) {\r\n return;\r\n }\r\n this._tryToRun = true;\r\n\r\n this._resumeAudioContext()\r\n .then(() => {\r\n this._tryToRun = false;\r\n if (this._muteButton) {\r\n this._hideMuteButton();\r\n }\r\n // Notify users that the audio stack is unlocked/unmuted\r\n this.unlocked = true;\r\n this.onAudioUnlockedObservable.notifyObservers(this);\r\n })\r\n .catch(() => {\r\n this._tryToRun = false;\r\n this.unlocked = false;\r\n });\r\n }\r\n\r\n private _triggerSuspendedState() {\r\n this.unlocked = false;\r\n this.onAudioLockedObservable.notifyObservers(this);\r\n this._displayMuteButton();\r\n }\r\n\r\n private _displayMuteButton() {\r\n if (this.useCustomUnlockedButton || this._muteButton) {\r\n return;\r\n }\r\n\r\n this._muteButton = <HTMLButtonElement>document.createElement(\"BUTTON\");\r\n this._muteButton.className = \"babylonUnmuteIcon\";\r\n this._muteButton.id = \"babylonUnmuteIconBtn\";\r\n this._muteButton.title = \"Unmute\";\r\n const imageUrl = !window.SVGSVGElement\r\n ? \"https://cdn.babylonjs.com/Assets/audio.png\"\r\n : \"data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2239%22%20height%3D%2232%22%20viewBox%3D%220%200%2039%2032%22%3E%3Cpath%20fill%3D%22white%22%20d%3D%22M9.625%2018.938l-0.031%200.016h-4.953q-0.016%200-0.031-0.016v-12.453q0-0.016%200.031-0.016h4.953q0.031%200%200.031%200.016v12.453zM12.125%207.688l8.719-8.703v27.453l-8.719-8.719-0.016-0.047v-9.938zM23.359%207.875l1.406-1.406%204.219%204.203%204.203-4.203%201.422%201.406-4.219%204.219%204.219%204.203-1.484%201.359-4.141-4.156-4.219%204.219-1.406-1.422%204.219-4.203z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E\";\r\n\r\n const css =\r\n \".babylonUnmuteIcon { position: absolute; left: 20px; top: 20px; height: 40px; width: 60px; background-color: rgba(51,51,51,0.7); background-image: url(\" +\r\n imageUrl +\r\n \"); background-size: 80%; background-repeat:no-repeat; background-position: center; background-position-y: 4px; border: none; outline: none; transition: transform 0.125s ease-out; cursor: pointer; z-index: 9999; } .babylonUnmuteIcon:hover { transform: scale(1.05) } .babylonUnmuteIcon:active { background-color: rgba(51,51,51,1) }\";\r\n\r\n const style = document.createElement(\"style\");\r\n style.appendChild(document.createTextNode(css));\r\n document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n\r\n document.body.appendChild(this._muteButton);\r\n\r\n this._moveButtonToTopLeft();\r\n\r\n this._muteButton.addEventListener(\r\n \"touchend\",\r\n () => {\r\n this._triggerRunningState();\r\n },\r\n true\r\n );\r\n this._muteButton.addEventListener(\r\n \"click\",\r\n () => {\r\n this._triggerRunningState();\r\n },\r\n true\r\n );\r\n\r\n window.addEventListener(\"resize\", this._onResize);\r\n }\r\n\r\n private _moveButtonToTopLeft() {\r\n if (this._hostElement && this._muteButton) {\r\n this._muteButton.style.top = this._hostElement.offsetTop + 20 + \"px\";\r\n this._muteButton.style.left = this._hostElement.offsetLeft + 20 + \"px\";\r\n }\r\n }\r\n\r\n private _onResize = () => {\r\n this._moveButtonToTopLeft();\r\n };\r\n\r\n private _hideMuteButton() {\r\n if (this._muteButton) {\r\n document.body.removeChild(this._muteButton);\r\n this._muteButton = null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy and release the resources associated with the audio context.\r\n */\r\n public dispose(): void {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n if (this._connectedAnalyser && this._audioContext) {\r\n this._connectedAnalyser.stopDebugCanvas();\r\n this._connectedAnalyser.dispose();\r\n this.masterGain.disconnect();\r\n this.masterGain.connect(this._audioContext.destination);\r\n this._connectedAnalyser = null;\r\n }\r\n this.masterGain.gain.value = 1;\r\n }\r\n this.WarnedWebAudioUnsupported = false;\r\n this._hideMuteButton();\r\n window.removeEventListener(\"resize\", this._onResize);\r\n\r\n this.onAudioUnlockedObservable.clear();\r\n this.onAudioLockedObservable.clear();\r\n }\r\n\r\n /**\r\n * Gets the global volume sets on the master gain.\r\n * @returns the global volume if set or -1 otherwise\r\n */\r\n public getGlobalVolume(): number {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n return this.masterGain.gain.value;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the global volume of your experience (sets on the master gain).\r\n * @param newVolume Defines the new global volume of the application\r\n */\r\n public setGlobalVolume(newVolume: number): void {\r\n if (this.canUseWebAudio && this._audioContextInitialized) {\r\n this.masterGain.gain.value = newVolume;\r\n }\r\n }\r\n\r\n /**\r\n * Connect the audio engine to an audio analyser allowing some amazing\r\n * synchronization between the sounds/music and your visualization (VuMeter for instance).\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music#using-the-analyser\r\n * @param analyser The analyser to connect to the engine\r\n */\r\n public connectToAnalyser(analyser: Analyser): void {\r\n if (this._connectedAnalyser) {\r\n this._connectedAnalyser.stopDebugCanvas();\r\n }\r\n if (this.canUseWebAudio && this._audioContextInitialized && this._audioContext) {\r\n this._connectedAnalyser = analyser;\r\n this.masterGain.disconnect();\r\n this._connectedAnalyser.connectAudioNodes(this.masterGain, this._audioContext.destination);\r\n }\r\n }\r\n}\r\n"]}
@@ -10,9 +10,10 @@ declare module "../../Cameras/freeCameraInputsManager" {
10
10
  _deviceOrientationInput: Nullable<FreeCameraDeviceOrientationInput>;
11
11
  /**
12
12
  * Add orientation input support to the input manager.
13
+ * @param smoothFactor deviceOrientation smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing
13
14
  * @returns the current input manager
14
15
  */
15
- addDeviceOrientation(): FreeCameraInputsManager;
16
+ addDeviceOrientation(smoothFactor?: number): FreeCameraInputsManager;
16
17
  }
17
18
  }
18
19
  /**
@@ -28,6 +29,8 @@ export declare class FreeCameraDeviceOrientationInput implements ICameraInput<Fr
28
29
  private _alpha;
29
30
  private _beta;
30
31
  private _gamma;
32
+ /** alpha+beta+gamma smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing */
33
+ smoothFactor: number;
31
34
  /**
32
35
  * Can be used to detect if a device orientation sensor is available on a device
33
36
  * @param timeout amount of time in milliseconds to wait for a response from the sensor (default: infinite)
@@ -5,11 +5,15 @@ import { FreeCameraInputsManager } from "../../Cameras/freeCameraInputsManager.j
5
5
  import { Observable } from "../../Misc/observable.js";
6
6
  /**
7
7
  * Add orientation input support to the input manager.
8
+ * @param smoothFactor deviceOrientation smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing
8
9
  * @returns the current input manager
9
10
  */
10
- FreeCameraInputsManager.prototype.addDeviceOrientation = function () {
11
+ FreeCameraInputsManager.prototype.addDeviceOrientation = function (smoothFactor) {
11
12
  if (!this._deviceOrientationInput) {
12
13
  this._deviceOrientationInput = new FreeCameraDeviceOrientationInput();
14
+ if (smoothFactor) {
15
+ this._deviceOrientationInput.smoothFactor = smoothFactor;
16
+ }
13
17
  this.add(this._deviceOrientationInput);
14
18
  }
15
19
  return this;
@@ -30,6 +34,8 @@ export class FreeCameraDeviceOrientationInput {
30
34
  this._alpha = 0;
31
35
  this._beta = 0;
32
36
  this._gamma = 0;
37
+ /** alpha+beta+gamma smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing */
38
+ this.smoothFactor = 0;
33
39
  /**
34
40
  * @internal
35
41
  */
@@ -45,9 +51,16 @@ export class FreeCameraDeviceOrientationInput {
45
51
  this._screenQuaternion.copyFromFloats(0, Math.sin(this._screenOrientationAngle), 0, Math.cos(this._screenOrientationAngle));
46
52
  };
47
53
  this._deviceOrientation = (evt) => {
48
- this._alpha = evt.alpha !== null ? evt.alpha : 0;
49
- this._beta = evt.beta !== null ? evt.beta : 0;
50
- this._gamma = evt.gamma !== null ? evt.gamma : 0;
54
+ if (this.smoothFactor) {
55
+ this._alpha = evt.alpha !== null ? Tools.SmoothAngleChange(this._alpha, evt.alpha, this.smoothFactor) : 0;
56
+ this._beta = evt.beta !== null ? Tools.SmoothAngleChange(this._beta, evt.beta, this.smoothFactor) : 0;
57
+ this._gamma = evt.gamma !== null ? Tools.SmoothAngleChange(this._gamma, evt.gamma, this.smoothFactor) : 0;
58
+ }
59
+ else {
60
+ this._alpha = evt.alpha !== null ? evt.alpha : 0;
61
+ this._beta = evt.beta !== null ? evt.beta : 0;
62
+ this._gamma = evt.gamma !== null ? evt.gamma : 0;
63
+ }
51
64
  if (evt.alpha !== null) {
52
65
  this._onDeviceOrientationChangedObservable.notifyObservers();
53
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"freeCameraDeviceOrientationInput.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Cameras/Inputs/freeCameraDeviceOrientationInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { FreeCamera } from \"../../Cameras/freeCamera\";\r\nimport { Quaternion } from \"../../Maths/math.vector\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { FreeCameraInputsManager } from \"../../Cameras/freeCameraInputsManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n// Module augmentation to abstract orientation inputs from camera.\r\ndeclare module \"../../Cameras/freeCameraInputsManager\" {\r\n export interface FreeCameraInputsManager {\r\n /**\r\n * @internal\r\n */\r\n _deviceOrientationInput: Nullable<FreeCameraDeviceOrientationInput>;\r\n /**\r\n * Add orientation input support to the input manager.\r\n * @returns the current input manager\r\n */\r\n addDeviceOrientation(): FreeCameraInputsManager;\r\n }\r\n}\r\n\r\n/**\r\n * Add orientation input support to the input manager.\r\n * @returns the current input manager\r\n */\r\nFreeCameraInputsManager.prototype.addDeviceOrientation = function (): FreeCameraInputsManager {\r\n if (!this._deviceOrientationInput) {\r\n this._deviceOrientationInput = new FreeCameraDeviceOrientationInput();\r\n this.add(this._deviceOrientationInput);\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Takes information about the orientation of the device as reported by the deviceorientation event to orient the camera.\r\n * Screen rotation is taken into account.\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\nexport class FreeCameraDeviceOrientationInput implements ICameraInput<FreeCamera> {\r\n private _camera: FreeCamera;\r\n\r\n private _screenOrientationAngle: number = 0;\r\n\r\n private _constantTranform: Quaternion;\r\n private _screenQuaternion: Quaternion = new Quaternion();\r\n\r\n private _alpha: number = 0;\r\n private _beta: number = 0;\r\n private _gamma: number = 0;\r\n\r\n /**\r\n * Can be used to detect if a device orientation sensor is available on a device\r\n * @param timeout amount of time in milliseconds to wait for a response from the sensor (default: infinite)\r\n * @returns a promise that will resolve on orientation change\r\n */\r\n public static WaitForOrientationChangeAsync(timeout?: number): Promise<void> {\r\n return new Promise((res, rej) => {\r\n let gotValue = false;\r\n const eventHandler = () => {\r\n window.removeEventListener(\"deviceorientation\", eventHandler);\r\n gotValue = true;\r\n res();\r\n };\r\n\r\n // If timeout is populated reject the promise\r\n if (timeout) {\r\n setTimeout(() => {\r\n if (!gotValue) {\r\n window.removeEventListener(\"deviceorientation\", eventHandler);\r\n rej(\"WaitForOrientationChangeAsync timed out\");\r\n }\r\n }, timeout);\r\n }\r\n\r\n if (typeof DeviceOrientationEvent !== \"undefined\" && typeof (<any>DeviceOrientationEvent).requestPermission === \"function\") {\r\n (<any>DeviceOrientationEvent)\r\n .requestPermission()\r\n .then((response: string) => {\r\n if (response == \"granted\") {\r\n window.addEventListener(\"deviceorientation\", eventHandler);\r\n } else {\r\n Tools.Warn(\"Permission not granted.\");\r\n }\r\n })\r\n .catch((error: any) => {\r\n Tools.Error(error);\r\n });\r\n } else {\r\n window.addEventListener(\"deviceorientation\", eventHandler);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onDeviceOrientationChangedObservable = new Observable<void>();\r\n /**\r\n * Instantiates a new input\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\n constructor() {\r\n this._constantTranform = new Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));\r\n this._orientationChanged();\r\n }\r\n\r\n /**\r\n * Define the camera controlled by the input.\r\n */\r\n public get camera(): FreeCamera {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: FreeCamera) {\r\n this._camera = camera;\r\n if (this._camera != null && !this._camera.rotationQuaternion) {\r\n this._camera.rotationQuaternion = new Quaternion();\r\n }\r\n if (this._camera) {\r\n this._camera.onDisposeObservable.add(() => {\r\n this._onDeviceOrientationChangedObservable.clear();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n */\r\n public attachControl(): void {\r\n const hostWindow = this.camera.getScene().getEngine().getHostWindow();\r\n\r\n if (hostWindow) {\r\n const eventHandler = () => {\r\n hostWindow!.addEventListener(\"orientationchange\", this._orientationChanged);\r\n hostWindow!.addEventListener(\"deviceorientation\", this._deviceOrientation);\r\n //In certain cases, the attach control is called AFTER orientation was changed,\r\n //So this is needed.\r\n this._orientationChanged();\r\n };\r\n if (typeof DeviceOrientationEvent !== \"undefined\" && typeof (<any>DeviceOrientationEvent).requestPermission === \"function\") {\r\n (<any>DeviceOrientationEvent)\r\n .requestPermission()\r\n .then((response: string) => {\r\n if (response === \"granted\") {\r\n eventHandler();\r\n } else {\r\n Tools.Warn(\"Permission not granted.\");\r\n }\r\n })\r\n .catch((error: any) => {\r\n Tools.Error(error);\r\n });\r\n } else {\r\n eventHandler();\r\n }\r\n }\r\n }\r\n\r\n private _orientationChanged = () => {\r\n this._screenOrientationAngle =\r\n <any>window.orientation !== undefined\r\n ? +(<any>window.orientation)\r\n : (<any>window.screen).orientation && (<any>window.screen).orientation[\"angle\"]\r\n ? (<any>window.screen).orientation.angle\r\n : 0;\r\n this._screenOrientationAngle = -Tools.ToRadians(this._screenOrientationAngle / 2);\r\n this._screenQuaternion.copyFromFloats(0, Math.sin(this._screenOrientationAngle), 0, Math.cos(this._screenOrientationAngle));\r\n };\r\n\r\n private _deviceOrientation = (evt: DeviceOrientationEvent) => {\r\n this._alpha = evt.alpha !== null ? evt.alpha : 0;\r\n this._beta = evt.beta !== null ? evt.beta : 0;\r\n this._gamma = evt.gamma !== null ? evt.gamma : 0;\r\n if (evt.alpha !== null) {\r\n this._onDeviceOrientationChangedObservable.notifyObservers();\r\n }\r\n };\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n window.removeEventListener(\"orientationchange\", this._orientationChanged);\r\n window.removeEventListener(\"deviceorientation\", this._deviceOrientation);\r\n this._alpha = 0;\r\n }\r\n\r\n /**\r\n * Update the current camera state depending on the inputs that have been used this frame.\r\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\r\n */\r\n public checkInputs(): void {\r\n //if no device orientation provided, don't update the rotation.\r\n //Only testing against alpha under the assumption thatnorientation will never be so exact when set.\r\n if (!this._alpha) {\r\n return;\r\n }\r\n Quaternion.RotationYawPitchRollToRef(Tools.ToRadians(this._alpha), Tools.ToRadians(this._beta), -Tools.ToRadians(this._gamma), this.camera.rotationQuaternion);\r\n this._camera.rotationQuaternion.multiplyInPlace(this._screenQuaternion);\r\n this._camera.rotationQuaternion.multiplyInPlace(this._constantTranform);\r\n //Mirror on XY Plane\r\n this._camera.rotationQuaternion.z *= -1;\r\n this._camera.rotationQuaternion.w *= -1;\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"FreeCameraDeviceOrientationInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"deviceOrientation\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"FreeCameraDeviceOrientationInput\"] = FreeCameraDeviceOrientationInput;\r\n"]}
1
+ {"version":3,"file":"freeCameraDeviceOrientationInput.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Cameras/Inputs/freeCameraDeviceOrientationInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { FreeCamera } from \"../../Cameras/freeCamera\";\r\nimport { Quaternion } from \"../../Maths/math.vector\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { FreeCameraInputsManager } from \"../../Cameras/freeCameraInputsManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\n\r\n// Module augmentation to abstract orientation inputs from camera.\r\ndeclare module \"../../Cameras/freeCameraInputsManager\" {\r\n export interface FreeCameraInputsManager {\r\n /**\r\n * @internal\r\n */\r\n _deviceOrientationInput: Nullable<FreeCameraDeviceOrientationInput>;\r\n /**\r\n * Add orientation input support to the input manager.\r\n * @param smoothFactor deviceOrientation smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing\r\n * @returns the current input manager\r\n */\r\n addDeviceOrientation(smoothFactor?: number): FreeCameraInputsManager;\r\n }\r\n}\r\n\r\n/**\r\n * Add orientation input support to the input manager.\r\n * @param smoothFactor deviceOrientation smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing\r\n * @returns the current input manager\r\n */\r\nFreeCameraInputsManager.prototype.addDeviceOrientation = function (smoothFactor?: number): FreeCameraInputsManager {\r\n if (!this._deviceOrientationInput) {\r\n this._deviceOrientationInput = new FreeCameraDeviceOrientationInput();\r\n if (smoothFactor) {\r\n this._deviceOrientationInput.smoothFactor = smoothFactor;\r\n }\r\n this.add(this._deviceOrientationInput);\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Takes information about the orientation of the device as reported by the deviceorientation event to orient the camera.\r\n * Screen rotation is taken into account.\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\nexport class FreeCameraDeviceOrientationInput implements ICameraInput<FreeCamera> {\r\n private _camera: FreeCamera;\r\n\r\n private _screenOrientationAngle: number = 0;\r\n\r\n private _constantTranform: Quaternion;\r\n private _screenQuaternion: Quaternion = new Quaternion();\r\n\r\n private _alpha: number = 0;\r\n private _beta: number = 0;\r\n private _gamma: number = 0;\r\n\r\n /** alpha+beta+gamma smoothing. 0: no smoothing, 1: new data ignored, 0.9 recommended for smoothing */\r\n public smoothFactor: number = 0;\r\n\r\n /**\r\n * Can be used to detect if a device orientation sensor is available on a device\r\n * @param timeout amount of time in milliseconds to wait for a response from the sensor (default: infinite)\r\n * @returns a promise that will resolve on orientation change\r\n */\r\n public static WaitForOrientationChangeAsync(timeout?: number): Promise<void> {\r\n return new Promise((res, rej) => {\r\n let gotValue = false;\r\n const eventHandler = () => {\r\n window.removeEventListener(\"deviceorientation\", eventHandler);\r\n gotValue = true;\r\n res();\r\n };\r\n\r\n // If timeout is populated reject the promise\r\n if (timeout) {\r\n setTimeout(() => {\r\n if (!gotValue) {\r\n window.removeEventListener(\"deviceorientation\", eventHandler);\r\n rej(\"WaitForOrientationChangeAsync timed out\");\r\n }\r\n }, timeout);\r\n }\r\n\r\n if (typeof DeviceOrientationEvent !== \"undefined\" && typeof (<any>DeviceOrientationEvent).requestPermission === \"function\") {\r\n (<any>DeviceOrientationEvent)\r\n .requestPermission()\r\n .then((response: string) => {\r\n if (response == \"granted\") {\r\n window.addEventListener(\"deviceorientation\", eventHandler);\r\n } else {\r\n Tools.Warn(\"Permission not granted.\");\r\n }\r\n })\r\n .catch((error: any) => {\r\n Tools.Error(error);\r\n });\r\n } else {\r\n window.addEventListener(\"deviceorientation\", eventHandler);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onDeviceOrientationChangedObservable = new Observable<void>();\r\n /**\r\n * Instantiates a new input\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\n constructor() {\r\n this._constantTranform = new Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));\r\n this._orientationChanged();\r\n }\r\n\r\n /**\r\n * Define the camera controlled by the input.\r\n */\r\n public get camera(): FreeCamera {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: FreeCamera) {\r\n this._camera = camera;\r\n if (this._camera != null && !this._camera.rotationQuaternion) {\r\n this._camera.rotationQuaternion = new Quaternion();\r\n }\r\n if (this._camera) {\r\n this._camera.onDisposeObservable.add(() => {\r\n this._onDeviceOrientationChangedObservable.clear();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n */\r\n public attachControl(): void {\r\n const hostWindow = this.camera.getScene().getEngine().getHostWindow();\r\n\r\n if (hostWindow) {\r\n const eventHandler = () => {\r\n hostWindow!.addEventListener(\"orientationchange\", this._orientationChanged);\r\n hostWindow!.addEventListener(\"deviceorientation\", this._deviceOrientation);\r\n //In certain cases, the attach control is called AFTER orientation was changed,\r\n //So this is needed.\r\n this._orientationChanged();\r\n };\r\n if (typeof DeviceOrientationEvent !== \"undefined\" && typeof (<any>DeviceOrientationEvent).requestPermission === \"function\") {\r\n (<any>DeviceOrientationEvent)\r\n .requestPermission()\r\n .then((response: string) => {\r\n if (response === \"granted\") {\r\n eventHandler();\r\n } else {\r\n Tools.Warn(\"Permission not granted.\");\r\n }\r\n })\r\n .catch((error: any) => {\r\n Tools.Error(error);\r\n });\r\n } else {\r\n eventHandler();\r\n }\r\n }\r\n }\r\n\r\n private _orientationChanged = () => {\r\n this._screenOrientationAngle =\r\n <any>window.orientation !== undefined\r\n ? +(<any>window.orientation)\r\n : (<any>window.screen).orientation && (<any>window.screen).orientation[\"angle\"]\r\n ? (<any>window.screen).orientation.angle\r\n : 0;\r\n this._screenOrientationAngle = -Tools.ToRadians(this._screenOrientationAngle / 2);\r\n this._screenQuaternion.copyFromFloats(0, Math.sin(this._screenOrientationAngle), 0, Math.cos(this._screenOrientationAngle));\r\n };\r\n\r\n private _deviceOrientation = (evt: DeviceOrientationEvent) => {\r\n if (this.smoothFactor) {\r\n this._alpha = evt.alpha !== null ? Tools.SmoothAngleChange(this._alpha, evt.alpha, this.smoothFactor) : 0;\r\n this._beta = evt.beta !== null ? Tools.SmoothAngleChange(this._beta, evt.beta, this.smoothFactor) : 0;\r\n this._gamma = evt.gamma !== null ? Tools.SmoothAngleChange(this._gamma, evt.gamma, this.smoothFactor) : 0;\r\n } else {\r\n this._alpha = evt.alpha !== null ? evt.alpha : 0;\r\n this._beta = evt.beta !== null ? evt.beta : 0;\r\n this._gamma = evt.gamma !== null ? evt.gamma : 0;\r\n }\r\n\r\n if (evt.alpha !== null) {\r\n this._onDeviceOrientationChangedObservable.notifyObservers();\r\n }\r\n };\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n window.removeEventListener(\"orientationchange\", this._orientationChanged);\r\n window.removeEventListener(\"deviceorientation\", this._deviceOrientation);\r\n this._alpha = 0;\r\n }\r\n\r\n /**\r\n * Update the current camera state depending on the inputs that have been used this frame.\r\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\r\n */\r\n public checkInputs(): void {\r\n //if no device orientation provided, don't update the rotation.\r\n //Only testing against alpha under the assumption thatnorientation will never be so exact when set.\r\n if (!this._alpha) {\r\n return;\r\n }\r\n Quaternion.RotationYawPitchRollToRef(Tools.ToRadians(this._alpha), Tools.ToRadians(this._beta), -Tools.ToRadians(this._gamma), this.camera.rotationQuaternion);\r\n this._camera.rotationQuaternion.multiplyInPlace(this._screenQuaternion);\r\n this._camera.rotationQuaternion.multiplyInPlace(this._constantTranform);\r\n //Mirror on XY Plane\r\n this._camera.rotationQuaternion.z *= -1;\r\n this._camera.rotationQuaternion.w *= -1;\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"FreeCameraDeviceOrientationInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"deviceOrientation\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"FreeCameraDeviceOrientationInput\"] = FreeCameraDeviceOrientationInput;\r\n"]}
@@ -361,22 +361,7 @@ export class VRExperienceHelper {
361
361
  }
362
362
  };
363
363
  this._onFullscreenChange = () => {
364
- const anyDoc = document;
365
- if (anyDoc.fullscreen !== undefined) {
366
- this._fullscreenVRpresenting = document.fullscreen;
367
- }
368
- else if (anyDoc.mozFullScreen !== undefined) {
369
- this._fullscreenVRpresenting = anyDoc.mozFullScreen;
370
- }
371
- else if (anyDoc.webkitIsFullScreen !== undefined) {
372
- this._fullscreenVRpresenting = anyDoc.webkitIsFullScreen;
373
- }
374
- else if (anyDoc.msIsFullScreen !== undefined) {
375
- this._fullscreenVRpresenting = anyDoc.msIsFullScreen;
376
- }
377
- else if (document.msFullscreenElement !== undefined) {
378
- this._fullscreenVRpresenting = document.msFullscreenElement;
379
- }
364
+ this._fullscreenVRpresenting = !!document.fullscreenElement;
380
365
  if (!this._fullscreenVRpresenting && this._inputElement) {
381
366
  this.exitVR();
382
367
  if (!this._useCustomVRButton && this._btnVR) {
@@ -832,10 +817,6 @@ export class VRExperienceHelper {
832
817
  }
833
818
  hostWindow.addEventListener("resize", this._onResize);
834
819
  document.addEventListener("fullscreenchange", this._onFullscreenChange, false);
835
- document.addEventListener("mozfullscreenchange", this._onFullscreenChange, false);
836
- document.addEventListener("webkitfullscreenchange", this._onFullscreenChange, false);
837
- document.addEventListener("msfullscreenchange", this._onFullscreenChange, false);
838
- document.onmsfullscreenchange = this._onFullscreenChange;
839
820
  // Display vr button when headset is connected
840
821
  if (webVROptions.createFallbackVRDeviceOrientationFreeCamera) {
841
822
  this._displayVRButton();
@@ -1984,10 +1965,6 @@ export class VRExperienceHelper {
1984
1965
  window.removeEventListener("vrdisplaypresentchange", this._onVrDisplayPresentChangeBind);
1985
1966
  window.removeEventListener("resize", this._onResize);
1986
1967
  document.removeEventListener("fullscreenchange", this._onFullscreenChange);
1987
- document.removeEventListener("mozfullscreenchange", this._onFullscreenChange);
1988
- document.removeEventListener("webkitfullscreenchange", this._onFullscreenChange);
1989
- document.removeEventListener("msfullscreenchange", this._onFullscreenChange);
1990
- document.onmsfullscreenchange = null;
1991
1968
  this._scene.getEngine().onVRDisplayChangedObservable.removeCallback(this._onVRDisplayChangedBind);
1992
1969
  this._scene.getEngine().onVRRequestPresentStart.removeCallback(this._onVRRequestPresentStart);
1993
1970
  this._scene.getEngine().onVRRequestPresentComplete.removeCallback(this._onVRRequestPresentComplete);