128 lines
4.6 KiB
C#
128 lines
4.6 KiB
C#
#if PICO_OPENXR_SDK
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Unity.XR.CoreUtils;
|
|
using Unity.XR.PXR;
|
|
using UnityEngine;
|
|
using UnityEngine.XR;
|
|
using UnityEngine.XR.OpenXR;
|
|
|
|
namespace Unity.XR.OpenXR.Features.PICOSupport
|
|
{
|
|
public class LayerBase : MonoBehaviour
|
|
{
|
|
public static int ID = 0;
|
|
private Transform overlayTransform;
|
|
private Camera xrRig;
|
|
|
|
private Vector3 modelTranslations;
|
|
private Quaternion modelRotations;
|
|
private Vector3 modelScales ;
|
|
private XROrigin cameraRig;
|
|
private XROrigin lastcameraRig;
|
|
public bool isXROriginChange = false;
|
|
private float offsetY = 0;
|
|
bool isUpdateOffsetY= false;
|
|
private Vector3 cameraPosOri;
|
|
private TrackingOriginModeFlags lastTrackingOriginMod = TrackingOriginModeFlags.Unknown;
|
|
public void Awake()
|
|
{
|
|
ID++;
|
|
lastcameraRig=cameraRig=FindActiveXROrigin();
|
|
overlayTransform = GetComponent<Transform>();
|
|
PXR_Plugin.System.RecenterSuccess+=()=>
|
|
{
|
|
isUpdateOffsetY = true;
|
|
};
|
|
|
|
|
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
|
if (overlayTransform != null)
|
|
{
|
|
MeshRenderer render = overlayTransform.GetComponent<MeshRenderer>();
|
|
if (render != null)
|
|
{
|
|
render.enabled = false;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
XROrigin FindActiveXROrigin()
|
|
{
|
|
XROrigin[] xrOrigins = FindObjectsOfType<XROrigin>();
|
|
foreach (XROrigin xrOrigin in xrOrigins)
|
|
{
|
|
if (xrOrigin.gameObject.activeInHierarchy)
|
|
{
|
|
return xrOrigin;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
ID--;
|
|
}
|
|
|
|
public void UpdateCoords(bool isCreate = false)
|
|
{
|
|
if (isXROriginChange)
|
|
{
|
|
cameraRig=FindActiveXROrigin();
|
|
isUpdateOffsetY=cameraRig!= lastcameraRig;
|
|
lastcameraRig = cameraRig;
|
|
}
|
|
|
|
if (isCreate)
|
|
{
|
|
cameraPosOri=cameraRig.transform.position;
|
|
}
|
|
if (isCreate||cameraRig.CurrentTrackingOriginMode != lastTrackingOriginMod ||isUpdateOffsetY)
|
|
{
|
|
|
|
if (cameraRig.CurrentTrackingOriginMode == TrackingOriginModeFlags.Floor)
|
|
{
|
|
offsetY= cameraRig.Camera.transform.position.y;
|
|
}
|
|
Debug.Log("CurrentTrackingOriginMode:"+cameraRig.CurrentTrackingOriginMode+" offsetY:"+offsetY);
|
|
isUpdateOffsetY=false;
|
|
lastTrackingOriginMod = cameraRig.CurrentTrackingOriginMode;
|
|
}
|
|
|
|
|
|
var worldInsightModel = GetTransformMatrixForPassthrough(overlayTransform.localToWorldMatrix);
|
|
modelTranslations=worldInsightModel.GetPosition();
|
|
modelRotations = worldInsightModel.rotation;
|
|
modelScales = overlayTransform.lossyScale;
|
|
}
|
|
|
|
private Matrix4x4 GetTransformMatrixForPassthrough(Matrix4x4 worldFromObj)
|
|
{
|
|
Matrix4x4 trackingSpaceFromWorld =
|
|
(cameraRig != null) ? cameraRig.CameraFloorOffsetObject.transform.worldToLocalMatrix : Matrix4x4.identity;
|
|
|
|
return trackingSpaceFromWorld * worldFromObj;
|
|
}
|
|
public void GetCurrentTransform(ref GeometryInstanceTransform geometryInstanceTransform)
|
|
{
|
|
geometryInstanceTransform.pose.position.x = modelTranslations.x;
|
|
geometryInstanceTransform.pose.position.y = modelTranslations.y-offsetY+ (cameraRig.CurrentTrackingOriginMode == TrackingOriginModeFlags.Floor
|
|
? (cameraRig.transform.position.y - cameraPosOri.y)
|
|
: 0);
|
|
geometryInstanceTransform.pose.position.z = -modelTranslations.z;
|
|
geometryInstanceTransform.pose.orientation.x = -modelRotations.x;
|
|
geometryInstanceTransform.pose.orientation.y = -modelRotations.y;
|
|
geometryInstanceTransform.pose.orientation.z = modelRotations.z;
|
|
geometryInstanceTransform.pose.orientation.w = modelRotations.w;
|
|
|
|
geometryInstanceTransform.scale.x = modelScales.x;
|
|
geometryInstanceTransform.scale.y = modelScales.y;
|
|
geometryInstanceTransform.scale.z = 1;
|
|
|
|
geometryInstanceTransform.isFloor = cameraRig.CurrentTrackingOriginMode == TrackingOriginModeFlags.Floor;
|
|
}
|
|
}
|
|
}
|
|
#endif |