@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.37 kB
JavaScript
import{math as t}from"../../core/math/math.js";import{Vec3 as i}from"../../core/math/vec3.js";import{DISTANCE_INVERSE as e,DISTANCE_LINEAR as n,DISTANCE_EXPONENTIAL as s}from"./constants.js";import{hasAudioContext as o}from"./capabilities.js";import{Channel as c}from"./channel.js";class r extends c{constructor(t,n,s){super(t,n,s),this.position=new i,this.velocity=new i,o()?this.panner=t.context.createPanner():(this.maxDistance=1e4,this.minDistance=1,this.rollOffFactor=1,this.distanceModel=e)}getPosition(){return this.position}setPosition(t){this.position.copy(t);const i=this.panner;"positionX"in i?(i.positionX.value=t.x,i.positionY.value=t.y,i.positionZ.value=t.z):i.setPosition&&i.setPosition(t.x,t.y,t.z)}getVelocity(){return this.velocity}setVelocity(t){this.velocity.copy(t)}getMaxDistance(){return this.panner.maxDistance}setMaxDistance(t){this.panner.maxDistance=t}getMinDistance(){return this.panner.refDistance}setMinDistance(t){this.panner.refDistance=t}getRollOffFactor(){return this.panner.rolloffFactor}setRollOffFactor(t){this.panner.rolloffFactor=t}getDistanceModel(){return this.panner.distanceModel}setDistanceModel(t){this.panner.distanceModel=t}_createSource(){const t=this.manager.context;this.source=t.createBufferSource(),this.source.buffer=this.sound.buffer,this.source.connect(this.panner),this.panner.connect(this.gain),this.gain.connect(t.destination),this.loop||(this.source.onended=this.pause.bind(this))}}if(!o()){let o=new i;const c=function(i,c,r,a,h,l){o=o.sub2(i,c);const f=o.length();if(f<r)return 1;if(f>a)return 0;let u=0;return l===n?u=1-h*(f-r)/(a-r):l===e?u=r/(r+h*(f-r)):l===s&&(u=Math.pow(f/r,-h)),t.clamp(u,0,1)};Object.assign(r.prototype,{setPosition:function(t){if(this.position.copy(t),this.source){const t=this.manager.listener.getPosition(),i=c(t,this.position,this.minDistance,this.maxDistance,this.rollOffFactor,this.distanceModel),e=this.getVolume();this.source.volume=e*i}},getMaxDistance:function(){return this.maxDistance},setMaxDistance:function(t){this.maxDistance=t},getMinDistance:function(){return this.minDistance},setMinDistance:function(t){this.minDistance=t},getRollOffFactor:function(){return this.rollOffFactor},setRollOffFactor:function(t){this.rollOffFactor=t},getDistanceModel:function(){return this.distanceModel},setDistanceModel:function(t){this.distanceModel=t}})}export{r as Channel3d};