updateCamera method

  1. @override
void updateCamera(
  1. Camera camera
)
override

Updates the state of the XR camera. Use this method on app level if you set cameraAutoUpdatetofalse`. The method requires the non-XR camera of the scene as a parameter. The passed in camera's transformation is automatically adjusted to the position of the XR camera when calling this method.

@param {Camera} camera - The camera.

Implementation

@override
void updateCamera(Camera camera ) {
  if ( session == null ) return;
  double depthNear = camera.near;
  double depthFar = camera.far;

  if ( depthSensing.texture != null ) {
    if ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;
    if ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;
  }

  cameraXR.near = cameraR.near = cameraL.near = depthNear;
  cameraXR.far = cameraR.far = cameraL.far = depthFar;

  if ( _currentDepthNear != cameraXR.near || _currentDepthFar != cameraXR.far ) {
    // Note that the new renderState won't apply until the next frame. See #18320
    session?.updateRenderState({
      'depthNear': cameraXR.near,
      'depthFar': cameraXR.far
    }.jsify());

    _currentDepthNear = cameraXR.near;
    _currentDepthFar = cameraXR.far;
  }

  cameraL.layers.mask = camera.layers.mask | int.parse("010", radix: 2);
  cameraR.layers.mask = camera.layers.mask | int.parse("100", radix: 2);
  cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask;

  final parent = camera.parent;
  final cameras = cameraXR.cameras;

  _updateCamera( cameraXR, parent );

  for (int i = 0; i < cameras.length; i ++ ) {
    _updateCamera( cameras[ i ], parent );
  }

  // update projection matrix for proper view frustum culling

  if ( cameras.length == 2 ) {
    setProjectionFromUnion( cameraXR, cameraL, cameraR );
  }
  else {
    // assume single camera setup (AR)
    cameraXR.projectionMatrix.setFrom( cameraL.projectionMatrix );
  }

  // update user camera and its children
  updateUserCamera( camera, cameraXR, parent );
}