VR4Medical/ICI/Library/PackageCache/com.unity.xr.oculus@f23ad2c521e1/Runtime/OculusPlugin.cs
2025-08-20 11:12:05 +03:00

695 lines
22 KiB
C#

#if !(UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || (UNITY_ANDROID && !UNITY_EDITOR))
#define OCULUSPLUGIN_UNSUPPORTED_PLATFORM
#endif
#if (UNITY_ANDROID && !UNITY_EDITOR)
#define OCULUSPLUGIN_ANDROID_PLATFORM_ONLY
#endif
using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace Unity.XR.Oculus
{
public enum SystemHeadset
{
None = 0,
// Standalone headsets
Oculus_Quest = 8,
Oculus_Quest_2 = 9,
Meta_Quest_Pro = 10,
Placeholder_10 = 10,
Meta_Quest_3 = 11,
Placeholder_11 = 11,
Meta_Quest_3S = 12,
Placeholder_12 = 12,
Placeholder_13,
Placeholder_14,
// PC headsets
Rift_DK1 = 0x1000,
Rift_DK2,
Rift_CV1,
Rift_CB,
Rift_S,
Oculus_Link_Quest,
Oculus_Link_Quest_2,
Meta_Link_Quest_Pro,
PC_Placeholder_4103 = Meta_Link_Quest_Pro,
Meta_Link_Quest_3,
PC_Placeholder_4104 = Meta_Link_Quest_3,
Meta_Link_Quest_3S,
PC_Placeholder_4105 = Meta_Link_Quest_3S,
PC_Placeholder_4106,
PC_Placeholder_4107
}
// some platform support can only be determined at runtime such as Windows Arm64
internal static class RuntimePlatformChecks
{
private static readonly bool isRuntimeUnsupportedPlatform;
static RuntimePlatformChecks()
{
// catch situations not handled by OCULUSPLUGIN_UNSUPPORTED_PLATFORM
isRuntimeUnsupportedPlatform = false;
#if (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN)
if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{
isRuntimeUnsupportedPlatform = true;
}
#endif
}
internal static bool IsSupportedPlatform()
{
#if OCULUSPLUGIN_UNSUPPORTED_PLATFORM
return false;
#else
return !isRuntimeUnsupportedPlatform;
#endif
}
}
public static partial class NativeMethods
{
[StructLayout(LayoutKind.Sequential)]
internal struct UserDefinedSettings
{
public ushort sharedDepthBuffer;
public ushort dashSupport;
public ushort stereoRenderingMode;
public ushort colorSpace;
public ushort lowOverheadMode;
public ushort optimizeBufferDiscards;
public ushort symmetricProjection;
public ushort subsampledLayout;
public ushort lateLatching;
public ushort lateLatchingDebug;
public ushort enableTrackingOriginStageMode;
public ushort spaceWarp;
public ushort depthSubmission;
public ushort foveatedRenderingMethod;
public ushort optimizeMultiviewRenderRegions;
}
[StructLayout(LayoutKind.Sequential)]
internal struct UnityVersion
{
public int major;
public int minor;
public int patch;
public char type;
public int buildNumber;
}
[StructLayout(LayoutKind.Sequential)]
internal struct EnvironmentDepthFrameDescInternal
{
public bool isValid;
public double createTime;
public double predictedDisplayTime;
public int swapchainIndex;
public Vector3 createPoseLocation;
public Vector4 createPoseRotation;
public float fovLeftAngle;
public float fovRightAngle;
public float fovTopAngle;
public float fovDownAngle;
public float nearZ;
public float farZ;
public float minDepth;
public float maxDepth;
}
[StructLayout(LayoutKind.Sequential)]
internal struct EnvironmentDepthCreateParamsInternal
{
public bool removeHands;
}
internal static void SetColorScale(float x, float y, float z, float w)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetColorScale(x, y, z, w);
}
}
internal static void SetColorOffset(float x, float y, float z, float w)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetColorOffset(x, y, z, w);
}
}
internal static bool GetIsSupportedDevice()
{
#if OCULUSPLUGIN_ANDROID_PLATFORM_ONLY
return Internal.GetIsSupportedDevice();
#else
return false;
#endif
}
internal static bool LoadOVRPlugin(string ovrpPath)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.LoadOVRPlugin(ovrpPath);
}
else
{
return false;
}
}
internal static void UnloadOVRPlugin()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.UnloadOVRPlugin();
}
}
internal static void SetUserDefinedSettings(UserDefinedSettings settings, UnityVersion unityVersion)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetUserDefinedSettings(settings, unityVersion);
}
}
internal static int SetCPULevel(int cpuLevel)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.SetCPULevel(cpuLevel);
}
else
{
return -1;
}
}
internal static int SetGPULevel(int gpuLevel)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.SetGPULevel(gpuLevel);
}
else
{
return -1;
}
}
internal static void GetOVRPVersion(byte[] version)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.GetOVRPVersion(version);
}
}
internal static void EnablePerfMetrics(bool enable)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.EnablePerfMetrics(enable);
}
}
internal static void EnableAppMetrics(bool enable)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.EnableAppMetrics(enable);
}
}
internal static bool SetDeveloperModeStrict(bool active)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.SetDeveloperModeStrict(active);
}
else
{
return false;
}
}
internal static bool GetHasInputFocus()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetAppHasInputFocus();
}
else
{
return false;
}
}
internal static bool GetBoundaryConfigured()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetBoundaryConfigured();
}
else
{
return false;
}
}
internal static bool GetBoundaryDimensions(Boundary.BoundaryType boundaryType, out Vector3 dimensions)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetBoundaryDimensions(boundaryType, out dimensions);
}
else
{
dimensions = Vector3.zero;
return false;
}
}
internal static bool GetBoundaryVisible()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetBoundaryVisible();
}
else
{
return false;
}
}
internal static void SetBoundaryVisible(bool boundaryVisible)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetBoundaryVisible(boundaryVisible);
}
}
internal static bool GetAppShouldQuit()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetAppShouldQuit();
}
else
{
return false;
}
}
internal static bool GetDisplayAvailableFrequencies(IntPtr ptr, ref int numFrequencies)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetDisplayAvailableFrequencies(ptr, ref numFrequencies);
}
else
{
return false;
}
}
internal static bool SetDisplayFrequency(float refreshRate)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.SetDisplayFrequency(refreshRate);
}
else
{
return false;
}
}
internal static bool GetDisplayFrequency(out float refreshRate)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetDisplayFrequency(out refreshRate);
}
else
{
refreshRate = 0.0f;
return false;
}
}
internal static SystemHeadset GetSystemHeadsetType()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetSystemHeadsetType();
}
else
{
return SystemHeadset.None;
}
}
internal static bool GetTiledMultiResSupported()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetTiledMultiResSupported();
}
else
{
return false;
}
}
internal static void SetTiledMultiResLevel(int level)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetTiledMultiResLevel(level);
}
}
internal static int GetTiledMultiResLevel()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetTiledMultiResLevel();
}
else
{
return -1;
}
}
internal static void SetTiledMultiResDynamic(bool isDynamic)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetTiledMultiResDynamic(isDynamic);
}
}
internal static bool GetEyeTrackedFoveatedRenderingSupported()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetEyeTrackedFoveatedRenderingSupported();
}
else
{
return false;
}
}
internal static bool GetEyeTrackedFoveatedRenderingEnabled()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetEyeTrackedFoveatedRenderingEnabled();
}
else
{
return false;
}
}
internal static void SetEyeTrackedFoveatedRenderingEnabled(bool isEnabled)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetEyeTrackedFoveatedRenderingEnabled(isEnabled);
}
}
internal static bool GetShouldRestartSession()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetShouldRestartSession();
}
else
{
return false;
}
}
internal static void SetupEnvironmentDepth(Utils.EnvironmentDepthCreateParams createParams)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
EnvironmentDepthCreateParamsInternal param = new EnvironmentDepthCreateParamsInternal();
param.removeHands = createParams.removeHands;
Internal.SetupEnvironmentDepth(ref param);
}
}
internal static void SetEnvironmentDepthRendering(bool isEnabled)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.SetEnvironmentDepthRendering(isEnabled);
}
}
internal static void ShutdownEnvironmentDepth()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
Internal.ShutdownEnvironmentDepth();
}
}
internal static bool GetEnvironmentDepthTextureId(ref uint id)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetEnvironmentDepthTextureId(ref id);
}
else
{
return false;
}
}
internal static Utils.EnvironmentDepthFrameDesc GetEnvironmentDepthFrameDesc(int eye)
{
Utils.EnvironmentDepthFrameDesc desc = new Utils.EnvironmentDepthFrameDesc();
desc.isValid = false;
if (RuntimePlatformChecks.IsSupportedPlatform())
{
EnvironmentDepthFrameDescInternal frameDesc = new EnvironmentDepthFrameDescInternal();
if (Internal.GetEnvironmentDepthFrameDesc(ref frameDesc, eye))
{
desc.isValid = frameDesc.isValid;
desc.createTime = frameDesc.createTime;
desc.predictedDisplayTime = frameDesc.predictedDisplayTime;
desc.swapchainIndex = frameDesc.swapchainIndex;
desc.createPoseLocation = frameDesc.createPoseLocation;
desc.createPoseRotation = frameDesc.createPoseRotation;
desc.fovLeftAngle = frameDesc.fovLeftAngle;
desc.fovRightAngle = frameDesc.fovRightAngle;
desc.fovTopAngle = frameDesc.fovTopAngle;
desc.fovDownAngle = frameDesc.fovDownAngle;
desc.nearZ = frameDesc.nearZ;
desc.farZ = frameDesc.farZ;
desc.minDepth = frameDesc.minDepth;
desc.maxDepth = frameDesc.maxDepth;
}
}
return desc;
}
internal static bool SetEnvironmentDepthHandRemoval(bool isEnabled)
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.SetEnvironmentDepthHandRemoval(isEnabled);
}
else
{
return false;
}
}
internal static bool GetEnvironmentDepthSupported()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetEnvironmentDepthSupported();
}
else
{
return false;
}
}
internal static bool GetEnvironmentDepthHandRemovalSupported()
{
if (RuntimePlatformChecks.IsSupportedPlatform())
{
return Internal.GetEnvironmentDepthHandRemovalSupported();
}
else
{
return false;
}
}
private static class Internal
{
[DllImport("OculusXRPlugin")]
internal static extern void SetColorScale(float x, float y, float z, float w);
[DllImport("OculusXRPlugin")]
internal static extern void SetColorOffset(float x, float y, float z, float w);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetIsSupportedDevice();
[DllImport("OculusXRPlugin", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool LoadOVRPlugin(string ovrpPath);
[DllImport("OculusXRPlugin")]
internal static extern void UnloadOVRPlugin();
[DllImport("OculusXRPlugin")]
internal static extern void SetUserDefinedSettings(UserDefinedSettings settings, UnityVersion unityVersion);
[DllImport("OculusXRPlugin")]
internal static extern int SetCPULevel(int cpuLevel);
[DllImport("OculusXRPlugin")]
internal static extern int SetGPULevel(int gpuLevel);
[DllImport("OculusXRPlugin", CharSet = CharSet.Auto)]
internal static extern void GetOVRPVersion(byte[] version);
[DllImport("OculusXRPlugin")]
internal static extern void EnablePerfMetrics([MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport("OculusXRPlugin")]
internal static extern void EnableAppMetrics([MarshalAs(UnmanagedType.I1)] bool enable);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool SetDeveloperModeStrict([MarshalAs(UnmanagedType.I1)] bool active);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetAppHasInputFocus();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetBoundaryConfigured();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetBoundaryDimensions(Boundary.BoundaryType boundaryType, out Vector3 dimensions);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetBoundaryVisible();
[DllImport("OculusXRPlugin")]
internal static extern void SetBoundaryVisible([MarshalAs(UnmanagedType.I1)] bool boundaryVisible);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetAppShouldQuit();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetDisplayAvailableFrequencies(IntPtr ptr, ref int numFrequencies);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool SetDisplayFrequency(float refreshRate);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetDisplayFrequency(out float refreshRate);
[DllImport("OculusXRPlugin")]
internal static extern SystemHeadset GetSystemHeadsetType();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetTiledMultiResSupported();
[DllImport("OculusXRPlugin")]
internal static extern void SetTiledMultiResLevel(int level);
[DllImport("OculusXRPlugin")]
internal static extern int GetTiledMultiResLevel();
[DllImport("OculusXRPlugin")]
internal static extern void SetTiledMultiResDynamic([MarshalAs(UnmanagedType.I1)] bool isDynamic);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEyeTrackedFoveatedRenderingSupported();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEyeTrackedFoveatedRenderingEnabled();
[DllImport("OculusXRPlugin")]
internal static extern void SetEyeTrackedFoveatedRenderingEnabled([MarshalAs(UnmanagedType.I1)] bool isEnabled);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetShouldRestartSession();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool SetupEnvironmentDepth(ref EnvironmentDepthCreateParamsInternal createParams);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool SetEnvironmentDepthRendering([MarshalAs(UnmanagedType.I1)] bool isEnabled);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool ShutdownEnvironmentDepth();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEnvironmentDepthTextureId(ref uint id);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEnvironmentDepthFrameDesc(ref EnvironmentDepthFrameDescInternal frameDesc, int eye);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool SetEnvironmentDepthHandRemoval([MarshalAs(UnmanagedType.I1)] bool isEnabled);
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEnvironmentDepthSupported();
[DllImport("OculusXRPlugin")]
[return: MarshalAs(UnmanagedType.U1)]
internal static extern bool GetEnvironmentDepthHandRemovalSupported();
}
}
}