mirror of
https://github.com/EyeTrackVR/EyeTrackVR.git
synced 2025-09-26 23:09:28 +08:00

* initial changes * Mostly clean up, refactor registering listeners to make sense, backport tests * Add initial implementation of VRCFTModuleSender * Add basic GUI for the modules settings * Fix tooltip descriptions # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * Fix type validation bugs, fix typos # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * Add checkbox to switch to ETVR Module # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * Black stuff # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * Remove coverage by default # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * Fix timeout in tests # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * HEAVY WIP: Refactor native output, NOTE: I brought back the entire old OSC implementation as a live reference, this will be removed once I'm done. This also lays ground for other modes as they're pretty similar # TODO: # - there's ghosts in the machine - vrc osc is not working properly # - min/maxing will require field combinators in the modules lmao * HEAVY WIP: Refactor v1 params output, # TODO: # - min/maxing will require field combinators in the modules lmao * HEAVY WIP: Refactor v2 params output # TODO: # - min/maxing will require field combinators in the modules lmao * Finish refactoring v2 and v1, fixup tests, refactor native # TODO: # - min/maxing will require field combinators in the modules lmao * Add tests for v1 params # TODO: # - min/maxing will require field combinators in the modules lmao * Add tests for native params # TODO: # - min/maxing will require field combinators in the modules lmao * Fix OSC not getting up after config reset. Remove reset command, config sends everything changed anyway, sunset the idea of using single client and thus simplify the code a bit # TODO: # - min/maxing will require field combinators in the modules lmao * Rename gui_PortNumber to gui_VRCFTModulePort for readability # TODO: # - min/maxing will require field combinators in the modules lmao * Cleanup EyeID usage # TODO: # - min/maxing will require field combinators in the modules lmao * Cleanup osc after rebase # TODO: # - min/maxing will require field combinators in the modules lmao * Make VRChatOSCSender a bit more readable # TODO: # - min/maxing will require field combinators in the modules lmao * Remove unsued VRChatOSCReceiver, this is taken care of by generic OSCReceiver # TODO: # - min/maxing will require field combinators in the modules lmao * Commit crimes with try_convert_to_float to make osc, pysimplegui and pydantic happy * Cleanup after merge * Disable emulation by default * Fix OSCReceiver crashing on unknown addresses * Adjust VRCFT Module settings to look better in game * Fix recalibrate and recenter for OSC only working for the right eye * Fix save and restart button not restarting the tracking * Fix broken tracking on v1 params for eye_x, clean up implementation * Fix regular value being passed to OSC listeners instead of OSCMessage * Add a TODO, probably to be ignored * Add support for custom ETVR VRCFT Module listening address
46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
import numpy as np
|
|
|
|
from eye import EyeId
|
|
|
|
|
|
def velocity_falloff(self, var, out_x, out_y):
|
|
|
|
if (
|
|
self.settings.gui_right_eye_dominant
|
|
or self.settings.gui_left_eye_dominant
|
|
or self.settings.gui_outer_side_falloff
|
|
):
|
|
# Calculate the distance between the two eyes
|
|
dist = np.sqrt(np.square(var.l_eye_x - var.r_eye_x) + np.square(var.left_y - var.right_y))
|
|
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
|
|
|
|
# Check if the distance is greater than the threshold
|
|
if dist > self.settings.gui_eye_dominant_diff_thresh:
|
|
|
|
if self.settings.gui_right_eye_dominant:
|
|
out_x, out_y = var.r_eye_x, var.right_y
|
|
|
|
elif self.settings.gui_left_eye_dominant:
|
|
out_x, out_y = var.l_eye_x, var.left_y
|
|
|
|
else:
|
|
# If the distance is too large, identify the eye with the lower velocity
|
|
if var.l_eye_velocity < var.r_eye_velocity:
|
|
# Mirror the position of the eye with lower velocity to the other eye
|
|
out_x, out_y = var.r_eye_x, var.right_y
|
|
else:
|
|
# Mirror the position of the eye with lower velocity to the other eye
|
|
out_x, out_y = var.l_eye_x, var.left_y
|
|
else:
|
|
# If the distance is within the threshold, do not mirror the eyes
|
|
pass
|
|
else:
|
|
pass
|
|
return out_x, out_y
|