private static IEnumerator UpdateEyeTrackerState() { while (true) { // Start or stop eye tracker from avatar quick menu var useEyeTracker = ExpressionParameterManager.GetBoolParameter("UseEyeTracker"); var isEyeTrackerActive = eyeTracker?.Active ?? false; if (isEyeTrackerActive && needsExpressionUpdate) { needsExpressionUpdate = false; UpdateExpressionParameters(); } if (!isChangingActiveStatus) { if (isEyeTrackerActive && !useEyeTracker) { MelonLogger.Msg("Eye Tracker Stopping"); isChangingActiveStatus = true; changeActiveStateTimer = DateTime.Now; eyeTracker.Stop(); } else if (!isEyeTrackerActive && useEyeTracker) { MelonLogger.Msg("Eye Tracker Starting"); isChangingActiveStatus = eyeTracker.Start(); changeActiveStateTimer = DateTime.Now; } } else { if ((DateTime.Now - changeActiveStateTimer).TotalSeconds >= TIMER_CHANGE_ACTIVE_STATE) { MelonLogger.Msg("Eye Tracker State Change Timed Out"); isChangingActiveStatus = false; ExpressionParameterManager.SetParameter("UseEyeTracker", isEyeTrackerActive, true); } } yield return(new WaitForSeconds(isEyeTrackerActive ? 0.01f : 0.5f)); } }
private static void UpdateExpressionParameters() { if (eyeTracker?.Active ?? false) { ExpressionParameterManager.SetParameter("LeftEyeBlink", eyeTracker.LeftEye.Expression.Blink, true); ExpressionParameterManager.SetParameter("RightEyeBlink", eyeTracker.RightEye.Expression.Blink, true); ExpressionParameterManager.SetParameter("LeftEyeLid", eyeTracker.LeftEye.Expression.Openness, true); ExpressionParameterManager.SetParameter("RightEyeLid", eyeTracker.RightEye.Expression.Openness, true); ExpressionParameterManager.SetParameter("LeftEyeX", eyeTracker.LeftEye.Expression.PupilCenter.x); ExpressionParameterManager.SetParameter("RightEyeX", eyeTracker.RightEye.Expression.PupilCenter.x); ExpressionParameterManager.SetParameter("EyesX", eyeTracker.RightEye.Expression.Blink ? eyeTracker.LeftEye.Expression.PupilCenter.x : eyeTracker.RightEye.Expression.PupilCenter.x); ExpressionParameterManager.SetParameter("LeftEyeY", eyeTracker.LeftEye.Expression.PupilCenter.y); ExpressionParameterManager.SetParameter("RightEyeY", eyeTracker.RightEye.Expression.PupilCenter.y); ExpressionParameterManager.SetParameter("EyesY", eyeTracker.RightEye.Expression.Blink ? eyeTracker.LeftEye.Expression.PupilCenter.y : eyeTracker.RightEye.Expression.PupilCenter.y); } }