@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
3 lines (2 loc) • 37 kB
JavaScript
import{aa as e,O as t,V as i,H as n,L as o,b as s,bW as a,_ as r,R as u,F as d,G as l,M as h,bX as c,bJ as _,bI as m}from"./index-Bw2N6w1y.esm.min.js";import{ArrayItem as p,GLTFLoader as g}from"./glTFLoader-DEYqxGxH.esm.min.js";import"./audioEngine-BZ_elF0R.esm.min.js";import"./bone-BwMp7T0B.esm.min.js";import"./skeleton-CkTZwWbM.esm.min.js";import"./rawTexture-CPAqHIA7.esm.min.js";import"./assetContainer-21j7tcC8.esm.min.js";import"./objectModelMapping-DX92iJ8M.esm.min.js";class f{constructor(e,t,i){this.frame=e,this.action=t,this.onlyOnce=i,this.isDone=!1}_clone(){return new f(this.frame,this.action,this.onlyOnce)}}class A{get loop(){return this._loop}set loop(e){e!==this._loop&&(this._loop=e,this.updateOptions({loop:e}))}get currentTime(){if(this._htmlAudioElement)return this._htmlAudioElement.currentTime;if(e.audioEngine?.audioContext&&(this.isPlaying||this.isPaused)){const t=this.isPaused?0:e.audioEngine.audioContext.currentTime-this._startTime;return this._currentTime+t}return 0}get spatialSound(){return this._spatialSound}set spatialSound(e){if(e==this._spatialSound)return;const t=this.isPlaying;this.pause(),e?(this._spatialSound=e,this._updateSpatialParameters()):this._disableSpatialSound(),t&&this.play()}constructor(a,r,u,d=null,l){if(this.autoplay=!1,this._loop=!1,this.useCustomAttenuation=!1,this.isPlaying=!1,this.isPaused=!1,this.refDistance=1,this.rolloffFactor=1,this.maxDistance=100,this.distanceModel="linear",this.metadata=null,this.onEndedObservable=new t,this._spatialSound=!1,this._panningModel="equalpower",this._playbackRate=1,this._streaming=!1,this._startTime=0,this._currentTime=0,this._position=i.Zero(),this._localDirection=new i(1,0,0),this._volume=1,this._isReadyToPlay=!1,this._isDirectional=!1,this._coneInnerAngle=360,this._coneOuterAngle=360,this._coneOuterGain=0,this._isOutputConnected=!1,this._urlType="Unknown",this.name=a,u=u||n.LastCreatedScene)if(this._scene=u,A._SceneComponentInitialization(u),this._readyToPlayCallback=d,this._customAttenuationFunction=(e,t,i,n,o)=>t<i?e*(1-t/i):0,l&&(this.autoplay=l.autoplay||!1,this._loop=l.loop||!1,void 0!==l.volume&&(this._volume=l.volume),this._spatialSound=l.spatialSound??!1,this.maxDistance=l.maxDistance??100,this.useCustomAttenuation=l.useCustomAttenuation??!1,this.rolloffFactor=l.rolloffFactor||1,this.refDistance=l.refDistance||1,this.distanceModel=l.distanceModel||"linear",this._playbackRate=l.playbackRate||1,this._streaming=l.streaming??!1,this._length=l.length,this._offset=l.offset),e.audioEngine?.canUseWebAudio&&e.audioEngine.audioContext){this._soundGain=e.audioEngine.audioContext.createGain(),this._soundGain.gain.value=this._volume,this._inputAudioNode=this._soundGain,this._outputAudioNode=this._soundGain,this._spatialSound&&this._createSpatialParameters(),this._scene.mainSoundTrack.addSound(this);let t=!0;if(r)try{"string"==typeof r?(this._urlType="String",this._url=r):r instanceof ArrayBuffer?this._urlType="ArrayBuffer":r instanceof HTMLMediaElement?this._urlType="MediaElement":r instanceof MediaStream?this._urlType="MediaStream":r instanceof AudioBuffer?this._urlType="AudioBuffer":Array.isArray(r)&&(this._urlType="Array");let i=[],n=!1;switch(this._urlType){case"MediaElement":this._streaming=!0,this._isReadyToPlay=!0,this._streamingSource=e.audioEngine.audioContext.createMediaElementSource(r),this.autoplay&&this.play(0,this._offset,this._length),this._readyToPlayCallback&&this._readyToPlayCallback();break;case"MediaStream":this._streaming=!0,this._isReadyToPlay=!0,this._streamingSource=e.audioEngine.audioContext.createMediaStreamSource(r),this.autoplay&&this.play(0,this._offset,this._length),this._readyToPlayCallback&&this._readyToPlayCallback();break;case"ArrayBuffer":r.byteLength>0&&(n=!0,this._soundLoaded(r));break;case"AudioBuffer":this._audioBufferLoaded(r);break;case"String":i.push(r);case"Array":0===i.length&&(i=r);for(let t=0;t<i.length;t++){const a=i[t];if(n=l&&l.skipCodecCheck||-1!==a.indexOf(".mp3",a.length-4)&&e.audioEngine.isMP3supported||-1!==a.indexOf(".ogg",a.length-4)&&e.audioEngine.isOGGsupported||-1!==a.indexOf(".wav",a.length-4)||-1!==a.indexOf(".m4a",a.length-4)||-1!==a.indexOf(".mp4",a.length-4)||-1!==a.indexOf("blob:"),n){this._streaming?(this._htmlAudioElement=new Audio(a),this._htmlAudioElement.controls=!1,this._htmlAudioElement.loop=this.loop,s.SetCorsBehavior(a,this._htmlAudioElement),this._htmlAudioElement.preload="auto",this._htmlAudioElement.addEventListener("canplaythrough",(()=>{this._isReadyToPlay=!0,this.autoplay&&this.play(0,this._offset,this._length),this._readyToPlayCallback&&this._readyToPlayCallback()}),{once:!0}),document.body.appendChild(this._htmlAudioElement),this._htmlAudioElement.load()):this._scene._loadFile(a,(e=>{this._soundLoaded(e)}),void 0,!0,!0,(e=>{e&&o.Error("XHR "+e.status+" error on: "+a+"."),o.Error("Sound creation aborted."),this._scene.mainSoundTrack.removeSound(this)}));break}}break;default:t=!1}t?n||(this._isReadyToPlay=!0,this._readyToPlayCallback&&setTimeout((()=>{this._readyToPlayCallback&&this._readyToPlayCallback()}),1e3)):o.Error("Parameter must be a URL to the sound, an Array of URLs (.mp3 & .ogg) or an ArrayBuffer of the sound.")}catch(e){o.Error("Unexpected error. Sound creation aborted."),this._scene.mainSoundTrack.removeSound(this)}}else this._scene.mainSoundTrack.addSound(this),e.audioEngine&&!e.audioEngine.WarnedWebAudioUnsupported&&(o.Error("Web Audio is not supported by your browser."),e.audioEngine.WarnedWebAudioUnsupported=!0),this._readyToPlayCallback&&setTimeout((()=>{this._readyToPlayCallback&&this._readyToPlayCallback()}),1e3)}dispose(){e.audioEngine?.canUseWebAudio&&(this.isPlaying&&this.stop(),this._isReadyToPlay=!1,-1===this.soundTrackId?this._scene.mainSoundTrack.removeSound(this):this._scene.soundTracks&&this._scene.soundTracks[this.soundTrackId].removeSound(this),this._soundGain&&(this._soundGain.disconnect(),this._soundGain=null),this._soundPanner&&(this._soundPanner.disconnect(),this._soundPanner=null),this._soundSource&&(this._soundSource.disconnect(),this._soundSource=null),this._audioBuffer=null,this._htmlAudioElement&&(this._htmlAudioElement.pause(),this._htmlAudioElement.src="",document.body.removeChild(this._htmlAudioElement),this._htmlAudioElement=null),this._streamingSource&&(this._streamingSource.disconnect(),this._streamingSource=null),this._connectedTransformNode&&this._registerFunc&&(this._connectedTransformNode.unregisterAfterWorldMatrixUpdate(this._registerFunc),this._connectedTransformNode=null),this._clearTimeoutsAndObservers())}isReady(){return this._isReadyToPlay}getClassName(){return"Sound"}_audioBufferLoaded(t){e.audioEngine?.audioContext&&(this._audioBuffer=t,this._isReadyToPlay=!0,this.autoplay&&this.play(0,this._offset,this._length),this._readyToPlayCallback&&this._readyToPlayCallback())}_soundLoaded(t){e.audioEngine?.audioContext&&e.audioEngine.audioContext.decodeAudioData(t,(e=>{this._audioBufferLoaded(e)}),(e=>{o.Error("Error while decoding audio data for: "+this.name+" / Error: "+e)}))}setAudioBuffer(t){e.audioEngine?.canUseWebAudio&&(this._audioBuffer=t,this._isReadyToPlay=!0)}updateOptions(e){e&&(this.loop=e.loop??this.loop,this.maxDistance=e.maxDistance??this.maxDistance,this.useCustomAttenuation=e.useCustomAttenuation??this.useCustomAttenuation,this.rolloffFactor=e.rolloffFactor??this.rolloffFactor,this.refDistance=e.refDistance??this.refDistance,this.distanceModel=e.distanceModel??this.distanceModel,this._playbackRate=e.playbackRate??this._playbackRate,this._length=e.length??void 0,this.spatialSound=e.spatialSound??this._spatialSound,this._setOffset(e.offset??void 0),this.setVolume(e.volume??this._volume),this._updateSpatialParameters(),this.isPlaying&&(this._streaming&&this._htmlAudioElement?(this._htmlAudioElement.playbackRate=this._playbackRate,this._htmlAudioElement.loop!==this.loop&&(this._htmlAudioElement.loop=this.loop)):this._soundSource&&(this._soundSource.playbackRate.value=this._playbackRate,this._soundSource.loop!==this.loop&&(this._soundSource.loop=this.loop),void 0!==this._offset&&this._soundSource.loopStart!==this._offset&&(this._soundSource.loopStart=this._offset),void 0!==this._length&&this._length!==this._soundSource.loopEnd&&(this._soundSource.loopEnd=(0|this._offset)+this._length))))}_createSpatialParameters(){e.audioEngine?.canUseWebAudio&&e.audioEngine.audioContext&&(this._scene.headphone&&(this._panningModel="HRTF"),this._soundPanner=this._soundPanner??e.audioEngine.audioContext.createPanner(),this._soundPanner&&this._outputAudioNode&&(this._updateSpatialParameters(),this._soundPanner.connect(this._outputAudioNode),this._inputAudioNode=this._soundPanner))}_disableSpatialSound(){this._spatialSound&&(this._inputAudioNode=this._soundGain,this._soundPanner?.disconnect(),this._soundPanner=null,this._spatialSound=!1)}_updateSpatialParameters(){this._spatialSound&&(this._soundPanner?this.useCustomAttenuation?(this._soundPanner.distanceModel="linear",this._soundPanner.maxDistance=Number.MAX_VALUE,this._soundPanner.refDistance=1,this._soundPanner.rolloffFactor=1,this._soundPanner.panningModel=this._panningModel):(this._soundPanner.distanceModel=this.distanceModel,this._soundPanner.maxDistance=this.maxDistance,this._soundPanner.refDistance=this.refDistance,this._soundPanner.rolloffFactor=this.rolloffFactor,this._soundPanner.panningModel=this._panningModel):this._createSpatialParameters())}switchPanningModelToHRTF(){this._panningModel="HRTF",this._switchPanningModel()}switchPanningModelToEqualPower(){this._panningModel="equalpower",this._switchPanningModel()}_switchPanningModel(){e.audioEngine?.canUseWebAudio&&this._spatialSound&&this._soundPanner&&(this._soundPanner.panningModel=this._panningModel)}connectToSoundTrackAudioNode(t){e.audioEngine?.canUseWebAudio&&this._outputAudioNode&&(this._isOutputConnected&&this._outputAudioNode.disconnect(),this._outputAudioNode.connect(t),this._isOutputConnected=!0)}setDirectionalCone(e,t,i){t<e?o.Error("setDirectionalCone(): outer angle of the cone must be superior or equal to the inner angle."):(this._coneInnerAngle=e,this._coneOuterAngle=t,this._coneOuterGain=i,this._isDirectional=!0,this.isPlaying&&this.loop&&(this.stop(),this.play(0,this._offset,this._length)))}get directionalConeInnerAngle(){return this._coneInnerAngle}set directionalConeInnerAngle(t){if(t!=this._coneInnerAngle){if(this._coneOuterAngle<t)return void o.Error("directionalConeInnerAngle: outer angle of the cone must be superior or equal to the inner angle.");this._coneInnerAngle=t,e.audioEngine?.canUseWebAudio&&this._spatialSound&&this._soundPanner&&(this._soundPanner.coneInnerAngle=this._coneInnerAngle)}}get directionalConeOuterAngle(){return this._coneOuterAngle}set directionalConeOuterAngle(t){if(t!=this._coneOuterAngle){if(t<this._coneInnerAngle)return void o.Error("directionalConeOuterAngle: outer angle of the cone must be superior or equal to the inner angle.");this._coneOuterAngle=t,e.audioEngine?.canUseWebAudio&&this._spatialSound&&this._soundPanner&&(this._soundPanner.coneOuterAngle=this._coneOuterAngle)}}setPosition(t){t.equals(this._position)||(this._position.copyFrom(t),e.audioEngine?.canUseWebAudio&&this._spatialSound&&this._soundPanner&&!isNaN(this._position.x)&&!isNaN(this._position.y)&&!isNaN(this._position.z)&&(this._soundPanner.positionX.value=this._position.x,this._soundPanner.positionY.value=this._position.y,this._soundPanner.positionZ.value=this._position.z))}setLocalDirectionToMesh(t){this._localDirection=t,e.audioEngine?.canUseWebAudio&&this._connectedTransformNode&&this.isPlaying&&this._updateDirection()}_updateDirection(){if(!this._connectedTransformNode||!this._soundPanner)return;const e=this._connectedTransformNode.getWorldMatrix(),t=i.TransformNormal(this._localDirection,e);t.normalize(),this._soundPanner.orientationX.value=t.x,this._soundPanner.orientationY.value=t.y,this._soundPanner.orientationZ.value=t.z}updateDistanceFromListener(){if(e.audioEngine?.canUseWebAudio&&this._connectedTransformNode&&this.useCustomAttenuation&&this._soundGain&&this._scene.activeCamera){const e=this._scene.audioListenerPositionProvider?this._connectedTransformNode.position.subtract(this._scene.audioListenerPositionProvider()).length():this._connectedTransformNode.getDistanceToCamera(this._scene.activeCamera);this._soundGain.gain.value=this._customAttenuationFunction(this._volume,e,this.maxDistance,this.refDistance,this.rolloffFactor)}}setAttenuationFunction(e){this._customAttenuationFunction=e}play(t,i,n){if(this._isReadyToPlay&&this._scene.audioEnabled&&e.audioEngine?.audioContext)try{this._clearTimeoutsAndObservers();let o=t?e.audioEngine?.audioContext.currentTime+t:e.audioEngine?.audioContext.currentTime;if(this._soundSource&&this._streamingSource||this._spatialSound&&this._soundPanner&&(isNaN(this._position.x)||isNaN(this._position.y)||isNaN(this._position.z)||(this._soundPanner.positionX.value=this._position.x,this._soundPanner.positionY.value=this._position.y,this._soundPanner.positionZ.value=this._position.z),this._isDirectional&&(this._soundPanner.coneInnerAngle=this._coneInnerAngle,this._soundPanner.coneOuterAngle=this._coneOuterAngle,this._soundPanner.coneOuterGain=this._coneOuterGain,this._connectedTransformNode?this._updateDirection():this._soundPanner.setOrientation(this._localDirection.x,this._localDirection.y,this._localDirection.z))),this._streaming){if(!this._streamingSource&&this._htmlAudioElement&&(this._streamingSource=e.audioEngine.audioContext.createMediaElementSource(this._htmlAudioElement),this._htmlAudioElement.onended=()=>{this._onended()},this._htmlAudioElement.playbackRate=this._playbackRate),this._streamingSource&&(this._streamingSource.disconnect(),this._inputAudioNode&&this._streamingSource.connect(this._inputAudioNode)),this._htmlAudioElement){const t=()=>{if(e.audioEngine?.unlocked){if(!this._htmlAudioElement)return;this._htmlAudioElement.currentTime=i??0;const n=this._htmlAudioElement.play();void 0!==n&&n.catch((()=>{e.audioEngine?.lock(),(this.loop||this.autoplay)&&(this._audioUnlockedObserver=e.audioEngine?.onAudioUnlockedObservable.addOnce((()=>{t()})))}))}else(this.loop||this.autoplay)&&(this._audioUnlockedObserver=e.audioEngine?.onAudioUnlockedObservable.addOnce((()=>{t()})))};t()}}else{const s=()=>{if(e.audioEngine?.audioContext){if(n=n||this._length,void 0!==i&&this._setOffset(i),this._soundSource){const e=this._soundSource;e.onended=()=>{e.disconnect()}}if(this._soundSource=e.audioEngine?.audioContext.createBufferSource(),this._soundSource&&this._inputAudioNode){this._soundSource.buffer=this._audioBuffer,this._soundSource.connect(this._inputAudioNode),this._soundSource.loop=this.loop,void 0!==i&&(this._soundSource.loopStart=i),void 0!==n&&(this._soundSource.loopEnd=(0|i)+n),this._soundSource.playbackRate.value=this._playbackRate,this._soundSource.onended=()=>{this._onended()},o=t?e.audioEngine?.audioContext.currentTime+t:e.audioEngine.audioContext.currentTime;const s=((this.isPaused?this.currentTime:0)+(this._offset??0))%this._soundSource.buffer.duration;this._soundSource.start(o,s,this.loop?void 0:n)}}};"suspended"===e.audioEngine?.audioContext.state?this._tryToPlayTimeout=setTimeout((()=>{"suspended"===e.audioEngine?.audioContext.state?(e.audioEngine.lock(),(this.loop||this.autoplay)&&(this._audioUnlockedObserver=e.audioEngine.onAudioUnlockedObservable.addOnce((()=>{s()})))):s()}),500):s()}this._startTime=o,this.isPlaying=!0,this.isPaused=!1}catch(e){o.Error("Error while trying to play audio: "+this.name+", "+e.message)}}_onended(){this.isPlaying=!1,this._startTime=0,this._currentTime=0,this.onended&&this.onended(),this.onEndedObservable.notifyObservers(this)}stop(t){if(this.isPlaying)if(this._clearTimeoutsAndObservers(),this._streaming)this._htmlAudioElement?(this._htmlAudioElement.pause(),this._htmlAudioElement.currentTime>0&&(this._htmlAudioElement.currentTime=0)):this._streamingSource?.disconnect(),this.isPlaying=!1;else if(e.audioEngine?.audioContext&&this._soundSource){const i=t?e.audioEngine.audioContext.currentTime+t:void 0;this._soundSource.onended=()=>{this.isPlaying=!1,this.isPaused=!1,this._startTime=0,this._currentTime=0,this._soundSource&&(this._soundSource.onended=()=>{}),this._onended()},this._soundSource.stop(i)}else this.isPlaying=!1;else this.isPaused&&(this.isPaused=!1,this._startTime=0,this._currentTime=0)}pause(){this.isPlaying&&(this._clearTimeoutsAndObservers(),this._streaming?(this._htmlAudioElement?this._htmlAudioElement.pause():this._streamingSource?.disconnect(),this.isPlaying=!1,this.isPaused=!0):e.audioEngine?.audioContext&&this._soundSource&&(this._soundSource.onended=()=>{},this._soundSource.stop(),this.isPlaying=!1,this.isPaused=!0,this._currentTime+=e.audioEngine.audioContext.currentTime-this._startTime))}setVolume(t,i){e.audioEngine?.canUseWebAudio&&this._soundGain&&(i&&e.audioEngine.audioContext?(this._soundGain.gain.cancelScheduledValues(e.audioEngine.audioContext.currentTime),this._soundGain.gain.setValueAtTime(this._soundGain.gain.value,e.audioEngine.audioContext.currentTime),this._soundGain.gain.linearRampToValueAtTime(t,e.audioEngine.audioContext.currentTime+i)):this._soundGain.gain.value=t),this._volume=t}setPlaybackRate(e){this._playbackRate=e,this.isPlaying&&(this._streaming&&this._htmlAudioElement?this._htmlAudioElement.playbackRate=this._playbackRate:this._soundSource&&(this._soundSource.playbackRate.value=this._playbackRate))}getPlaybackRate(){return this._playbackRate}getVolume(){return this._volume}attachToMesh(e){this._connectedTransformNode&&this._registerFunc&&(this._connectedTransformNode.unregisterAfterWorldMatrixUpdate(this._registerFunc),this._registerFunc=null),this._connectedTransformNode=e,this._spatialSound||(this._spatialSound=!0,this._createSpatialParameters(),this.isPlaying&&this.loop&&(this.stop(),this.play(0,this._offset,this._length))),this._onRegisterAfterWorldMatrixUpdate(this._connectedTransformNode),this._registerFunc=e=>this._onRegisterAfterWorldMatrixUpdate(e),this._connectedTransformNode.registerAfterWorldMatrixUpdate(this._registerFunc)}detachFromMesh(){this._connectedTransformNode&&this._registerFunc&&(this._connectedTransformNode.unregisterAfterWorldMatrixUpdate(this._registerFunc),this._registerFunc=null,this._connectedTransformNode=null)}_onRegisterAfterWorldMatrixUpdate(t){if(t.getBoundingInfo){const e=t.getBoundingInfo();this.setPosition(e.boundingSphere.centerWorld)}else this.setPosition(t.absolutePosition);e.audioEngine?.canUseWebAudio&&this._isDirectional&&this.isPlaying&&this._updateDirection()}clone(){if(this._streaming)return null;{const e=()=>{a((()=>this._isReadyToPlay),(()=>{i._audioBuffer=this.getAudioBuffer(),i._isReadyToPlay=!0,i.autoplay&&i.play(0,this._offset,this._length)}),void 0,300)},t={autoplay:this.autoplay,loop:this.loop,volume:this._volume,spatialSound:this._spatialSound,maxDistance:this.maxDistance,useCustomAttenuation:this.useCustomAttenuation,rolloffFactor:this.rolloffFactor,refDistance:this.refDistance,distanceModel:this.distanceModel},i=new A(this.name+"_cloned",new ArrayBuffer(0),this._scene,null,t);return this.useCustomAttenuation&&i.setAttenuationFunction(this._customAttenuationFunction),i.setPosition(this._position),i.setPlaybackRate(this._playbackRate),e(),i}}getAudioBuffer(){return this._audioBuffer}getSoundSource(){return this._soundSource}getSoundGain(){return this._soundGain}serialize(){const e={name:this.name,url:this._url,autoplay:this.autoplay,loop:this.loop,volume:this._volume,spatialSound:this._spatialSound,maxDistance:this.maxDistance,rolloffFactor:this.rolloffFactor,refDistance:this.refDistance,distanceModel:this.distanceModel,playbackRate:this._playbackRate,panningModel:this._panningModel,soundTrackId:this.soundTrackId,metadata:this.metadata};return this._spatialSound&&(this._connectedTransformNode&&(e.connectedMeshId=this._connectedTransformNode.id),e.position=this._position.asArray(),e.refDistance=this.refDistance,e.distanceModel=this.distanceModel,e.isDirectional=this._isDirectional,e.localDirectionToMesh=this._localDirection.asArray(),e.coneInnerAngle=this._coneInnerAngle,e.coneOuterAngle=this._coneOuterAngle,e.coneOuterGain=this._coneOuterGain),e}static Parse(e,t,n,o){const s=e.name;let r;r=e.url?n+e.url:n+s;const u={autoplay:e.autoplay,loop:e.loop,volume:e.volume,spatialSound:e.spatialSound,maxDistance:e.maxDistance,rolloffFactor:e.rolloffFactor,refDistance:e.refDistance,distanceModel:e.distanceModel,playbackRate:e.playbackRate};let d;if(o){const e=()=>{a((()=>o._isReadyToPlay),(()=>{d._audioBuffer=o.getAudioBuffer(),d._isReadyToPlay=!0,d.autoplay&&d.play(0,d._offset,d._length)}),void 0,300)};d=new A(s,new ArrayBuffer(0),t,null,u),e()}else d=new A(s,r,t,(()=>{t.removePendingData(d)}),u),t.addPendingData(d);if(e.position){const t=i.FromArray(e.position);d.setPosition(t)}if(e.isDirectional&&(d.setDirectionalCone(e.coneInnerAngle||360,e.coneOuterAngle||360,e.coneOuterGain||0),e.localDirectionToMesh)){const t=i.FromArray(e.localDirectionToMesh);d.setLocalDirectionToMesh(t)}if(e.connectedMeshId){const i=t.getMeshById(e.connectedMeshId);i&&d.attachToMesh(i)}return e.metadata&&(d.metadata=e.metadata),d}_setOffset(e){this._offset!==e&&(this.isPaused&&(this.stop(),this.isPaused=!1),this._offset=e)}_clearTimeoutsAndObservers(){this._tryToPlayTimeout&&(clearTimeout(this._tryToPlayTimeout),this._tryToPlayTimeout=null),this._audioUnlockedObserver&&(e.audioEngine?.onAudioUnlockedObservable.remove(this._audioUnlockedObserver),this._audioUnlockedObserver=null)}}A._SceneComponentInitialization=e=>{throw r("AudioSceneComponent")},u("BABYLON.Sound",A);class y{constructor(e,t,i){if(this.loop=!1,this._coneInnerAngle=360,this._coneOuterAngle=360,this._volume=1,this.isPlaying=!1,this.isPaused=!1,this._sounds=[],this._weights=[],t.length!==i.length)throw new Error("Sounds length does not equal weights length");this.loop=e,this._weights=i;let n=0;for(const e of i)n+=e;const o=n>0?1/n:0;for(let e=0;e<this._weights.length;e++)this._weights[e]*=o;this._sounds=t;for(const e of this._sounds)e.onEndedObservable.add((()=>{this._onended()}))}get directionalConeInnerAngle(){return this._coneInnerAngle}set directionalConeInnerAngle(e){if(e!==this._coneInnerAngle){if(this._coneOuterAngle<e)return void o.Error("directionalConeInnerAngle: outer angle of the cone must be superior or equal to the inner angle.");this._coneInnerAngle=e;for(const t of this._sounds)t.directionalConeInnerAngle=e}}get directionalConeOuterAngle(){return this._coneOuterAngle}set directionalConeOuterAngle(e){if(e!==this._coneOuterAngle){if(e<this._coneInnerAngle)return void o.Error("directionalConeOuterAngle: outer angle of the cone must be superior or equal to the inner angle.");this._coneOuterAngle=e;for(const t of this._sounds)t.directionalConeOuterAngle=e}}get volume(){return this._volume}set volume(e){if(e!==this._volume)for(const t of this._sounds)t.setVolume(e)}_onended(){void 0!==this._currentIndex&&(this._sounds[this._currentIndex].autoplay=!1),this.loop&&this.isPlaying?this.play():this.isPlaying=!1}pause(){this.isPlaying&&(this.isPaused=!0,void 0!==this._currentIndex&&this._sounds[this._currentIndex].pause())}stop(){this.isPlaying=!1,void 0!==this._currentIndex&&this._sounds[this._currentIndex].stop()}play(e){if(!this.isPaused){this.stop();const e=Math.random();let t=0;for(let i=0;i<this._weights.length;i++)if(t+=this._weights[i],e<=t){this._currentIndex=i;break}}const t=this._sounds[this._currentIndex??0];t.isReady()?t.play(0,this.isPaused?void 0:e):t.autoplay=!0,this.isPlaying=!0,this.isPaused=!1}}class T{constructor(e,t={}){this.id=-1,this._isInitialized=!1,(e=e||n.LastCreatedScene)&&(this._scene=e,this.soundCollection=[],this._options=t,!this._options.mainTrack&&this._scene.soundTracks&&(this._scene.soundTracks.push(this),this.id=this._scene.soundTracks.length-1))}_initializeSoundTrackAudioGraph(){e.audioEngine?.canUseWebAudio&&e.audioEngine.audioContext&&(this._outputAudioNode=e.audioEngine.audioContext.createGain(),this._outputAudioNode.connect(e.audioEngine.masterGain),this._options&&this._options.volume&&(this._outputAudioNode.gain.value=this._options.volume),this._isInitialized=!0)}dispose(){if(e.audioEngine&&e.audioEngine.canUseWebAudio){for(this._connectedAnalyser&&this._connectedAnalyser.stopDebugCanvas();this.soundCollection.length;)this.soundCollection[0].dispose();this._outputAudioNode&&this._outputAudioNode.disconnect(),this._outputAudioNode=null}}addSound(t){this._isInitialized||this._initializeSoundTrackAudioGraph(),e.audioEngine?.canUseWebAudio&&this._outputAudioNode&&t.connectToSoundTrackAudioNode(this._outputAudioNode),void 0!==t.soundTrackId&&(-1===t.soundTrackId?this._scene.mainSoundTrack.removeSound(t):this._scene.soundTracks&&this._scene.soundTracks[t.soundTrackId].removeSound(t)),this.soundCollection.push(t),t.soundTrackId=this.id}removeSound(e){const t=this.soundCollection.indexOf(e);-1!==t&&this.soundCollection.splice(t,1)}setVolume(t){e.audioEngine?.canUseWebAudio&&this._outputAudioNode&&(this._outputAudioNode.gain.value=t)}switchPanningModelToHRTF(){if(e.audioEngine?.canUseWebAudio)for(let e=0;e<this.soundCollection.length;e++)this.soundCollection[e].switchPanningModelToHRTF()}switchPanningModelToEqualPower(){if(e.audioEngine?.canUseWebAudio)for(let e=0;e<this.soundCollection.length;e++)this.soundCollection[e].switchPanningModelToEqualPower()}connectToAnalyser(t){this._connectedAnalyser&&this._connectedAnalyser.stopDebugCanvas(),this._connectedAnalyser=t,e.audioEngine?.canUseWebAudio&&this._outputAudioNode&&(this._outputAudioNode.disconnect(),this._connectedAnalyser.connectAudioNodes(this._outputAudioNode,e.audioEngine.masterGain))}}Object.defineProperty(d.prototype,"mainSoundTrack",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),this._mainSoundTrack||(this._mainSoundTrack=new T(this,{mainTrack:!0})),this._mainSoundTrack},enumerable:!0,configurable:!0}),d.prototype.getSoundByName=function(e){let t;for(t=0;t<this.mainSoundTrack.soundCollection.length;t++)if(this.mainSoundTrack.soundCollection[t].name===e)return this.mainSoundTrack.soundCollection[t];if(this.soundTracks)for(let i=0;i<this.soundTracks.length;i++)for(t=0;t<this.soundTracks[i].soundCollection.length;t++)if(this.soundTracks[i].soundCollection[t].name===e)return this.soundTracks[i].soundCollection[t];return null},Object.defineProperty(d.prototype,"audioEnabled",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),e.audioEnabled},set:function(e){let t=this._getComponent(l.NAME_AUDIO);t||(t=new P(this),this._addComponent(t)),e?t.enableAudio():t.disableAudio()},enumerable:!0,configurable:!0}),Object.defineProperty(d.prototype,"headphone",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),e.headphone},set:function(e){let t=this._getComponent(l.NAME_AUDIO);t||(t=new P(this),this._addComponent(t)),e?t.switchAudioModeForHeadphones():t.switchAudioModeForNormalSpeakers()},enumerable:!0,configurable:!0}),Object.defineProperty(d.prototype,"audioListenerPositionProvider",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),e.audioListenerPositionProvider},set:function(e){let t=this._getComponent(l.NAME_AUDIO);if(t||(t=new P(this),this._addComponent(t)),e&&"function"!=typeof e)throw new Error("The value passed to [Scene.audioListenerPositionProvider] must be a function that returns a Vector3");t.audioListenerPositionProvider=e},enumerable:!0,configurable:!0}),Object.defineProperty(d.prototype,"audioListenerRotationProvider",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),e.audioListenerRotationProvider},set:function(e){let t=this._getComponent(l.NAME_AUDIO);if(t||(t=new P(this),this._addComponent(t)),e&&"function"!=typeof e)throw new Error("The value passed to [Scene.audioListenerRotationProvider] must be a function that returns a Vector3");t.audioListenerRotationProvider=e},enumerable:!0,configurable:!0}),Object.defineProperty(d.prototype,"audioPositioningRefreshRate",{get:function(){let e=this._getComponent(l.NAME_AUDIO);return e||(e=new P(this),this._addComponent(e)),e.audioPositioningRefreshRate},set:function(e){let t=this._getComponent(l.NAME_AUDIO);t||(t=new P(this),this._addComponent(t)),t.audioPositioningRefreshRate=e},enumerable:!0,configurable:!0});class P{get audioEnabled(){return this._audioEnabled}get headphone(){return this._headphone}constructor(e){this.name=l.NAME_AUDIO,this._audioEnabled=!0,this._headphone=!1,this.audioPositioningRefreshRate=500,this.audioListenerPositionProvider=null,this.audioListenerRotationProvider=null,this._cachedCameraDirection=new i,this._cachedCameraPosition=new i,this._lastCheck=0,this._invertMatrixTemp=new h,this._cameraDirectionTemp=new i,(e=e||n.LastCreatedScene)&&(this.scene=e,e.soundTracks=[],e.sounds=[])}register(){this.scene._afterRenderStage.registerStep(l.STEP_AFTERRENDER_AUDIO,this,this._afterRender)}rebuild(){}serialize(e){if(e.sounds=[],this.scene.soundTracks)for(let t=0;t<this.scene.soundTracks.length;t++){const i=this.scene.soundTracks[t];for(let t=0;t<i.soundCollection.length;t++)e.sounds.push(i.soundCollection[t].serialize())}}addFromContainer(e){if(e.sounds)for(const t of e.sounds)t.play(),t.autoplay=!0,this.scene.mainSoundTrack.addSound(t)}removeFromContainer(e,t=!1){if(e.sounds)for(const i of e.sounds)i.stop(),i.autoplay=!1,this.scene.mainSoundTrack.removeSound(i),t&&i.dispose()}dispose(){const e=this.scene;if(e._mainSoundTrack&&e.mainSoundTrack.dispose(),e.soundTracks)for(let t=0;t<e.soundTracks.length;t++)e.soundTracks[t].dispose()}disableAudio(){const t=this.scene;let i;for(this._audioEnabled=!1,e.audioEngine&&e.audioEngine.audioContext&&e.audioEngine.audioContext.suspend(),i=0;i<t.mainSoundTrack.soundCollection.length;i++)t.mainSoundTrack.soundCollection[i].pause();if(t.soundTracks)for(i=0;i<t.soundTracks.length;i++)for(let e=0;e<t.soundTracks[i].soundCollection.length;e++)t.soundTracks[i].soundCollection[e].pause()}enableAudio(){const t=this.scene;let i;for(this._audioEnabled=!0,e.audioEngine&&e.audioEngine.audioContext&&e.audioEngine.audioContext.resume(),i=0;i<t.mainSoundTrack.soundCollection.length;i++)t.mainSoundTrack.soundCollection[i].isPaused&&t.mainSoundTrack.soundCollection[i].play();if(t.soundTracks)for(i=0;i<t.soundTracks.length;i++)for(let e=0;e<t.soundTracks[i].soundCollection.length;e++)t.soundTracks[i].soundCollection[e].isPaused&&t.soundTracks[i].soundCollection[e].play()}switchAudioModeForHeadphones(){const e=this.scene;if(this._headphone=!0,e.mainSoundTrack.switchPanningModelToHRTF(),e.soundTracks)for(let t=0;t<e.soundTracks.length;t++)e.soundTracks[t].switchPanningModelToHRTF()}switchAudioModeForNormalSpeakers(){const e=this.scene;if(this._headphone=!1,e.mainSoundTrack.switchPanningModelToEqualPower(),e.soundTracks)for(let t=0;t<e.soundTracks.length;t++)e.soundTracks[t].switchPanningModelToEqualPower()}_afterRender(){const t=c.Now;if(this._lastCheck&&t-this._lastCheck<this.audioPositioningRefreshRate)return;this._lastCheck=t;const n=this.scene;if(!this._audioEnabled||!n._mainSoundTrack||!n.soundTracks||0===n._mainSoundTrack.soundCollection.length&&1===n.soundTracks.length)return;const o=e.audioEngine;if(o&&o.audioContext){let e,t=n.activeCamera;if(n.activeCameras&&n.activeCameras.length>0&&(t=n.activeCameras[0]),this.audioListenerPositionProvider){const e=this.audioListenerPositionProvider();o.audioContext.listener.setPosition(e.x||0,e.y||0,e.z||0)}else t?this._cachedCameraPosition.equals(t.globalPosition)||(this._cachedCameraPosition.copyFrom(t.globalPosition),o.audioContext.listener.setPosition(t.globalPosition.x,t.globalPosition.y,t.globalPosition.z)):o.audioContext.listener.setPosition(0,0,0);if(this.audioListenerRotationProvider){const e=this.audioListenerRotationProvider();o.audioContext.listener.setOrientation(e.x||0,e.y||0,e.z||0,0,1,0)}else t?(t.rigCameras&&t.rigCameras.length>0&&(t=t.rigCameras[0]),t.getViewMatrix().invertToRef(this._invertMatrixTemp),i.TransformNormalToRef(P._CameraDirection,this._invertMatrixTemp,this._cameraDirectionTemp),this._cameraDirectionTemp.normalize(),isNaN(this._cameraDirectionTemp.x)||isNaN(this._cameraDirectionTemp.y)||isNaN(this._cameraDirectionTemp.z)||this._cachedCameraDirection.equals(this._cameraDirectionTemp)||(this._cachedCameraDirection.copyFrom(this._cameraDirectionTemp),o.audioContext.listener.setOrientation(this._cameraDirectionTemp.x,this._cameraDirectionTemp.y,this._cameraDirectionTemp.z,0,1,0))):o.audioContext.listener.setOrientation(0,0,0,0,1,0);for(e=0;e<n.mainSoundTrack.soundCollection.length;e++){const t=n.mainSoundTrack.soundCollection[e];t.useCustomAttenuation&&t.updateDistanceFromListener()}if(n.soundTracks)for(e=0;e<n.soundTracks.length;e++)for(let t=0;t<n.soundTracks[e].soundCollection.length;t++){const i=n.soundTracks[e].soundCollection[t];i.useCustomAttenuation&&i.updateDistanceFromListener()}}}}P._CameraDirection=new i(0,0,-1),A._SceneComponentInitialization=e=>{let t=e._getComponent(l.NAME_AUDIO);t||(t=new P(e),e._addComponent(t))};const b="MSFT_audio_emitter";class C{constructor(e){this.name=b,this._loader=e,this.enabled=this._loader.isExtensionUsed(b)}dispose(){this._loader=null,this._clips=null,this._emitters=null}onLoading(){const e=this._loader.gltf.extensions;if(e&&e[this.name]){const t=e[this.name];this._clips=t.clips,this._emitters=t.emitters,p.Assign(this._clips),p.Assign(this._emitters)}}loadSceneAsync(e,t){return g.LoadExtensionAsync(e,t,this.name,(async(i,n)=>{const o=new Array;o.push(this._loader.loadSceneAsync(e,t));for(const e of n.emitters){const t=p.Get(`${i}/emitters`,this._emitters,e);if(null!=t.refDistance||null!=t.maxDistance||null!=t.rolloffFactor||null!=t.distanceModel||null!=t.innerAngle||null!=t.outerAngle)throw new Error(`${i}: Direction or Distance properties are not allowed on emitters attached to a scene`);o.push(this._loadEmitterAsync(`${i}/emitters/${t.index}`,t))}await Promise.all(o)}))}loadNodeAsync(e,t,n){return g.LoadExtensionAsync(e,t,this.name,(async(e,o)=>{const a=new Array,r=await this._loader.loadNodeAsync(e,t,(t=>{for(const n of o.emitters){const o=p.Get(`${e}/emitters`,this._emitters,n);a.push(this._loadEmitterAsync(`${e}/emitters/${o.index}`,o).then((()=>{for(const e of o._babylonSounds)e.attachToMesh(t),null==o.innerAngle&&null==o.outerAngle||(e.setLocalDirectionToMesh(i.Forward()),e.setDirectionalCone(2*s.ToDegrees(null==o.innerAngle?Math.PI:o.innerAngle),2*s.ToDegrees(null==o.outerAngle?Math.PI:o.outerAngle),0))})))}n(t)}));return await Promise.all(a),r}))}loadAnimationAsync(e,t){return g.LoadExtensionAsync(e,t,this.name,(async(i,n)=>{const o=await this._loader.loadAnimationAsync(e,t),s=new Array;p.Assign(n.events);for(const a of n.events)s.push(this._loadAnimationEventAsync(`${i}/events/${a.index}`,e,t,a,o));return await Promise.all(s),o}))}_loadClipAsync(e,t){if(t._objectURL)return t._objectURL;let i;if(t.uri)i=this._loader.loadUriAsync(e,t,t.uri);else{const n=p.Get(`${e}/bufferView`,this._loader.gltf.bufferViews,t.bufferView);i=this._loader.loadBufferViewAsync(`/bufferViews/${n.index}`,n)}return t._objectURL=i.then((e=>URL.createObjectURL(new Blob([e],{type:t.mimeType})))),t._objectURL}_loadEmitterAsync(e,t){if(t._babylonSounds=t._babylonSounds||[],!t._babylonData){const e=new Array,i=t.name||`emitter${t.index}`,n={loop:!1,autoplay:!1,volume:null==t.volume?1:t.volume};for(let o=0;o<t.clips.length;o++){const s=`/extensions/${this.name}/clips`,a=p.Get(s,this._clips,t.clips[o].clip);e.push(this._loadClipAsync(`${s}/${t.clips[o].clip}`,a).then((e=>{const s=t._babylonSounds[o]=new A(i,e,this._loader.babylonScene,null,n);s.refDistance=t.refDistance||1,s.maxDistance=t.maxDistance||256,s.rolloffFactor=t.rolloffFactor||1,s.distanceModel=t.distanceModel||"exponential"})))}const o=Promise.all(e).then((()=>{const e=t.clips.map((e=>e.weight||1)),i=new y(t.loop||!1,t._babylonSounds,e);t.innerAngle&&(i.directionalConeInnerAngle=2*s.ToDegrees(t.innerAngle)),t.outerAngle&&(i.directionalConeOuterAngle=2*s.ToDegrees(t.outerAngle)),t.volume&&(i.volume=t.volume),t._babylonData.sound=i}));t._babylonData={loaded:o}}return t._babylonData.loaded}_getEventAction(e,t,i,n,o){switch(i){case"play":return e=>{const i=(o||0)+(e-n);t.play(i)};case"stop":return()=>{t.stop()};case"pause":return()=>{t.pause()};default:throw new Error(`${e}: Unsupported action ${i}`)}}_loadAnimationEventAsync(e,t,i,n,o){if(0==o.targetedAnimations.length)return Promise.resolve();const s=o.targetedAnimations[0],a=n.emitter,r=p.Get(`/extensions/${this.name}/emitters`,this._emitters,a);return this._loadEmitterAsync(e,r).then((()=>{const t=r._babylonData.sound;if(t){const i=new f(n.time,this._getEventAction(e,t,n.action,n.time,n.startOffset));s.animation.addEvent(i),o.onAnimationGroupEndObservable.add((()=>{t.stop()})),o.onAnimationGroupPauseObservable.add((()=>{t.pause()}))}}))}}_(b),m(b,!0,(e=>new C(e)));export{C as MSFT_audio_emitter};
//# sourceMappingURL=MSFT_audio_emitter-Cj8p79XX.esm.min.js.map