// Copyright 2017 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /// /// Accesses and configures Daydream settings. /// // This class is defined only for versions of Unity with the GVR native integration. #if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR) using UnityEngine; using UnityEngine.VR; using System; using System.Runtime.InteropServices; #if UNITY_EDITOR using UnityEditor; #endif // UNITY_EDITOR public static class GvrSettings { private const string METHOD_GET_WINDOW = "getWindow"; private const string METHOD_RUN_ON_UI_THREAD = "runOnUiThread"; private const string METHOD_SET_SUSTAINED_PERFORMANCE_MODE = "setSustainedPerformanceMode"; // Viewer type. public enum ViewerPlatformType { Error = -1, // Plugin-only value; does not exist in the NDK. Cardboard, Daydream } public static ViewerPlatformType ViewerPlatform { // Expose a setter only for the editor emulator, for development testing purposes. #if UNITY_EDITOR get { return editorEmulatorOnlyViewerPlatformType; } set { editorEmulatorOnlyViewerPlatformType = value; } #else get { IntPtr gvrContextPtr = VRDevice.GetNativePtr(); if (gvrContextPtr == IntPtr.Zero) { Debug.Log("Null GVR context pointer, could not get viewer platform type"); return ViewerPlatformType.Error; } return (ViewerPlatformType) gvr_get_viewer_type(gvrContextPtr); } #endif // UNITY_EDITOR } #if UNITY_EDITOR private static ViewerPlatformType editorEmulatorOnlyViewerPlatformType = ViewerPlatformType.Daydream; #endif // UNITY_EDITOR // The developer is expected to remember whether sustained performance mode is set // at runtime, via the checkbox in Player Settings. // This state may be recorded here in a future release. public static bool SustainedPerformanceMode { set { SetSustainedPerformanceMode(value); } } // Handedness preference. public enum UserPrefsHandedness { Error = -1, // Plugin-only value, does not exist in the NDK. Right, Left } public static UserPrefsHandedness Handedness { // Expose a setter only for the editor emulator, for development testing purposes. #if UNITY_EDITOR get { return (UserPrefsHandedness)EditorPrefs.GetInt(EMULATOR_HANDEDNESS_PREF_NAME, (int)UserPrefsHandedness.Right); } set { EditorPrefs.SetInt(EMULATOR_HANDEDNESS_PREF_NAME, (int)value); } #else // Running on Android. get { IntPtr gvrContextPtr = VRDevice.GetNativePtr(); if (gvrContextPtr == IntPtr.Zero) { Debug.Log("Null GVR context pointer, could not get GVR user prefs' handedness"); return UserPrefsHandedness.Error; } IntPtr gvrUserPrefsPtr = gvr_get_user_prefs(gvrContextPtr); if (gvrUserPrefsPtr == IntPtr.Zero) { Debug.Log("Null GVR user prefs pointer, could not get handedness"); return UserPrefsHandedness.Error; } return (UserPrefsHandedness) gvr_user_prefs_get_controller_handedness(gvrUserPrefsPtr); } #endif // UNITY_EDITOR } #if UNITY_EDITOR // This allows developers to test handedness in the editor emulator. private const string EMULATOR_HANDEDNESS_PREF_NAME = "GoogleVREditorEmulatorHandedness"; #endif // UNITY_EDITOR private static void SetSustainedPerformanceMode(bool enabled) { #if !UNITY_EDITOR AndroidJavaObject androidActivity = null; try { androidActivity = GvrActivityHelper.GetActivity(); } catch (AndroidJavaException e) { Debug.LogError("Exception while connecting to the Activity: " + e); return; } AndroidJavaObject androidWindow = androidActivity.Call(METHOD_GET_WINDOW); if (androidWindow == null) { Debug.LogError("No window found on the current android activity"); return; } // The sim thread in Unity is single-threaded, so we don't need to lock when accessing // or assigning androidWindow. androidActivity.Call(METHOD_RUN_ON_UI_THREAD, new AndroidJavaRunnable(() => { androidWindow.Call(METHOD_SET_SUSTAINED_PERFORMANCE_MODE, enabled); Debug.Log("Set sustained performance mode: " + (enabled ? "ON" : "OFF")); }) ); #endif // !UNITY_EDITOR } [DllImport(GvrActivityHelper.GVR_DLL_NAME)] private static extern IntPtr gvr_get_user_prefs(IntPtr gvrContextPtr); [DllImport(GvrActivityHelper.GVR_DLL_NAME)] private static extern int gvr_get_viewer_type(IntPtr gvrContextPtr); [DllImport(GvrActivityHelper.GVR_DLL_NAME)] private static extern int gvr_user_prefs_get_controller_handedness(IntPtr gvrUserPrefsPtr); } #endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)