/** Called once per frame, before {@link #onDrawEyeView(int, float)}. */
  void onDrawFrame() {

    GVRPerspectiveCamera centerCamera = mMainScene.getMainCameraRig().getCenterCamera();
    cull(
        mMainScene.getNative(),
        centerCamera.getNative(),
        mRenderBundle.getMaterialShaderManager().getNative());

    if (mCurrentEye == 1) {
      mActivity.setCamera(mMainScene.getMainCameraRig().getLeftCamera());
    } else {
      mActivity.setCamera(mMainScene.getMainCameraRig().getRightCamera());
    }
  }
  private void renderSixCamerasAndReadback(final GVRCameraRig mainCameraRig, byte[][] byteArrays) {
    if (byteArrays.length != 6) {
      throw new IllegalArgumentException("byteArrays length is not 6.");
    } else {
      // temporarily create a center camera
      GVRPerspectiveCamera centerCamera = new GVRPerspectiveCamera(this);
      centerCamera.setFovY(90.0f);
      centerCamera.setRenderMask(GVRRenderMaskBit.Left | GVRRenderMaskBit.Right);
      GVRSceneObject centerCameraObject = new GVRSceneObject(this);
      centerCameraObject.attachCamera(centerCamera);
      mainCameraRig.getOwnerObject().addChildObject(centerCameraObject);
      GVRTransform centerCameraTransform = centerCameraObject.getTransform();

      int index = 0;
      // render +x face
      centerCameraTransform.rotateByAxis(-90, 0, 1, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      // render -x face
      centerCameraTransform.rotateByAxis(180, 0, 1, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      // render +y face
      centerCameraTransform.rotateByAxis(-90, 0, 1, 0);
      centerCameraTransform.rotateByAxis(90, 1, 0, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      // render -y face
      centerCameraTransform.rotateByAxis(180, 1, 0, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      // render +z face
      centerCameraTransform.rotateByAxis(90, 1, 0, 0);
      centerCameraTransform.rotateByAxis(180, 0, 1, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      // render -z face
      centerCameraTransform.rotateByAxis(180, 0, 1, 0);
      renderOneCameraAndAddToList(centerCamera, byteArrays, index++);

      centerCameraObject.detachCamera();
      mainCameraRig.getOwnerObject().removeChildObject(centerCameraObject);
    }
  }
  /**
   * Constructs GVRViewManager object with GVRScript which controls GL activities
   *
   * @param gvrActivity Current activity object
   * @param gvrScript {@link GVRScript} which describes
   * @param distortionDataFileName distortion filename under assets folder
   */
  GVRViewManager(GVRActivity gvrActivity, GVRScript gvrScript, GVRXMLParser xmlParser) {
    super(gvrActivity);

    // Clear singletons and per-run data structures
    resetOnRestart();

    GVRAsynchronousResourceLoader.setup(this);

    /*
     * Links with the script.
     */
    mScript = gvrScript;
    mActivity = gvrActivity;

    /*
     * Starts listening to the sensor.
     */
    mRotationSensor = new RotationSensor(gvrActivity, this);

    /*
     * Sets things with the numbers in the xml.
     */
    DisplayMetrics metrics = new DisplayMetrics();
    gvrActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

    final float INCH_TO_METERS = 0.0254f;
    int screenWidthPixels = metrics.widthPixels;
    int screenHeightPixels = metrics.heightPixels;
    float screenWidthMeters = (float) screenWidthPixels / metrics.xdpi * INCH_TO_METERS;
    float screenHeightMeters = (float) screenHeightPixels / metrics.ydpi * INCH_TO_METERS;

    mLensInfo =
        new GVRLensInfo(
            screenWidthPixels,
            screenHeightPixels,
            screenWidthMeters,
            screenHeightMeters,
            gvrActivity.getAppSettings());

    GVRPerspectiveCamera.setDefaultFovY(gvrActivity.getAppSettings().getEyeBufferParms().getFovY());
    // Different width/height aspect ratio makes the rendered screen warped
    // when the screen rotates
    // GVRPerspectiveCamera.setDefaultAspectRatio(mLensInfo
    // .getRealScreenWidthMeters()
    // / mLensInfo.getRealScreenHeightMeters());
    mInputManager = new GVRInputManagerImpl(this);

    mEventManager = new GVREventManager(this);
    mScriptManager = new GVRScriptManager(this);
  }