EyeTrackVR/EyeTrackApp/utils/smart_inversion.py
2025-02-08 18:19:47 +13:00

73 lines
2.6 KiB
Python

from eye import EyeId
from utils.misc_utils import clamp
def smart_inversion(self, var, out_x, out_y):
#Checks to see if the class already has frame counts or inversion attributes
if not hasattr(self, "inverted_frame_count"):
self.inverted_frame_count = 0
if not hasattr(self, "normal_frame_count"):
self.normal_frame_count = 0
if not hasattr(self, "is_inverted"):
self.is_inverted = False
#Updates eye positions with latest
if self.eye_id == EyeId.LEFT:
var.l_eye_x = out_x
var.left_y = out_y
if self.eye_id == EyeId.RIGHT:
var.r_eye_x = out_x
var.right_y = out_y
#Checks if eyes are inverted, and then activates inversion if the conditions have been true for a specified number of frames.
if (var.l_eye_x > 0 and var.r_eye_x < 0) and (abs(var.l_eye_x - var.r_eye_x) > self.settings.gui_smartinversion_thresh):
self.inverted_frame_count = min(self.inverted_frame_count + 1, self.settings.gui_smartinversion_frame_count)
if self.inverted_frame_count == self.settings.gui_smartinversion_frame_count:
self.is_inverted = True
self.normal_frame_count = 0
print(f"Inversion Activated")
#Checks if the eyes are no longer inverted, and then clears inversion if the conditions haven't been true for a specified number of frames.
elif self.is_inverted and (
not (var.l_eye_x > 0 and var.r_eye_x < 0) or
abs(var.l_eye_x - var.r_eye_x) <= self.settings.gui_smartinversion_thresh
):
self.normal_frame_count = min(self.normal_frame_count + 1, self.settings.gui_smartinversion_frame_count)
if self.normal_frame_count == self.settings.gui_smartinversion_frame_count:
self.is_inverted = False
self.inverted_frame_count = 0
print(f"Inversion Cleared")
#Determines which eye is being tracked based off selection and sets values accordingly
if self.settings.gui_smartinversion_select_right:
tracked_eye_x = var.r_eye_x
tracked_eye_y = var.right_y
recessive_eye = EyeId.LEFT
else:
tracked_eye_x = var.l_eye_x
tracked_eye_y = var.left_y
recessive_eye = EyeId.RIGHT
out_x = tracked_eye_x
out_y = tracked_eye_y
#If eyes are inverted, and eye being processed is recessive, invert x value.
if self.eye_id == recessive_eye:
if self.is_inverted:
out_x = -tracked_eye_x
else:
out_x = tracked_eye_x
else:
out_x = tracked_eye_x
out_y = tracked_eye_y
return out_x, out_y