using UnityEngine; using System.Collections; using System; using Oculus.Avatar; public abstract class OvrAvatarDriver : MonoBehaviour { public enum PacketMode { SDK, Unity }; public PacketMode Mode; protected PoseFrame CurrentPose; public PoseFrame GetCurrentPose() { return CurrentPose; } public abstract void UpdateTransforms(IntPtr sdkAvatar); private ovrAvatarControllerType ControllerType = ovrAvatarControllerType.Quest; public struct ControllerPose { public ovrAvatarButton buttons; public ovrAvatarTouch touches; public Vector2 joystickPosition; public float indexTrigger; public float handTrigger; public bool isActive; public static ControllerPose Interpolate(ControllerPose a, ControllerPose b, float t) { return new ControllerPose { buttons = t < 0.5f ? a.buttons : b.buttons, touches = t < 0.5f ? a.touches : b.touches, joystickPosition = Vector2.Lerp(a.joystickPosition, b.joystickPosition, t), indexTrigger = Mathf.Lerp(a.indexTrigger, b.indexTrigger, t), handTrigger = Mathf.Lerp(a.handTrigger, b.handTrigger, t), isActive = t < 0.5f ? a.isActive : b.isActive, }; } } public struct PoseFrame { public Vector3 headPosition; public Quaternion headRotation; public Vector3 handLeftPosition; public Quaternion handLeftRotation; public Vector3 handRightPosition; public Quaternion handRightRotation; public float voiceAmplitude; public ControllerPose controllerLeftPose; public ControllerPose controllerRightPose; public static PoseFrame Interpolate(PoseFrame a, PoseFrame b, float t) { return new PoseFrame { headPosition = Vector3.Lerp(a.headPosition, b.headPosition, t), headRotation = Quaternion.Slerp(a.headRotation, b.headRotation, t), handLeftPosition = Vector3.Lerp(a.handLeftPosition, b.handLeftPosition, t), handLeftRotation = Quaternion.Slerp(a.handLeftRotation, b.handLeftRotation, t), handRightPosition = Vector3.Lerp(a.handRightPosition, b.handRightPosition, t), handRightRotation = Quaternion.Slerp(a.handRightRotation, b.handRightRotation, t), voiceAmplitude = Mathf.Lerp(a.voiceAmplitude, b.voiceAmplitude, t), controllerLeftPose = ControllerPose.Interpolate(a.controllerLeftPose, b.controllerLeftPose, t), controllerRightPose = ControllerPose.Interpolate(a.controllerRightPose, b.controllerRightPose, t), }; } }; void Start() { var headsetType = OVRPlugin.GetSystemHeadsetType(); switch (headsetType) { case OVRPlugin.SystemHeadset.GearVR_R320: case OVRPlugin.SystemHeadset.GearVR_R321: case OVRPlugin.SystemHeadset.GearVR_R322: case OVRPlugin.SystemHeadset.GearVR_R323: case OVRPlugin.SystemHeadset.GearVR_R324: case OVRPlugin.SystemHeadset.GearVR_R325: ControllerType = ovrAvatarControllerType.Malibu; break; case OVRPlugin.SystemHeadset.Oculus_Go: ControllerType = ovrAvatarControllerType.Go; break; case OVRPlugin.SystemHeadset.Oculus_Quest: case OVRPlugin.SystemHeadset.Rift_S: ControllerType = ovrAvatarControllerType.Quest; break; case OVRPlugin.SystemHeadset.Rift_DK1: case OVRPlugin.SystemHeadset.Rift_DK2: case OVRPlugin.SystemHeadset.Rift_CV1: default: ControllerType = ovrAvatarControllerType.Touch; break; } } public void UpdateTransformsFromPose(IntPtr sdkAvatar) { if (sdkAvatar != IntPtr.Zero) { ovrAvatarTransform bodyTransform = OvrAvatar.CreateOvrAvatarTransform(CurrentPose.headPosition, CurrentPose.headRotation); ovrAvatarHandInputState inputStateLeft = OvrAvatar.CreateInputState(OvrAvatar.CreateOvrAvatarTransform(CurrentPose.handLeftPosition, CurrentPose.handLeftRotation), CurrentPose.controllerLeftPose); ovrAvatarHandInputState inputStateRight = OvrAvatar.CreateInputState(OvrAvatar.CreateOvrAvatarTransform(CurrentPose.handRightPosition, CurrentPose.handRightRotation), CurrentPose.controllerRightPose); CAPI.ovrAvatarPose_UpdateBody(sdkAvatar, bodyTransform); CAPI.ovrAvatarPose_UpdateHandsWithType(sdkAvatar, inputStateLeft, inputStateRight, ControllerType); } } public static bool GetIsTrackedRemote() { return OVRInput.IsControllerConnected(OVRInput.Controller.RTrackedRemote) || OVRInput.IsControllerConnected(OVRInput.Controller.LTrackedRemote); } }