Spaces:
Running
Running
| /** | |
| * @author mrdoob / http://mrdoob.com/ | |
| */ | |
| import { Vector3 } from '../math/Vector3.js'; | |
| import { Quaternion } from '../math/Quaternion.js'; | |
| import { Audio } from './Audio.js'; | |
| import { Object3D } from '../core/Object3D.js'; | |
| function PositionalAudio( listener ) { | |
| Audio.call( this, listener ); | |
| this.panner = this.context.createPanner(); | |
| this.panner.connect( this.gain ); | |
| } | |
| PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { | |
| constructor: PositionalAudio, | |
| getOutput: function () { | |
| return this.panner; | |
| }, | |
| getRefDistance: function () { | |
| return this.panner.refDistance; | |
| }, | |
| setRefDistance: function ( value ) { | |
| this.panner.refDistance = value; | |
| return this; | |
| }, | |
| getRolloffFactor: function () { | |
| return this.panner.rolloffFactor; | |
| }, | |
| setRolloffFactor: function ( value ) { | |
| this.panner.rolloffFactor = value; | |
| return this; | |
| }, | |
| getDistanceModel: function () { | |
| return this.panner.distanceModel; | |
| }, | |
| setDistanceModel: function ( value ) { | |
| this.panner.distanceModel = value; | |
| return this; | |
| }, | |
| getMaxDistance: function () { | |
| return this.panner.maxDistance; | |
| }, | |
| setMaxDistance: function ( value ) { | |
| this.panner.maxDistance = value; | |
| return this; | |
| }, | |
| setDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) { | |
| this.panner.coneInnerAngle = coneInnerAngle; | |
| this.panner.coneOuterAngle = coneOuterAngle; | |
| this.panner.coneOuterGain = coneOuterGain; | |
| return this; | |
| }, | |
| updateMatrixWorld: ( function () { | |
| var position = new Vector3(); | |
| var quaternion = new Quaternion(); | |
| var scale = new Vector3(); | |
| var orientation = new Vector3(); | |
| return function updateMatrixWorld( force ) { | |
| Object3D.prototype.updateMatrixWorld.call( this, force ); | |
| if ( this.hasPlaybackControl === true && this.isPlaying === false ) return; | |
| this.matrixWorld.decompose( position, quaternion, scale ); | |
| orientation.set( 0, 0, 1 ).applyQuaternion( quaternion ); | |
| var panner = this.panner; | |
| if ( panner.positionX ) { | |
| // code path for Chrome and Firefox (see #14393) | |
| var 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 }; | |