You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.5 KiB
120 lines
3.5 KiB
//========= Copyright 2016-2020, HTC Corporation. All rights reserved. ===========
|
|
|
|
using HTC.UnityPlugin.PoseTracker;
|
|
using HTC.UnityPlugin.Utility;
|
|
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
namespace HTC.UnityPlugin.Vive
|
|
{
|
|
[AddComponentMenu("VIU/Device Tracker/Vive Pose Tracker (Transform)", 7)]
|
|
// Simple component to track Vive devices.
|
|
public class VivePoseTracker : BasePoseTracker, INewPoseListener, IViveRoleComponent
|
|
{
|
|
[Serializable]
|
|
public class UnityEventBool : UnityEvent<bool> { }
|
|
|
|
private bool m_isValid;
|
|
|
|
public Transform origin;
|
|
|
|
[SerializeField]
|
|
private ViveRoleProperty m_viveRole = ViveRoleProperty.New(HandRole.RightHand);
|
|
|
|
public UnityEventBool onIsValidChanged;
|
|
|
|
[HideInInspector]
|
|
[Obsolete("Use VivePoseTracker.viveRole instead")]
|
|
public DeviceRole role = DeviceRole.Invalid;
|
|
|
|
public ViveRoleProperty viveRole { get { return m_viveRole; } }
|
|
|
|
public bool isPoseValid { get { return m_isValid; } }
|
|
|
|
protected void SetIsValid(bool value, bool forceSet = false)
|
|
{
|
|
if (ChangeProp.Set(ref m_isValid, value) || forceSet)
|
|
{
|
|
if (onIsValidChanged != null)
|
|
{
|
|
onIsValidChanged.Invoke(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void Start()
|
|
{
|
|
SetIsValid(VivePose.IsValid(m_viveRole), true);
|
|
}
|
|
#if UNITY_EDITOR
|
|
protected virtual void OnValidate()
|
|
{
|
|
// change old DeviceRole value to viveRole value
|
|
var serializedObject = new UnityEditor.SerializedObject(this);
|
|
|
|
var roleValueProp = serializedObject.FindProperty("role");
|
|
var oldRoleValue = roleValueProp.intValue;
|
|
|
|
if (oldRoleValue != (int)DeviceRole.Invalid)
|
|
{
|
|
Type newRoleType;
|
|
int newRoleValue;
|
|
|
|
if (oldRoleValue == -1)
|
|
{
|
|
newRoleType = typeof(DeviceRole);
|
|
newRoleValue = (int)DeviceRole.Hmd;
|
|
}
|
|
else
|
|
{
|
|
newRoleType = typeof(HandRole);
|
|
newRoleValue = oldRoleValue;
|
|
}
|
|
|
|
if (Application.isPlaying)
|
|
{
|
|
roleValueProp.intValue = (int)DeviceRole.Invalid;
|
|
m_viveRole.Set(newRoleType, newRoleValue);
|
|
}
|
|
else
|
|
{
|
|
roleValueProp.intValue = (int)DeviceRole.Invalid;
|
|
serializedObject.ApplyModifiedProperties();
|
|
m_viveRole.Set(newRoleType, newRoleValue);
|
|
serializedObject.Update();
|
|
}
|
|
}
|
|
serializedObject.Dispose();
|
|
}
|
|
#endif
|
|
protected virtual void OnEnable()
|
|
{
|
|
VivePose.AddNewPosesListener(this);
|
|
}
|
|
|
|
protected virtual void OnDisable()
|
|
{
|
|
VivePose.RemoveNewPosesListener(this);
|
|
|
|
SetIsValid(false);
|
|
}
|
|
|
|
public virtual void BeforeNewPoses() { }
|
|
|
|
public virtual void OnNewPoses()
|
|
{
|
|
var deviceIndex = m_viveRole.GetDeviceIndex();
|
|
var isValid = VivePose.IsValid(deviceIndex);
|
|
|
|
if (isValid)
|
|
{
|
|
TrackPose(VivePose.GetPose(deviceIndex), origin);
|
|
}
|
|
|
|
SetIsValid(isValid);
|
|
}
|
|
|
|
public virtual void AfterNewPoses() { }
|
|
}
|
|
}
|