|
|
- 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);
- }
- }
|