public void onFovChanged(
     final HeadMountedDisplay hmd,
     final FieldOfView leftFov,
     final FieldOfView rightFov,
     final float virtualEyeToScreenDistance) {
   if (this.mDrawingFrame) {
     throw new IllegalStateException("Cannot change FOV while rendering a frame.");
   }
   this.mHmd = new HeadMountedDisplay(hmd);
   this.mLeftEyeViewport = this.initViewportForEye(leftFov, 0.0f);
   this.mRightEyeViewport = this.initViewportForEye(rightFov, this.mLeftEyeViewport.width);
   this.mMetersPerTanAngle = virtualEyeToScreenDistance;
   final ScreenParams screen = this.mHmd.getScreenParams();
   this.mXPxPerTanAngle = screen.getWidth() / (screen.getWidthMeters() / this.mMetersPerTanAngle);
   this.mYPxPerTanAngle =
       screen.getHeight() / (screen.getHeightMeters() / this.mMetersPerTanAngle);
   this.mFovsChanged = true;
   this.mViewportsChanged = true;
 }