示例#1
0
        public static Texture GetPlatformIcon(VRPlatform platform)
        {
            switch (platform)
            {
            case VRPlatform.OculusMobile:
            case VRPlatform.OculusPC:
                return(platformImages[1]);

            case VRPlatform.None:
                return(platformImages[0]);

            case VRPlatform.Daydream:
                return(platformImages[4]);

            case VRPlatform.SteamVR:
                return(platformImages[2]);

            case VRPlatform.PlayStationVR:
                return(platformImages[3]);

            case VRPlatform.WindowsMR:
                return(platformImages[5]);

            default:
                return(null);
            }
        }
示例#2
0
        static void SavePlatformSettings(VRPlatform platform)
        {
            switch (platform)
            {
            case VRPlatform.OculusMobile:
            case VRPlatform.OculusPC:
                TBOculusEditorSDKSettings.instance.SaveSettings();
                break;

            case VRPlatform.SteamVR:
                TBSteamVREditorSDKSettings.instance.SaveSettings();
                break;

            case VRPlatform.Daydream:
                TBGoogleEditorSDKSettings.instance.SaveSettings();
                break;

            #if TB_HAS_UNITY_PS4
            case VRPlatform.PlayStationVR:
                TBPSVREditorSDKSettings.instance.SaveSettings();
                break;
            #endif
            case VRPlatform.WindowsMR:
                TBWindowsMREditorSDKSettings.instance.SaveSettings();
                break;
            }
        }
示例#3
0
        private static void SetActivePlatform()
        {
            if (!UnityEngine.XR.XRSettings.enabled)
            {
                TBLogging.LogMessage("VR is disabled in PlayerSettings (or Unity's XRSettings). Setting VRPlatform to None.");
                _activePlatform = VRPlatform.None;
                return;
            }

            switch (UnityEngine.XR.XRSettings.loadedDeviceName)
            {
            case TBSettings.VRDeviceNames.Oculus:
                if (Application.isMobilePlatform)
                {
                    _activePlatform = VRPlatform.OculusMobile;
                }
                else
                {
                    _activePlatform = VRPlatform.OculusPC;
                }
                break;

            case TBSettings.VRDeviceNames.SteamVR:
                    #if !TB_STEAM_VR
                _activePlatform = VRPlatform.OculusPC;      // Allows Oculus Utilities to be used as a fallback if Steam VR plugin is not present.
                    #else
                _activePlatform = VRPlatform.SteamVR;
                    #endif
                break;

            case TBSettings.VRDeviceNames.Daydream:
                _activePlatform = VRPlatform.Daydream;
                break;

            case TBSettings.VRDeviceNames.PlayStationVR:
                _activePlatform = VRPlatform.PlayStationVR;
                break;

            case TBSettings.VRDeviceNames.WindowsMR:
                _activePlatform = VRPlatform.WindowsMR;
                break;

            default:
                if (string.IsNullOrEmpty(UnityEngine.XR.XRSettings.loadedDeviceName))
                {
                    TBLogging.LogMessage("No VR device is currently loaded in Unity's XRSettings, even though VR was enabled. That may be a sign of an error.");
                }
                else
                {
                    Debug.LogError("Detected " + UnityEngine.XR.XRSettings.loadedDeviceName);
                    Debug.LogError("The current HMD / SDK pairing doesn't match any known TButt preset! TCore initialization failed.");
                }
                _activePlatform = VRPlatform.None;
                UnityEngine.XR.XRSettings.enabled = false;
                return;
            }
            TBLogging.LogMessage("TBCore's VRPlatform is now " + _activePlatform + ". Configured for " + UnityEngine.XR.XRDevice.model + " running through " + UnityEngine.XR.XRSettings.loadedDeviceName + " SDK");
        }
示例#4
0
        private static void LoadSettings(VRPlatform platform)
        {
            if (_loadedSettings)
            {
                return;
            }

            // Get control and camera settings.
            _controlSettings = TBDataManager.DeserializeFromFile <TBControlSettings>(settingsFolder + controlSettingsFileName, TBDataManager.PathType.ResourcesFolder);
            if (!_controlSettings.supports3DOFControllers && !_controlSettings.supportsClickRemote && !_controlSettings.supportsGamepad && !_controlSettings.supportsHandControllers)
            {
                UnityEngine.Debug.LogWarning("No controller types are enabled in TBInput's settings!");
            }
            PrintControlSettings();
            _cameraSettings = TBDataManager.DeserializeFromFile <TBCameraSettings>(settingsFolder + cameraSettingsFilename, TBDataManager.PathType.ResourcesFolder);

            // Setup platform settings subclass.
            switch (platform)
            {
            case VRPlatform.OculusPC:
            case VRPlatform.OculusMobile:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBOculusSettings>();
                break;

                #if TB_HAS_UNITY_PS4
            case VRPlatform.PlayStationVR:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBSettingsPSVR>();
                break;
                #endif
            case VRPlatform.WindowsMR:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBWindowsMRSettings>();
                break;

            case VRPlatform.SteamVR:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBSteamVRSettings>();
                break;

            case VRPlatform.Daydream:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBGoogleSettings>();
                break;

            default:
                _settingsBase = TBCore.instance.gameObject.AddComponent <TBSettingsBase>();
                break;
            }
            _settingsBase.Initialize();

            // Apply quality settings overrides if needed.
            if (_settingsBase.GetDisplaySettings().qualitySettings.enableQualitySettingsOverride)
            {
                ApplyQualitySettingsOverrides(_settingsBase.GetDisplaySettings().qualitySettings);
            }

            // Set timestep.
            SetTimestep();

            _loadedSettings = true;
        }
示例#5
0
        static void CheckPlatformMenu()
        {
            VRPlatform curPlatform = GetPlatformPrefs();

            Menu.SetChecked(CardboardMenu, curPlatform == VRPlatform.Cardboard);
            Menu.SetChecked(DaydreamMenu, curPlatform == VRPlatform.Daydream);
            Menu.SetChecked(GearVRPMenu, curPlatform == VRPlatform.GearVR);
            Menu.SetChecked(LuancherMenu, curPlatform == VRPlatform.Launcher);
        }
示例#6
0
 /// <summary>
 /// Override function to force TBCore to initialize for a specific platform.
 /// Only necessary for devices that can start without a headset active.
 /// </summary>
 /// <param name="platform"></param>
 public static void Initialize(VRPlatform platform)
 {
     if (!_loadedSettings)
     {
         LoadSettings(platform);
     }
     else
     {
         TBLogging.LogMessage("TBSettings.Initialize() was called, but settings were already initialized.");
     }
 }
示例#7
0
 public static void ShowControllerMatrixHeader(bool show, VRPlatform platform, GUIStyle color)
 {
     if (show)
     {
         EditorGUILayout.BeginVertical(color, new GUILayoutOption[1] {
             GUILayout.Width(controllerColumnWidth)
         });
         GUILayout.Label(TBEditorStyles.GetPlatformIcon(platform), TBEditorStyles.h1centered);
         EditorGUILayout.EndVertical();
     }
 }
示例#8
0
        private void SetupNativeCamera(VRPlatform platform)
        {
            _centerEyeTransform = new GameObject().transform;
            _centerEyeTransform.MakeZeroedChildOf(_trackingVolume);
            _centerEyeTransform.gameObject.name = "Standard VR Camera";
            _centerEyeTransform.gameObject.tag  = "MainCamera";
            _primaryCamera = _centerEyeTransform.gameObject.AddComponent <Camera>();
            switch (platform)
            {
            case VRPlatform.OculusMobile:
            case VRPlatform.OculusPC:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraOculus>();
                break;

            case VRPlatform.SteamVR:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBSteamVRCamera>();
                break;

                #if TB_HAS_UNITY_PS4
            case VRPlatform.PlayStationVR:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraPSVR>();
                break;
                #endif
            case VRPlatform.Daydream:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraGoogle>();
                break;

            default:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraBase>();
                break;
            }
            _baseCamera.Initialize();

            if (TBTracking.OnNodeConnected != null)
            {
                TBTracking.OnNodeConnected(UnityEngine.XR.XRNode.CenterEye, _centerEyeTransform);
                TBTracking.OnNodeConnected(UnityEngine.XR.XRNode.Head, _centerEyeTransform);
                TBTracking.OnNodeConnected(UnityEngine.XR.XRNode.TrackingReference, _trackingVolume);
            }

            _trackingVolume.localScale = Vector3.one;
        }
示例#9
0
        private void SetupCameraForPlatform(VRPlatform platform)
        {
            switch (platform)
            {
            default:
                SetupNativeCamera(platform);
                DestroyTempCamera();
                break;

            case VRPlatform.None:
                _primaryCamera      = GetComponent <Camera>();
                _centerEyeTransform = transform;
                break;
            }
            _audioListenerTransform = new GameObject("AudioListener").transform;
            _audioListener          = _audioListenerTransform.gameObject.AddComponent <AudioListener>();
            _audioListenerTransform.gameObject.AddComponent <TBAudioListener>();
        }
示例#10
0
        private void SetupNativeCamera(VRPlatform platform)
        {
            _primaryCamera = _centerEyeTransform.gameObject.AddComponent <Camera>();
            switch (platform)
            {
            case VRPlatform.OculusMobile:
            case VRPlatform.OculusPC:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraOculus>();
                break;

            case VRPlatform.SteamVR:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBSteamVRCamera>();
                break;

                    #if TB_HAS_UNITY_PS4
            case VRPlatform.PlayStationVR:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraPSVR>();
                break;
                    #endif
            case VRPlatform.Daydream:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraGoogle>();
                break;

            default:
                _cameraMode = CameraMode.Single;
                _baseCamera = _primaryCamera.gameObject.AddComponent <TBCameraBase>();
                break;
            }
            _baseCamera.Initialize();

            _trackingVolume.localScale = Vector3.one;
        }
示例#11
0
        // FixedUpdate is called before any Update
        public void Update()
        {
            if (CheckForSpatialInputActive() == false)
            {
                return;
            }

            Vector3 rootPos = spatialCamRig.transform.position;

            SpatialDevice[] hands = { Left, Right };
            for (int i = 0; i < 2; ++i)
            {
                SpatialDevice h = hands[i];

                h.CursorActive = VRPlatform.IsSpatialDeviceTracked(i);
                if (h.CursorActive)
                {
                    h.Hand.Show();
                    h.Cursor.Show();

                    Vector3    handPos = VRPlatform.GetLocalControllerPosition(i);
                    Quaternion handRot = VRPlatform.GetLocalControllerRotation(i);

                    h.AbsoluteHandFrame = new Frame3f(rootPos + handPos, handRot);

                    float fPositionT = 0.2f;
                    float fRotationT = 0.2f;
                    //float fPositionT = 1.0f;
                    //float fRotationT = 1.0f;

                    if (h.SmoothedHandFrame.Origin != Vector3f.Zero)
                    {
                        Vector3 new_origin =
                            Vector3.Lerp(h.SmoothedHandFrame.Origin, h.AbsoluteHandFrame.Origin, fPositionT);
                        Quaternion new_rotation =
                            Quaternion.Slerp(h.SmoothedHandFrame.Rotation, h.AbsoluteHandFrame.Rotation, fRotationT);
                        h.SmoothedHandFrame = new Frame3f(new_origin, new_rotation);
                    }
                    else
                    {
                        h.SmoothedHandFrame = h.AbsoluteHandFrame;
                    }

                    h.Hand.transform.position = h.SmoothedHandFrame.Origin;
                    h.Hand.transform.rotation = h.SmoothedHandFrame.Rotation * (Quaternionf)handGeomRotation;

                    h.CursorRay = new Ray(h.SmoothedHandFrame.Origin,
                                          (h.SmoothedHandFrame.Rotation * Vector3.forward).Normalized);

                    if (Mathf.Abs(h.CursorRay.direction.sqrMagnitude - 1.0f) > 0.001f)
                    {
                        DebugUtil.Log(2, "SpatialInputController.Update - invlaid cursor ray! rotation was {0}", h.SmoothedHandFrame.Rotation);
                        h.CursorRay = new Ray(h.SmoothedHandFrame.Origin, Vector3.up);
                    }

                    // raycast into scene to see if we hit object, UI, bounds, etc.
                    bool bHit = false;
                    if (context != null)
                    {
                        // want to hit-test active gizmo first, because that has hit-priority
                        if (context.TransformManager.HaveActiveGizmo)
                        {
                            UIRayHit uiHit = null;
                            if (context.TransformManager.ActiveGizmo.FindRayIntersection(h.CursorRay, out uiHit))
                            {
                                h.RayHitPos = uiHit.hitPos;
                                bHit        = true;
                            }
                        }
                        // next we tested scene
                        if (bHit == false)
                        {
                            AnyRayHit hit = null;
                            if (context.FindAnyRayIntersection(h.CursorRay, out hit))
                            {
                                h.RayHitPos = hit.hitPos;
                                bHit        = true;
                            }
                        }
                        // finally test worldbounds
                        if (bHit == false)
                        {
                            GameObjectRayHit ghit = null;
                            if (context.GetScene().FindWorldBoundsHit(h.CursorRay, out ghit))
                            {
                                h.RayHitPos = ghit.hitPos;
                            }
                        }
                    }

                    // if not, plane cursor on view-perp plane centered at last hit pos,
                    // otherwise it will be stuck/disappear
                    if (bHit == false)
                    {
                        Frame3f f = new Frame3f(h.RayHitPos, camera.transform.forward);
                        h.RayHitPos = f.RayPlaneIntersection(h.CursorRay.origin, h.CursorRay.direction, 2);
                    }

                    h.Cursor.transform.position = h.RayHitPos;
                    //if (scene.InCapture)
                    //    MaterialUtil.SetMaterial(h.Cursor, h.CursorCapturingMaterial);
                    //else
                    if (bHit)
                    {
                        MaterialUtil.SetMaterial(h.Cursor, h.CursorHitMaterial);
                    }
                    else
                    {
                        MaterialUtil.SetMaterial(h.Cursor, h.CursorDefaultMaterial);
                    }

                    // maintain a consistent visual size for 3D cursor sphere
                    float fScaling = VRUtil.GetVRRadiusForVisualAngle(h.RayHitPos, camera.transform.position, CursorVisualAngleInDegrees);
                    h.Cursor.transform.localScale = fScaling * Vector3.one;

                    // orient cursor so it is tilted like a 2D cursor, but per-hand
                    Vector3 cursor_right = Vector3.Cross(camera.transform.up, h.CursorRay.direction);
                    Vector3 cursor_fw    = Vector3.Cross(cursor_right, camera.transform.up);
                    float   rotSign      = (h == Right) ? 1.0f : -1.0f;
                    Vector3 pointDir     = (camera.transform.up + cursor_fw - 0.5f * rotSign * cursor_right).normalized;
                    h.Cursor.transform.localRotation = Quaternion.FromToRotation(Vector3.up, pointDir);

                    // update laser line
                    if (h.Laser != null)
                    {
                        float   hDist = (h.RayHitPos - h.CursorRay.origin).magnitude;
                        Vector3 p0    = h.RayHitPos - 0.9f * hDist * h.CursorRay.direction;
                        Vector3 p1    = h.RayHitPos + 100.0f * h.CursorRay.direction;
                        float   r0    = VRUtil.GetVRRadiusForVisualAngle(p0, camera.transform.position, 0.5f);
                        h.LaserRen.SetPosition(0, p0);
                        h.LaserRen.SetPosition(1, p1);
                        h.LaserRen.startWidth = h.LaserRen.endWidth = r0;
                    }

                    // udpate cursor
                    Mesh useMesh = context.ToolManager.HasActiveTool(i) ? activeToolCursorMesh : standardCursorMesh;
                    if (h.Cursor.GetSharedMesh() != useMesh)
                    {
                        h.Cursor.SetSharedMesh(useMesh);
                    }
                }
                else
                {
                    h.Hand.Hide();
                    h.Cursor.Hide();
                }
            }
        }
示例#12
0
 static void SavePlatformPrefs(VRPlatform platform)
 {
     AssetDatabase.Refresh();
 }
示例#13
0
        /// <summary>
        /// Applies settings and adds required components for input to be detected based on the active platform.
        /// </summary>
        public static void Initialize(VRPlatform platform)
        {
            TBCore.OnUpdate += TBInput.Update;

#if UNITY_EDITOR
            _activeControlType = TBSettings.GetControlSettings().defaultEditorControlType;
#endif

            _hasActiveSDK = true;

            switch (platform)
            {
            case VRPlatform.OculusPC:
            case VRPlatform.OculusMobile:
                TBInputOculus.instance.Initialize();
                TBCore.OnFixedUpdate += TBInputOculus.instance.FixedUpdate;
                TBCore.OnUpdate      += TBInputOculus.instance.Update;
                _activeSDK            = TBInputOculus.instance;
                break;

            case VRPlatform.SteamVR:
                TBInputSteamVR.instance.Initialize();
                TBCore.OnFixedUpdate += TBInputSteamVR.instance.FixedUpdate;
                TBCore.OnUpdate      += TBInputSteamVR.instance.Update;
                _activeSDK            = TBInputSteamVR.instance;
                break;

            case VRPlatform.Daydream:
                TBInputGoogle.instance.Initialize();
                TBCore.OnFixedUpdate += TBInputGoogle.instance.FixedUpdate;
                TBCore.OnUpdate      += TBInputGoogle.instance.Update;
                _activeSDK            = TBInputGoogle.instance;
                break;

            case VRPlatform.PlayStationVR:
#if TB_HAS_UNITY_PS4
                TBPSVRInput.instance.Initialize();
                TBCore.OnFixedUpdate += TBPSVRInput.instance.FixedUpdate;
                TBCore.OnUpdate      += TBPSVRInput.instance.Update;
                _activeSDK            = TBPSVRInput.instance;
#else
                UnityEngine.Debug.LogError("TBInput attempted to initialize for PSVR, but the PSVR module is not available. Is the module installed and set up with #TB_HAS_UNITY_PS4?");
#endif
                break;

            case VRPlatform.WindowsMR:
                TBWindowsMRInput.instance.Initialize();
                TBCore.OnFixedUpdate += TBWindowsMRInput.instance.FixedUpdate;
                TBCore.OnUpdate      += TBWindowsMRInput.instance.Update;
                _activeSDK            = TBWindowsMRInput.instance;
                break;

            default:
                _hasActiveSDK = false;
                UnityEngine.Debug.LogError("Attempted to initialize TBInput without an active SDK in TBCore. This shouldn't happen if TBCore exists in your scene.");
                break;
            }

            TBLogging.LogMessage("Active Control Type: " + _activeControlType);
            if (_activeControlType == ControlType.None)
            {
                TBLogging.LogMessage("No active control type is assigned to TBInput. Input for type 'active' will be ignored until a control type is assigned.");
            }
        }