private void SendHeadTrackingDataToVridge() { switch (SelectedHeadTrackingMode) { case TrackingType.Position: headTrackingService?.SendPositionOnly(PositionX, PositionY, PositionZ); break; case TrackingType.PositionAndRotation: headTrackingService?.SendRotationAndPosition(Yaw, Pitch, Roll, PositionX, PositionY, PositionZ); break; case TrackingType.SyncOffset: headTrackingService?.UpdateOffsetMatrix(Yaw, Pitch, Roll, PositionX, PositionY, PositionZ); break; case TrackingType.AsyncOffset: headTrackingService?.SendAsyncOffset(Yaw, Pitch, Roll); break; default: throw new ArgumentOutOfRangeException(); } // Mark HMD as in/out of tracking range when it crosses tracking bounds var isHmdTracked = Math.Abs(PositionX) <= 3 && Math.Abs(PositionZ) <= 3; if (wasHMDTracked && !isHmdTracked) { headTrackingService?.ChangeStatus(false); wasHMDTracked = false; } if (!wasHMDTracked && isHmdTracked) { headTrackingService?.ChangeStatus(true); wasHMDTracked = true; } }