Skip to content

Commit 22eae0a

Browse files
Merge pull request #2379 from davidkline-ms/vNext-2378
vNext: fix corner cases in determining windows mixed reality controller tracking
2 parents c9b54d4 + 5a62113 commit 22eae0a

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

Assets/MixedRealityToolkit/_Core/Devices/MixedReality/WindowsMixedRealityController.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,33 @@ private void UpdateControllerData(InteractionSourceState interactionSourceState)
111111
{
112112
var lastState = TrackingState;
113113

114-
IsPositionAvailable = interactionSourceState.sourcePose.TryGetPosition(out currentControllerPosition);
115-
if (IsPositionAvailable)
114+
InteractionSourceKind sourceKind = interactionSourceState.source.kind;
115+
if ((sourceKind == InteractionSourceKind.Hand) ||
116+
((sourceKind == InteractionSourceKind.Controller) && interactionSourceState.source.supportsPointing))
116117
{
117-
TrackingState = TrackingState.Tracked;
118-
IsPositionApproximate = (interactionSourceState.sourcePose.positionAccuracy == InteractionSourcePositionAccuracy.Approximate);
118+
// The source is either a hand or a controller that supports pointing.
119+
// We can now check for position and rotation.
120+
IsPositionAvailable = interactionSourceState.sourcePose.TryGetPosition(out currentControllerPosition);
121+
if (IsPositionAvailable)
122+
{
123+
IsPositionApproximate = (interactionSourceState.sourcePose.positionAccuracy == InteractionSourcePositionAccuracy.Approximate);
124+
}
125+
else
126+
{
127+
IsPositionApproximate = false;
128+
}
129+
130+
IsRotationAvailable = interactionSourceState.sourcePose.TryGetRotation(out currentControllerRotation);
131+
132+
// Devices are considered tracked if we receive position OR rotation data from the sensors.
133+
TrackingState = (IsPositionAvailable || IsRotationAvailable) ? TrackingState.Tracked : TrackingState.NotTracked;
119134
}
120135
else
121136
{
122-
TrackingState = TrackingState.NotTracked;
123-
IsPositionApproximate = true;
137+
// The input source does not support tracking.
138+
TrackingState = TrackingState.NotApplicable;
124139
}
125140

126-
IsRotationAvailable = interactionSourceState.sourcePose.TryGetRotation(out currentControllerRotation);
127141

128142
if (lastState != TrackingState)
129143
{

0 commit comments

Comments
 (0)