import { Vector3 } from '../math/Vector3.js'; import { Quaternion } from '../math/Quaternion.js'; import { Audio } from './Audio.js'; const _position = /*@__PURE__*/ new Vector3(); const _quaternion = /*@__PURE__*/ new Quaternion(); const _scale = /*@__PURE__*/ new Vector3(); const _orientation = /*@__PURE__*/ new Vector3(); class PositionalAudio extends Audio { constructor(listener) { super(listener); this.panner = this.context.createPanner(); this.panner.panningModel = 'HRTF'; this.panner.connect(this.gain); } getOutput() { return this.panner; } getRefDistance() { return this.panner.refDistance; } setRefDistance(value) { this.panner.refDistance = value; return this; } getRolloffFactor() { return this.panner.rolloffFactor; } setRolloffFactor(value) { this.panner.rolloffFactor = value; return this; } getDistanceModel() { return this.panner.distanceModel; } setDistanceModel(value) { this.panner.distanceModel = value; return this; } getMaxDistance() { return this.panner.maxDistance; } setMaxDistance(value) { this.panner.maxDistance = value; return this; } setDirectionalCone(coneInnerAngle, coneOuterAngle, coneOuterGain) { this.panner.coneInnerAngle = coneInnerAngle; this.panner.coneOuterAngle = coneOuterAngle; this.panner.coneOuterGain = coneOuterGain; return this; } updateMatrixWorld(force) { super.updateMatrixWorld(force); if (this.hasPlaybackControl === true && this.isPlaying === false) return; this.matrixWorld.decompose(_position, _quaternion, _scale); _orientation.set(0, 0, 1).applyQuaternion(_quaternion); const panner = this.panner; if (panner.positionX) { // code path for Chrome and Firefox (see #14393) const endTime = this.context.currentTime + this.listener.timeDelta; panner.positionX.linearRampToValueAtTime(_position.x, endTime); panner.positionY.linearRampToValueAtTime(_position.y, endTime); panner.positionZ.linearRampToValueAtTime(_position.z, endTime); panner.orientationX.linearRampToValueAtTime(_orientation.x, endTime); panner.orientationY.linearRampToValueAtTime(_orientation.y, endTime); panner.orientationZ.linearRampToValueAtTime(_orientation.z, endTime); } else { panner.setPosition(_position.x, _position.y, _position.z); panner.setOrientation(_orientation.x, _orientation.y, _orientation.z); } } } export { PositionalAudio };