| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- /*******************************************************************************
- Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved.
- NOTICE:All information contained herein is, and remains the property of
- PICO Technology Co., Ltd. The intellectual and technical concepts
- contained herein are proprietary to PICO Technology Co., Ltd. and may be
- covered by patents, patents in process, and are protected by trade secret or
- copyright law. Dissemination of this information or reproduction of this
- material is strictly forbidden unless prior written permission is obtained from
- PICO Technology Co., Ltd.
- *******************************************************************************/
- using System;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- using UnityEngine;
- using UnityEngine.Rendering;
- using UnityEngine.XR.Management;
- using UnityEngine.XR;
- using AOT;
- #if UNITY_INPUT_SYSTEM
- using UnityEngine.InputSystem;
- using UnityEngine.InputSystem.Layouts;
- using UnityEngine.InputSystem.XR;
- using Unity.XR.PXR.Input;
- #endif
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- #if XR_HANDS
- using UnityEngine.XR.Hands;
- #endif
- namespace Unity.XR.PXR
- {
- #if UNITY_INPUT_SYSTEM
- #if UNITY_EDITOR
- [InitializeOnLoad]
- #endif
- static class InputLayoutLoader
- {
- static InputLayoutLoader()
- {
- RegisterInputLayouts();
- }
- public static void RegisterInputLayouts()
- {
- InputSystem.RegisterLayout<PXR_HMD>(matches: new InputDeviceMatcher().WithInterface(XRUtilities.InterfaceMatchAnyVersion).WithProduct(@"^(PICO HMD)|^(PICO Neo)|^(PICO G)"));
- InputSystem.RegisterLayout<PXR_Controller>(matches: new InputDeviceMatcher().WithInterface(XRUtilities.InterfaceMatchAnyVersion).WithProduct(@"^(PICO Controller)"));
- }
- }
- #endif
- public class PXR_Loader : XRLoaderHelper
- #if UNITY_EDITOR
- , IXRLoaderPreInit
- #endif
- {
- private static List<XRDisplaySubsystemDescriptor> displaySubsystemDescriptors = new List<XRDisplaySubsystemDescriptor>();
- private static List<XRInputSubsystemDescriptor> inputSubsystemDescriptors = new List<XRInputSubsystemDescriptor>();
- #if XR_HANDS
- private static List<XRHandSubsystemDescriptor> handSubsystemDescriptors = new List<XRHandSubsystemDescriptor>();
- #endif
- public delegate Quaternion ConvertRotationWith2VectorDelegate(Vector3 from, Vector3 to);
- public XRDisplaySubsystem displaySubsystem
- {
- get
- {
- return GetLoadedSubsystem<XRDisplaySubsystem>();
- }
- }
- public XRInputSubsystem inputSubsystem
- {
- get
- {
- return GetLoadedSubsystem<XRInputSubsystem>();
- }
- }
- public override bool Initialize()
- {
- #if UNITY_INPUT_SYSTEM
- InputLayoutLoader.RegisterInputLayouts();
- #endif
- #if UNITY_ANDROID
- PXR_Settings settings = GetSettings();
- if (settings != null)
- {
- UserDefinedSettings userDefinedSettings = new UserDefinedSettings
- {
- stereoRenderingMode = settings.GetStereoRenderingMode(),
- colorSpace = (ushort)((QualitySettings.activeColorSpace == ColorSpace.Linear) ? 1 : 0),
- useContentProtect = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().useContentProtect),
- systemDisplayFrequency = settings.GetSystemDisplayFrequency(),
- optimizeBufferDiscards = settings.GetOptimizeBufferDiscards(),
- enableAppSpaceWarp = Convert.ToUInt16(settings.enableAppSpaceWarp),
- enableSubsampled = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().enableSubsampled),
- lateLatchingDebug = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().latelatchingDebug),
- enableStageMode = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().stageMode),
- enableSuperResolution = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().superResolution),
- normalSharpening = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().normalSharpening),
- qualitySharpening = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().qualitySharpening),
- fixedFoveatedSharpening = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().fixedFoveatedSharpening),
- selfAdaptiveSharpening = Convert.ToUInt16(PXR_ProjectSetting.GetProjectConfig().selfAdaptiveSharpening)
- };
- PXR_Plugin.System.UPxr_Construct(ConvertRotationWith2Vector);
- PXR_Plugin.System.UPxr_SetInputDeviceChangedCallBack(InputDeviceChangedFunction);
- PXR_Plugin.System.UPxr_SetSeethroughStateChangedCallBack(SeethroughStateChangedFunction);
- PXR_Plugin.System.UPxr_SetFitnessBandNumberOfConnectionsCallBack(FitnessBandNumberOfConnectionsFunction);
- PXR_Plugin.System.UPxr_SetFitnessBandElectricQuantityCallBack(FitnessBandElectricQuantityFunction);
- PXR_Plugin.System.UPxr_SetFitnessBandAbnormalCalibrationDataCallBack(FitnessBandAbnormalCalibrationDataFunction);
- PXR_Plugin.System.UPxr_SetLoglevelChangedCallBack(LoglevelChangedFunction);
- PXR_Plugin.System.UPxr_SetUserDefinedSettings(userDefinedSettings);
- }
- #endif
- CreateSubsystem<XRDisplaySubsystemDescriptor, XRDisplaySubsystem>(displaySubsystemDescriptors, "PICO Display");
- CreateSubsystem<XRInputSubsystemDescriptor, XRInputSubsystem>(inputSubsystemDescriptors, "PICO Input");
- #if XR_HANDS
- CreateSubsystem<XRHandSubsystemDescriptor, XRHandSubsystem>(handSubsystemDescriptors, "PICO Hands");
- #endif
- if (displaySubsystem == null && inputSubsystem == null)
- {
- Debug.LogError("PXRLog Unable to start PICO Plugin.");
- }
- else if (displaySubsystem == null)
- {
- Debug.LogError("PXRLog Failed to load display subsystem.");
- }
- else if (inputSubsystem == null)
- {
- Debug.LogError("PXRLog Failed to load input subsystem.");
- }
- else
- {
- PXR_Plugin.System.UPxr_InitializeFocusCallback();
- }
- #if XR_HANDS
- var handSubSystem = GetLoadedSubsystem<XRHandSubsystem>();
- if (handSubSystem == null)
- {
- Debug.LogError("PXRLog Failed to load XRHandSubsystem.");
- }
- #endif
- return displaySubsystem != null;
- }
- public override bool Start()
- {
- StartSubsystem<XRDisplaySubsystem>();
- StartSubsystem<XRInputSubsystem>();
- #if XR_HANDS
- StartSubsystem<XRHandSubsystem>();
- #endif
- return true;
- }
- public override bool Stop()
- {
- StopSubsystem<XRDisplaySubsystem>();
- StopSubsystem<XRInputSubsystem>();
- #if XR_HANDS
- StopSubsystem<XRHandSubsystem>();
- #endif
- return true;
- }
- public override bool Deinitialize()
- {
- DestroySubsystem<XRDisplaySubsystem>();
- DestroySubsystem<XRInputSubsystem>();
- #if XR_HANDS
- DestroySubsystem<XRHandSubsystem>();
- #endif
- PXR_Plugin.System.UPxr_DeinitializeFocusCallback();
- return true;
- }
- [MonoPInvokeCallback(typeof(ConvertRotationWith2VectorDelegate))]
- static Quaternion ConvertRotationWith2Vector(Vector3 from, Vector3 to)
- {
- return Quaternion.FromToRotation(from, to);
- }
- [MonoPInvokeCallback(typeof(InputDeviceChangedCallBack))]
- static void InputDeviceChangedFunction(int value)
- {
- if (PXR_Plugin.System.InputDeviceChanged != null)
- {
- PXR_Plugin.System.InputDeviceChanged(value);
- }
- }
- [MonoPInvokeCallback(typeof(SeethroughStateChangedCallBack))]
- static void SeethroughStateChangedFunction(int value)
- {
- if (PXR_Plugin.System.SeethroughStateChangedChanged != null)
- {
- PXR_Plugin.System.SeethroughStateChangedChanged(value);
- }
- }
- [MonoPInvokeCallback(typeof(FitnessBandNumberOfConnectionsCallBack))]
- static void FitnessBandNumberOfConnectionsFunction(int state, int value)
- {
- if (PXR_Plugin.System.FitnessBandNumberOfConnections != null)
- {
- PXR_Plugin.System.FitnessBandNumberOfConnections(state, value);
- }
- }
- [MonoPInvokeCallback(typeof(FitnessBandElectricQuantityCallBack))]
- static void FitnessBandElectricQuantityFunction(int trackerID, int battery)
- {
- if (PXR_Plugin.System.FitnessBandElectricQuantity != null)
- {
- PXR_Plugin.System.FitnessBandElectricQuantity(trackerID, battery);
- }
- }
- [MonoPInvokeCallback(typeof(FitnessBandAbnormalCalibrationDataCallBack))]
- static void FitnessBandAbnormalCalibrationDataFunction(int state, int value)
- {
- if (PXR_Plugin.System.FitnessBandAbnormalCalibrationData != null)
- {
- PXR_Plugin.System.FitnessBandAbnormalCalibrationData(state, value);
- }
- }
- [MonoPInvokeCallback(typeof(LoglevelChangedCallBack))]
- static void LoglevelChangedFunction(int value)
- {
- if (PXR_Plugin.System.LoglevelChangedChanged != null)
- {
- PXR_Plugin.System.LoglevelChangedChanged(value);
- }
- }
- public PXR_Settings GetSettings()
- {
- PXR_Settings settings = null;
- #if UNITY_EDITOR
- UnityEditor.EditorBuildSettings.TryGetConfigObject<PXR_Settings>("Unity.XR.PXR.Settings", out settings);
- #endif
- #if UNITY_ANDROID && !UNITY_EDITOR
- settings = PXR_Settings.settings;
- #endif
- return settings;
- }
- #if UNITY_EDITOR
- public string GetPreInitLibraryName(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
- {
- return "PxrPlatform";
- }
- #endif
- #if UNITY_ANDROID && !UNITY_EDITOR
- [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
- static void RuntimeLoadPicoPlugin()
- {
- PXR_Plugin.System.UPxr_LoadPICOPlugin();
- string version = "UnityXR_" + PXR_Plugin.System.UPxr_GetSDKVersion() + "_" + Application.unityVersion;
- PXR_Plugin.System.UPxr_SetConfigString( ConfigType.EngineVersion, version );
- }
- #endif
- }
- }
|