@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.77 kB
JavaScript
import{math as t}from"../../core/math/math.js";import{Vec3 as e}from"../../core/math/vec3.js";import{DISTANCE_LINEAR as i,DISTANCE_INVERSE as n,DISTANCE_EXPONENTIAL as o}from"../audio/constants.js";import{hasAudioContext as s}from"../audio/capabilities.js";import{SoundInstance as r}from"./instance.js";class a extends r{constructor(t,n,o={}){super(t,n,o),this._position=new e,this._velocity=new e,o.position&&(this.position=o.position),this.maxDistance=void 0!==o.maxDistance?Number(o.maxDistance):1e4,this.refDistance=void 0!==o.refDistance?Number(o.refDistance):1,this.rollOffFactor=void 0!==o.rollOffFactor?Number(o.rollOffFactor):1,this.distanceModel=void 0!==o.distanceModel?o.distanceModel:i}_initializeNodes(){this.gain=this._manager.context.createGain(),this.panner=this._manager.context.createPanner(),this.panner.connect(this.gain),this._inputNode=this.panner,this._connectorNode=this.gain,this._connectorNode.connect(this._manager.context.destination)}set position(t){this._position.copy(t);const e=this.panner;"positionX"in e?(e.positionX.value=t.x,e.positionY.value=t.y,e.positionZ.value=t.z):e.setPosition&&e.setPosition(t.x,t.y,t.z)}get position(){return this._position}set velocity(t){this._velocity.copy(t)}get velocity(){return this._velocity}set maxDistance(t){this.panner.maxDistance=t}get maxDistance(){return this.panner.maxDistance}set refDistance(t){this.panner.refDistance=t}get refDistance(){return this.panner.refDistance}set rollOffFactor(t){this.panner.rolloffFactor=t}get rollOffFactor(){return this.panner.rolloffFactor}set distanceModel(t){this.panner.distanceModel=t}get distanceModel(){return this.panner.distanceModel}}if(!s()){let s=new e;const r=function(e,r,a,c,f,h){s=s.sub2(e,r);const p=s.length();if(p<a)return 1;if(p>c)return 0;let l=0;return h===i?l=1-f*(p-a)/(c-a):h===n?l=a/(a+f*(p-a)):h===o&&(l=Math.pow(p/a,-f)),t.clamp(l,0,1)};Object.defineProperty(a.prototype,"position",{get:function(){return this._position},set:function(t){if(this._position.copy(t),this.source){const t=this._manager.listener.getPosition(),e=r(t,this._position,this.refDistance,this.maxDistance,this.rollOffFactor,this.distanceModel),i=this.volume;this.source.volume=i*e*this._manager.volume}}}),Object.defineProperty(a.prototype,"maxDistance",{get:function(){return this._maxDistance},set:function(t){this._maxDistance=t}}),Object.defineProperty(a.prototype,"refDistance",{get:function(){return this._refDistance},set:function(t){this._refDistance=t}}),Object.defineProperty(a.prototype,"rollOffFactor",{get:function(){return this._rollOffFactor},set:function(t){this._rollOffFactor=t}}),Object.defineProperty(a.prototype,"distanceModel",{get:function(){return this._distanceModel},set:function(t){this._distanceModel=t}})}export{a as SoundInstance3d};