using System; using UnityEngine; using UnityEngine.Android; namespace Unity.XR.Oculus { public static partial class Utils { static void PermissionGrantedCallback(string permissionName) { if (permissionName == "com.oculus.permission.EYE_TRACKING") { NativeMethods.SetEyeTrackedFoveatedRenderingEnabled(true); } } /// /// Returns true if the user has allowed the Eye Tracking permission. /// public static bool IsEyeTrackingPermissionGranted() { return Permission.HasUserAuthorizedPermission("com.oculus.permission.EYE_TRACKING"); } /// /// Gets or sets dynamic foveated rendering which will change the foveated rendering level automatically based on the current performance. /// Works for both FFR and ETFR. /// public static bool useDynamicFoveatedRendering { get { return NativeMethods.GetTiledMultiResSupported(); } set { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't enable dynamic FFR on current platform"); } NativeMethods.SetTiledMultiResDynamic(value); } } /// /// Gets or sets the foveated rendering level. This works for both FFR and ETFR /// level can be 0, 1, 2, 3, or 4: /// /// * -1 (get) not supported on current platform /// * 0 foveated rendering disabled /// * 1 low foveated rendering level /// * 2 medium foveated rendering level /// * 3 high foveated rendering level /// * 4 high top foveated rendering level /// public static int foveatedRenderingLevel { get { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't get foveation level on current platform"); return -1; } return NativeMethods.GetTiledMultiResLevel(); } set { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't set foveation level on current platform"); } NativeMethods.SetTiledMultiResLevel(value); } } /// /// Returns whether or not eye tracked foveated rendering (ETFR) is supported. /// You cannot enable ETFR using eyeTrackedFoveatedRenderingEnabled if the feature isn't supported. /// public static bool eyeTrackedFoveatedRenderingSupported { get { return NativeMethods.GetEyeTrackedFoveatedRenderingSupported(); } } /// /// Gets or sets whether eye tracked foveated rendering is enabled or not. /// public static bool eyeTrackedFoveatedRenderingEnabled { get { if (eyeTrackedFoveatedRenderingSupported) return NativeMethods.GetEyeTrackedFoveatedRenderingEnabled(); return false; } set { if (eyeTrackedFoveatedRenderingSupported) { if (value) { if (IsEyeTrackingPermissionGranted()) { NativeMethods.SetEyeTrackedFoveatedRenderingEnabled(value); } else { var permissionCallbacks = new PermissionCallbacks(); permissionCallbacks.PermissionGranted += PermissionGrantedCallback; Permission.RequestUserPermission("com.oculus.permission.EYE_TRACKING", permissionCallbacks); } } else { NativeMethods.SetEyeTrackedFoveatedRenderingEnabled(value); } } } } /// /// Set the degree of foveation. Only supported on mobile. See [Oculus Documention](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-ffr/). /// /// /// level can be 0, 1, 2, 3, or 4: /// /// * 0 disables foveated rendering /// * 1 low foveated rendering level /// * 2 medium foveated rendering level /// * 3 high foveated rendering level /// * 4 high top foveated rendering level /// [Obsolete("Please use foveatedRenderingLevel instead.", false)] public static bool SetFoveationLevel(int level) { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't set foveation level on current platform"); return false; } NativeMethods.SetTiledMultiResLevel(level); return true; } /// /// Enable or disable dynamic foveated rendering. Only supported on mobile. See [Oculus Documention](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-ffr/). /// /// /// Set to true to enable dynamic foveated rendering or false to disable it. /// [Obsolete("Please use useDynamicFoveatedRendering instead", false)] public static bool EnableDynamicFFR(bool enable) { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't enable dynamic FFR on current platform"); return false; } NativeMethods.SetTiledMultiResDynamic(enable); return true; } /// /// Returns the level of foveated rendering. Only supported on mobile. See [Oculus Documentation](https://developer.oculus.com/documentation/quest/latest/concepts/mobile-ffr/). /// /// /// * -1 error /// * 0 disables foveated rendering /// * 1 low foveated rendering level /// * 2 medium foveated rendering level /// * 3 high foveated rendering level /// * 4 high top foveated rendering level /// [Obsolete("Please use foveatedRenderingLevel instead.", false)] public static int GetFoveationLevel() { if (!NativeMethods.GetTiledMultiResSupported()) { Debug.LogWarning("Can't get foveation level on current platform"); return -1; } return NativeMethods.GetTiledMultiResLevel(); } } }