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