updateMatrixWorld method

  1. @override
void updateMatrixWorld([
  1. 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);
  }
	}