//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
namespace Rokid.UXR.Native
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using Rokid.XR.Core;
///
/// UXR Plugin.
///
public static class Api
{
private static Rect _cachedSafeArea;
private static ScreenOrientation _cachedScreenOrientation;
///
/// Updates screen parameters. This method must be called at framerate to ensure the current
/// screen orientation is properly taken into account by the head tracker.
///
public static void UpdateScreenParams()
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return;
}
// Only set viewport orientation if it has changed since the last check.
if (_cachedScreenOrientation != Screen.orientation)
{
_cachedScreenOrientation = Screen.orientation;
XRLoader.SetViewportOrientation(_cachedScreenOrientation);
XRLoader.RecalculateRectangles(Screen.safeArea);
//ReloadDeviceParams();
}
}
public static void setTrackingType(int type)
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return;
}
setHeadTrackingType(type);
}
///
/// Recenters the head tracker(yaw only).
///
public static void Recenter()
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return;
}
recenterHeadPose();
}
///
/// Recenters the head tracker(pitch,yaw and roll).
///
public static void Recenter2()
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return;
}
recenterHeadPoseYPR();
}
public static string getDebugInfoU()
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return "Not Initialized";
}
IntPtr keyPtr = getDebugInfo();
string result = Marshal.PtrToStringAnsi(keyPtr);
//Debug.Log("Debug Info: " + result);
return result;
}
public static int getHeadTrackerState()
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return 1;
}
int state = getSlamState();
//Debug.Log("head tracker State: " + state);
return state;
}
///
/// 获取预测的未来某时刻Head位姿
///
///
///
///
public static long getHeadPose(float[] position, float[] orientation)
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return 1;
}
long ts = getHeadPoseRHS(position, orientation);
//R2L
position[2] = -position[2];
orientation[0] = -orientation[0]; orientation[1] = -orientation[1];
return ts;
}
///
/// 获取最新相机时刻(physical camera)的Head位姿
///
///
///
///
public static long GetHeadPoseCameraBase(float[] position, float[] orientation)
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return 1;
}
long ts = getHeadPoseCameraBaseRHS(position, orientation);
//R2L
position[2] = -position[2];
orientation[0] = -orientation[0]; orientation[1] = -orientation[1];
return ts;
}
///
/// 获取左右眼投影参数
///
/// float[6] {left,right,bottom,top,near,far}
/// {left,right,bottom,top,near,far}
///
public static bool getFrustum(float[] frustum_left, float[] frustum_right)
{
if (!XRLoader._isInitialized)
{
Debug.LogError(
"Please initialize UXR loader before calling this function.");
return false;
}
bool result = get_frustum(frustum_left, frustum_right);
return result;
}
public static String GetDeviceModel()
{
IntPtr charPointer = CardboardUnity_getDeviceModel();
if (charPointer == null)
{
return "";
}
return Marshal.PtrToStringAnsi(CardboardUnity_getDeviceModel());
}
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern void setHeadTrackingType(int type);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern void recenterHeadPose();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern void recenterHeadPoseYPR();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern IntPtr getDebugInfo();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern int getSlamState();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern long getHeadPoseRHS(float[] position, float[] orientation);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern long getHeadPoseCameraBaseRHS(float[] position, float[] orientation);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern bool get_frustum(float[] frustum_left, float[] frustum_right);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern int getGlassProductId();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern bool isUsbConnect();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassName();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassTypeId();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassSn();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassSeed();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void setGlassBrightness(int value);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern int getGlassBrightness();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassCalFile();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern IntPtr getGlassFirmwareVersion();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern bool isPreviewing();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getPreviewDimen(int[] data);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void openPhoneTracker();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void closePhoneTracker();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getPhonePose(float[] oritation);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void recenterPhonePose();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void recenterPhonePoseYPR();
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern void CardboardUnity_setDeviceURL(String url);
[DllImport(ApiConstants.UXR_GFX_PLUGIN)]
private static extern IntPtr CardboardUnity_getDeviceModel();
/**
* 获取fx,fy
*/
[Obsolete("Use NativeInterface.NativeAPI.GetFocalLength instead"), DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getFocalLength(float[] data);
/**
* 获取cx,cy
*/
[Obsolete("Use NativeInterface.NativeAPI.GetPrincipalPoint instead"), DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getPrincipalPoint(float[] data);
/**
* 获取width,height
*/
[Obsolete("Use NativeInterface.NativeAPI.GetImageDimensions instead"), DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getImageDimensions(int[] data);
/**
* pinhole:k1,k2,k3,p1,p2
* fisheye:alpha,k1,k2,k3,k4;
*/
[Obsolete("Use NativeInterface.NativeAPI.GetDistortion instead"), DllImport(ApiConstants.UXR_GFX_PLUGIN)]
public static extern void getDistortion(float[] data);
}
}