57 lines
1.8 KiB
C#
57 lines
1.8 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
|
|
|
|
public abstract class OVRComposition {
|
|
|
|
public abstract OVRManager.CompositionMethod CompositionMethod();
|
|
|
|
public abstract void Update(Camera mainCamera);
|
|
public abstract void Cleanup();
|
|
|
|
public virtual void RecenterPose() { }
|
|
|
|
protected bool usingLastAttachedNodePose = false;
|
|
protected OVRPose lastAttachedNodePose = new OVRPose(); // Sometimes the attach node pose is not readable (lose tracking, low battery, etc.) Use the last pose instead when it happens
|
|
|
|
internal OVRPose ComputeCameraWorldSpacePose(OVRPlugin.CameraExtrinsics extrinsics)
|
|
{
|
|
OVRPose worldSpacePose = new OVRPose();
|
|
OVRPose trackingSpacePose = new OVRPose();
|
|
|
|
OVRPose cameraTrackingSpacePose = extrinsics.RelativePose.ToOVRPose();
|
|
trackingSpacePose = cameraTrackingSpacePose;
|
|
|
|
if (extrinsics.AttachedToNode != OVRPlugin.Node.None && OVRPlugin.GetNodePresent(extrinsics.AttachedToNode))
|
|
{
|
|
if (usingLastAttachedNodePose)
|
|
{
|
|
Debug.Log("The camera attached node get tracked");
|
|
usingLastAttachedNodePose = false;
|
|
}
|
|
OVRPose attachedNodePose = OVRPlugin.GetNodePose(extrinsics.AttachedToNode, OVRPlugin.Step.Render).ToOVRPose();
|
|
lastAttachedNodePose = attachedNodePose;
|
|
trackingSpacePose = attachedNodePose * trackingSpacePose;
|
|
}
|
|
else
|
|
{
|
|
if (extrinsics.AttachedToNode != OVRPlugin.Node.None)
|
|
{
|
|
if (!usingLastAttachedNodePose)
|
|
{
|
|
Debug.LogWarning("The camera attached node could not be tracked, using the last pose");
|
|
usingLastAttachedNodePose = true;
|
|
}
|
|
trackingSpacePose = lastAttachedNodePose * trackingSpacePose;
|
|
}
|
|
}
|
|
|
|
worldSpacePose = OVRExtensions.ToWorldSpacePose(trackingSpacePose);
|
|
return worldSpacePose;
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|