starry / backend /libs /three /audio /PositionalAudio.js
k-l-lambda's picture
feat: add Python ML services (CPU mode) with model download
2b7aae2
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 };