|
/************************************************************************************
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
|
|
the Utilities SDK except in compliance with the License, which is provided at the time of installation
|
|
or download, or which otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
https://developer.oculus.com/licenses/utilities-1.31
|
|
|
|
Unless required by applicable law or agreed to in writing, the Utilities SDK 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.
|
|
************************************************************************************/
|
|
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|
#define OVR_ANDROID_MRC
|
|
#endif
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text.RegularExpressions;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || UNITY_ANDROID
|
|
|
|
/// <summary>
|
|
/// Manages mix-reality elements
|
|
/// </summary>
|
|
internal static class OVRMixedReality
|
|
{
|
|
/// <summary>
|
|
/// For Debugging purpose, we can use preset parameters to fake a camera when external camera is not available
|
|
/// </summary>
|
|
public static bool useFakeExternalCamera = false;
|
|
public static Vector3 fakeCameraFloorLevelPosition = new Vector3(0.0f, 2.0f, -0.5f);
|
|
public static Vector3 fakeCameraEyeLevelPosition = fakeCameraFloorLevelPosition - new Vector3(0.0f, 1.8f, 0.0f);
|
|
public static Quaternion fakeCameraRotation = Quaternion.LookRotation((new Vector3(0.0f, fakeCameraFloorLevelPosition.y, 0.0f) - fakeCameraFloorLevelPosition).normalized, Vector3.up);
|
|
public static float fakeCameraFov = 60.0f;
|
|
public static float fakeCameraAspect = 16.0f / 9.0f;
|
|
|
|
/// <summary>
|
|
/// Composition object
|
|
/// </summary>
|
|
public static OVRComposition currentComposition = null;
|
|
|
|
/// <summary>
|
|
/// Updates the internal state of the Mixed Reality Camera. Called by OVRManager.
|
|
/// </summary>
|
|
|
|
public static void Update(GameObject parentObject, Camera mainCamera, OVRManager.CompositionMethod compositionMethod, bool useDynamicLighting, OVRManager.CameraDevice cameraDevice, OVRManager.DepthQuality depthQuality)
|
|
{
|
|
if (!OVRPlugin.initialized)
|
|
{
|
|
Debug.LogError("OVRPlugin not initialized");
|
|
return;
|
|
}
|
|
|
|
if (!OVRPlugin.IsMixedRealityInitialized())
|
|
{
|
|
OVRPlugin.InitializeMixedReality();
|
|
if (OVRPlugin.IsMixedRealityInitialized())
|
|
{
|
|
Debug.Log("OVRPlugin_MixedReality initialized");
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Unable to initialize OVRPlugin_MixedReality");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!OVRPlugin.IsMixedRealityInitialized())
|
|
{
|
|
return;
|
|
}
|
|
|
|
OVRPlugin.UpdateExternalCamera();
|
|
#if !OVR_ANDROID_MRC
|
|
OVRPlugin.UpdateCameraDevices();
|
|
#endif
|
|
|
|
#if OVR_ANDROID_MRC
|
|
useFakeExternalCamera = OVRPlugin.Media.UseMrcDebugCamera();
|
|
#endif
|
|
|
|
if (currentComposition != null && currentComposition.CompositionMethod() != compositionMethod)
|
|
{
|
|
currentComposition.Cleanup();
|
|
currentComposition = null;
|
|
}
|
|
|
|
if (compositionMethod == OVRManager.CompositionMethod.External)
|
|
{
|
|
if (currentComposition == null)
|
|
{
|
|
currentComposition = new OVRExternalComposition(parentObject, mainCamera);
|
|
}
|
|
}
|
|
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
|
else if (compositionMethod == OVRManager.CompositionMethod.Direct)
|
|
{
|
|
if (currentComposition == null)
|
|
{
|
|
currentComposition = new OVRDirectComposition(parentObject, mainCamera, cameraDevice, useDynamicLighting, depthQuality);
|
|
}
|
|
}
|
|
#endif
|
|
else
|
|
{
|
|
Debug.LogError("Unknown CompositionMethod : " + compositionMethod);
|
|
return;
|
|
}
|
|
currentComposition.Update(parentObject, mainCamera);
|
|
}
|
|
|
|
public static void Cleanup()
|
|
{
|
|
if (currentComposition != null)
|
|
{
|
|
currentComposition.Cleanup();
|
|
currentComposition = null;
|
|
}
|
|
if (OVRPlugin.IsMixedRealityInitialized())
|
|
{
|
|
OVRPlugin.ShutdownMixedReality();
|
|
}
|
|
}
|
|
|
|
public static void RecenterPose()
|
|
{
|
|
if (currentComposition != null)
|
|
{
|
|
currentComposition.RecenterPose();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|