updateMatrixWorld method
void
updateMatrixWorld(
[ - bool force = false
])
Implementation
@override
void updateMatrixWorld([bool force = false]) {
super.updateMatrixWorld( force );
if (hasPlaybackControl && !isPlaying) return;
matrixWorld.decompose( _position, _quaternion, _scale );
_orientation.setValues( 0, 0, 1 ).applyQuaternion( _quaternion );
final dist = _position.distanceTo(listner.position);
// Sphere of influence
if(dist <= maxDistance){
if(_insideAudioArea(_position.clone(),_orientation,listner.position.clone(),coneOuterAngle).inside){ //is inside cone
//check balance
_AudioArea aa = _insideAudioArea(_position.clone(),_orientation,listner.position.clone(),coneInnerAngle);
final diffAngle = (coneOuterAngle-coneInnerAngle)/2;
final double anglePercent = aa.inside?1:(coneOuterAngle/2-aa.angle)/diffAngle;
//check volume
if(dist >= refDistance && dist <= maxDistance){
//dist to percent
final double percent = ((maxDistance-dist)/(maxDistance-refDistance)).toPrecision(rolloffFactor)*anglePercent;
if(getVolume() != percent){
setVolume(percent);
}
}
else if(dist <= refDistance && getVolume() != 1.0){
setVolume(1.0);
}
else if(dist > refDistance && getVolume() != 0.0){
setVolume(0);
}
if(!aa.inside){ ///is not inside little cone
// dist from little cone
if(getBalance() != anglePercent){
setBalance((1-anglePercent)*-aa.side);
}
}
else if(getBalance() != 0.0){
setBalance(0.0);
}
}
else{ // is inside little sphere
if(dist <= refDistance){
//dist to percent
final double percent = ((refDistance-dist)/refDistance).toPrecision(rolloffFactor);
if(getVolume() != percent){
setVolume(percent);
}
}
else if(dist == 0 && getVolume() != 1.0){
setVolume(1.0);
}
else if(dist > refDistance && getVolume() != 0.0){
setVolume(0);
}
}
}
else if(getVolume() != 0.0){
setVolume(0);
}
}