updateMatrixWorld method

  1. @override
void updateMatrixWorld([
  1. bool force = false
])
override

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);
  }
	}