private void UpdateProjection() { if (!VuforiaRuntimeUtilities.IsVuforiaEnabled()) { return; } this.mLastAppliedNearClipPlane = this.mPrimaryCamera.nearClipPlane; this.mLastAppliedFarClipPlane = this.mPrimaryCamera.farClipPlane; this.mLastAppliedFoV = this.mPrimaryCamera.fieldOfView; Device instance = Device.Instance; this.mPrimaryCamera.projectionMatrix = instance.GetProjectionMatrix(View.VIEW_SINGULAR, this.mLastAppliedNearClipPlane, this.mLastAppliedFarClipPlane, this.mProjectionOrientation); if (Device.Instance.GetMode() == Device.Mode.MODE_VR) { float targetHorizontalFoVDeg = CameraConfigurationUtility.CalculateHorizontalFoVFromViewPortAspect(this.mLastAppliedFoV, (float)this.mCameraViewPortWidth / (float)this.mCameraViewPortHeight); this.mPrimaryCamera.projectionMatrix = CameraConfigurationUtility.ScalePerspectiveProjectionMatrix(this.mPrimaryCamera.projectionMatrix, this.mLastAppliedFoV, targetHorizontalFoVDeg); } else { CameraConfigurationUtility.SetFovForCustomProjection(this.mPrimaryCamera); this.mLastAppliedFoV = this.mPrimaryCamera.fieldOfView; } this.mPrimaryCamera.transform.localPosition = new Vector3(0f, 0f, 0f); this.mPrimaryCamera.transform.localRotation = Quaternion.identity; }
public static float ExtractHorizontalCameraFoV(Matrix4x4 inverseProjMatrix) { Vector3 arg_22_0 = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MAX_LEFT); Vector3 vector = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MAX_RIGHT); return(Vector3.Angle(arg_22_0, vector)); }
protected void ComputeViewPortRect(int leftCameraViewPortHeight, int leftCameraViewPortWidth) { float num = CameraConfigurationUtility.ExtractVerticalCameraFoV(this.mPrimaryCamera.projectionMatrix.inverse) * 0.0174532924f; float num2 = (float)(Math.Tan((double)(CameraDevice.Instance.GetCameraFieldOfViewRads().y / 2f)) / Math.Tan((double)(num / 2f))); float num3 = (float)leftCameraViewPortHeight * num2; CameraDevice.VideoModeData videoMode = CameraDevice.Instance.GetVideoMode(this.mCameraDeviceMode); ScreenOrientation surfaceOrientation = SurfaceUtilities.GetSurfaceOrientation(); float num4; if (surfaceOrientation == ScreenOrientation.Landscape || surfaceOrientation == ScreenOrientation.LandscapeLeft || surfaceOrientation == ScreenOrientation.LandscapeRight) { num4 = num3 * (float)videoMode.width / (float)videoMode.height; } else { num4 = num3 * (float)videoMode.height / (float)videoMode.width; } int num5 = (leftCameraViewPortWidth - (int)num4) / 2; int num6 = (leftCameraViewPortHeight - (int)num3) / 2; this.mVideoBackgroundViewportRect = new Rect((float)num5, (float)num6, (float)((int)num4), (float)((int)num3)); if (base.IsVideoBackgroundEnabled()) { this.mVideoBackgroundBehaviours[this.mPrimaryCamera].ApplyStereoDepthToMatrices(); this.mVideoBackgroundBehaviours[this.mSecondaryCamera].ApplyStereoDepthToMatrices(); } }
public static float ExtractVerticalCameraFoV(Matrix4x4 inverseProjMatrix) { Vector3 arg_22_0 = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MAX_BOTTOM); Vector3 vector = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MAX_TOP); return(Vector3.Angle(arg_22_0, vector)); }
public void ApplyCorrectedProjectionMatrix(Matrix4x4 projectionMatrix, bool primaryCamera) { Matrix4x4 inverse = projectionMatrix.inverse; if (primaryCamera) { this.mExternallySetLeftMatrix = projectionMatrix; CameraConfigurationUtility.ExtractCameraClippingPlanes(inverse, out this.mNewLeftNearClipPlane, out this.mNewLeftFarClipPlane); this.mNewLeftVerticalVirtualFoV = CameraConfigurationUtility.ExtractVerticalCameraFoV(inverse); this.mNewLeftHorizontalVirtualFoV = CameraConfigurationUtility.ExtractHorizontalCameraFoV(inverse); } else { this.mExternallySetRightMatrix = projectionMatrix; CameraConfigurationUtility.ExtractCameraClippingPlanes(inverse, out this.mNewRightNearClipPlane, out this.mNewRightFarClipPlane); this.mNewRightVerticalVirtualFoV = CameraConfigurationUtility.ExtractVerticalCameraFoV(inverse); this.mNewRightHorizontalVirtualFoV = CameraConfigurationUtility.ExtractHorizontalCameraFoV(inverse); } if (this.CameraParameterChanged()) { ScreenOrientation screenOrientation; this.CheckForSurfaceChanges(out screenOrientation); } this.mPrimaryCamera.projectionMatrix = this.mLastAppliedLeftProjection; this.mSecondaryCamera.projectionMatrix = this.mLastAppliedRightProjection; if (base.IsVideoBackgroundEnabled()) { this.mVideoBackgroundBehaviours[this.mPrimaryCamera].ApplyStereoDepthToMatrices(); this.mVideoBackgroundBehaviours[this.mSecondaryCamera].ApplyStereoDepthToMatrices(); } }
public static void ExtractCameraClippingPlanes(Matrix4x4 inverseProjMatrix, out float near, out float far) { Vector3 vector = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MIN_CENTER); Vector3 vector2 = CameraConfigurationUtility.HomogenizedVec3(inverseProjMatrix * CameraConfigurationUtility.MAX_CENTER); near = vector.z * -1f; far = vector2.z * -1f; }
protected override void UpdateProjection() { if (!VuforiaRuntimeUtilities.IsVuforiaEnabled()) { return; } Device instance = Device.Instance; this.mLastAppliedLeftNearClipPlane = this.mPrimaryCamera.nearClipPlane; this.mLastAppliedLeftFarClipPlane = this.mPrimaryCamera.farClipPlane; this.mLastAppliedRightNearClipPlane = this.mSecondaryCamera.nearClipPlane; this.mLastAppliedRightFarClipPlane = this.mSecondaryCamera.farClipPlane; Matrix4x4 projectionMatrix = instance.GetProjectionMatrix(View.VIEW_LEFTEYE, this.mLastAppliedLeftNearClipPlane, this.mLastAppliedLeftFarClipPlane, this.mProjectionOrientation); Matrix4x4 projectionMatrix2 = instance.GetProjectionMatrix(View.VIEW_RIGHTEYE, this.mLastAppliedRightNearClipPlane, this.mLastAppliedRightFarClipPlane, this.mProjectionOrientation); this.mPrimaryCamera.transform.localPosition = new Vector3(-0.5f * this.mCameraOffset, 0f, 0f); this.mSecondaryCamera.transform.localPosition = new Vector3(0.5f * this.mCameraOffset, 0f, 0f); int width; int height; if (this.mIsDistorted) { instance.GetTextureSize(View.VIEW_POSTPROCESS, out width, out height); } else { width = Screen.width; height = Screen.height; } this.mPrimaryCamera.rect = instance.GetNormalizedViewport(View.VIEW_LEFTEYE); this.mSecondaryCamera.rect = instance.GetNormalizedViewport(View.VIEW_RIGHTEYE); int num = (int)((float)width * this.mPrimaryCamera.rect.width); int num2 = (int)((float)height * this.mPrimaryCamera.rect.height); int num3 = (int)((float)width * this.mSecondaryCamera.rect.width); int num4 = (int)((float)height * this.mSecondaryCamera.rect.height); Vector4 effectiveFovRads = Device.Instance.GetEffectiveFovRads(View.VIEW_LEFTEYE); Vector4 effectiveFovRads2 = Device.Instance.GetEffectiveFovRads(View.VIEW_RIGHTEYE); float num5 = (effectiveFovRads.x + effectiveFovRads.y) * 57.29578f; float targetVerticalFoVDeg = CameraConfigurationUtility.CalculateVerticalFoVFromViewPortAspect(num5, (float)num / (float)num2); float num6 = (effectiveFovRads2.x + effectiveFovRads2.y) * 57.29578f; float targetVerticalFoVDeg2 = CameraConfigurationUtility.CalculateVerticalFoVFromViewPortAspect(num6, (float)num3 / (float)num4); this.mPrimaryCamera.projectionMatrix = CameraConfigurationUtility.ScalePerspectiveProjectionMatrix(projectionMatrix, targetVerticalFoVDeg, num5); this.mSecondaryCamera.projectionMatrix = CameraConfigurationUtility.ScalePerspectiveProjectionMatrix(projectionMatrix2, targetVerticalFoVDeg2, num6); Vector2 skewingValues = new Vector2(this.mPrimaryCamera.projectionMatrix[0, 2], this.mPrimaryCamera.projectionMatrix[1, 2]); Vector2 viewportCentreToEyeAxis = instance.GetViewportCentreToEyeAxis(View.VIEW_LEFTEYE); this.mVideoBackgroundBehaviours[this.mPrimaryCamera].SetVuforiaFrustumSkewValues(skewingValues, viewportCentreToEyeAxis); Vector2 skewingValues2 = new Vector2(this.mSecondaryCamera.projectionMatrix[0, 2], this.mSecondaryCamera.projectionMatrix[1, 2]); Vector2 viewportCentreToEyeAxis2 = instance.GetViewportCentreToEyeAxis(View.VIEW_RIGHTEYE); this.mVideoBackgroundBehaviours[this.mSecondaryCamera].SetVuforiaFrustumSkewValues(skewingValues2, viewportCentreToEyeAxis2); CameraConfigurationUtility.SetFovForCustomProjection(this.mPrimaryCamera); CameraConfigurationUtility.SetFovForCustomProjection(this.mSecondaryCamera); base.ComputeViewPortRect(num2, num); }
public ExternalStereoCameraConfiguration(Camera leftCamera, Camera rightCamera) : base(leftCamera, rightCamera) { this.mNewLeftNearClipPlane = leftCamera.nearClipPlane; this.mNewLeftFarClipPlane = leftCamera.farClipPlane; this.mNewLeftVerticalVirtualFoV = leftCamera.fieldOfView; this.mNewLeftHorizontalVirtualFoV = CameraConfigurationUtility.CalculateHorizontalFoVFromViewPortAspect(leftCamera.fieldOfView, leftCamera.aspect); this.mNewRightNearClipPlane = rightCamera.nearClipPlane; this.mNewRightFarClipPlane = rightCamera.farClipPlane; this.mNewRightVerticalVirtualFoV = rightCamera.fieldOfView; this.mNewRightHorizontalVirtualFoV = CameraConfigurationUtility.CalculateHorizontalFoVFromViewPortAspect(rightCamera.fieldOfView, rightCamera.aspect); }
public static Matrix4x4 ScalePerspectiveProjectionMatrix(Matrix4x4 inputMatrix, float targetVerticalFoVDeg, float targetHorizontalFoVDeg) { Matrix4x4 result = inputMatrix; float num = targetVerticalFoVDeg * 0.0174532924f; float num2 = targetHorizontalFoVDeg * 0.0174532924f; double arg_3C_0 = (double)(CameraConfigurationUtility.ExtractVerticalCameraFoV(inputMatrix.inverse) * 0.0174532924f); float num3 = CameraConfigurationUtility.ExtractHorizontalCameraFoV(inputMatrix.inverse) * 0.0174532924f; float num4 = (float)(Math.Tan(arg_3C_0 / (double)2f) / Math.Tan((double)(num / 2f))); float num5 = (float)(Math.Tan((double)(num3 / 2f)) / Math.Tan((double)(num2 / 2f))); result[0] = result[0] * num5; result[8] = result[8] * num5; result[5] = result[5] * num4; result[9] = result[9] * num4; return(result); }
private void ApplyMatrix(Camera cam, Matrix4x4 inputMatrix) { if (this.mVideoBackgroundViewportRect.width != (float)this.mScreenWidth) { float num = this.mVideoBackgroundViewportRect.width / (float)this.mScreenWidth * 2f; inputMatrix[0] = inputMatrix[0] * num; inputMatrix[8] = inputMatrix[8] * num; } if (this.mVideoBackgroundViewportRect.height != (float)this.mScreenHeight) { float num2 = this.mVideoBackgroundViewportRect.height / (float)this.mScreenHeight; inputMatrix[5] = inputMatrix[5] * num2; inputMatrix[9] = inputMatrix[9] * num2; } cam.projectionMatrix = inputMatrix; CameraConfigurationUtility.SetFovForCustomProjection(cam); }
protected override void UpdateProjection() { if (!VuforiaRuntimeUtilities.IsVuforiaEnabled()) { return; } Device instance = Device.Instance; this.mLastAppliedLeftNearClipPlane = this.mNewLeftNearClipPlane; this.mLastAppliedLeftFarClipPlane = this.mNewLeftFarClipPlane; this.mLastAppliedLeftVerticalVirtualFoV = this.mNewLeftVerticalVirtualFoV; this.mLastAppliedLeftHorizontalVirtualFoV = this.mNewLeftHorizontalVirtualFoV; this.mLastAppliedRightNearClipPlane = this.mNewRightNearClipPlane; this.mLastAppliedRightFarClipPlane = this.mNewRightFarClipPlane; this.mLastAppliedRightVerticalVirtualFoV = this.mNewRightVerticalVirtualFoV; this.mLastAppliedRightHorizontalVirtualFoV = this.mNewRightHorizontalVirtualFoV; if (Device.Instance.GetMode() == Device.Mode.MODE_AR) { Matrix4x4 projectionMatrix = instance.GetProjectionMatrix(View.VIEW_LEFTEYE, this.mLastAppliedLeftNearClipPlane, this.mLastAppliedLeftFarClipPlane, this.mProjectionOrientation); Matrix4x4 projectionMatrix2 = instance.GetProjectionMatrix(View.VIEW_RIGHTEYE, this.mLastAppliedRightNearClipPlane, this.mLastAppliedRightFarClipPlane, this.mProjectionOrientation); this.mPrimaryCamera.projectionMatrix = CameraConfigurationUtility.ScalePerspectiveProjectionMatrix(projectionMatrix, this.mLastAppliedLeftVerticalVirtualFoV, this.mLastAppliedLeftHorizontalVirtualFoV); this.mSecondaryCamera.projectionMatrix = CameraConfigurationUtility.ScalePerspectiveProjectionMatrix(projectionMatrix2, this.mLastAppliedLeftVerticalVirtualFoV, this.mLastAppliedLeftHorizontalVirtualFoV); Vector2 skewingValues = new Vector2(this.mPrimaryCamera.projectionMatrix[0, 2], this.mPrimaryCamera.projectionMatrix[1, 2]); this.mVideoBackgroundBehaviours[this.mPrimaryCamera].SetVuforiaFrustumSkewValues(skewingValues, Vector2.zero); Vector2 skewingValues2 = new Vector2(this.mSecondaryCamera.projectionMatrix[0, 2], this.mSecondaryCamera.projectionMatrix[1, 2]); this.mVideoBackgroundBehaviours[this.mSecondaryCamera].SetVuforiaFrustumSkewValues(skewingValues2, Vector2.zero); } else { this.mPrimaryCamera.projectionMatrix = this.mExternallySetLeftMatrix; this.mSecondaryCamera.projectionMatrix = this.mExternallySetRightMatrix; this.mVideoBackgroundBehaviours[this.mPrimaryCamera].SetVuforiaFrustumSkewValues(Vector2.zero, Vector2.zero); this.mVideoBackgroundBehaviours[this.mSecondaryCamera].SetVuforiaFrustumSkewValues(Vector2.zero, Vector2.zero); } CameraConfigurationUtility.SetFovForCustomProjection(this.mPrimaryCamera); CameraConfigurationUtility.SetFovForCustomProjection(this.mSecondaryCamera); this.mLastAppliedLeftProjection = this.mPrimaryCamera.projectionMatrix; this.mLastAppliedRightProjection = this.mSecondaryCamera.projectionMatrix; int pixelWidthInt = this.mPrimaryCamera.GetPixelWidthInt(); int pixelHeightInt = this.mPrimaryCamera.GetPixelHeightInt(); base.ComputeViewPortRect(pixelHeightInt, pixelWidthInt); }