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.
88 lines
2.6 KiB
88 lines
2.6 KiB
3 years ago
|
//========= Copyright 2016-2018, HTC Corporation. All rights reserved. ===========
|
||
|
|
||
|
using HTC.UnityPlugin.VRModuleManagement;
|
||
|
|
||
|
namespace HTC.UnityPlugin.Vive
|
||
|
{
|
||
|
[ViveRoleEnum((int)TrackerRole.Invalid)]
|
||
|
public enum TrackerRole
|
||
|
{
|
||
|
Invalid,
|
||
|
Tracker1,
|
||
|
Tracker2,
|
||
|
Tracker3,
|
||
|
Tracker4,
|
||
|
Tracker5,
|
||
|
Tracker6,
|
||
|
Tracker7,
|
||
|
Tracker8,
|
||
|
Tracker9,
|
||
|
Tracker10,
|
||
|
Tracker11,
|
||
|
Tracker12,
|
||
|
Tracker13,
|
||
|
}
|
||
|
|
||
|
public class TrackerRoleHandler : ViveRole.MapHandler<TrackerRole>
|
||
|
{
|
||
|
private bool IsTracker(uint deviceIndex)
|
||
|
{
|
||
|
return IsTracker(VRModule.GetCurrentDeviceState(deviceIndex).deviceClass);
|
||
|
}
|
||
|
|
||
|
private bool IsTracker(VRModuleDeviceClass deviceClass)
|
||
|
{
|
||
|
return deviceClass == VRModuleDeviceClass.GenericTracker;
|
||
|
}
|
||
|
|
||
|
public override void OnAssignedAsCurrentMapHandler() { Refresh(); }
|
||
|
|
||
|
public override void OnConnectedDeviceChanged(uint deviceIndex, VRModuleDeviceClass deviceClass, string deviceSN, bool connected)
|
||
|
{
|
||
|
if (!RoleMap.IsDeviceBound(deviceSN) && !IsTracker(deviceClass)) { return; }
|
||
|
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
public override void OnBindingChanged(string deviceSN, bool previousIsBound, TrackerRole previousRole, bool currentIsBound, TrackerRole currentRole)
|
||
|
{
|
||
|
uint deviceIndex;
|
||
|
if (!VRModule.TryGetConnectedDeviceIndex(deviceSN, out deviceIndex)) { return; }
|
||
|
|
||
|
Refresh();
|
||
|
}
|
||
|
|
||
|
public void Refresh()
|
||
|
{
|
||
|
MappingTrackers();
|
||
|
}
|
||
|
|
||
|
private void MappingTrackers()
|
||
|
{
|
||
|
var deviceIndex = 0u;
|
||
|
for (var role = RoleInfo.MinValidRole; role <= RoleInfo.MaxValidRole; ++role)
|
||
|
{
|
||
|
if (!RoleInfo.IsValidRole(role)) { continue; }
|
||
|
if (RoleMap.IsRoleBound(role)) { continue; }
|
||
|
|
||
|
// find next valid device
|
||
|
if (VRModule.IsValidDeviceIndex(deviceIndex))
|
||
|
{
|
||
|
while (!IsTracker(deviceIndex) || RoleMap.IsDeviceConnectedAndBound(deviceIndex))
|
||
|
{
|
||
|
if (!VRModule.IsValidDeviceIndex(++deviceIndex)) { break; }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (VRModule.IsValidDeviceIndex(deviceIndex))
|
||
|
{
|
||
|
MappingRole(role, deviceIndex++);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
UnmappingRole(role);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|