@@ -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