private void adjustViewMatrix(Camera.StereoscopicEye eye, float baselineAdjust) { float eyeOffset = eye == Camera.StereoscopicEye.Left ? 1 : -1; Vector3 ipdOffset = eyeOffset * Vector3.right * baselineAdjust * 0.5f; Vector3 providerForwardOffset = Vector3.zero, providerVerticalOffset = Vector3.zero; Quaternion providerRotation = Quaternion.Euler(0f, 180f, 0f); if (_provider is LeapXRServiceProvider || _provider.GetType().BaseType == typeof(LeapXRServiceProvider)) { LeapXRServiceProvider _xrProvider = _provider as LeapXRServiceProvider; providerForwardOffset = Vector3.forward * _xrProvider.deviceOffsetZAxis; providerVerticalOffset = -Vector3.up * _xrProvider.deviceOffsetYAxis; providerRotation = Quaternion.AngleAxis(_xrProvider.deviceTiltXAxis, Vector3.right); } else { Matrix4x4 imageMatWarp = _camera.projectionMatrix * Matrix4x4.TRS(Vector3.zero, providerRotation, Vector3.one) * _camera.projectionMatrix.inverse; Shader.SetGlobalMatrix("_LeapGlobalWarpedOffset", imageMatWarp); } var existingMatrix = _camera.GetStereoViewMatrix(eye); _camera.SetStereoViewMatrix(eye, Matrix4x4.TRS(Vector3.zero, providerRotation, Vector3.one) * Matrix4x4.Translate(providerForwardOffset + ipdOffset) * Matrix4x4.Translate(providerVerticalOffset) * existingMatrix); }
public override void OnSceneGUI() { LeapXRServiceProvider xrProvider = target as LeapXRServiceProvider; if (serializedObject.FindProperty("_deviceOffsetMode").enumValueIndex == 2 && xrProvider.deviceOrigin != null) { controllerOffset = xrProvider.transform.InverseTransformPoint(xrProvider.deviceOrigin.position); deviceRotation = Quaternion.Inverse(xrProvider.transform.rotation) * xrProvider.deviceOrigin.rotation * Quaternion.Euler(90f, 0f, 0f); } else { var vrProvider = target as LeapXRServiceProvider; deviceRotation = Quaternion.Euler(90f, 0f, 0f) * Quaternion.Euler(vrProvider.deviceTiltXAxis, 0f, 0f); controllerOffset = new Vector3(0f, vrProvider.deviceOffsetYAxis, vrProvider.deviceOffsetZAxis); } base.OnSceneGUI(); }
/// <summary> /// Copies property settings from this LeapServiceProvider to the target /// LeapXRServiceProvider where applicable. Does not modify any XR-specific settings /// that only exist on the LeapXRServiceProvider. /// </summary> public void CopySettingsToLeapXRServiceProvider( LeapXRServiceProvider leapXRServiceProvider) { leapXRServiceProvider._frameOptimization = _frameOptimization; leapXRServiceProvider._physicsExtrapolation = _physicsExtrapolation; leapXRServiceProvider._physicsExtrapolationTime = _physicsExtrapolationTime; leapXRServiceProvider._workerThreadProfiling = _workerThreadProfiling; }
public override void OnSceneGUI() { LeapXRServiceProvider xrProvider = target as LeapXRServiceProvider; if (_mainCamera.objectReferenceValue == null) { return; } controllerOffset = new Vector3(0f, xrProvider.deviceOffsetYAxis, xrProvider.deviceOffsetZAxis); deviceRotation = xrProvider.mainCamera.transform.InverseTransformRotation(xrProvider.mainCamera.transform.TransformRotation(Quaternion.Euler(xrProvider.deviceTiltXAxis, 0f, 0f))) * Quaternion.Euler(90f, 0f, 0f); base.OnSceneGUI(); }
public virtual void OnSceneGUI() { if (target == null) { return; } Transform targetTransform = target.transform; LeapXRServiceProvider xrProvider = target as LeapXRServiceProvider; if (xrProvider != null) { targetTransform = xrProvider.mainCamera.transform; if (xrProvider.deviceOrigin != null) { targetTransform.InverseTransformPoint(xrProvider.deviceOrigin.position); } } switch (GetSelectedInteractionVolume()) { case LeapServiceProvider.InteractionVolumeVisualization.None: break; case LeapServiceProvider.InteractionVolumeVisualization.LeapMotionController: DrawLeapMotionControllerInteractionZone(LMC_BOX_WIDTH, LMC_BOX_DEPTH, LMC_BOX_RADIUS, Color.white, targetTransform); break; case LeapServiceProvider.InteractionVolumeVisualization.StereoIR170: DrawStereoIR170InteractionZoneMesh(targetTransform); break; case LeapServiceProvider.InteractionVolumeVisualization.Automatic: DetectConnectedDevice(targetTransform); break; default: break; } }