updateMatrixWorld method
force
- A boolean that can be used to bypass
matrixWorldAutoUpdate, to recalculate the world matrix of the
object and descendants on the current frame. Useful if you cannot wait for
the renderer to update it on the next frame (assuming
matrixWorldAutoUpdate set to true
).
Updates the global transform of the object and its descendants if the
world matrix needs update (matrixWorldNeedsUpdate set to true) or
if the force
parameter is set to true
.
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);
}
}