/// <summary>
 ///     Resets all state to the initial state, with no users remembered as engaged or tracked.
 /// </summary>
 public void Reset()
 {
     using (var section = new EventQueueSection())
     {
         activityMeter.Clear();
         TrackedUserTrackingIds.Clear();
         PrimaryUserTrackingId = InvalidUserTrackingId;
         SetCandidateUserTrackingId(InvalidUserTrackingId, section);
         SetEngagedUserTrackingId(InvalidUserTrackingId, section);
         SendTrackedUsersChanged(section);
     }
 }
        /// <summary>
        ///     Called whenever the set of tracked hand pointers has changed.
        /// </summary>
        /// <param name="trackedHandPointers">
        ///     Hand pointers from which we'll update the set of tracked users and the primary user.
        /// </param>
        public void UpdateHandPointers(IEnumerable <HandPointer> trackedHandPointers)
        {
            bool foundEngagedUser      = false;
            bool foundCandidateUser    = false;
            int  primaryUserTrackingId = InvalidUserTrackingId;

            using (var section = new EventQueueSection())
            {
                TrackedUserTrackingIds.Clear();

                foreach (HandPointer handPointer in trackedHandPointers)
                {
                    if (handPointer.IsTracked && (handPointer.TrackingId != InvalidUserTrackingId))
                    {
                        // Only consider valid user tracking ids
                        TrackedUserTrackingIds.Add(handPointer.TrackingId);

                        if (EngagedUserTrackingId == handPointer.TrackingId)
                        {
                            foundEngagedUser = true;
                        }

                        if (CandidateUserTrackingId == handPointer.TrackingId)
                        {
                            foundCandidateUser = true;
                        }

                        if (handPointer.IsPrimaryUser)
                        {
                            primaryUserTrackingId = handPointer.TrackingId;
                        }
                    }
                }

                SendTrackedUsersChanged(section);

                // If engaged user was not found in list of candidate users, engaged user has become invalid.
                if (!foundEngagedUser)
                {
                    SetEngagedUserTrackingId(InvalidUserTrackingId, section);
                }

                // If candidate user was not found in list of candidate users, candidate user has become invalid.
                if (!foundCandidateUser)
                {
                    SetCandidateUserTrackingId(InvalidUserTrackingId, section);
                }

                SetPrimaryUserTrackingId(primaryUserTrackingId, section);
            }
        }