psychopy 2025.2.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- psychopy/CHANGELOG.txt +3981 -0
- psychopy/GIT_SHA +1 -0
- psychopy/LICENSE.txt +11 -0
- psychopy/LICENSES.txt +55 -0
- psychopy/VERSION +1 -0
- psychopy/__init__.py +148 -0
- psychopy/alerts/__init__.py +65 -0
- psychopy/alerts/_alerts.py +224 -0
- psychopy/alerts/_errorHandler.py +50 -0
- psychopy/alerts/alertsCatalogue/1000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/1100.yaml +0 -0
- psychopy/alerts/alertsCatalogue/1500.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2100.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2110.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2115.yaml +21 -0
- psychopy/alerts/alertsCatalogue/2120.yaml +22 -0
- psychopy/alerts/alertsCatalogue/2150.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2155.yaml +21 -0
- psychopy/alerts/alertsCatalogue/2300.yaml +0 -0
- psychopy/alerts/alertsCatalogue/2500.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3100.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3110.yaml +25 -0
- psychopy/alerts/alertsCatalogue/3115.yaml +24 -0
- psychopy/alerts/alertsCatalogue/3200.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3400.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3600.yaml +0 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/4051.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4052.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4100.yaml +0 -0
- psychopy/alerts/alertsCatalogue/4105.yaml +18 -0
- psychopy/alerts/alertsCatalogue/4115.yaml +21 -0
- psychopy/alerts/alertsCatalogue/4120.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4125.yaml +23 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4160.yaml +25 -0
- psychopy/alerts/alertsCatalogue/4200.yaml +0 -0
- psychopy/alerts/alertsCatalogue/4205.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4210.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4305.yaml +21 -0
- psychopy/alerts/alertsCatalogue/4310.yaml +21 -0
- psychopy/alerts/alertsCatalogue/4315.yaml +21 -0
- psychopy/alerts/alertsCatalogue/4320.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4325.yaml +23 -0
- psychopy/alerts/alertsCatalogue/4330.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4335.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4340.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4405.yaml +24 -0
- psychopy/alerts/alertsCatalogue/4505.yaml +22 -0
- psychopy/alerts/alertsCatalogue/4510.yaml +25 -0
- psychopy/alerts/alertsCatalogue/4520.yaml +26 -0
- psychopy/alerts/alertsCatalogue/4530.yaml +23 -0
- psychopy/alerts/alertsCatalogue/4540.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4545.yaml +22 -0
- psychopy/alerts/alertsCatalogue/4550.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4605.yaml +22 -0
- psychopy/alerts/alertsCatalogue/4610.yaml +22 -0
- psychopy/alerts/alertsCatalogue/4615.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4705.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4710.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4810.yaml +19 -0
- psychopy/alerts/alertsCatalogue/5000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/5055.yaml +25 -0
- psychopy/alerts/alertsCatalogue/6000.yaml +0 -0
- psychopy/alerts/alertsCatalogue/6105.yaml +18 -0
- psychopy/alerts/alertsCatalogue/7105.yaml +19 -0
- psychopy/alerts/alertsCatalogue/8105.yaml +21 -0
- psychopy/alerts/alertsCatalogue/8110.yaml +21 -0
- psychopy/alerts/alertsCatalogue/9998.yaml +19 -0
- psychopy/alerts/alertsCatalogue/9999.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +123 -0
- psychopy/alerts/alertsCatalogue/alertTemplate.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertmsg.py +173 -0
- psychopy/alerts/alertsCatalogue/generateAlertmsg.py +34 -0
- psychopy/alerts/alerttools.py +322 -0
- psychopy/app/Resources/README.md +12 -0
- psychopy/app/Resources/__init__.py +0 -0
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/builder.ico +0 -0
- psychopy/app/Resources/classic/FlowBottom_CompLeft.png +0 -0
- psychopy/app/Resources/classic/FlowBottom_CompRight.png +0 -0
- psychopy/app/Resources/classic/FlowTop_CompLeft.png +0 -0
- psychopy/app/Resources/classic/FlowTop_CompRight.png +0 -0
- psychopy/app/Resources/classic/README.txt +9 -0
- psychopy/app/Resources/classic/__init__.py +0 -0
- psychopy/app/Resources/classic/_layouts.ai +1138 -1
- psychopy/app/Resources/classic/add.png +0 -0
- psychopy/app/Resources/classic/add@2x.png +0 -0
- psychopy/app/Resources/classic/addExp32.png +0 -0
- psychopy/app/Resources/classic/add_many.png +0 -0
- psychopy/app/Resources/classic/add_many@2x.png +0 -0
- psychopy/app/Resources/classic/alerts.png +0 -0
- psychopy/app/Resources/classic/beta.png +0 -0
- psychopy/app/Resources/classic/browser.png +0 -0
- psychopy/app/Resources/classic/browser@2x.png +0 -0
- psychopy/app/Resources/classic/bug16.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@2x.png +0 -0
- psychopy/app/Resources/classic/circle_mask.png +0 -0
- psychopy/app/Resources/classic/circle_mask@2x.png +0 -0
- psychopy/app/Resources/classic/clear.png +0 -0
- psychopy/app/Resources/classic/clear@2x.png +0 -0
- psychopy/app/Resources/classic/coderclass16.png +0 -0
- psychopy/app/Resources/classic/coderfunc16.png +0 -0
- psychopy/app/Resources/classic/coderimport16.png +0 -0
- psychopy/app/Resources/classic/coderjs16.png +0 -0
- psychopy/app/Resources/classic/coderpython16.png +0 -0
- psychopy/app/Resources/classic/codervar16.png +0 -0
- psychopy/app/Resources/classic/cogwindow32.png +0 -0
- psychopy/app/Resources/classic/color32.png +0 -0
- psychopy/app/Resources/classic/compile32.png +0 -0
- psychopy/app/Resources/classic/compile_js.png +0 -0
- psychopy/app/Resources/classic/compile_js@2x.png +0 -0
- psychopy/app/Resources/classic/compile_py.png +0 -0
- psychopy/app/Resources/classic/compile_py@2x.png +0 -0
- psychopy/app/Resources/classic/copy16.png +0 -0
- psychopy/app/Resources/classic/currentFile.png +0 -0
- psychopy/app/Resources/classic/currentFile@2x.png +0 -0
- psychopy/app/Resources/classic/delete16.png +0 -0
- psychopy/app/Resources/classic/desktop.png +0 -0
- psychopy/app/Resources/classic/desktop@2x.png +0 -0
- psychopy/app/Resources/classic/devices.png +0 -0
- psychopy/app/Resources/classic/devices@2x.png +0 -0
- psychopy/app/Resources/classic/dirup16.png +0 -0
- psychopy/app/Resources/classic/docclose16.png +0 -0
- psychopy/app/Resources/classic/download.png +0 -0
- psychopy/app/Resources/classic/edit.png +0 -0
- psychopy/app/Resources/classic/edit@2x.png +0 -0
- psychopy/app/Resources/classic/editbtn.png +0 -0
- psychopy/app/Resources/classic/editbtn16.png +0 -0
- psychopy/app/Resources/classic/editbtn16@2x.png +0 -0
- psychopy/app/Resources/classic/editbtn@2x.png +0 -0
- psychopy/app/Resources/classic/email.png +0 -0
- psychopy/app/Resources/classic/email@2x.png +0 -0
- psychopy/app/Resources/classic/experiment.png +0 -0
- psychopy/app/Resources/classic/experiment@2x.png +0 -0
- psychopy/app/Resources/classic/expsettings.png +0 -0
- psychopy/app/Resources/classic/expsettings@2x.png +0 -0
- psychopy/app/Resources/classic/file.png +0 -0
- psychopy/app/Resources/classic/file@2x.png +0 -0
- psychopy/app/Resources/classic/fileaudio.png +0 -0
- psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
- psychopy/app/Resources/classic/filecss.png +0 -0
- psychopy/app/Resources/classic/filecss@2x.png +0 -0
- psychopy/app/Resources/classic/filecsv.png +0 -0
- psychopy/app/Resources/classic/filecsv@2x.png +0 -0
- psychopy/app/Resources/classic/filedesign.png +0 -0
- psychopy/app/Resources/classic/filedesign@2x.png +0 -0
- psychopy/app/Resources/classic/filefont.png +0 -0
- psychopy/app/Resources/classic/filefont@2x.png +0 -0
- psychopy/app/Resources/classic/filegit.png +0 -0
- psychopy/app/Resources/classic/filegit@2x.png +0 -0
- psychopy/app/Resources/classic/filehtml.png +0 -0
- psychopy/app/Resources/classic/filehtml@2x.png +0 -0
- psychopy/app/Resources/classic/fileimage.png +0 -0
- psychopy/app/Resources/classic/fileimage@2x.png +0 -0
- psychopy/app/Resources/classic/fileinfo.png +0 -0
- psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
- psychopy/app/Resources/classic/filejs.png +0 -0
- psychopy/app/Resources/classic/filejs@2x.png +0 -0
- psychopy/app/Resources/classic/filejson.png +0 -0
- psychopy/app/Resources/classic/filejson@2x.png +0 -0
- psychopy/app/Resources/classic/filenew.png +0 -0
- psychopy/app/Resources/classic/filenew32.png +0 -0
- psychopy/app/Resources/classic/filenew@2x.png +0 -0
- psychopy/app/Resources/classic/fileopen.png +0 -0
- psychopy/app/Resources/classic/fileopen32.png +0 -0
- psychopy/app/Resources/classic/fileopen@2x.png +0 -0
- psychopy/app/Resources/classic/filepkg.png +0 -0
- psychopy/app/Resources/classic/filepkg@2x.png +0 -0
- psychopy/app/Resources/classic/filepsyexp.png +0 -0
- psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/classic/filepy.png +0 -0
- psychopy/app/Resources/classic/filepy@2x.png +0 -0
- psychopy/app/Resources/classic/filesave.png +0 -0
- psychopy/app/Resources/classic/filesave32.png +0 -0
- psychopy/app/Resources/classic/filesave@2x.png +0 -0
- psychopy/app/Resources/classic/filesaveas.png +0 -0
- psychopy/app/Resources/classic/filesaveas32.png +0 -0
- psychopy/app/Resources/classic/filesaveas@2x.png +0 -0
- psychopy/app/Resources/classic/filetxt.png +0 -0
- psychopy/app/Resources/classic/filetxt@2x.png +0 -0
- psychopy/app/Resources/classic/fileunknown.png +0 -0
- psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
- psychopy/app/Resources/classic/filevideo.png +0 -0
- psychopy/app/Resources/classic/filevideo@2x.png +0 -0
- psychopy/app/Resources/classic/filter.png +0 -0
- psychopy/app/Resources/classic/filter@2x.png +0 -0
- psychopy/app/Resources/classic/find.png +0 -0
- psychopy/app/Resources/classic/find@2x.png +0 -0
- psychopy/app/Resources/classic/folder-open16.png +0 -0
- psychopy/app/Resources/classic/folder16.png +0 -0
- psychopy/app/Resources/classic/foldernew16.png +0 -0
- psychopy/app/Resources/classic/fork.png +0 -0
- psychopy/app/Resources/classic/fork@2x.png +0 -0
- psychopy/app/Resources/classic/github.png +0 -0
- psychopy/app/Resources/classic/github@2x.png +0 -0
- psychopy/app/Resources/classic/globe.png +0 -0
- psychopy/app/Resources/classic/globe@2x.png +0 -0
- psychopy/app/Resources/classic/globe_bug.png +0 -0
- psychopy/app/Resources/classic/globe_bug@2x.png +0 -0
- psychopy/app/Resources/classic/globe_greensync.png +0 -0
- psychopy/app/Resources/classic/globe_greensync@2x.png +0 -0
- psychopy/app/Resources/classic/globe_info.png +0 -0
- psychopy/app/Resources/classic/globe_info@2x.png +0 -0
- psychopy/app/Resources/classic/globe_magnifier.png +0 -0
- psychopy/app/Resources/classic/globe_magnifier@2x.png +0 -0
- psychopy/app/Resources/classic/globe_run.png +0 -0
- psychopy/app/Resources/classic/globe_run@2x.png +0 -0
- psychopy/app/Resources/classic/globe_user.png +0 -0
- psychopy/app/Resources/classic/globe_user@2x.png +0 -0
- psychopy/app/Resources/classic/goto16.png +0 -0
- psychopy/app/Resources/classic/greendot.png +0 -0
- psychopy/app/Resources/classic/greendot@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe.png +0 -0
- psychopy/app/Resources/classic/greenglobe@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_bug.png +0 -0
- psychopy/app/Resources/classic/greenglobe_bug@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_greensync.png +0 -0
- psychopy/app/Resources/classic/greenglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_info.png +0 -0
- psychopy/app/Resources/classic/greenglobe_info@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_magnifier.png +0 -0
- psychopy/app/Resources/classic/greenglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_run.png +0 -0
- psychopy/app/Resources/classic/greenglobe_run@2x.png +0 -0
- psychopy/app/Resources/classic/greenglobe_user.png +0 -0
- psychopy/app/Resources/classic/greenglobe_user@2x.png +0 -0
- psychopy/app/Resources/classic/greydot.png +0 -0
- psychopy/app/Resources/classic/greydot@2x.png +0 -0
- psychopy/app/Resources/classic/greytick.png +0 -0
- psychopy/app/Resources/classic/greytick@2x.png +0 -0
- psychopy/app/Resources/classic/invalid_img.png +0 -0
- psychopy/app/Resources/classic/jsPilot.png +0 -0
- psychopy/app/Resources/classic/jsPilot@2x.png +0 -0
- psychopy/app/Resources/classic/jsRun.png +0 -0
- psychopy/app/Resources/classic/jsRun@2x.png +0 -0
- psychopy/app/Resources/classic/libroot.png +0 -0
- psychopy/app/Resources/classic/libroot@2x.png +0 -0
- psychopy/app/Resources/classic/loop.png +0 -0
- psychopy/app/Resources/classic/loop@2x.png +0 -0
- psychopy/app/Resources/classic/monitor16.png +0 -0
- psychopy/app/Resources/classic/monitors.png +0 -0
- psychopy/app/Resources/classic/monitors16.png +0 -0
- psychopy/app/Resources/classic/monitors32.png +0 -0
- psychopy/app/Resources/classic/monitors@2x.png +0 -0
- psychopy/app/Resources/classic/orangedot.png +0 -0
- psychopy/app/Resources/classic/orangedot@2x.png +0 -0
- psychopy/app/Resources/classic/pavlovia.png +0 -0
- psychopy/app/Resources/classic/pavlovia16.png +0 -0
- psychopy/app/Resources/classic/pavlovia16@2x.png +0 -0
- psychopy/app/Resources/classic/pavlovia@2x.png +0 -0
- psychopy/app/Resources/classic/pavsync.png +0 -0
- psychopy/app/Resources/classic/pavsync@2x.png +0 -0
- psychopy/app/Resources/classic/person_off.png +0 -0
- psychopy/app/Resources/classic/person_off@2x.png +0 -0
- psychopy/app/Resources/classic/person_on.png +0 -0
- psychopy/app/Resources/classic/person_on@2x.png +0 -0
- psychopy/app/Resources/classic/photometer.png +0 -0
- psychopy/app/Resources/classic/photometer@2x.png +0 -0
- psychopy/app/Resources/classic/plugin16.png +0 -0
- psychopy/app/Resources/classic/plugin16@2x.png +0 -0
- psychopy/app/Resources/classic/plugins32.png +0 -0
- psychopy/app/Resources/classic/plus.png +0 -0
- psychopy/app/Resources/classic/plus@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-app.png +0 -0
- psychopy/app/Resources/classic/preferences-app48.png +0 -0
- psychopy/app/Resources/classic/preferences-app@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-conn.png +0 -0
- psychopy/app/Resources/classic/preferences-conn48.png +0 -0
- psychopy/app/Resources/classic/preferences-conn@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-debug.png +0 -0
- psychopy/app/Resources/classic/preferences-debug@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-general.png +0 -0
- psychopy/app/Resources/classic/preferences-general48.png +0 -0
- psychopy/app/Resources/classic/preferences-general@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-hardware.png +0 -0
- psychopy/app/Resources/classic/preferences-hardware48.png +0 -0
- psychopy/app/Resources/classic/preferences-hardware@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-keyboard.png +0 -0
- psychopy/app/Resources/classic/preferences-keyboard48.png +0 -0
- psychopy/app/Resources/classic/preferences-keyboard@2x.png +0 -0
- psychopy/app/Resources/classic/preferences-pilot.png +0 -0
- psychopy/app/Resources/classic/preferences-pilot@2x.png +0 -0
- psychopy/app/Resources/classic/preferences32.png +0 -0
- psychopy/app/Resources/classic/pyPilot.png +0 -0
- psychopy/app/Resources/classic/pyPilot@2x.png +0 -0
- psychopy/app/Resources/classic/pyRun.png +0 -0
- psychopy/app/Resources/classic/pyRun@2x.png +0 -0
- psychopy/app/Resources/classic/reddot.png +0 -0
- psychopy/app/Resources/classic/reddot@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe.png +0 -0
- psychopy/app/Resources/classic/redglobe@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_bug.png +0 -0
- psychopy/app/Resources/classic/redglobe_bug@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_greensync.png +0 -0
- psychopy/app/Resources/classic/redglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_info.png +0 -0
- psychopy/app/Resources/classic/redglobe_info@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_magnifier.png +0 -0
- psychopy/app/Resources/classic/redglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_run.png +0 -0
- psychopy/app/Resources/classic/redglobe_run@2x.png +0 -0
- psychopy/app/Resources/classic/redglobe_user.png +0 -0
- psychopy/app/Resources/classic/redglobe_user@2x.png +0 -0
- psychopy/app/Resources/classic/redo.png +0 -0
- psychopy/app/Resources/classic/redo32.png +0 -0
- psychopy/app/Resources/classic/redo@2x.png +0 -0
- psychopy/app/Resources/classic/regex.png +0 -0
- psychopy/app/Resources/classic/regex@2x.png +0 -0
- psychopy/app/Resources/classic/removeExp32.png +0 -0
- psychopy/app/Resources/classic/rename16.png +0 -0
- psychopy/app/Resources/classic/restart.png +0 -0
- psychopy/app/Resources/classic/restart@2x.png +0 -0
- psychopy/app/Resources/classic/run.png +0 -0
- psychopy/app/Resources/classic/run@2x.png +0 -0
- psychopy/app/Resources/classic/runner.png +0 -0
- psychopy/app/Resources/classic/runner@2x.png +0 -0
- psychopy/app/Resources/classic/runnerPilot.png +0 -0
- psychopy/app/Resources/classic/runnerPilot@2x.png +0 -0
- psychopy/app/Resources/classic/savebtn.png +0 -0
- psychopy/app/Resources/classic/savebtn16.png +0 -0
- psychopy/app/Resources/classic/savebtn16@2x.png +0 -0
- psychopy/app/Resources/classic/savebtn@2x.png +0 -0
- psychopy/app/Resources/classic/search.png +0 -0
- psychopy/app/Resources/classic/search@2x.png +0 -0
- psychopy/app/Resources/classic/showBuilder.png +0 -0
- psychopy/app/Resources/classic/showBuilder@2x.png +0 -0
- psychopy/app/Resources/classic/showCoder.png +0 -0
- psychopy/app/Resources/classic/showCoder@2x.png +0 -0
- psychopy/app/Resources/classic/showRunner.png +0 -0
- psychopy/app/Resources/classic/showRunner@2x.png +0 -0
- psychopy/app/Resources/classic/starred.png +0 -0
- psychopy/app/Resources/classic/starred@2x.png +0 -0
- psychopy/app/Resources/classic/start.png +0 -0
- psychopy/app/Resources/classic/start@2x.png +0 -0
- psychopy/app/Resources/classic/stdout.png +0 -0
- psychopy/app/Resources/classic/stop.png +0 -0
- psychopy/app/Resources/classic/stop32.png +0 -0
- psychopy/app/Resources/classic/stop@2x.png +0 -0
- psychopy/app/Resources/classic/switchCtrlBot.png +0 -0
- psychopy/app/Resources/classic/switchCtrlBot@2x.png +0 -0
- psychopy/app/Resources/classic/switchCtrlLeft.png +0 -0
- psychopy/app/Resources/classic/switchCtrlLeft@2x.png +0 -0
- psychopy/app/Resources/classic/switchCtrlRight.png +0 -0
- psychopy/app/Resources/classic/switchCtrlRight@2x.png +0 -0
- psychopy/app/Resources/classic/switchCtrlTop.png +0 -0
- psychopy/app/Resources/classic/switchCtrlTop@2x.png +0 -0
- psychopy/app/Resources/classic/tick.png +0 -0
- psychopy/app/Resources/classic/tick@2x.png +0 -0
- psychopy/app/Resources/classic/undo.png +0 -0
- psychopy/app/Resources/classic/undo32.png +0 -0
- psychopy/app/Resources/classic/undo@2x.png +0 -0
- psychopy/app/Resources/classic/unstarred.png +0 -0
- psychopy/app/Resources/classic/unstarred@2x.png +0 -0
- psychopy/app/Resources/classic/user_none.png +0 -0
- psychopy/app/Resources/classic/view-refresh16.png +0 -0
- psychopy/app/Resources/classic/viewbtn.png +0 -0
- psychopy/app/Resources/classic/viewbtn16.png +0 -0
- psychopy/app/Resources/classic/viewbtn16@2x.png +0 -0
- psychopy/app/Resources/classic/viewbtn@2x.png +0 -0
- psychopy/app/Resources/classic/windows16.png +0 -0
- psychopy/app/Resources/classic/windows16@2x.png +0 -0
- psychopy/app/Resources/coder.ico +0 -0
- psychopy/app/Resources/dark/FlowBottom_CompLeft.png +0 -0
- psychopy/app/Resources/dark/FlowBottom_CompRight.png +0 -0
- psychopy/app/Resources/dark/FlowTop_CompLeft.png +0 -0
- psychopy/app/Resources/dark/FlowTop_CompRight.png +0 -0
- psychopy/app/Resources/dark/README.txt +3 -0
- psychopy/app/Resources/dark/__init__.py +0 -0
- psychopy/app/Resources/dark/add.png +0 -0
- psychopy/app/Resources/dark/add@2x.png +0 -0
- psychopy/app/Resources/dark/addExp32.png +0 -0
- psychopy/app/Resources/dark/addExp32@2x.png +0 -0
- psychopy/app/Resources/dark/add_many.png +0 -0
- psychopy/app/Resources/dark/add_many@2x.png +0 -0
- psychopy/app/Resources/dark/alerts.png +0 -0
- psychopy/app/Resources/dark/alerts@2x.png +0 -0
- psychopy/app/Resources/dark/beta.png +0 -0
- psychopy/app/Resources/dark/beta@2x.png +0 -0
- psychopy/app/Resources/dark/browser.png +0 -0
- psychopy/app/Resources/dark/browser@2x.png +0 -0
- psychopy/app/Resources/dark/bug16.png +0 -0
- psychopy/app/Resources/dark/bug16@2x.png +0 -0
- psychopy/app/Resources/dark/case.png +0 -0
- psychopy/app/Resources/dark/case@2x.png +0 -0
- psychopy/app/Resources/dark/circle_mask.png +0 -0
- psychopy/app/Resources/dark/circle_mask@2x.png +0 -0
- psychopy/app/Resources/dark/clear.png +0 -0
- psychopy/app/Resources/dark/clear@2x.png +0 -0
- psychopy/app/Resources/dark/coderclass16.png +0 -0
- psychopy/app/Resources/dark/coderclass16@2x.png +0 -0
- psychopy/app/Resources/dark/coderfunc16.png +0 -0
- psychopy/app/Resources/dark/coderfunc16@2x.png +0 -0
- psychopy/app/Resources/dark/coderimport16.png +0 -0
- psychopy/app/Resources/dark/coderimport16@2x.png +0 -0
- psychopy/app/Resources/dark/coderjs.png +0 -0
- psychopy/app/Resources/dark/coderjs@2x.png +0 -0
- psychopy/app/Resources/dark/coderpython.png +0 -0
- psychopy/app/Resources/dark/coderpython@2x.png +0 -0
- psychopy/app/Resources/dark/codervar16.png +0 -0
- psychopy/app/Resources/dark/codervar16@2x.png +0 -0
- psychopy/app/Resources/dark/cogwindow32.png +0 -0
- psychopy/app/Resources/dark/cogwindow32@2x.png +0 -0
- psychopy/app/Resources/dark/color32.png +0 -0
- psychopy/app/Resources/dark/color32@2x.png +0 -0
- psychopy/app/Resources/dark/compile_js.png +0 -0
- psychopy/app/Resources/dark/compile_js@2x.png +0 -0
- psychopy/app/Resources/dark/compile_py.png +0 -0
- psychopy/app/Resources/dark/compile_py@2x.png +0 -0
- psychopy/app/Resources/dark/copy16.png +0 -0
- psychopy/app/Resources/dark/copy16@2x.png +0 -0
- psychopy/app/Resources/dark/currentFile16.png +0 -0
- psychopy/app/Resources/dark/currentFile16@2x.png +0 -0
- psychopy/app/Resources/dark/delete16.png +0 -0
- psychopy/app/Resources/dark/delete16@2x.png +0 -0
- psychopy/app/Resources/dark/desktop.png +0 -0
- psychopy/app/Resources/dark/desktop@2x.png +0 -0
- psychopy/app/Resources/dark/devices.png +0 -0
- psychopy/app/Resources/dark/devices@2x.png +0 -0
- psychopy/app/Resources/dark/dirup16.png +0 -0
- psychopy/app/Resources/dark/dirup16@2x.png +0 -0
- psychopy/app/Resources/dark/docclose16.png +0 -0
- psychopy/app/Resources/dark/docclose16@2x.png +0 -0
- psychopy/app/Resources/dark/download.png +0 -0
- psychopy/app/Resources/dark/download@2x.png +0 -0
- psychopy/app/Resources/dark/edit.png +0 -0
- psychopy/app/Resources/dark/edit@2x.png +0 -0
- psychopy/app/Resources/dark/editbtn16.png +0 -0
- psychopy/app/Resources/dark/editbtn16@2x.png +0 -0
- psychopy/app/Resources/dark/email.png +0 -0
- psychopy/app/Resources/dark/email@2x.png +0 -0
- psychopy/app/Resources/dark/experiment.png +0 -0
- psychopy/app/Resources/dark/experiment@2x.png +0 -0
- psychopy/app/Resources/dark/expsettings.png +0 -0
- psychopy/app/Resources/dark/expsettings@2x.png +0 -0
- psychopy/app/Resources/dark/file.png +0 -0
- psychopy/app/Resources/dark/file@16w.png +0 -0
- psychopy/app/Resources/dark/file@16w@2x.png +0 -0
- psychopy/app/Resources/dark/file@2x.png +0 -0
- psychopy/app/Resources/dark/fileaudio.png +0 -0
- psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
- psychopy/app/Resources/dark/filecss.png +0 -0
- psychopy/app/Resources/dark/filecss@2x.png +0 -0
- psychopy/app/Resources/dark/filecsv.png +0 -0
- psychopy/app/Resources/dark/filecsv@2x.png +0 -0
- psychopy/app/Resources/dark/filedesign.png +0 -0
- psychopy/app/Resources/dark/filedesign@2x.png +0 -0
- psychopy/app/Resources/dark/filefont.png +0 -0
- psychopy/app/Resources/dark/filefont@2x.png +0 -0
- psychopy/app/Resources/dark/filegit.png +0 -0
- psychopy/app/Resources/dark/filegit@2x.png +0 -0
- psychopy/app/Resources/dark/filehtml.png +0 -0
- psychopy/app/Resources/dark/filehtml@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage.png +0 -0
- psychopy/app/Resources/dark/fileimage@2x.png +0 -0
- psychopy/app/Resources/dark/fileinfo.png +0 -0
- psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
- psychopy/app/Resources/dark/filejs.png +0 -0
- psychopy/app/Resources/dark/filejs@2x.png +0 -0
- psychopy/app/Resources/dark/filejson.png +0 -0
- psychopy/app/Resources/dark/filejson@2x.png +0 -0
- psychopy/app/Resources/dark/filenew.png +0 -0
- psychopy/app/Resources/dark/filenew32.png +0 -0
- psychopy/app/Resources/dark/filenew32@2x.png +0 -0
- psychopy/app/Resources/dark/filenew@2x.png +0 -0
- psychopy/app/Resources/dark/fileopen.png +0 -0
- psychopy/app/Resources/dark/fileopen32.png +0 -0
- psychopy/app/Resources/dark/fileopen32@2x.png +0 -0
- psychopy/app/Resources/dark/fileopen@2x.png +0 -0
- psychopy/app/Resources/dark/filepkg.png +0 -0
- psychopy/app/Resources/dark/filepkg@2x.png +0 -0
- psychopy/app/Resources/dark/filepsyexp.png +0 -0
- psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/dark/filepy.png +0 -0
- psychopy/app/Resources/dark/filepy@2x.png +0 -0
- psychopy/app/Resources/dark/filesave.png +0 -0
- psychopy/app/Resources/dark/filesave32.png +0 -0
- psychopy/app/Resources/dark/filesave32@2x.png +0 -0
- psychopy/app/Resources/dark/filesave@2x.png +0 -0
- psychopy/app/Resources/dark/filesaveas.png +0 -0
- psychopy/app/Resources/dark/filesaveas32.png +0 -0
- psychopy/app/Resources/dark/filesaveas32@2x.png +0 -0
- psychopy/app/Resources/dark/filesaveas@2x.png +0 -0
- psychopy/app/Resources/dark/filetxt.png +0 -0
- psychopy/app/Resources/dark/filetxt@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown.png +0 -0
- psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
- psychopy/app/Resources/dark/filevideo.png +0 -0
- psychopy/app/Resources/dark/filevideo@2x.png +0 -0
- psychopy/app/Resources/dark/filter.png +0 -0
- psychopy/app/Resources/dark/filter@2x.png +0 -0
- psychopy/app/Resources/dark/find.png +0 -0
- psychopy/app/Resources/dark/find@2x.png +0 -0
- psychopy/app/Resources/dark/folder-open16.png +0 -0
- psychopy/app/Resources/dark/folder-open16@2x.png +0 -0
- psychopy/app/Resources/dark/folder16.png +0 -0
- psychopy/app/Resources/dark/folder16@2x.png +0 -0
- psychopy/app/Resources/dark/foldernew16.png +0 -0
- psychopy/app/Resources/dark/foldernew16@2x.png +0 -0
- psychopy/app/Resources/dark/fork.png +0 -0
- psychopy/app/Resources/dark/fork@2x.png +0 -0
- psychopy/app/Resources/dark/github.png +0 -0
- psychopy/app/Resources/dark/github@2x.png +0 -0
- psychopy/app/Resources/dark/globe.png +0 -0
- psychopy/app/Resources/dark/globe@2x.png +0 -0
- psychopy/app/Resources/dark/globe_bug.png +0 -0
- psychopy/app/Resources/dark/globe_bug@2x.png +0 -0
- psychopy/app/Resources/dark/globe_greensync.png +0 -0
- psychopy/app/Resources/dark/globe_greensync@2x.png +0 -0
- psychopy/app/Resources/dark/globe_info.png +0 -0
- psychopy/app/Resources/dark/globe_info@2x.png +0 -0
- psychopy/app/Resources/dark/globe_magnifier.png +0 -0
- psychopy/app/Resources/dark/globe_magnifier@2x.png +0 -0
- psychopy/app/Resources/dark/globe_run.png +0 -0
- psychopy/app/Resources/dark/globe_run@2x.png +0 -0
- psychopy/app/Resources/dark/globe_user.png +0 -0
- psychopy/app/Resources/dark/globe_user@2x.png +0 -0
- psychopy/app/Resources/dark/goto.png +0 -0
- psychopy/app/Resources/dark/goto@2x.png +0 -0
- psychopy/app/Resources/dark/greendot.png +0 -0
- psychopy/app/Resources/dark/greendot@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe.png +0 -0
- psychopy/app/Resources/dark/greenglobe@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_bug.png +0 -0
- psychopy/app/Resources/dark/greenglobe_bug@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_greensync.png +0 -0
- psychopy/app/Resources/dark/greenglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_info.png +0 -0
- psychopy/app/Resources/dark/greenglobe_info@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_magnifier.png +0 -0
- psychopy/app/Resources/dark/greenglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_run.png +0 -0
- psychopy/app/Resources/dark/greenglobe_run@2x.png +0 -0
- psychopy/app/Resources/dark/greenglobe_user.png +0 -0
- psychopy/app/Resources/dark/greenglobe_user@2x.png +0 -0
- psychopy/app/Resources/dark/greydot.png +0 -0
- psychopy/app/Resources/dark/greydot@2x.png +0 -0
- psychopy/app/Resources/dark/greytick.png +0 -0
- psychopy/app/Resources/dark/greytick@2x.png +0 -0
- psychopy/app/Resources/dark/invalid_img.png +0 -0
- psychopy/app/Resources/dark/jsPilot.png +0 -0
- psychopy/app/Resources/dark/jsPilot@2x.png +0 -0
- psychopy/app/Resources/dark/jsRun.png +0 -0
- psychopy/app/Resources/dark/jsRun@2x.png +0 -0
- psychopy/app/Resources/dark/libroot16.png +0 -0
- psychopy/app/Resources/dark/libroot16@2x.png +0 -0
- psychopy/app/Resources/dark/loop.png +0 -0
- psychopy/app/Resources/dark/loop@2x.png +0 -0
- psychopy/app/Resources/dark/monitor16.png +0 -0
- psychopy/app/Resources/dark/monitor16@2x.png +0 -0
- psychopy/app/Resources/dark/monitors.png +0 -0
- psychopy/app/Resources/dark/monitors32.png +0 -0
- psychopy/app/Resources/dark/monitors32@2x.png +0 -0
- psychopy/app/Resources/dark/monitors@2x.png +0 -0
- psychopy/app/Resources/dark/orangedot.png +0 -0
- psychopy/app/Resources/dark/orangedot@2x.png +0 -0
- psychopy/app/Resources/dark/pavlovia.png +0 -0
- psychopy/app/Resources/dark/pavlovia16.png +0 -0
- psychopy/app/Resources/dark/pavlovia16@2x.png +0 -0
- psychopy/app/Resources/dark/pavlovia@2x.png +0 -0
- psychopy/app/Resources/dark/pavsync.png +0 -0
- psychopy/app/Resources/dark/pavsync@2x.png +0 -0
- psychopy/app/Resources/dark/person_off.png +0 -0
- psychopy/app/Resources/dark/person_off@2x.png +0 -0
- psychopy/app/Resources/dark/person_on.png +0 -0
- psychopy/app/Resources/dark/person_on@2x.png +0 -0
- psychopy/app/Resources/dark/photometer.png +0 -0
- psychopy/app/Resources/dark/photometer@2x.png +0 -0
- psychopy/app/Resources/dark/plugin16.png +0 -0
- psychopy/app/Resources/dark/plugin16@2x.png +0 -0
- psychopy/app/Resources/dark/plugins32.png +0 -0
- psychopy/app/Resources/dark/plugins32@2x.png +0 -0
- psychopy/app/Resources/dark/plus.png +0 -0
- psychopy/app/Resources/dark/plus@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-app.png +0 -0
- psychopy/app/Resources/dark/preferences-app48.png +0 -0
- psychopy/app/Resources/dark/preferences-app48@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-app@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-conn.png +0 -0
- psychopy/app/Resources/dark/preferences-conn48.png +0 -0
- psychopy/app/Resources/dark/preferences-conn48@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-conn@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-debug.png +0 -0
- psychopy/app/Resources/dark/preferences-debug@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-general.png +0 -0
- psychopy/app/Resources/dark/preferences-general48.png +0 -0
- psychopy/app/Resources/dark/preferences-general48@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-general@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-hardware.png +0 -0
- psychopy/app/Resources/dark/preferences-hardware48.png +0 -0
- psychopy/app/Resources/dark/preferences-hardware48@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-hardware@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-keyboard.png +0 -0
- psychopy/app/Resources/dark/preferences-keyboard48.png +0 -0
- psychopy/app/Resources/dark/preferences-keyboard48@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-keyboard@2x.png +0 -0
- psychopy/app/Resources/dark/preferences-pilot.png +0 -0
- psychopy/app/Resources/dark/preferences-pilot@2x.png +0 -0
- psychopy/app/Resources/dark/preferences32.png +0 -0
- psychopy/app/Resources/dark/preferences32@2x.png +0 -0
- psychopy/app/Resources/dark/pyPilot.png +0 -0
- psychopy/app/Resources/dark/pyPilot@2x.png +0 -0
- psychopy/app/Resources/dark/pyRun.png +0 -0
- psychopy/app/Resources/dark/pyRun@2x.png +0 -0
- psychopy/app/Resources/dark/reddot.png +0 -0
- psychopy/app/Resources/dark/reddot@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe.png +0 -0
- psychopy/app/Resources/dark/redglobe@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_bug.png +0 -0
- psychopy/app/Resources/dark/redglobe_bug@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_greensync.png +0 -0
- psychopy/app/Resources/dark/redglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_info.png +0 -0
- psychopy/app/Resources/dark/redglobe_info@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_magnifier.png +0 -0
- psychopy/app/Resources/dark/redglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_run.png +0 -0
- psychopy/app/Resources/dark/redglobe_run@2x.png +0 -0
- psychopy/app/Resources/dark/redglobe_user.png +0 -0
- psychopy/app/Resources/dark/redglobe_user@2x.png +0 -0
- psychopy/app/Resources/dark/redo.png +0 -0
- psychopy/app/Resources/dark/redo32.png +0 -0
- psychopy/app/Resources/dark/redo32@2x.png +0 -0
- psychopy/app/Resources/dark/redo@2x.png +0 -0
- psychopy/app/Resources/dark/regex.png +0 -0
- psychopy/app/Resources/dark/regex@2x.png +0 -0
- psychopy/app/Resources/dark/removeExp32.png +0 -0
- psychopy/app/Resources/dark/removeExp32@2x.png +0 -0
- psychopy/app/Resources/dark/rename16.png +0 -0
- psychopy/app/Resources/dark/rename16@2x.png +0 -0
- psychopy/app/Resources/dark/restart.png +0 -0
- psychopy/app/Resources/dark/restart@2x.png +0 -0
- psychopy/app/Resources/dark/runner.png +0 -0
- psychopy/app/Resources/dark/runner@2x.png +0 -0
- psychopy/app/Resources/dark/runnerPilot.png +0 -0
- psychopy/app/Resources/dark/runnerPilot@2x.png +0 -0
- psychopy/app/Resources/dark/savebtn16.png +0 -0
- psychopy/app/Resources/dark/savebtn16@2x.png +0 -0
- psychopy/app/Resources/dark/search.png +0 -0
- psychopy/app/Resources/dark/search@2x.png +0 -0
- psychopy/app/Resources/dark/showBuilder.png +0 -0
- psychopy/app/Resources/dark/showBuilder@2x.png +0 -0
- psychopy/app/Resources/dark/showCoder.png +0 -0
- psychopy/app/Resources/dark/showCoder@2x.png +0 -0
- psychopy/app/Resources/dark/showRunner.png +0 -0
- psychopy/app/Resources/dark/showRunner@2x.png +0 -0
- psychopy/app/Resources/dark/starred.png +0 -0
- psychopy/app/Resources/dark/starred@2x.png +0 -0
- psychopy/app/Resources/dark/start.png +0 -0
- psychopy/app/Resources/dark/start@2x.png +0 -0
- psychopy/app/Resources/dark/stdout.png +0 -0
- psychopy/app/Resources/dark/stdout@2x.png +0 -0
- psychopy/app/Resources/dark/stop.png +0 -0
- psychopy/app/Resources/dark/stop32.png +0 -0
- psychopy/app/Resources/dark/stop32@2x.png +0 -0
- psychopy/app/Resources/dark/stop@2x.png +0 -0
- psychopy/app/Resources/dark/switchCtrlBot.png +0 -0
- psychopy/app/Resources/dark/switchCtrlBot@2x.png +0 -0
- psychopy/app/Resources/dark/switchCtrlLeft.png +0 -0
- psychopy/app/Resources/dark/switchCtrlLeft@2x.png +0 -0
- psychopy/app/Resources/dark/switchCtrlRight.png +0 -0
- psychopy/app/Resources/dark/switchCtrlRight@2x.png +0 -0
- psychopy/app/Resources/dark/switchCtrlTop.png +0 -0
- psychopy/app/Resources/dark/switchCtrlTop@2x.png +0 -0
- psychopy/app/Resources/dark/tick.png +0 -0
- psychopy/app/Resources/dark/tick@2x.png +0 -0
- psychopy/app/Resources/dark/undo.png +0 -0
- psychopy/app/Resources/dark/undo32.png +0 -0
- psychopy/app/Resources/dark/undo32@2x.png +0 -0
- psychopy/app/Resources/dark/undo@2x.png +0 -0
- psychopy/app/Resources/dark/unstarred.png +0 -0
- psychopy/app/Resources/dark/unstarred@2x.png +0 -0
- psychopy/app/Resources/dark/user_none.png +0 -0
- psychopy/app/Resources/dark/view-refresh16.png +0 -0
- psychopy/app/Resources/dark/view-refresh16@2x.png +0 -0
- psychopy/app/Resources/dark/viewbtn16.png +0 -0
- psychopy/app/Resources/dark/viewbtn16@2x.png +0 -0
- psychopy/app/Resources/dark/windows16.png +0 -0
- psychopy/app/Resources/dark/windows16@2x.png +0 -0
- psychopy/app/Resources/light/FlowBottom_CompLeft.png +0 -0
- psychopy/app/Resources/light/FlowBottom_CompRight.png +0 -0
- psychopy/app/Resources/light/FlowTop_CompLeft.png +0 -0
- psychopy/app/Resources/light/FlowTop_CompRight.png +0 -0
- psychopy/app/Resources/light/README.txt +3 -0
- psychopy/app/Resources/light/__init__.py +0 -0
- psychopy/app/Resources/light/add.png +0 -0
- psychopy/app/Resources/light/add@2x.png +0 -0
- psychopy/app/Resources/light/addExp32.png +0 -0
- psychopy/app/Resources/light/addExp32@2x.png +0 -0
- psychopy/app/Resources/light/add_many.png +0 -0
- psychopy/app/Resources/light/add_many@2x.png +0 -0
- psychopy/app/Resources/light/alerts.png +0 -0
- psychopy/app/Resources/light/alerts@2x.png +0 -0
- psychopy/app/Resources/light/beta.png +0 -0
- psychopy/app/Resources/light/beta@2x.png +0 -0
- psychopy/app/Resources/light/browser.png +0 -0
- psychopy/app/Resources/light/browser@2x.png +0 -0
- psychopy/app/Resources/light/bug16.png +0 -0
- psychopy/app/Resources/light/bug16@2x.png +0 -0
- psychopy/app/Resources/light/case.png +0 -0
- psychopy/app/Resources/light/case@2x.png +0 -0
- psychopy/app/Resources/light/circle_mask.png +0 -0
- psychopy/app/Resources/light/circle_mask@2x.png +0 -0
- psychopy/app/Resources/light/clear.png +0 -0
- psychopy/app/Resources/light/clear@2x.png +0 -0
- psychopy/app/Resources/light/coderclass16.png +0 -0
- psychopy/app/Resources/light/coderclass16@2x.png +0 -0
- psychopy/app/Resources/light/coderfunc16.png +0 -0
- psychopy/app/Resources/light/coderfunc16@2x.png +0 -0
- psychopy/app/Resources/light/coderimport16.png +0 -0
- psychopy/app/Resources/light/coderimport16@2x.png +0 -0
- psychopy/app/Resources/light/coderjs.png +0 -0
- psychopy/app/Resources/light/coderjs@2x.png +0 -0
- psychopy/app/Resources/light/coderpython.png +0 -0
- psychopy/app/Resources/light/coderpython@2x.png +0 -0
- psychopy/app/Resources/light/codervar16.png +0 -0
- psychopy/app/Resources/light/codervar16@2x.png +0 -0
- psychopy/app/Resources/light/cogwindow32.png +0 -0
- psychopy/app/Resources/light/cogwindow32@2x.png +0 -0
- psychopy/app/Resources/light/color16.png +0 -0
- psychopy/app/Resources/light/color16@2x.png +0 -0
- psychopy/app/Resources/light/color32.png +0 -0
- psychopy/app/Resources/light/color32@2x.png +0 -0
- psychopy/app/Resources/light/compile_js.png +0 -0
- psychopy/app/Resources/light/compile_js@2x.png +0 -0
- psychopy/app/Resources/light/compile_py.png +0 -0
- psychopy/app/Resources/light/compile_py@2x.png +0 -0
- psychopy/app/Resources/light/copy16.png +0 -0
- psychopy/app/Resources/light/copy16@2x.png +0 -0
- psychopy/app/Resources/light/currentFile16.png +0 -0
- psychopy/app/Resources/light/currentFile16@2x.png +0 -0
- psychopy/app/Resources/light/delete16.png +0 -0
- psychopy/app/Resources/light/delete16@2x.png +0 -0
- psychopy/app/Resources/light/delete8.png +0 -0
- psychopy/app/Resources/light/desktop.png +0 -0
- psychopy/app/Resources/light/desktop@2x.png +0 -0
- psychopy/app/Resources/light/devices.png +0 -0
- psychopy/app/Resources/light/devices@2x.png +0 -0
- psychopy/app/Resources/light/dirup16.png +0 -0
- psychopy/app/Resources/light/dirup16@2x.png +0 -0
- psychopy/app/Resources/light/docclose16.png +0 -0
- psychopy/app/Resources/light/docclose16@2x.png +0 -0
- psychopy/app/Resources/light/download.png +0 -0
- psychopy/app/Resources/light/download@2x.png +0 -0
- psychopy/app/Resources/light/edit.png +0 -0
- psychopy/app/Resources/light/edit@2x.png +0 -0
- psychopy/app/Resources/light/editbtn16.png +0 -0
- psychopy/app/Resources/light/editbtn16@2x.png +0 -0
- psychopy/app/Resources/light/email.png +0 -0
- psychopy/app/Resources/light/email@2x.png +0 -0
- psychopy/app/Resources/light/experiment.png +0 -0
- psychopy/app/Resources/light/experiment@2x.png +0 -0
- psychopy/app/Resources/light/expsettings.png +0 -0
- psychopy/app/Resources/light/expsettings@2x.png +0 -0
- psychopy/app/Resources/light/file.png +0 -0
- psychopy/app/Resources/light/file@2x.png +0 -0
- psychopy/app/Resources/light/fileaudio.png +0 -0
- psychopy/app/Resources/light/fileaudio@2x.png +0 -0
- psychopy/app/Resources/light/filecss.png +0 -0
- psychopy/app/Resources/light/filecss@2x.png +0 -0
- psychopy/app/Resources/light/filecsv.png +0 -0
- psychopy/app/Resources/light/filecsv@2x.png +0 -0
- psychopy/app/Resources/light/filedesign.png +0 -0
- psychopy/app/Resources/light/filedesign@2x.png +0 -0
- psychopy/app/Resources/light/filefont.png +0 -0
- psychopy/app/Resources/light/filefont@2x.png +0 -0
- psychopy/app/Resources/light/filegit.png +0 -0
- psychopy/app/Resources/light/filegit@2x.png +0 -0
- psychopy/app/Resources/light/filehtml.png +0 -0
- psychopy/app/Resources/light/filehtml@2x.png +0 -0
- psychopy/app/Resources/light/fileimage.png +0 -0
- psychopy/app/Resources/light/fileimage@2x.png +0 -0
- psychopy/app/Resources/light/fileinfo.png +0 -0
- psychopy/app/Resources/light/fileinfo@2x.png +0 -0
- psychopy/app/Resources/light/filejs.png +0 -0
- psychopy/app/Resources/light/filejs@2x.png +0 -0
- psychopy/app/Resources/light/filejson.png +0 -0
- psychopy/app/Resources/light/filejson@2x.png +0 -0
- psychopy/app/Resources/light/filenew.png +0 -0
- psychopy/app/Resources/light/filenew32.png +0 -0
- psychopy/app/Resources/light/filenew32@2x.png +0 -0
- psychopy/app/Resources/light/filenew@2x.png +0 -0
- psychopy/app/Resources/light/fileopen.png +0 -0
- psychopy/app/Resources/light/fileopen32.png +0 -0
- psychopy/app/Resources/light/fileopen32@2x.png +0 -0
- psychopy/app/Resources/light/fileopen@2x.png +0 -0
- psychopy/app/Resources/light/filepkg.png +0 -0
- psychopy/app/Resources/light/filepkg@2x.png +0 -0
- psychopy/app/Resources/light/filepsyexp.png +0 -0
- psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/light/filepy.png +0 -0
- psychopy/app/Resources/light/filepy@2x.png +0 -0
- psychopy/app/Resources/light/filesave.png +0 -0
- psychopy/app/Resources/light/filesave32.png +0 -0
- psychopy/app/Resources/light/filesave32@2x.png +0 -0
- psychopy/app/Resources/light/filesave@2x.png +0 -0
- psychopy/app/Resources/light/filesaveas.png +0 -0
- psychopy/app/Resources/light/filesaveas32.png +0 -0
- psychopy/app/Resources/light/filesaveas32@2x.png +0 -0
- psychopy/app/Resources/light/filesaveas@2x.png +0 -0
- psychopy/app/Resources/light/filetxt.png +0 -0
- psychopy/app/Resources/light/filetxt@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown.png +0 -0
- psychopy/app/Resources/light/fileunknown@2x.png +0 -0
- psychopy/app/Resources/light/filevideo.png +0 -0
- psychopy/app/Resources/light/filevideo@2x.png +0 -0
- psychopy/app/Resources/light/filter.png +0 -0
- psychopy/app/Resources/light/filter@2x.png +0 -0
- psychopy/app/Resources/light/find.png +0 -0
- psychopy/app/Resources/light/find@2x.png +0 -0
- psychopy/app/Resources/light/folder-open16.png +0 -0
- psychopy/app/Resources/light/folder-open16@2x.png +0 -0
- psychopy/app/Resources/light/folder16.png +0 -0
- psychopy/app/Resources/light/folder16@2x.png +0 -0
- psychopy/app/Resources/light/foldernew16.png +0 -0
- psychopy/app/Resources/light/foldernew16@2x.png +0 -0
- psychopy/app/Resources/light/fork.png +0 -0
- psychopy/app/Resources/light/fork@2x.png +0 -0
- psychopy/app/Resources/light/github.png +0 -0
- psychopy/app/Resources/light/github@2x.png +0 -0
- psychopy/app/Resources/light/globe.png +0 -0
- psychopy/app/Resources/light/globe@2x.png +0 -0
- psychopy/app/Resources/light/globe_bug.png +0 -0
- psychopy/app/Resources/light/globe_bug@2x.png +0 -0
- psychopy/app/Resources/light/globe_greensync.png +0 -0
- psychopy/app/Resources/light/globe_greensync@2x.png +0 -0
- psychopy/app/Resources/light/globe_info.png +0 -0
- psychopy/app/Resources/light/globe_info@2x.png +0 -0
- psychopy/app/Resources/light/globe_magnifier.png +0 -0
- psychopy/app/Resources/light/globe_magnifier@2x.png +0 -0
- psychopy/app/Resources/light/globe_run.png +0 -0
- psychopy/app/Resources/light/globe_run@2x.png +0 -0
- psychopy/app/Resources/light/globe_user.png +0 -0
- psychopy/app/Resources/light/globe_user@2x.png +0 -0
- psychopy/app/Resources/light/goto16.png +0 -0
- psychopy/app/Resources/light/goto16@2x.png +0 -0
- psychopy/app/Resources/light/greendot.png +0 -0
- psychopy/app/Resources/light/greendot@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe.png +0 -0
- psychopy/app/Resources/light/greenglobe@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_bug.png +0 -0
- psychopy/app/Resources/light/greenglobe_bug@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_greensync.png +0 -0
- psychopy/app/Resources/light/greenglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_info.png +0 -0
- psychopy/app/Resources/light/greenglobe_info@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_magnifier.png +0 -0
- psychopy/app/Resources/light/greenglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_run.png +0 -0
- psychopy/app/Resources/light/greenglobe_run@2x.png +0 -0
- psychopy/app/Resources/light/greenglobe_user.png +0 -0
- psychopy/app/Resources/light/greenglobe_user@2x.png +0 -0
- psychopy/app/Resources/light/greydot.png +0 -0
- psychopy/app/Resources/light/greydot@2x.png +0 -0
- psychopy/app/Resources/light/greytick.png +0 -0
- psychopy/app/Resources/light/greytick@2x.png +0 -0
- psychopy/app/Resources/light/invalid_img.png +0 -0
- psychopy/app/Resources/light/jsPilot.png +0 -0
- psychopy/app/Resources/light/jsPilot@2x.png +0 -0
- psychopy/app/Resources/light/jsRun.png +0 -0
- psychopy/app/Resources/light/jsRun@2x.png +0 -0
- psychopy/app/Resources/light/libroot16.png +0 -0
- psychopy/app/Resources/light/libroot16@2x.png +0 -0
- psychopy/app/Resources/light/loop.png +0 -0
- psychopy/app/Resources/light/loop@2x.png +0 -0
- psychopy/app/Resources/light/monitor16.png +0 -0
- psychopy/app/Resources/light/monitor16@2x.png +0 -0
- psychopy/app/Resources/light/monitors.png +0 -0
- psychopy/app/Resources/light/monitors32.png +0 -0
- psychopy/app/Resources/light/monitors32@2x.png +0 -0
- psychopy/app/Resources/light/monitors@2x.png +0 -0
- psychopy/app/Resources/light/orangedot.png +0 -0
- psychopy/app/Resources/light/orangedot@2x.png +0 -0
- psychopy/app/Resources/light/pavlovia.png +0 -0
- psychopy/app/Resources/light/pavlovia16.png +0 -0
- psychopy/app/Resources/light/pavlovia16@2x.png +0 -0
- psychopy/app/Resources/light/pavlovia@2x.png +0 -0
- psychopy/app/Resources/light/pavsync.png +0 -0
- psychopy/app/Resources/light/pavsync@2x.png +0 -0
- psychopy/app/Resources/light/person_off.png +0 -0
- psychopy/app/Resources/light/person_off@2x.png +0 -0
- psychopy/app/Resources/light/person_on.png +0 -0
- psychopy/app/Resources/light/person_on@2x.png +0 -0
- psychopy/app/Resources/light/photometer.png +0 -0
- psychopy/app/Resources/light/photometer@2x.png +0 -0
- psychopy/app/Resources/light/plugin16.png +0 -0
- psychopy/app/Resources/light/plugin16@2x.png +0 -0
- psychopy/app/Resources/light/plugins32.png +0 -0
- psychopy/app/Resources/light/plugins32@2x.png +0 -0
- psychopy/app/Resources/light/plus.png +0 -0
- psychopy/app/Resources/light/plus@2x.png +0 -0
- psychopy/app/Resources/light/preferences-app.png +0 -0
- psychopy/app/Resources/light/preferences-app48.png +0 -0
- psychopy/app/Resources/light/preferences-app48@2x.png +0 -0
- psychopy/app/Resources/light/preferences-app@2x.png +0 -0
- psychopy/app/Resources/light/preferences-conn.png +0 -0
- psychopy/app/Resources/light/preferences-conn48.png +0 -0
- psychopy/app/Resources/light/preferences-conn48@2x.png +0 -0
- psychopy/app/Resources/light/preferences-conn@2x.png +0 -0
- psychopy/app/Resources/light/preferences-general.png +0 -0
- psychopy/app/Resources/light/preferences-general48.png +0 -0
- psychopy/app/Resources/light/preferences-general48@2x.png +0 -0
- psychopy/app/Resources/light/preferences-general@2x.png +0 -0
- psychopy/app/Resources/light/preferences-hardware.png +0 -0
- psychopy/app/Resources/light/preferences-hardware48.png +0 -0
- psychopy/app/Resources/light/preferences-hardware48@2x.png +0 -0
- psychopy/app/Resources/light/preferences-hardware@2x.png +0 -0
- psychopy/app/Resources/light/preferences-keyboard.png +0 -0
- psychopy/app/Resources/light/preferences-keyboard48.png +0 -0
- psychopy/app/Resources/light/preferences-keyboard48@2x.png +0 -0
- psychopy/app/Resources/light/preferences-keyboard@2x.png +0 -0
- psychopy/app/Resources/light/preferences-pilot.png +0 -0
- psychopy/app/Resources/light/preferences-pilot@2x.png +0 -0
- psychopy/app/Resources/light/preferences32.png +0 -0
- psychopy/app/Resources/light/preferences32@2x.png +0 -0
- psychopy/app/Resources/light/pyPilot.png +0 -0
- psychopy/app/Resources/light/pyPilot@2x.png +0 -0
- psychopy/app/Resources/light/pyRun.png +0 -0
- psychopy/app/Resources/light/pyRun@2x.png +0 -0
- psychopy/app/Resources/light/reddot.png +0 -0
- psychopy/app/Resources/light/reddot@2x.png +0 -0
- psychopy/app/Resources/light/redglobe.png +0 -0
- psychopy/app/Resources/light/redglobe@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_bug.png +0 -0
- psychopy/app/Resources/light/redglobe_bug@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_greensync.png +0 -0
- psychopy/app/Resources/light/redglobe_greensync@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_info.png +0 -0
- psychopy/app/Resources/light/redglobe_info@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_magnifier.png +0 -0
- psychopy/app/Resources/light/redglobe_magnifier@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_run.png +0 -0
- psychopy/app/Resources/light/redglobe_run@2x.png +0 -0
- psychopy/app/Resources/light/redglobe_user.png +0 -0
- psychopy/app/Resources/light/redglobe_user@2x.png +0 -0
- psychopy/app/Resources/light/redo.png +0 -0
- psychopy/app/Resources/light/redo32.png +0 -0
- psychopy/app/Resources/light/redo32@2x.png +0 -0
- psychopy/app/Resources/light/redo@2x.png +0 -0
- psychopy/app/Resources/light/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/light/removeExp32.png +0 -0
- psychopy/app/Resources/light/removeExp32@2x.png +0 -0
- psychopy/app/Resources/light/rename16.png +0 -0
- psychopy/app/Resources/light/rename16@2x.png +0 -0
- psychopy/app/Resources/light/restart.png +0 -0
- psychopy/app/Resources/light/restart@2x.png +0 -0
- psychopy/app/Resources/light/runner.png +0 -0
- psychopy/app/Resources/light/runner@2x.png +0 -0
- psychopy/app/Resources/light/runnerPilot.png +0 -0
- psychopy/app/Resources/light/runnerPilot@2x.png +0 -0
- psychopy/app/Resources/light/savebtn16.png +0 -0
- psychopy/app/Resources/light/savebtn16@2x.png +0 -0
- psychopy/app/Resources/light/search.png +0 -0
- psychopy/app/Resources/light/search@2x.png +0 -0
- psychopy/app/Resources/light/showBuilder.png +0 -0
- psychopy/app/Resources/light/showBuilder@2x.png +0 -0
- psychopy/app/Resources/light/showCoder.png +0 -0
- psychopy/app/Resources/light/showCoder@2x.png +0 -0
- psychopy/app/Resources/light/showRunner.png +0 -0
- psychopy/app/Resources/light/showRunner@2x.png +0 -0
- psychopy/app/Resources/light/starred.png +0 -0
- psychopy/app/Resources/light/starred@2x.png +0 -0
- psychopy/app/Resources/light/start.png +0 -0
- psychopy/app/Resources/light/start@2x.png +0 -0
- psychopy/app/Resources/light/stdout.png +0 -0
- psychopy/app/Resources/light/stdout@2x.png +0 -0
- psychopy/app/Resources/light/stop.png +0 -0
- psychopy/app/Resources/light/stop32.png +0 -0
- psychopy/app/Resources/light/stop32@2x.png +0 -0
- psychopy/app/Resources/light/stop@2x.png +0 -0
- psychopy/app/Resources/light/switchCtrlBot.png +0 -0
- psychopy/app/Resources/light/switchCtrlBot@2x.png +0 -0
- psychopy/app/Resources/light/switchCtrlLeft.png +0 -0
- psychopy/app/Resources/light/switchCtrlLeft@2x.png +0 -0
- psychopy/app/Resources/light/switchCtrlRight.png +0 -0
- psychopy/app/Resources/light/switchCtrlRight@2x.png +0 -0
- psychopy/app/Resources/light/switchCtrlTop.png +0 -0
- psychopy/app/Resources/light/switchCtrlTop@2x.png +0 -0
- psychopy/app/Resources/light/tick.png +0 -0
- psychopy/app/Resources/light/tick@2x.png +0 -0
- psychopy/app/Resources/light/undo.png +0 -0
- psychopy/app/Resources/light/undo32.png +0 -0
- psychopy/app/Resources/light/undo32@2x.png +0 -0
- psychopy/app/Resources/light/undo@2x.png +0 -0
- psychopy/app/Resources/light/unstarred.png +0 -0
- psychopy/app/Resources/light/unstarred@2x.png +0 -0
- psychopy/app/Resources/light/user_none.png +0 -0
- psychopy/app/Resources/light/view-refresh16.png +0 -0
- psychopy/app/Resources/light/view-refresh16@2x.png +0 -0
- psychopy/app/Resources/light/viewbtn16.png +0 -0
- psychopy/app/Resources/light/viewbtn16@2x.png +0 -0
- psychopy/app/Resources/light/windows16.png +0 -0
- psychopy/app/Resources/light/windows16@2x.png +0 -0
- psychopy/app/Resources/moveComponentIcons.py +50 -0
- psychopy/app/Resources/psychopy.desktop +13 -0
- psychopy/app/Resources/psychopy.icns +0 -0
- psychopy/app/Resources/psychopy.ico +0 -0
- psychopy/app/Resources/psychopy.png +0 -0
- psychopy/app/Resources/psychopy.xml +9 -0
- psychopy/app/Resources/psychopy@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +344 -0
- psychopy/app/Resources/routine_templates/Misc.psyexp +228 -0
- psychopy/app/Resources/routine_templates/Online.psyexp +200 -0
- psychopy/app/Resources/routine_templates/Trials.psyexp +735 -0
- psychopy/app/Resources/routine_templates/readme.md +14 -0
- psychopy/app/Resources/runner.ico +0 -0
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/Resources/tips.txt +45 -0
- psychopy/app/Resources/tips_ar_001.txt +45 -0
- psychopy/app/Resources/tips_fr_FR.txt +45 -0
- psychopy/app/Resources/tips_ja_JP.txt +42 -0
- psychopy/app/Resources/tips_zh_CN.txt +45 -0
- psychopy/app/Resources/window.ico +0 -0
- psychopy/app/__init__.py +339 -0
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +1298 -0
- psychopy/app/appData.spec +58 -0
- psychopy/app/builder/__init__.py +5 -0
- psychopy/app/builder/builder.py +4738 -0
- psychopy/app/builder/dialogs/__init__.py +1910 -0
- psychopy/app/builder/dialogs/dlgsCode.py +631 -0
- psychopy/app/builder/dialogs/dlgsConditions.py +669 -0
- psychopy/app/builder/dialogs/findDlg.py +275 -0
- psychopy/app/builder/dialogs/paramCtrls.py +1802 -0
- psychopy/app/builder/validators.py +589 -0
- psychopy/app/coder/__init__.py +8 -0
- psychopy/app/coder/codeEditorBase.py +460 -0
- psychopy/app/coder/coder.py +3100 -0
- psychopy/app/coder/fileBrowser.py +714 -0
- psychopy/app/coder/folding.py +128 -0
- psychopy/app/coder/psychoParser.py +139 -0
- psychopy/app/coder/repl.py +496 -0
- psychopy/app/coder/sourceTree.py +302 -0
- psychopy/app/colorpicker/__init__.py +594 -0
- psychopy/app/colorpicker/ui.py +336 -0
- psychopy/app/connections/__init__.py +10 -0
- psychopy/app/connections/news.py +104 -0
- psychopy/app/connections/sendusage.py +61 -0
- psychopy/app/connections/updates.py +642 -0
- psychopy/app/console.py +164 -0
- psychopy/app/deviceManager/__init__.py +1 -0
- psychopy/app/deviceManager/addDialog.py +218 -0
- psychopy/app/deviceManager/dialog.py +185 -0
- psychopy/app/deviceManager/panel.py +191 -0
- psychopy/app/deviceManager/utils.py +60 -0
- psychopy/app/dialogs.py +664 -0
- psychopy/app/errorDlg.py +238 -0
- psychopy/app/frametracker.py +8 -0
- psychopy/app/idle.py +181 -0
- psychopy/app/jobs.py +676 -0
- psychopy/app/linuxconfig/__init__.py +153 -0
- psychopy/app/linuxconfig/ui.py +88 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +12695 -0
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +10199 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +10199 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +11221 -0
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.po +10195 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +11917 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +11924 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +11917 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +11084 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +11590 -0
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +10199 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +11091 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +11072 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +11071 -0
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +11072 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +11268 -0
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +10199 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +11463 -0
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +11288 -0
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +10200 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +10199 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +11441 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +11069 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +12085 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +11929 -0
- psychopy/app/localizedStrings.py +386 -0
- psychopy/app/pavlovia_ui/__init__.py +22 -0
- psychopy/app/pavlovia_ui/_base.py +268 -0
- psychopy/app/pavlovia_ui/functions.py +176 -0
- psychopy/app/pavlovia_ui/menu.py +140 -0
- psychopy/app/pavlovia_ui/project.py +943 -0
- psychopy/app/pavlovia_ui/search.py +444 -0
- psychopy/app/pavlovia_ui/sync.py +137 -0
- psychopy/app/pavlovia_ui/user.py +264 -0
- psychopy/app/plugin_manager/__init__.py +5 -0
- psychopy/app/plugin_manager/dialog.py +402 -0
- psychopy/app/plugin_manager/output.py +132 -0
- psychopy/app/plugin_manager/packageIndex.py +303 -0
- psychopy/app/plugin_manager/packages.py +643 -0
- psychopy/app/plugin_manager/plugins.py +1363 -0
- psychopy/app/plugin_manager/utils.py +115 -0
- psychopy/app/preferencesDlg.py +771 -0
- psychopy/app/psychopyApp.py +207 -0
- psychopy/app/ribbon.py +1019 -0
- psychopy/app/runner/__init__.py +1 -0
- psychopy/app/runner/runner.py +1299 -0
- psychopy/app/runner/scriptProcess.py +363 -0
- psychopy/app/stdout/__init__.py +1 -0
- psychopy/app/stdout/stdOutRich.py +410 -0
- psychopy/app/sysInfoDlg.py +242 -0
- psychopy/app/themes/__init__.py +78 -0
- psychopy/app/themes/colors.py +201 -0
- psychopy/app/themes/css/contrast_black.css +112 -0
- psychopy/app/themes/css/contrast_white.css +115 -0
- psychopy/app/themes/css/dark.css +112 -0
- psychopy/app/themes/css/light.css +115 -0
- psychopy/app/themes/fonts.py +629 -0
- psychopy/app/themes/handlers.py +321 -0
- psychopy/app/themes/icons.py +267 -0
- psychopy/app/themes/spec/Classic.json +154 -0
- psychopy/app/themes/spec/ClassicDark.json +154 -0
- psychopy/app/themes/spec/GitHub.json +154 -0
- psychopy/app/themes/spec/HiVisDark.json +153 -0
- psychopy/app/themes/spec/HiVisLight.json +154 -0
- psychopy/app/themes/spec/MinimalDark.json +154 -0
- psychopy/app/themes/spec/MinimalLight.json +153 -0
- psychopy/app/themes/spec/PsychopyDark.json +231 -0
- psychopy/app/themes/spec/PsychopyLight.json +236 -0
- psychopy/app/themes/ui.py +74 -0
- psychopy/app/ui/__init__.py +184 -0
- psychopy/app/urls.py +31 -0
- psychopy/app/utils.py +1741 -0
- psychopy/app/viewer/__init__.py +0 -0
- psychopy/assets/Psychopy Window Favicon@16w.png +0 -0
- psychopy/assets/Psychopy Window Favicon@32w.png +0 -0
- psychopy/assets/USB-C.png +0 -0
- psychopy/assets/USB.png +0 -0
- psychopy/assets/__init__.py +0 -0
- psychopy/assets/click.png +0 -0
- psychopy/assets/clicknext.png +0 -0
- psychopy/assets/creditCard.png +0 -0
- psychopy/assets/default.mp3 +0 -0
- psychopy/assets/default.mp4 +0 -0
- psychopy/assets/default.png +0 -0
- psychopy/assets/fonts/Arvo-Bold.ttf +0 -0
- psychopy/assets/fonts/Arvo-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/Arvo-Italic.ttf +0 -0
- psychopy/assets/fonts/Arvo-Regular.ttf +0 -0
- psychopy/assets/fonts/DejaVuSerif.ttf +0 -0
- psychopy/assets/fonts/IndieFlower-Regular.ttf +0 -0
- psychopy/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- psychopy/assets/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
- psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
- psychopy/assets/next.png +0 -0
- psychopy/assets/psychopy.ico +0 -0
- psychopy/assets/psychopy.png +0 -0
- psychopy/assets/templates/__init__.py +0 -0
- psychopy/assets/templates/instruct1.png +0 -0
- psychopy/assets/templates/instruct2.png +0 -0
- psychopy/assets/touch.png +0 -0
- psychopy/assets/touchnext.png +0 -0
- psychopy/assets/voicekeyThresholdStim.wav +0 -0
- psychopy/assets/window.ico +0 -0
- psychopy/changes/2023.1.0.md +9 -0
- psychopy/changes/2024.1.0.md +16 -0
- psychopy/changes/__init__.py +0 -0
- psychopy/clock.py +619 -0
- psychopy/colors.py +1058 -0
- psychopy/compatibility.py +147 -0
- psychopy/constants.py +87 -0
- psychopy/contrib/__init__.py +0 -0
- psychopy/contrib/configobj/LICENSE +39 -0
- psychopy/contrib/configobj/__init__.py +2455 -0
- psychopy/contrib/configobj/_version.py +2 -0
- psychopy/contrib/configobj/validate.py +1458 -0
- psychopy/contrib/lazy_import.py +402 -0
- psychopy/contrib/mseq.py +273 -0
- psychopy/contrib/mseqSearch.py +183 -0
- psychopy/contrib/psi.py +100 -0
- psychopy/contrib/quest.py +484 -0
- psychopy/contrib/tesselate.py +188 -0
- psychopy/core.py +167 -0
- psychopy/data/__init__.py +45 -0
- psychopy/data/base.py +566 -0
- psychopy/data/counterbalance.py +210 -0
- psychopy/data/experiment.py +1049 -0
- psychopy/data/fit.py +248 -0
- psychopy/data/routine.py +94 -0
- psychopy/data/shelf.py +237 -0
- psychopy/data/staircase.py +2270 -0
- psychopy/data/trial.py +2505 -0
- psychopy/data/utils.py +858 -0
- psychopy/demos/__init__.py +0 -0
- psychopy/demos/builder/Design Templates/branchedExperiment/README.md +5 -0
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +354 -0
- psychopy/demos/builder/Design Templates/branchedExperiment/trialTypes.xlsx +0 -0
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/README.md +20 -0
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +286 -0
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/README.md +14 -0
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +340 -0
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/stairDefinitions.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/README.md +18 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/chooseBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/facesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/housesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +219 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house03.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/README.md +30 -0
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/assets/background.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/bang.mp3 +0 -0
- psychopy/demos/builder/Experiments/BART/assets/bang.wav +0 -0
- psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/bart.psyexp +844 -0
- psychopy/demos/builder/Experiments/BART/spreadsheets/conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +255 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/README.md +23 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/TIPI.xlsx +0 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/bigFiveItems.xlsx +0 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/demographics.xlsx +0 -0
- psychopy/demos/builder/Experiments/BigFiveInventory/mini_IPIP.xlsx +0 -0
- psychopy/demos/builder/Experiments/GoNoGo/conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +462 -0
- psychopy/demos/builder/Experiments/GoNoGo/go.png +0 -0
- psychopy/demos/builder/Experiments/GoNoGo/nogo.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +5 -0
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +494 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
- psychopy/demos/builder/Experiments/goNoGo/readme.md +14 -0
- psychopy/demos/builder/Experiments/mentalRotation/F.png +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/FR.png +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRot.csv +33 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +646 -0
- psychopy/demos/builder/Experiments/mentalRotation/README.md +23 -0
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +509 -0
- psychopy/demos/builder/Experiments/navon/README.md +26 -0
- psychopy/demos/builder/Experiments/navon/bigHsmallH.png +0 -0
- psychopy/demos/builder/Experiments/navon/bigHsmallS.png +0 -0
- psychopy/demos/builder/Experiments/navon/bigSsmallH.png +0 -0
- psychopy/demos/builder/Experiments/navon/bigSsmallS.png +0 -0
- psychopy/demos/builder/Experiments/navon/mask.png +0 -0
- psychopy/demos/builder/Experiments/navon/stimuli.pptx +0 -0
- psychopy/demos/builder/Experiments/navon/trialTypes.xlsx +0 -0
- psychopy/demos/builder/Experiments/sternberg/README.md +14 -0
- psychopy/demos/builder/Experiments/sternberg/mainTrials.xlsx +0 -0
- psychopy/demos/builder/Experiments/sternberg/pracTrials.xlsx +0 -0
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +649 -0
- psychopy/demos/builder/Experiments/stroop/README.md +15 -0
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +321 -0
- psychopy/demos/builder/Experiments/stroop/trialTypes.csv +7 -0
- psychopy/demos/builder/Experiments/stroopExtended/README.md +14 -0
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +418 -0
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +418 -0
- psychopy/demos/builder/Experiments/stroopExtended/trialTypes.xlsx +0 -0
- psychopy/demos/builder/Experiments/stroopExtended/trialTypesReverse.xlsx +0 -0
- psychopy/demos/builder/Experiments/stroopVoice/README.md +27 -0
- psychopy/demos/builder/Experiments/stroopVoice/conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +382 -0
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +371 -0
- psychopy/demos/builder/Feature Demos/buttonBox/readme.md +5 -0
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +308 -0
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +391 -0
- psychopy/demos/builder/Feature Demos/gratings/readme.md +8 -0
- psychopy/demos/builder/Feature Demos/movies/movie.psyexp +220 -0
- psychopy/demos/builder/Feature Demos/movies/readme.md +3 -0
- psychopy/demos/builder/Feature Demos/noise/face.jpg +0 -0
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +477 -0
- psychopy/demos/builder/Feature Demos/noise/readme.md +3 -0
- psychopy/demos/builder/Feature Demos/panorama/panImg.jpg +0 -0
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +177 -0
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +434 -0
- psychopy/demos/builder/Feature Demos/pilotMode/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +451 -0
- psychopy/demos/builder/Feature Demos/progress/readme.md +1 -0
- psychopy/demos/builder/Feature Demos/sliders/README.md +8 -0
- psychopy/demos/builder/Feature Demos/sliders/fruitConditions.xlsx +0 -0
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +984 -0
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +199 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +639 -0
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +415 -0
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +659 -0
- psychopy/demos/builder/Hardware/EGI_netstation/README.md +17 -0
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +339 -0
- psychopy/demos/builder/Hardware/EGI_netstation/trialTypesEEG.csv +7 -0
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/readme.md +19 -0
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/trials_params.xlsx +0 -0
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +830 -0
- psychopy/demos/builder/Hardware/camera/camera.psyexp +330 -0
- psychopy/demos/builder/Hardware/camera/readme.md +6 -0
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +459 -0
- psychopy/demos/builder/Hardware/eyetracking/readme.md +7 -0
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/Bullseye_grey.mov +0 -0
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +468 -0
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/readme.md +7 -0
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +211 -0
- psychopy/demos/builder/Hardware/fMRI/readme.md +7 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/microphone/microphone.psyexp +484 -0
- psychopy/demos/builder/Hardware/microphone/phrases.xlsx +0 -0
- psychopy/demos/builder/Hardware/microphone/readme.md +9 -0
- psychopy/demos/builder/Hardware/pump/README.md +19 -0
- psychopy/demos/builder/Hardware/pump/pump.psyexp +646 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +350 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/readme.md +5 -0
- psychopy/demos/builder/Helper Tools/clockFace/README.md +3 -0
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +211 -0
- psychopy/demos/builder/Helper Tools/colors/README.md +5 -0
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +321 -0
- psychopy/demos/builder/Helper Tools/drawPolygon/README.md +5 -0
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +704 -0
- psychopy/demos/builder/Helper Tools/keyNameFinder/README.md +14 -0
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +225 -0
- psychopy/demos/builder/Helper Tools/spatialUnits/README.md +6 -0
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +206 -0
- psychopy/demos/builder/README.txt +43 -0
- psychopy/demos/builder/__init__.py +0 -0
- psychopy/demos/coder/__init__.py +0 -0
- psychopy/demos/coder/basic/hello_world.py +37 -0
- psychopy/demos/coder/csvFromPsydat.py +29 -0
- psychopy/demos/coder/experiment control/JND_staircase_analysis.py +85 -0
- psychopy/demos/coder/experiment control/JND_staircase_exp.py +110 -0
- psychopy/demos/coder/experiment control/TrialHandler.py +64 -0
- psychopy/demos/coder/experiment control/TrialHandler2.py +42 -0
- psychopy/demos/coder/experiment control/__init__.py +0 -0
- psychopy/demos/coder/experiment control/autoDraw_autoLog.py +50 -0
- psychopy/demos/coder/experiment control/experimentHandler.py +57 -0
- psychopy/demos/coder/experiment control/fMRI_launchScan.py +74 -0
- psychopy/demos/coder/experiment control/gammaMotionAnalysis.py +68 -0
- psychopy/demos/coder/experiment control/gammaMotionNull.py +169 -0
- psychopy/demos/coder/experiment control/logFiles.py +55 -0
- psychopy/demos/coder/experiment control/piloting.py +65 -0
- psychopy/demos/coder/experiment control/runtimeInfo.py +79 -0
- psychopy/demos/coder/hardware/CRS_BitsBox.py +75 -0
- psychopy/demos/coder/hardware/CRS_BitsPlusPlus.py +73 -0
- psychopy/demos/coder/hardware/RiftHeadTrackingExample.py +95 -0
- psychopy/demos/coder/hardware/RiftMinimal.py +44 -0
- psychopy/demos/coder/hardware/VSHD_Distortion.py +49 -0
- psychopy/demos/coder/hardware/__init__.py +0 -0
- psychopy/demos/coder/hardware/camera.py +90 -0
- psychopy/demos/coder/hardware/cedrusRB730.py +38 -0
- psychopy/demos/coder/hardware/crsBitsAdvancedDemo.py +780 -0
- psychopy/demos/coder/hardware/egi_netstation.py +45 -0
- psychopy/demos/coder/hardware/hdf5_extract.py +133 -0
- psychopy/demos/coder/hardware/ioLab_bbox.py +62 -0
- psychopy/demos/coder/hardware/labjack_u3.py +61 -0
- psychopy/demos/coder/hardware/monitorDemo.py +28 -0
- psychopy/demos/coder/hardware/parallelPortOutput.py +49 -0
- psychopy/demos/coder/hardware/qmixPump.py +79 -0
- psychopy/demos/coder/hardware/testSoundLatency.py +127 -0
- psychopy/demos/coder/input/GUI.py +52 -0
- psychopy/demos/coder/input/__init__.py +0 -0
- psychopy/demos/coder/input/customMouse.py +51 -0
- psychopy/demos/coder/input/joystick_universal.py +84 -0
- psychopy/demos/coder/input/keyNameFinder.py +39 -0
- psychopy/demos/coder/input/mic.png +0 -0
- psychopy/demos/coder/input/mouse.py +66 -0
- psychopy/demos/coder/iohub/delaytest.py +231 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/images/canal.jpg +0 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/images/fall.jpg +0 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/images/lake.jpg +0 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/images/party.jpg +0 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/images/swimming.jpg +0 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByConditionVariables.py +67 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByMessages.py +34 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/run.py +323 -0
- psychopy/demos/coder/iohub/eyetracking/gcCursor/trial_conditions.xlsx +0 -0
- psychopy/demos/coder/iohub/eyetracking/simple.py +147 -0
- psychopy/demos/coder/iohub/eyetracking/validation.py +251 -0
- psychopy/demos/coder/iohub/iodatastore/saveEventReport.py +56 -0
- psychopy/demos/coder/iohub/keyboard.py +189 -0
- psychopy/demos/coder/iohub/keyboardreactiontime.py +88 -0
- psychopy/demos/coder/iohub/launchHub.py +160 -0
- psychopy/demos/coder/iohub/mouse.py +112 -0
- psychopy/demos/coder/iohub/mouse_multi_window.py +124 -0
- psychopy/demos/coder/iohub/serial/_parseserial.py +53 -0
- psychopy/demos/coder/iohub/serial/customparser.py +84 -0
- psychopy/demos/coder/iohub/serial/pstbox.py +166 -0
- psychopy/demos/coder/iohub/wintab/_wintabgraphics.py +281 -0
- psychopy/demos/coder/iohub/wintab/pen_demo.py +260 -0
- psychopy/demos/coder/misc/encrypt_data.py +48 -0
- psychopy/demos/coder/misc/hdf5_2_csv +33 -0
- psychopy/demos/coder/misc/makeMovie.py +28 -0
- psychopy/demos/coder/misc/rigidBodyTransform.py +76 -0
- psychopy/demos/coder/stimuli/Campaign.ttf +0 -0
- psychopy/demos/coder/stimuli/MovieStim.py +65 -0
- psychopy/demos/coder/stimuli/__init__.py +0 -0
- psychopy/demos/coder/stimuli/aperture.py +37 -0
- psychopy/demos/coder/stimuli/beach.jpg +0 -0
- psychopy/demos/coder/stimuli/bufferImageStim.py +78 -0
- psychopy/demos/coder/stimuli/clockface.py +43 -0
- psychopy/demos/coder/stimuli/colorPalette.py +134 -0
- psychopy/demos/coder/stimuli/compare_text_timing.py +193 -0
- psychopy/demos/coder/stimuli/counterphase.py +43 -0
- psychopy/demos/coder/stimuli/customTextures.py +57 -0
- psychopy/demos/coder/stimuli/dot_gabors.py +35 -0
- psychopy/demos/coder/stimuli/dots.py +35 -0
- psychopy/demos/coder/stimuli/elementArrays.py +92 -0
- psychopy/demos/coder/stimuli/embeddedOpenGL.py +35 -0
- psychopy/demos/coder/stimuli/face.jpg +0 -0
- psychopy/demos/coder/stimuli/face_jpg.py +48 -0
- psychopy/demos/coder/stimuli/gabor.py +30 -0
- psychopy/demos/coder/stimuli/imagesAndPatches.py +51 -0
- psychopy/demos/coder/stimuli/jwpIntro.mp4 +0 -0
- psychopy/demos/coder/stimuli/kanizsa.py +41 -0
- psychopy/demos/coder/stimuli/maskReveal.py +63 -0
- psychopy/demos/coder/stimuli/plaid.py +43 -0
- psychopy/demos/coder/stimuli/ratingScale.py +183 -0
- psychopy/demos/coder/stimuli/rotatingFlashingWedge.py +37 -0
- psychopy/demos/coder/stimuli/screensAndWindows.py +58 -0
- psychopy/demos/coder/stimuli/secondOrderGratings.py +66 -0
- psychopy/demos/coder/stimuli/shapeContains.py +50 -0
- psychopy/demos/coder/stimuli/shapes.py +63 -0
- psychopy/demos/coder/stimuli/soundStimuli.py +49 -0
- psychopy/demos/coder/stimuli/starField.py +48 -0
- psychopy/demos/coder/stimuli/stim3d.py +107 -0
- psychopy/demos/coder/stimuli/textBoxStim/textbox_glyph_placement.py +93 -0
- psychopy/demos/coder/stimuli/textBoxStim/textbox_simple.py +71 -0
- psychopy/demos/coder/stimuli/textStimuli.py +106 -0
- psychopy/demos/coder/stimuli/textbox_editable.py +64 -0
- psychopy/demos/coder/stimuli/variousVisualStims.py +47 -0
- psychopy/demos/coder/stimuli/visual_noise.py +31 -0
- psychopy/demos/coder/sysInfo.py +56 -0
- psychopy/demos/coder/timing/__init__.py +0 -0
- psychopy/demos/coder/timing/callOnFlip.py +39 -0
- psychopy/demos/coder/timing/clocksAndTimers.py +46 -0
- psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +323 -0
- psychopy/demos/coder/timing/timeByFrames.py +80 -0
- psychopy/demos/coder/timing/timeByFramesEx.py +107 -0
- psychopy/demos/coder/understanding psychopy/colors.py +70 -0
- psychopy/demos/coder/understanding psychopy/fontLayout.py +69 -0
- psychopy/demos/demo_migration.py +214 -0
- psychopy/demos/modernizeDemos.py +16 -0
- psychopy/demos/test_demo_migration.py +155 -0
- psychopy/devices/__init__.py +8 -0
- psychopy/event.py +1339 -0
- psychopy/exceptions.py +59 -0
- psychopy/experiment/__init__.py +51 -0
- psychopy/experiment/_experiment.py +1514 -0
- psychopy/experiment/blankTemplate.xltx +0 -0
- psychopy/experiment/components/__init__.py +402 -0
- psychopy/experiment/components/_base.py +1689 -0
- psychopy/experiment/components/aperture/__init__.py +153 -0
- psychopy/experiment/components/aperture/classic/aperture.png +0 -0
- psychopy/experiment/components/aperture/classic/aperture@2x.png +0 -0
- psychopy/experiment/components/aperture/dark/aperture.png +0 -0
- psychopy/experiment/components/aperture/dark/aperture@2x.png +0 -0
- psychopy/experiment/components/aperture/light/aperture.png +0 -0
- psychopy/experiment/components/aperture/light/aperture@2x.png +0 -0
- psychopy/experiment/components/brush/__init__.py +165 -0
- psychopy/experiment/components/brush/classic/brush.png +0 -0
- psychopy/experiment/components/brush/classic/brush@2x.png +0 -0
- psychopy/experiment/components/brush/dark/brush.png +0 -0
- psychopy/experiment/components/brush/dark/brush@2x.png +0 -0
- psychopy/experiment/components/brush/light/brush.png +0 -0
- psychopy/experiment/components/brush/light/brush@2x.png +0 -0
- psychopy/experiment/components/button/__init__.py +493 -0
- psychopy/experiment/components/button/classic/button.png +0 -0
- psychopy/experiment/components/button/classic/button@2x.png +0 -0
- psychopy/experiment/components/button/dark/button.png +0 -0
- psychopy/experiment/components/button/dark/button@2x.png +0 -0
- psychopy/experiment/components/button/light/button.png +0 -0
- psychopy/experiment/components/button/light/button@2x.png +0 -0
- psychopy/experiment/components/buttonBox/__init__.py +322 -0
- psychopy/experiment/components/buttonBox/classic/buttonBox.png +0 -0
- psychopy/experiment/components/buttonBox/classic/buttonBox@2x.png +0 -0
- psychopy/experiment/components/buttonBox/dark/buttonBox.png +0 -0
- psychopy/experiment/components/buttonBox/dark/buttonBox@2x.png +0 -0
- psychopy/experiment/components/buttonBox/light/buttonBox.png +0 -0
- psychopy/experiment/components/buttonBox/light/buttonBox@2x.png +0 -0
- psychopy/experiment/components/camera/__init__.py +381 -0
- psychopy/experiment/components/camera/classic/webcam.png +0 -0
- psychopy/experiment/components/camera/classic/webcam@2x.png +0 -0
- psychopy/experiment/components/camera/dark/webcam.png +0 -0
- psychopy/experiment/components/camera/dark/webcam@2x.png +0 -0
- psychopy/experiment/components/camera/light/webcam.png +0 -0
- psychopy/experiment/components/camera/light/webcam@2x.png +0 -0
- psychopy/experiment/components/code/__init__.py +299 -0
- psychopy/experiment/components/code/classic/code.png +0 -0
- psychopy/experiment/components/code/classic/code@2x.png +0 -0
- psychopy/experiment/components/code/dark/code.png +0 -0
- psychopy/experiment/components/code/dark/code@2x.png +0 -0
- psychopy/experiment/components/code/light/code.png +0 -0
- psychopy/experiment/components/code/light/code@2x.png +0 -0
- psychopy/experiment/components/dots/__init__.py +199 -0
- psychopy/experiment/components/dots/classic/dots.png +0 -0
- psychopy/experiment/components/dots/classic/dots@2x.png +0 -0
- psychopy/experiment/components/dots/dark/dots.png +0 -0
- psychopy/experiment/components/dots/dark/dots@2x.png +0 -0
- psychopy/experiment/components/dots/dots.xcf +0 -0
- psychopy/experiment/components/dots/light/dots.png +0 -0
- psychopy/experiment/components/dots/light/dots@2x.png +0 -0
- psychopy/experiment/components/eyetracker_record/__init__.py +194 -0
- psychopy/experiment/components/eyetracker_record/classic/eyetracker_record.png +0 -0
- psychopy/experiment/components/eyetracker_record/classic/eyetracker_record@2x.png +0 -0
- psychopy/experiment/components/eyetracker_record/dark/eyetracker_record.png +0 -0
- psychopy/experiment/components/eyetracker_record/dark/eyetracker_record@2x.png +0 -0
- psychopy/experiment/components/eyetracker_record/light/eyetracker_record.png +0 -0
- psychopy/experiment/components/eyetracker_record/light/eyetracker_record@2x.png +0 -0
- psychopy/experiment/components/form/__init__.py +227 -0
- psychopy/experiment/components/form/classic/form.png +0 -0
- psychopy/experiment/components/form/classic/form@2x.png +0 -0
- psychopy/experiment/components/form/dark/form.png +0 -0
- psychopy/experiment/components/form/dark/form@2x.png +0 -0
- psychopy/experiment/components/form/formItems.xltx +0 -0
- psychopy/experiment/components/form/light/form.png +0 -0
- psychopy/experiment/components/form/light/form@2x.png +0 -0
- psychopy/experiment/components/grating/__init__.py +203 -0
- psychopy/experiment/components/grating/classic/grating.png +0 -0
- psychopy/experiment/components/grating/classic/grating@2x.png +0 -0
- psychopy/experiment/components/grating/dark/grating.png +0 -0
- psychopy/experiment/components/grating/dark/grating@2x.png +0 -0
- psychopy/experiment/components/grating/light/grating.png +0 -0
- psychopy/experiment/components/grating/light/grating@2x.png +0 -0
- psychopy/experiment/components/image/__init__.py +195 -0
- psychopy/experiment/components/image/classic/image.png +0 -0
- psychopy/experiment/components/image/classic/image@2x.png +0 -0
- psychopy/experiment/components/image/dark/image.png +0 -0
- psychopy/experiment/components/image/dark/image@2x.png +0 -0
- psychopy/experiment/components/image/light/image.png +0 -0
- psychopy/experiment/components/image/light/image@2x.png +0 -0
- psychopy/experiment/components/joyButtons/__init__.py +453 -0
- psychopy/experiment/components/joyButtons/classic/joyButtons.png +0 -0
- psychopy/experiment/components/joyButtons/classic/joybuttons@2x.png +0 -0
- psychopy/experiment/components/joyButtons/dark/joyButtons.png +0 -0
- psychopy/experiment/components/joyButtons/dark/joyButtons@2x.png +0 -0
- psychopy/experiment/components/joyButtons/light/joyButtons.png +0 -0
- psychopy/experiment/components/joyButtons/light/joyButtons@2x.png +0 -0
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +34 -0
- psychopy/experiment/components/joystick/__init__.py +572 -0
- psychopy/experiment/components/joystick/classic/joystick.png +0 -0
- psychopy/experiment/components/joystick/classic/joystick@2x.png +0 -0
- psychopy/experiment/components/joystick/dark/joystick.png +0 -0
- psychopy/experiment/components/joystick/dark/joystick@2x.png +0 -0
- psychopy/experiment/components/joystick/light/joystick.png +0 -0
- psychopy/experiment/components/joystick/light/joystick@2x.png +0 -0
- psychopy/experiment/components/joystick/virtualJoystick.py +40 -0
- psychopy/experiment/components/keyboard/__init__.py +568 -0
- psychopy/experiment/components/keyboard/classic/keyboard.png +0 -0
- psychopy/experiment/components/keyboard/classic/keyboard@2x.png +0 -0
- psychopy/experiment/components/keyboard/dark/keyboard.png +0 -0
- psychopy/experiment/components/keyboard/dark/keyboard@2x.png +0 -0
- psychopy/experiment/components/keyboard/light/keyboard.png +0 -0
- psychopy/experiment/components/keyboard/light/keyboard@2x.png +0 -0
- psychopy/experiment/components/keyboard.xcf +0 -0
- psychopy/experiment/components/microphone/__init__.py +600 -0
- psychopy/experiment/components/microphone/classic/microphone.png +0 -0
- psychopy/experiment/components/microphone/classic/microphone@2x.png +0 -0
- psychopy/experiment/components/microphone/dark/microphone.png +0 -0
- psychopy/experiment/components/microphone/dark/microphone@2x.png +0 -0
- psychopy/experiment/components/microphone/light/microphone.png +0 -0
- psychopy/experiment/components/microphone/light/microphone@2x.png +0 -0
- psychopy/experiment/components/mouse/__init__.py +773 -0
- psychopy/experiment/components/mouse/classic/mouse.png +0 -0
- psychopy/experiment/components/mouse/classic/mouse@2x.png +0 -0
- psychopy/experiment/components/mouse/dark/mouse.png +0 -0
- psychopy/experiment/components/mouse/dark/mouse@2x.png +0 -0
- psychopy/experiment/components/mouse/light/mouse.png +0 -0
- psychopy/experiment/components/mouse/light/mouse@2x.png +0 -0
- psychopy/experiment/components/movie/__init__.py +348 -0
- psychopy/experiment/components/movie/classic/movie.png +0 -0
- psychopy/experiment/components/movie/classic/movie@2x.png +0 -0
- psychopy/experiment/components/movie/dark/movie.png +0 -0
- psychopy/experiment/components/movie/dark/movie@2x.png +0 -0
- psychopy/experiment/components/movie/light/movie.png +0 -0
- psychopy/experiment/components/movie/light/movie@2x.png +0 -0
- psychopy/experiment/components/panorama/__init__.py +456 -0
- psychopy/experiment/components/panorama/classic/panorama.png +0 -0
- psychopy/experiment/components/panorama/classic/panorama@2x.png +0 -0
- psychopy/experiment/components/panorama/dark/panorama.png +0 -0
- psychopy/experiment/components/panorama/dark/panorama@2x.png +0 -0
- psychopy/experiment/components/panorama/light/panorama.png +0 -0
- psychopy/experiment/components/panorama/light/panorama@2x.png +0 -0
- psychopy/experiment/components/parallelOut/__init__.py +178 -0
- psychopy/experiment/components/parallelOut/classic/parallel.png +0 -0
- psychopy/experiment/components/parallelOut/classic/parallel@2x.png +0 -0
- psychopy/experiment/components/parallelOut/dark/parallel.png +0 -0
- psychopy/experiment/components/parallelOut/dark/parallel@2x.png +0 -0
- psychopy/experiment/components/parallelOut/light/parallel.png +0 -0
- psychopy/experiment/components/parallelOut/light/parallel@2x.png +0 -0
- psychopy/experiment/components/polygon/__init__.py +332 -0
- psychopy/experiment/components/polygon/classic/polygon.png +0 -0
- psychopy/experiment/components/polygon/classic/polygon@2x.png +0 -0
- psychopy/experiment/components/polygon/dark/polygon.png +0 -0
- psychopy/experiment/components/polygon/dark/polygon@2x.png +0 -0
- psychopy/experiment/components/polygon/light/polygon.png +0 -0
- psychopy/experiment/components/polygon/light/polygon@2x.png +0 -0
- psychopy/experiment/components/progress/__init__.py +130 -0
- psychopy/experiment/components/progress/classic/progress.png +0 -0
- psychopy/experiment/components/progress/classic/progress@2x.png +0 -0
- psychopy/experiment/components/progress/dark/progress.png +0 -0
- psychopy/experiment/components/progress/dark/progress@2x.png +0 -0
- psychopy/experiment/components/progress/light/progress.png +0 -0
- psychopy/experiment/components/progress/light/progress@2x.png +0 -0
- psychopy/experiment/components/resourceManager/__init__.py +176 -0
- psychopy/experiment/components/resourceManager/classic/resource_manager.png +0 -0
- psychopy/experiment/components/resourceManager/classic/resource_manager@2x.png +0 -0
- psychopy/experiment/components/resourceManager/dark/resource_manager.png +0 -0
- psychopy/experiment/components/resourceManager/dark/resource_manager@2x.png +0 -0
- psychopy/experiment/components/resourceManager/light/resource_manager.png +0 -0
- psychopy/experiment/components/resourceManager/light/resource_manager@2x.png +0 -0
- psychopy/experiment/components/roi/__init__.py +316 -0
- psychopy/experiment/components/roi/classic/eyetracker_roi.png +0 -0
- psychopy/experiment/components/roi/classic/eyetracker_roi@2x.png +0 -0
- psychopy/experiment/components/roi/dark/eyetracker_roi.png +0 -0
- psychopy/experiment/components/roi/dark/eyetracker_roi@2X.png +0 -0
- psychopy/experiment/components/roi/light/eyetracker_roi.png +0 -0
- psychopy/experiment/components/roi/light/eyetracker_roi@2X.png +0 -0
- psychopy/experiment/components/routineSettings/__init__.py +387 -0
- psychopy/experiment/components/routineSettings/classic/routineSettings.png +0 -0
- psychopy/experiment/components/routineSettings/classic/routineSettings@2x.png +0 -0
- psychopy/experiment/components/routineSettings/dark/routineSettings.png +0 -0
- psychopy/experiment/components/routineSettings/dark/routineSettings@2x.png +0 -0
- psychopy/experiment/components/routineSettings/light/routineSettings.png +0 -0
- psychopy/experiment/components/routineSettings/light/routineSettings@2x.png +0 -0
- psychopy/experiment/components/serialOut/__init__.py +304 -0
- psychopy/experiment/components/serialOut/classic/serial.png +0 -0
- psychopy/experiment/components/serialOut/classic/serial@2x.png +0 -0
- psychopy/experiment/components/serialOut/dark/serial.png +0 -0
- psychopy/experiment/components/serialOut/dark/serial@2x.png +0 -0
- psychopy/experiment/components/serialOut/light/serial.png +0 -0
- psychopy/experiment/components/serialOut/light/serial@2x.png +0 -0
- psychopy/experiment/components/settings/JS_htmlHeader.tmpl +23 -0
- psychopy/experiment/components/settings/JS_setupExp.tmpl +28 -0
- psychopy/experiment/components/settings/__init__.py +2254 -0
- psychopy/experiment/components/settings/classic/settings.png +0 -0
- psychopy/experiment/components/settings/classic/settings@2x.png +0 -0
- psychopy/experiment/components/settings/dark/settings.png +0 -0
- psychopy/experiment/components/settings/dark/settings@2x.png +0 -0
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/settings/light/settings.png +0 -0
- psychopy/experiment/components/settings/light/settings@2x.png +0 -0
- psychopy/experiment/components/slider/__init__.py +410 -0
- psychopy/experiment/components/slider/classic/slider.png +0 -0
- psychopy/experiment/components/slider/classic/slider@2x.png +0 -0
- psychopy/experiment/components/slider/dark/slider.png +0 -0
- psychopy/experiment/components/slider/dark/slider@2x.png +0 -0
- psychopy/experiment/components/slider/light/slider.png +0 -0
- psychopy/experiment/components/slider/light/slider@2x.png +0 -0
- psychopy/experiment/components/sound/__init__.py +441 -0
- psychopy/experiment/components/sound/classic/sound.png +0 -0
- psychopy/experiment/components/sound/classic/sound@2x.png +0 -0
- psychopy/experiment/components/sound/dark/sound.png +0 -0
- psychopy/experiment/components/sound/dark/sound@2x.png +0 -0
- psychopy/experiment/components/sound/light/sound.png +0 -0
- psychopy/experiment/components/sound/light/sound@2x.png +0 -0
- psychopy/experiment/components/soundsensor/__init__.py +324 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
- psychopy/experiment/components/static/__init__.py +293 -0
- psychopy/experiment/components/static/classic/static.png +0 -0
- psychopy/experiment/components/static/classic/static@2x.png +0 -0
- psychopy/experiment/components/static/dark/static.png +0 -0
- psychopy/experiment/components/static/dark/static@2x.png +0 -0
- psychopy/experiment/components/static/light/static.png +0 -0
- psychopy/experiment/components/static/light/static@2x.png +0 -0
- psychopy/experiment/components/text/__init__.py +190 -0
- psychopy/experiment/components/text/classic/text.png +0 -0
- psychopy/experiment/components/text/classic/text@2x.png +0 -0
- psychopy/experiment/components/text/dark/text.png +0 -0
- psychopy/experiment/components/text/dark/text@2x.png +0 -0
- psychopy/experiment/components/text/light/text.png +0 -0
- psychopy/experiment/components/text/light/text@2x.png +0 -0
- psychopy/experiment/components/textbox/__init__.py +336 -0
- psychopy/experiment/components/textbox/classic/textbox.png +0 -0
- psychopy/experiment/components/textbox/classic/textbox@2x.png +0 -0
- psychopy/experiment/components/textbox/dark/textbox.png +0 -0
- psychopy/experiment/components/textbox/dark/textbox@2x.png +0 -0
- psychopy/experiment/components/textbox/light/textbox.png +0 -0
- psychopy/experiment/components/textbox/light/textbox@2x.png +0 -0
- psychopy/experiment/components/unknown/__init__.py +87 -0
- psychopy/experiment/components/unknown/classic/unknown.png +0 -0
- psychopy/experiment/components/unknown/classic/unknown@2x.png +0 -0
- psychopy/experiment/components/unknown/dark/unknown.png +0 -0
- psychopy/experiment/components/unknown/dark/unknown@2x.png +0 -0
- psychopy/experiment/components/unknown/light/unknown.png +0 -0
- psychopy/experiment/components/unknown/light/unknown@2x.png +0 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +86 -0
- psychopy/experiment/components/unknownPlugin/classic/unknownPlugin.png +0 -0
- psychopy/experiment/components/unknownPlugin/classic/unknownPlugin@2x.png +0 -0
- psychopy/experiment/components/unknownPlugin/dark/unknownPlugin.png +0 -0
- psychopy/experiment/components/unknownPlugin/dark/unknownPlugin@2x.png +0 -0
- psychopy/experiment/components/unknownPlugin/light/unknownPlugin.png +0 -0
- psychopy/experiment/components/unknownPlugin/light/unknownPlugin@2x.png +0 -0
- psychopy/experiment/components/utils.py +0 -0
- psychopy/experiment/components/variable/__init__.py +184 -0
- psychopy/experiment/components/variable/classic/variable.png +0 -0
- psychopy/experiment/components/variable/classic/variable@2x.png +0 -0
- psychopy/experiment/components/variable/dark/variable.png +0 -0
- psychopy/experiment/components/variable/dark/variable@2x.png +0 -0
- psychopy/experiment/components/variable/light/variable.png +0 -0
- psychopy/experiment/components/variable/light/variable@2x.png +0 -0
- psychopy/experiment/devices.py +303 -0
- psychopy/experiment/experiment.xsd +223 -0
- psychopy/experiment/exports.py +390 -0
- psychopy/experiment/flow.py +547 -0
- psychopy/experiment/localization.py +11 -0
- psychopy/experiment/loopTemplate.xltx +0 -0
- psychopy/experiment/loops.py +1051 -0
- psychopy/experiment/monitor.py +74 -0
- psychopy/experiment/params.py +541 -0
- psychopy/experiment/plugins.py +42 -0
- psychopy/experiment/py2js.py +183 -0
- psychopy/experiment/py2js_transpiler.py +613 -0
- psychopy/experiment/questPlusTemplate.xltx +0 -0
- psychopy/experiment/questTemplate.xltx +0 -0
- psychopy/experiment/routines/__init__.py +108 -0
- psychopy/experiment/routines/_base.py +1172 -0
- psychopy/experiment/routines/audioValidator/__init__.py +229 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/counterbalance/__init__.py +320 -0
- psychopy/experiment/routines/counterbalance/classic/counterbalance.png +0 -0
- psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png +0 -0
- psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx +0 -0
- psychopy/experiment/routines/counterbalance/dark/counterbalance.png +0 -0
- psychopy/experiment/routines/counterbalance/dark/counterbalance@2x.png +0 -0
- psychopy/experiment/routines/counterbalance/light/counterbalance.png +0 -0
- psychopy/experiment/routines/counterbalance/light/counterbalance@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/__init__.py +334 -0
- psychopy/experiment/routines/eyetracker_calibrate/classic/eyetracker_calib.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_validate/__init__.py +354 -0
- psychopy/experiment/routines/eyetracker_validate/classic/eyetracker_valid.png +0 -0
- psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid.png +0 -0
- psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid.png +0 -0
- psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid@2x.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/__init__.py +236 -0
- psychopy/experiment/routines/pavlovia_survey/classic/survey.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/classic/survey@2x.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/dark/survey.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/dark/survey@2x.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/light/survey.png +0 -0
- psychopy/experiment/routines/pavlovia_survey/light/survey@2x.png +0 -0
- psychopy/experiment/routines/unknown/__init__.py +30 -0
- psychopy/experiment/routines/unknown/classic/eyetracker_record.png +0 -0
- psychopy/experiment/routines/unknown/classic/unknown.png +0 -0
- psychopy/experiment/routines/unknown/dark/eyetracker_record.png +0 -0
- psychopy/experiment/routines/unknown/dark/eyetracker_record@2x.png +0 -0
- psychopy/experiment/routines/unknown/dark/unknown.png +0 -0
- psychopy/experiment/routines/unknown/dark/unknown@2x.png +0 -0
- psychopy/experiment/routines/unknown/light/eyetracker_record.png +0 -0
- psychopy/experiment/routines/unknown/light/eyetracker_record@2x.png +0 -0
- psychopy/experiment/routines/unknown/light/unknown.png +0 -0
- psychopy/experiment/routines/unknown/light/unknown@2x.png +0 -0
- psychopy/experiment/routines/utils.py +0 -0
- psychopy/experiment/routines/visualValidator/__init__.py +395 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
- psychopy/experiment/staircaseTemplate.xltx +0 -0
- psychopy/experiment/utils.py +44 -0
- psychopy/filters.py +11 -0
- psychopy/gamma.py +9 -0
- psychopy/gui/__init__.py +47 -0
- psychopy/gui/qtgui.py +882 -0
- psychopy/gui/util.py +74 -0
- psychopy/gui/wxgui.py +420 -0
- psychopy/hardware/__init__.py +178 -0
- psychopy/hardware/base.py +466 -0
- psychopy/hardware/bbtk/__init__.py +24 -0
- psychopy/hardware/brainproducts.py +25 -0
- psychopy/hardware/button.py +238 -0
- psychopy/hardware/buttonbox/__init__.py +122 -0
- psychopy/hardware/camera/__init__.py +3657 -0
- psychopy/hardware/cedrus.py +24 -0
- psychopy/hardware/crs/__init__.py +46 -0
- psychopy/hardware/crs/bits.py +37 -0
- psychopy/hardware/crs/colorcal.py +18 -0
- psychopy/hardware/crs/optical.py +33 -0
- psychopy/hardware/crs/shaders.py +34 -0
- psychopy/hardware/emotiv.py +33 -0
- psychopy/hardware/emulator.py +46 -0
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/eyetracker.py +132 -0
- psychopy/hardware/forp.py +37 -0
- psychopy/hardware/gammasci.py +26 -0
- psychopy/hardware/iolab.py +24 -0
- psychopy/hardware/joystick/__init__.py +1196 -0
- psychopy/hardware/joystick/_base.py +251 -0
- psychopy/hardware/joystick/backend_glfw.py +306 -0
- psychopy/hardware/joystick/backend_pyglet.py +309 -0
- psychopy/hardware/joystick/mappings.py +287 -0
- psychopy/hardware/keyboard.py +975 -0
- psychopy/hardware/knownDevices.json +52 -0
- psychopy/hardware/labhackers.py +27 -0
- psychopy/hardware/labjacks.py +26 -0
- psychopy/hardware/lightsensor.py +789 -0
- psychopy/hardware/listener.py +330 -0
- psychopy/hardware/manager.py +992 -0
- psychopy/hardware/microphone.py +1630 -0
- psychopy/hardware/minolta.py +33 -0
- psychopy/hardware/monitor.py +144 -0
- psychopy/hardware/mouse/__init__.py +885 -0
- psychopy/hardware/photometer/__init__.py +207 -0
- psychopy/hardware/pr.py +33 -0
- psychopy/hardware/qmix.py +32 -0
- psychopy/hardware/serialdevice.py +387 -0
- psychopy/hardware/soundsensor.py +476 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +351 -0
- psychopy/hardware/triggerbox/__init__.py +56 -0
- psychopy/hardware/triggerbox/base.py +170 -0
- psychopy/hardware/triggerbox/parallel.py +362 -0
- psychopy/info.py +719 -0
- psychopy/iohub/__init__.py +50 -0
- psychopy/iohub/client/__init__.py +1481 -0
- psychopy/iohub/client/connect.py +260 -0
- psychopy/iohub/client/eyetracker/__init__.py +4 -0
- psychopy/iohub/client/eyetracker/validation/__init__.py +8 -0
- psychopy/iohub/client/eyetracker/validation/posgrid.py +274 -0
- psychopy/iohub/client/eyetracker/validation/procedure.py +1292 -0
- psychopy/iohub/client/eyetracker/validation/trigger.py +240 -0
- psychopy/iohub/client/keyboard.py +513 -0
- psychopy/iohub/client/wintab.py +378 -0
- psychopy/iohub/constants.py +1176 -0
- psychopy/iohub/datastore/__init__.py +439 -0
- psychopy/iohub/datastore/default_datastore.yaml +8 -0
- psychopy/iohub/datastore/util.py +868 -0
- psychopy/iohub/default_config.yaml +17 -0
- psychopy/iohub/devices/__init__.py +1047 -0
- psychopy/iohub/devices/computer.py +607 -0
- psychopy/iohub/devices/default_device.yaml +15 -0
- psychopy/iohub/devices/deviceConfigValidation.py +519 -0
- psychopy/iohub/devices/display/__init__.py +755 -0
- psychopy/iohub/devices/display/default_display.yaml +118 -0
- psychopy/iohub/devices/display/supported_config_settings.yaml +69 -0
- psychopy/iohub/devices/eventfilters.py +3572 -0
- psychopy/iohub/devices/experiment/__init__.py +316 -0
- psychopy/iohub/devices/experiment/default_experiment.yaml +74 -0
- psychopy/iohub/devices/experiment/supported_config_settings.yaml +26 -0
- psychopy/iohub/devices/eyetracker/__init__.py +474 -0
- psychopy/iohub/devices/eyetracker/calibration/__init__.py +1 -0
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +391 -0
- psychopy/iohub/devices/eyetracker/default_eyetracker.yaml +18 -0
- psychopy/iohub/devices/eyetracker/eye_events.py +1751 -0
- psychopy/iohub/devices/eyetracker/filters/__init__.py +4 -0
- psychopy/iohub/devices/eyetracker/filters/parser.py +913 -0
- psychopy/iohub/devices/eyetracker/hw/__init__.py +4 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +29 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +29 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/calibration.py +18 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +31 -0
- psychopy/iohub/devices/eyetracker/hw/mouse/__init__.py +8 -0
- psychopy/iohub/devices/eyetracker/hw/mouse/calibration.py +10 -0
- psychopy/iohub/devices/eyetracker/hw/mouse/default_eyetracker.yaml +102 -0
- psychopy/iohub/devices/eyetracker/hw/mouse/eyetracker.py +443 -0
- psychopy/iohub/devices/eyetracker/hw/mouse/supported_config_settings.yaml +110 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/__init__.py +4 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +27 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/eyetracker.py +18 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/__init__.py +29 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/bisector.py +20 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/constants.py +19 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/data_parse.py +22 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/eyetracker.py +18 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/pupil_remote.py +18 -0
- psychopy/iohub/devices/eyetracker/hw/sr_research/__init__.py +4 -0
- psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/__init__.py +28 -0
- psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/calibration.py +22 -0
- psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/eyetracker.py +38 -0
- psychopy/iohub/devices/eyetracker/hw/tobii/__init__.py +29 -0
- psychopy/iohub/devices/eyetracker/hw/tobii/calibration.py +19 -0
- psychopy/iohub/devices/eyetracker/hw/tobii/eyetracker.py +17 -0
- psychopy/iohub/devices/eyetracker/hw/tobii/tobiiwrapper.py +19 -0
- psychopy/iohub/devices/eyetracker/supported_config_settings.yaml +44 -0
- psychopy/iohub/devices/keyboard/__init__.py +309 -0
- psychopy/iohub/devices/keyboard/darwin.py +431 -0
- psychopy/iohub/devices/keyboard/darwinkey.py +94 -0
- psychopy/iohub/devices/keyboard/default_keyboard.yaml +94 -0
- psychopy/iohub/devices/keyboard/linux2.py +102 -0
- psychopy/iohub/devices/keyboard/supported_config_settings.yaml +39 -0
- psychopy/iohub/devices/keyboard/win32.py +356 -0
- psychopy/iohub/devices/mouse/__init__.py +709 -0
- psychopy/iohub/devices/mouse/darwin.py +414 -0
- psychopy/iohub/devices/mouse/default_mouse.yaml +92 -0
- psychopy/iohub/devices/mouse/linux2.py +172 -0
- psychopy/iohub/devices/mouse/supported_config_settings.yaml +39 -0
- psychopy/iohub/devices/mouse/win32.py +284 -0
- psychopy/iohub/devices/pyXHook.py +619 -0
- psychopy/iohub/devices/serial/__init__.py +779 -0
- psychopy/iohub/devices/serial/default_pstbox.yaml +108 -0
- psychopy/iohub/devices/serial/default_serial.yaml +108 -0
- psychopy/iohub/devices/serial/supported_config_settings.yaml +85 -0
- psychopy/iohub/devices/serial/supported_config_settings_pstbox.yaml +85 -0
- psychopy/iohub/devices/supported_config_settings.yaml +36 -0
- psychopy/iohub/devices/wintab/__init__.py +580 -0
- psychopy/iohub/devices/wintab/default_wintab.yaml +89 -0
- psychopy/iohub/devices/wintab/supported_config_settings.yaml +42 -0
- psychopy/iohub/devices/wintab/win32.py +722 -0
- psychopy/iohub/devices/xlib.py +6795 -0
- psychopy/iohub/errors.py +61 -0
- psychopy/iohub/lazy_import.py +582 -0
- psychopy/iohub/net.py +349 -0
- psychopy/iohub/server.py +1075 -0
- psychopy/iohub/start_iohub_process.py +121 -0
- psychopy/iohub/util/__init__.py +832 -0
- psychopy/iohub/util/visualangle.py +126 -0
- psychopy/layout.py +916 -0
- psychopy/liaison.py +471 -0
- psychopy/locale_setup.py +41 -0
- psychopy/localization/__init__.py +22 -0
- psychopy/localization/_localization.py +155 -0
- psychopy/localization/generateTranslationTemplate.py +257 -0
- psychopy/localization/mappings.txt +170 -0
- psychopy/localization/messages.pot +9950 -0
- psychopy/localization/readme.txt +68 -0
- psychopy/logging.py +415 -0
- psychopy/microphone.py +28 -0
- psychopy/misc.py +40 -0
- psychopy/monitors/MonitorCenter.py +1354 -0
- psychopy/monitors/__init__.py +30 -0
- psychopy/monitors/calibData.py +78 -0
- psychopy/monitors/calibTools.py +1301 -0
- psychopy/monitors/getLumSeries.py +50 -0
- psychopy/monitors/psychopy-icon.svg +395 -0
- psychopy/monitors/psychopy.ico +0 -0
- psychopy/parallel/__init__.py +206 -0
- psychopy/parallel/_dlportio.py +150 -0
- psychopy/parallel/_inpout.py +120 -0
- psychopy/parallel/_linux.py +105 -0
- psychopy/piloting.py +61 -0
- psychopy/platform_specific/__init__.py +46 -0
- psychopy/platform_specific/darwin.py +326 -0
- psychopy/platform_specific/linux.py +77 -0
- psychopy/platform_specific/win32.py +124 -0
- psychopy/plugins/__init__.py +1397 -0
- psychopy/plugins/util.py +104 -0
- psychopy/preferences/Darwin.spec +294 -0
- psychopy/preferences/FreeBSD.spec +294 -0
- psychopy/preferences/Linux.spec +294 -0
- psychopy/preferences/Windows.spec +294 -0
- psychopy/preferences/__init__.py +20 -0
- psychopy/preferences/baseNoArch.spec +290 -0
- psychopy/preferences/devices.py +80 -0
- psychopy/preferences/generateHints.py +93 -0
- psychopy/preferences/generateSpec.py +80 -0
- psychopy/preferences/hints.py +367 -0
- psychopy/preferences/preferences.py +448 -0
- psychopy/projects/__init__.py +11 -0
- psychopy/projects/gitignore.py +45 -0
- psychopy/projects/pavlovia.py +1674 -0
- psychopy/projects/sshkeys.py +107 -0
- psychopy/psychojs.zip +0 -0
- psychopy/pylintrc +69 -0
- psychopy/scripts/__init__.py +0 -0
- psychopy/scripts/psychopy-pkgutil.py +969 -0
- psychopy/scripts/psyexpCompile.py +229 -0
- psychopy/session.py +1651 -0
- psychopy/sound/__init__.py +50 -0
- psychopy/sound/_base.py +399 -0
- psychopy/sound/audioclip.py +1325 -0
- psychopy/sound/audiodevice.py +857 -0
- psychopy/sound/backend_ptb.py +406 -0
- psychopy/sound/backend_pygame.py +323 -0
- psychopy/sound/backend_pyo.py +64 -0
- psychopy/sound/backend_pysound.py +324 -0
- psychopy/sound/backend_sounddevice.py +44 -0
- psychopy/sound/backends/__init__.py +0 -0
- psychopy/sound/exceptions.py +115 -0
- psychopy/sound/microphone.py +357 -0
- psychopy/sound/sound.py +58 -0
- psychopy/sound/transcribe.py +1321 -0
- psychopy/tests/README.md +344 -0
- psychopy/tests/__init__.py +47 -0
- psychopy/tests/data/Electronic_Chime-KevanGC-495939803.wav +0 -0
- psychopy/tests/data/TestCircle_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestCircle_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestCircle_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestCircle_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestCircle_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestCircle_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestCircle_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestCircle_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestCircle_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestCircle_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestCircle_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestCircle_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestCircle_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestCircle_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestCircle_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestCircle_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestCircle_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestCircle_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestCircle_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestCircle_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq10_s0.5.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq10_s0.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq10_s1.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq1_s0.5.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq1_s0.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq1_s1.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq3_s0.5.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq3_s0.png +0 -0
- psychopy/tests/data/TestForm_scrolling_nq3_s1.png +0 -0
- psychopy/tests/data/TestImage_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestImage_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestImage_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestImage_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestImage_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestImage_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestImage_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestImage_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestImage_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestImage_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestImage_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestImage_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestImage_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestImage_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestImage_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestImage_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestImage_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestImage_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestImage_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestImage_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_testValue_minmax_0.png +0 -0
- psychopy/tests/data/TestProgress_testValue_minmax_1.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_center center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_center center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_top center_0.3.png +0 -0
- psychopy/tests/data/TestProgress_testValue_vertical_top center_0.6.png +0 -0
- psychopy/tests/data/TestProgress_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestProgress_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestProgress_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestProgress_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestProgress_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestProgress_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestProgress_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestProgress_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestProgress_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestProgress_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestProgress_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestProgress_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestProgress_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestProgress_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestProgress_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestProgress_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestProgress_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestProgress_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestProgress_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestProgress_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestROI_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestROI_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestROI_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestROI_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestROI_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestROI_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestROI_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestROI_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestROI_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestROI_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestROI_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestROI_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestROI_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestROI_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestROI_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestROI_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestROI_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestROI_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestROI_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestROI_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestSession_exp1.png +0 -0
- psychopy/tests/data/TestSession_exp2.png +0 -0
- psychopy/tests/data/TestShape_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestShape_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestShape_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestShape_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestShape_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestShape_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestShape_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestShape_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestShape_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestShape_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestShape_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestShape_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestShape_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestShape_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestShape_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestShape_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestShape_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestShape_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestShape_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestShape_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestTarget_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/TestTarget_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/TestTarget_w128h128_center_center.png +0 -0
- psychopy/tests/data/TestTarget_w128h128_top_left.png +0 -0
- psychopy/tests/data/TestTarget_w128h128_top_right.png +0 -0
- psychopy/tests/data/TestTarget_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/TestTarget_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/TestTarget_w128h64_center_center.png +0 -0
- psychopy/tests/data/TestTarget_w128h64_top_left.png +0 -0
- psychopy/tests/data/TestTarget_w128h64_top_right.png +0 -0
- psychopy/tests/data/TestTarget_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/TestTarget_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/TestTarget_w64h128_center_center.png +0 -0
- psychopy/tests/data/TestTarget_w64h128_top_left.png +0 -0
- psychopy/tests/data/TestTarget_w64h128_top_right.png +0 -0
- psychopy/tests/data/TestTarget_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/TestTarget_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/TestTarget_w64h64_center_center.png +0 -0
- psychopy/tests/data/TestTarget_w64h64_top_left.png +0 -0
- psychopy/tests/data/TestTarget_w64h64_top_right.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_0p6.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_0p8.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_1.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_1p2.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_1p4.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_1p6.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_1p8.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_2p0.png +0 -0
- psychopy/tests/data/TestTextbox_testLetterSpacing_None.png +0 -0
- psychopy/tests/data/TestUnknownPluginComponent_load_resave.psyexp +135 -0
- psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_0_center.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_0_top left.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_120_center.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_120_top left.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_180_center.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_180_top left.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_240_center.png +0 -0
- psychopy/tests/data/Test_textbox/test_ori_240_top left.png +0 -0
- psychopy/tests/data/Test_textbox_testSpeechpoint_-3ovr8_0ovr8.png +0 -0
- psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_-3ovr8.png +0 -0
- psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_3ovr8.png +0 -0
- psychopy/tests/data/Test_textbox_testSpeechpoint_3ovr8_0ovr8.png +0 -0
- psychopy/tests/data/Test_textbox_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/Test_textbox_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/Test_textbox_w128h128_center_center.png +0 -0
- psychopy/tests/data/Test_textbox_w128h128_top_left.png +0 -0
- psychopy/tests/data/Test_textbox_w128h128_top_right.png +0 -0
- psychopy/tests/data/Test_textbox_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/Test_textbox_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/Test_textbox_w128h64_center_center.png +0 -0
- psychopy/tests/data/Test_textbox_w128h64_top_left.png +0 -0
- psychopy/tests/data/Test_textbox_w128h64_top_right.png +0 -0
- psychopy/tests/data/Test_textbox_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/Test_textbox_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/Test_textbox_w64h128_center_center.png +0 -0
- psychopy/tests/data/Test_textbox_w64h128_top_left.png +0 -0
- psychopy/tests/data/Test_textbox_w64h128_top_right.png +0 -0
- psychopy/tests/data/Test_textbox_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/Test_textbox_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/Test_textbox_w64h64_center_center.png +0 -0
- psychopy/tests/data/Test_textbox_w64h64_top_left.png +0 -0
- psychopy/tests/data/Test_textbox_w64h64_top_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h128_center_center.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h128_top_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h128_top_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h64_center_center.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h64_top_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w128h64_top_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h128_center_center.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h128_top_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h128_top_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_right.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h64_center_center.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h64_top_left.png +0 -0
- psychopy/tests/data/Test_uax14_textbox_w64h64_top_right.png +0 -0
- psychopy/tests/data/TextComponent_disabled.psyexp +63 -0
- psychopy/tests/data/TextComponent_not_disabled.psyexp +63 -0
- psychopy/tests/data/aperture1_deg.png +0 -0
- psychopy/tests/data/aperture1_degFlat.png +0 -0
- psychopy/tests/data/aperture1_degFlatPos.png +0 -0
- psychopy/tests/data/aperture1_norm.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground.png +0 -0
- psychopy/tests/data/aperture1_normNoShade.png +0 -0
- psychopy/tests/data/aperture1_pix.png +0 -0
- psychopy/tests/data/aperture1_stencil.png +0 -0
- psychopy/tests/data/aperture2_deg.png +0 -0
- psychopy/tests/data/aperture2_degFlat.png +0 -0
- psychopy/tests/data/aperture2_degFlatPos.png +0 -0
- psychopy/tests/data/aperture2_norm.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground.png +0 -0
- psychopy/tests/data/aperture2_normNoShade.png +0 -0
- psychopy/tests/data/aperture2_pix.png +0 -0
- psychopy/tests/data/aperture2_stencil.png +0 -0
- psychopy/tests/data/beatandrcos_cm.png +0 -0
- psychopy/tests/data/beatandrcos_deg.png +0 -0
- psychopy/tests/data/beatandrcos_degFlat.png +0 -0
- psychopy/tests/data/beatandrcos_degFlatPos.png +0 -0
- psychopy/tests/data/beatandrcos_height.png +0 -0
- psychopy/tests/data/beatandrcos_norm.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground.png +0 -0
- psychopy/tests/data/beatandrcos_pix.png +0 -0
- psychopy/tests/data/beatandrcos_stencil.png +0 -0
- psychopy/tests/data/blend_add_cm.png +0 -0
- psychopy/tests/data/blend_add_deg.png +0 -0
- psychopy/tests/data/blend_add_degFlat.png +0 -0
- psychopy/tests/data/blend_add_degFlatPos.png +0 -0
- psychopy/tests/data/blend_add_height.png +0 -0
- psychopy/tests/data/blend_add_norm.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground.png +0 -0
- psychopy/tests/data/blend_add_normNoShade.png +0 -0
- psychopy/tests/data/blend_add_pix.png +0 -0
- psychopy/tests/data/blend_add_stencil.png +0 -0
- psychopy/tests/data/broken2020_2_5_resources/broken_resources.psyexp +84 -0
- psychopy/tests/data/broken2020_2_5_resources/psychopy72.png +0 -0
- psychopy/tests/data/bufferimg_gabor_cm.png +0 -0
- psychopy/tests/data/bufferimg_gabor_deg.png +0 -0
- psychopy/tests/data/bufferimg_gabor_degFlat.png +0 -0
- psychopy/tests/data/bufferimg_gabor_degFlatPos.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade.png +0 -0
- psychopy/tests/data/bufferimg_gabor_pix.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil.png +0 -0
- psychopy/tests/data/circleHex_cm.png +0 -0
- psychopy/tests/data/circleHex_deg.png +0 -0
- psychopy/tests/data/circleHex_degFlat.png +0 -0
- psychopy/tests/data/circleHex_degFlatPos.png +0 -0
- psychopy/tests/data/circleHex_height.png +0 -0
- psychopy/tests/data/circleHex_norm.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground.png +0 -0
- psychopy/tests/data/circleHex_normNoShade.png +0 -0
- psychopy/tests/data/circleHex_pix.png +0 -0
- psychopy/tests/data/circleHex_stencil.png +0 -0
- psychopy/tests/data/corrFullRandom.csv +16 -0
- psychopy/tests/data/corrFullRandom.tsv +6 -0
- psychopy/tests/data/corrFullRandomTH2.csv +16 -0
- psychopy/tests/data/corrMultiKeyExpWide.csv +3 -0
- psychopy/tests/data/corrMultiKeyTrials.csv +8 -0
- psychopy/tests/data/corrMultiKeyTrials.xlsx +0 -0
- psychopy/tests/data/corrRandom.csv +16 -0
- psychopy/tests/data/corrRandom.tsv +6 -0
- psychopy/tests/data/corrRandomTH2.csv +16 -0
- psychopy/tests/data/corrXlsx.xlsx +0 -0
- psychopy/tests/data/correctScript/js/correctCodeComponent.js +181 -0
- psychopy/tests/data/correctScript/js/correctImageComponent.js +204 -0
- psychopy/tests/data/correctScript/js/correctKeyboardComponent.js +225 -0
- psychopy/tests/data/correctScript/js/correctMouseComponent.js +221 -0
- psychopy/tests/data/correctScript/js/correctMovieComponent.js +210 -0
- psychopy/tests/data/correctScript/js/correctPolygonComponent.js +205 -0
- psychopy/tests/data/correctScript/js/correctSliderComponent.js +209 -0
- psychopy/tests/data/correctScript/js/correctSoundComponent.js +205 -0
- psychopy/tests/data/correctScript/js/correctTextComponent.js +207 -0
- psychopy/tests/data/correctScript/python/correctApertureComponent.py +157 -0
- psychopy/tests/data/correctScript/python/correctCodeComponent.py +135 -0
- psychopy/tests/data/correctScript/python/correctDotsComponent.py +161 -0
- psychopy/tests/data/correctScript/python/correctEnvGratingComponent.py +167 -0
- psychopy/tests/data/correctScript/python/correctFormComponent.py +150 -0
- psychopy/tests/data/correctScript/python/correctGratingComponent.py +158 -0
- psychopy/tests/data/correctScript/python/correctImageComponent.py +160 -0
- psychopy/tests/data/correctScript/python/correctJoyButtonsComponent.py +204 -0
- psychopy/tests/data/correctScript/python/correctJoystickComponent.py +214 -0
- psychopy/tests/data/correctScript/python/correctKeyboardComponent.py +169 -0
- psychopy/tests/data/correctScript/python/correctMicrophoneComponent.py +163 -0
- psychopy/tests/data/correctScript/python/correctMouseComponent.py +174 -0
- psychopy/tests/data/correctScript/python/correctMovieComponent.py +160 -0
- psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +169 -0
- psychopy/tests/data/correctScript/python/correctParallelOutComponent.py +156 -0
- psychopy/tests/data/correctScript/python/correctPatchComponent.py +159 -0
- psychopy/tests/data/correctScript/python/correctPolygonComponent.py +159 -0
- psychopy/tests/data/correctScript/python/correctQmixPumpComponent.py +174 -0
- psychopy/tests/data/correctScript/python/correctRatingScaleComponent.py +152 -0
- psychopy/tests/data/correctScript/python/correctSliderComponent.py +159 -0
- psychopy/tests/data/correctScript/python/correctSoundComponent.py +157 -0
- psychopy/tests/data/correctScript/python/correctStaticComponent.py +176 -0
- psychopy/tests/data/correctScript/python/correctTextComponent.py +159 -0
- psychopy/tests/data/correctScript/python/correctVariableComponent.py +139 -0
- psychopy/tests/data/correctScript/python/correctcedrusButtonBoxComponent.py +199 -0
- psychopy/tests/data/correctScript/python/correctioLabsButtonBoxComponent.py +187 -0
- psychopy/tests/data/dataTest.xlsx +0 -0
- psychopy/tests/data/dots_cm.png +0 -0
- psychopy/tests/data/dots_deg.png +0 -0
- psychopy/tests/data/dots_degFlat.png +0 -0
- psychopy/tests/data/dots_degFlatPos.png +0 -0
- psychopy/tests/data/dots_height.png +0 -0
- psychopy/tests/data/dots_norm.png +0 -0
- psychopy/tests/data/dots_normAddBlend.png +0 -0
- psychopy/tests/data/dots_normHexbackground.png +0 -0
- psychopy/tests/data/dots_normNoShade.png +0 -0
- psychopy/tests/data/dots_pix.png +0 -0
- psychopy/tests/data/dots_stencil.png +0 -0
- psychopy/tests/data/duplicateHeaders.csv +2 -0
- psychopy/tests/data/elarray1_cm.png +0 -0
- psychopy/tests/data/elarray1_deg.png +0 -0
- psychopy/tests/data/elarray1_degFlat.png +0 -0
- psychopy/tests/data/elarray1_degFlatPos.png +0 -0
- psychopy/tests/data/elarray1_height.png +0 -0
- psychopy/tests/data/elarray1_norm.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground.png +0 -0
- psychopy/tests/data/elarray1_pix.png +0 -0
- psychopy/tests/data/elarray1_stencil.png +0 -0
- psychopy/tests/data/envelopeandrcos_cm.png +0 -0
- psychopy/tests/data/envelopeandrcos_deg.png +0 -0
- psychopy/tests/data/envelopeandrcos_degFlat.png +0 -0
- psychopy/tests/data/envelopeandrcos_degFlatPos.png +0 -0
- psychopy/tests/data/envelopeandrcos_height.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground.png +0 -0
- psychopy/tests/data/envelopeandrcos_pix.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_cm.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_deg.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_degFlat.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_degFlatPos.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_pix.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil.png +0 -0
- psychopy/tests/data/filltext.png +0 -0
- psychopy/tests/data/form_font_demographics.png +0 -0
- psychopy/tests/data/form_font_demographics.xlsx +0 -0
- psychopy/tests/data/form_font_languages.png +0 -0
- psychopy/tests/data/form_font_languages.xlsx +0 -0
- psychopy/tests/data/form_font_nonstandard.png +0 -0
- psychopy/tests/data/futureParams.psyexp +150 -0
- psychopy/tests/data/gabor1_cm.png +0 -0
- psychopy/tests/data/gabor1_deg.png +0 -0
- psychopy/tests/data/gabor1_degFlat.png +0 -0
- psychopy/tests/data/gabor1_degFlatPos.png +0 -0
- psychopy/tests/data/gabor1_height.png +0 -0
- psychopy/tests/data/gabor1_norm.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground.png +0 -0
- psychopy/tests/data/gabor1_normNoShade.png +0 -0
- psychopy/tests/data/gabor1_pix.png +0 -0
- psychopy/tests/data/gabor1_stencil.png +0 -0
- psychopy/tests/data/gabor2_cm.png +0 -0
- psychopy/tests/data/gabor2_deg.png +0 -0
- psychopy/tests/data/gabor2_degFlat.png +0 -0
- psychopy/tests/data/gabor2_degFlatPos.png +0 -0
- psychopy/tests/data/gabor2_height.png +0 -0
- psychopy/tests/data/gabor2_norm.png +0 -0
- psychopy/tests/data/gabor2_normAddBlend.png +0 -0
- psychopy/tests/data/gabor2_normHexbackground.png +0 -0
- psychopy/tests/data/gabor2_normNoShade.png +0 -0
- psychopy/tests/data/gabor2_pix.png +0 -0
- psychopy/tests/data/gabor2_stencil.png +0 -0
- psychopy/tests/data/ghost_stroop.psyexp +131 -0
- psychopy/tests/data/ghost_trialTypes.xlsx +0 -0
- psychopy/tests/data/green_48000.flac.dist +0 -0
- psychopy/tests/data/greyscale.jpg +0 -0
- psychopy/tests/data/greyscale2.png +0 -0
- psychopy/tests/data/greyscale2_cm.png +0 -0
- psychopy/tests/data/greyscale2_deg.png +0 -0
- psychopy/tests/data/greyscale2_degFlat.png +0 -0
- psychopy/tests/data/greyscale2_degFlatPos.png +0 -0
- psychopy/tests/data/greyscale2_height.png +0 -0
- psychopy/tests/data/greyscale2_norm.png +0 -0
- psychopy/tests/data/greyscale2_normAddBlend.png +0 -0
- psychopy/tests/data/greyscale2_normHexbackground.png +0 -0
- psychopy/tests/data/greyscale2_normNoShade.png +0 -0
- psychopy/tests/data/greyscale2_pix.png +0 -0
- psychopy/tests/data/greyscale2_stencil.png +0 -0
- psychopy/tests/data/greyscaleLowContr_cm.png +0 -0
- psychopy/tests/data/greyscaleLowContr_deg.png +0 -0
- psychopy/tests/data/greyscaleLowContr_degFlat.png +0 -0
- psychopy/tests/data/greyscaleLowContr_degFlatPos.png +0 -0
- psychopy/tests/data/greyscaleLowContr_height.png +0 -0
- psychopy/tests/data/greyscaleLowContr_norm.png +0 -0
- psychopy/tests/data/greyscaleLowContr_normAddBlend.png +0 -0
- psychopy/tests/data/greyscaleLowContr_normHexbackground.png +0 -0
- psychopy/tests/data/greyscaleLowContr_normNoShade.png +0 -0
- psychopy/tests/data/greyscaleLowContr_pix.png +0 -0
- psychopy/tests/data/greyscaleLowContr_stencil.png +0 -0
- psychopy/tests/data/greyscale_cm.png +0 -0
- psychopy/tests/data/greyscale_deg.png +0 -0
- psychopy/tests/data/greyscale_degFlat.png +0 -0
- psychopy/tests/data/greyscale_degFlatPos.png +0 -0
- psychopy/tests/data/greyscale_height.png +0 -0
- psychopy/tests/data/greyscale_norm.png +0 -0
- psychopy/tests/data/greyscale_normAddBlend.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground.png +0 -0
- psychopy/tests/data/greyscale_normNoShade.png +0 -0
- psychopy/tests/data/greyscale_pix.png +0 -0
- psychopy/tests/data/greyscale_stencil.png +0 -0
- psychopy/tests/data/imageAndGauss_cm.png +0 -0
- psychopy/tests/data/imageAndGauss_deg.png +0 -0
- psychopy/tests/data/imageAndGauss_degFlat.png +0 -0
- psychopy/tests/data/imageAndGauss_degFlatPos.png +0 -0
- psychopy/tests/data/imageAndGauss_height.png +0 -0
- psychopy/tests/data/imageAndGauss_norm.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade.png +0 -0
- psychopy/tests/data/imageAndGauss_pix.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil.png +0 -0
- psychopy/tests/data/movFrame1_cm.png +0 -0
- psychopy/tests/data/movFrame1_deg.png +0 -0
- psychopy/tests/data/movFrame1_degFlat.png +0 -0
- psychopy/tests/data/movFrame1_degFlatPos.png +0 -0
- psychopy/tests/data/movFrame1_height.png +0 -0
- psychopy/tests/data/movFrame1_norm.png +0 -0
- psychopy/tests/data/movFrame1_normAddBlend.png +0 -0
- psychopy/tests/data/movFrame1_normHexbackground.png +0 -0
- psychopy/tests/data/movFrame1_normNoShade.png +0 -0
- psychopy/tests/data/movFrame1_pix.png +0 -0
- psychopy/tests/data/movFrame1_stencil.png +0 -0
- psychopy/tests/data/multiKeypressExperiment.psydat +357 -0
- psychopy/tests/data/multiKeypressTrialhandler.psydat +252 -0
- psychopy/tests/data/multiStairConds.xlsx +0 -0
- psychopy/tests/data/multiStairQuestPlus.xlsx +0 -0
- psychopy/tests/data/newstyle.psydat +6155 -0
- psychopy/tests/data/noiseAndRcos_cm.png +0 -0
- psychopy/tests/data/noiseAndRcos_deg.png +0 -0
- psychopy/tests/data/noiseAndRcos_degFlat.png +0 -0
- psychopy/tests/data/noiseAndRcos_degFlatPos.png +0 -0
- psychopy/tests/data/noiseAndRcos_height.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade.png +0 -0
- psychopy/tests/data/noiseAndRcos_pix.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_cm.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_deg.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_degFlat.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_degFlatPos.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_pix.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil.png +0 -0
- psychopy/tests/data/numpyImage_cm.png +0 -0
- psychopy/tests/data/numpyImage_deg.png +0 -0
- psychopy/tests/data/numpyImage_degFlat.png +0 -0
- psychopy/tests/data/numpyImage_degFlatPos.png +0 -0
- psychopy/tests/data/numpyImage_height.png +0 -0
- psychopy/tests/data/numpyImage_norm.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade.png +0 -0
- psychopy/tests/data/numpyImage_pix.png +0 -0
- psychopy/tests/data/numpyImage_stencil.png +0 -0
- psychopy/tests/data/numpyLowContr_cm.png +0 -0
- psychopy/tests/data/numpyLowContr_deg.png +0 -0
- psychopy/tests/data/numpyLowContr_degFlat.png +0 -0
- psychopy/tests/data/numpyLowContr_degFlatPos.png +0 -0
- psychopy/tests/data/numpyLowContr_height.png +0 -0
- psychopy/tests/data/numpyLowContr_norm.png +0 -0
- psychopy/tests/data/numpyLowContr_normAddBlend.png +0 -0
- psychopy/tests/data/numpyLowContr_normHexbackground.png +0 -0
- psychopy/tests/data/numpyLowContr_normNoShade.png +0 -0
- psychopy/tests/data/numpyLowContr_pix.png +0 -0
- psychopy/tests/data/numpyLowContr_stencil.png +0 -0
- psychopy/tests/data/oldstyle.psydat +1534 -0
- psychopy/tests/data/oldstyle_stair.psydat +263 -0
- psychopy/tests/data/ratingscale1_cm.png +0 -0
- psychopy/tests/data/ratingscale1_deg.png +0 -0
- psychopy/tests/data/ratingscale1_degFlat.png +0 -0
- psychopy/tests/data/ratingscale1_degFlatPos.png +0 -0
- psychopy/tests/data/ratingscale1_height.png +0 -0
- psychopy/tests/data/ratingscale1_norm.png +0 -0
- psychopy/tests/data/ratingscale1_normAddBlend.png +0 -0
- psychopy/tests/data/ratingscale1_normHexbackground.png +0 -0
- psychopy/tests/data/ratingscale1_normNoShade.png +0 -0
- psychopy/tests/data/ratingscale1_pix.png +0 -0
- psychopy/tests/data/ratingscale1_stencil.png +0 -0
- psychopy/tests/data/red_16000.flac.dist +0 -0
- psychopy/tests/data/retroListParam.psyexp +82 -0
- psychopy/tests/data/right_to_left_unidcode.xlsx +0 -0
- psychopy/tests/data/sample.meshwarp.data +11522 -0
- psychopy/tests/data/shape2_1_cm.png +0 -0
- psychopy/tests/data/shape2_1_deg.png +0 -0
- psychopy/tests/data/shape2_1_degFlat.png +0 -0
- psychopy/tests/data/shape2_1_degFlatPos.png +0 -0
- psychopy/tests/data/shape2_1_height.png +0 -0
- psychopy/tests/data/shape2_1_norm.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade.png +0 -0
- psychopy/tests/data/shape2_1_pix.png +0 -0
- psychopy/tests/data/shape2_1_stencil.png +0 -0
- psychopy/tests/data/shape2_2_cm.png +0 -0
- psychopy/tests/data/shape2_2_deg.png +0 -0
- psychopy/tests/data/shape2_2_degFlat.png +0 -0
- psychopy/tests/data/shape2_2_degFlatPos.png +0 -0
- psychopy/tests/data/shape2_2_height.png +0 -0
- psychopy/tests/data/shape2_2_norm.png +0 -0
- psychopy/tests/data/shape2_2_normAddBlend.png +0 -0
- psychopy/tests/data/shape2_2_normHexbackground.png +0 -0
- psychopy/tests/data/shape2_2_normNoShade.png +0 -0
- psychopy/tests/data/shape2_2_pix.png +0 -0
- psychopy/tests/data/shape2_2_stencil.png +0 -0
- psychopy/tests/data/simpleimage1_cm.png +0 -0
- psychopy/tests/data/simpleimage1_deg.png +0 -0
- psychopy/tests/data/simpleimage1_degFlat.png +0 -0
- psychopy/tests/data/simpleimage1_degFlatPos.png +0 -0
- psychopy/tests/data/simpleimage1_height.png +0 -0
- psychopy/tests/data/simpleimage1_norm.png +0 -0
- psychopy/tests/data/simpleimage1_normAddBlend.png +0 -0
- psychopy/tests/data/simpleimage1_normHexbackground.png +0 -0
- psychopy/tests/data/simpleimage1_normNoShade.png +0 -0
- psychopy/tests/data/simpleimage1_pix.png +0 -0
- psychopy/tests/data/simpleimage1_stencil.png +0 -0
- psychopy/tests/data/test001EntryImporting.psyexp +66 -0
- psychopy/tests/data/testMovie.mp4 +0 -0
- psychopy/tests/data/test_basic_run.py +1 -0
- psychopy/tests/data/test_circle_radius_.1height.png +0 -0
- psychopy/tests/data/test_circle_radius_.2height.png +0 -0
- psychopy/tests/data/test_circle_radius_10pix.png +0 -0
- psychopy/tests/data/test_circle_radius_20pix.png +0 -0
- psychopy/tests/data/test_components/testClearKeyboard/testClearKeyboard.psyexp +200 -0
- psychopy/tests/data/test_form_combinations_choice_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_choice_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_choice_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_choice_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_description_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_description_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_description_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_description_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_free text_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_free text_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_free text_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_free text_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_heading_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_heading_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_heading_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_heading_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_radio_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_radio_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_radio_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_radio_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_rating_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_rating_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_rating_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_rating_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_slider_bigItem.png +0 -0
- psychopy/tests/data/test_form_combinations_slider_bigItemOverflow.png +0 -0
- psychopy/tests/data/test_form_combinations_slider_bigResp.png +0 -0
- psychopy/tests/data/test_form_combinations_slider_bigRespOverflow.png +0 -0
- psychopy/tests/data/test_get_resources/blue.png +0 -0
- psychopy/tests/data/test_get_resources/groupA.csv +3 -0
- psychopy/tests/data/test_get_resources/groupB.csv +3 -0
- psychopy/tests/data/test_get_resources/groups.csv +3 -0
- psychopy/tests/data/test_get_resources/handledbyrm_constrloop.psyexp +143 -0
- psychopy/tests/data/test_get_resources/handledbyrm_noloop.psyexp +114 -0
- psychopy/tests/data/test_get_resources/handledbyrm_recurloop.psyexp +138 -0
- psychopy/tests/data/test_get_resources/handledbyrm_strloop.psyexp +126 -0
- psychopy/tests/data/test_get_resources/handledbystatic_constrloop.psyexp +141 -0
- psychopy/tests/data/test_get_resources/handledbystatic_noloop.psyexp +112 -0
- psychopy/tests/data/test_get_resources/handledbystatic_recurloop.psyexp +136 -0
- psychopy/tests/data/test_get_resources/handledbystatic_strloop.psyexp +124 -0
- psychopy/tests/data/test_get_resources/unhandled_constrloop.psyexp +128 -0
- psychopy/tests/data/test_get_resources/unhandled_noloop.psyexp +99 -0
- psychopy/tests/data/test_get_resources/unhandled_recurloop.psyexp +123 -0
- psychopy/tests/data/test_get_resources/unhandled_strloop.psyexp +111 -0
- psychopy/tests/data/test_get_resources/white.png +0 -0
- psychopy/tests/data/test_get_resources/yellow.png +0 -0
- psychopy/tests/data/test_image_aspect_default_None.png +0 -0
- psychopy/tests/data/test_image_aspect_default_xFull_yNone.png +0 -0
- psychopy/tests/data/test_image_aspect_default_xNone_yFull.png +0 -0
- psychopy/tests/data/test_image_aspect_default_xNone_yNone.png +0 -0
- psychopy/tests/data/test_image_flip_anchor_horiz.png +0 -0
- psychopy/tests/data/test_image_flip_anchor_vert.png +0 -0
- psychopy/tests/data/test_loaded_namespace/test_counterbalance.psyexp +142 -0
- psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
- psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -0
- psychopy/tests/data/test_loops/testLoopsBlocks.psyexp +161 -0
- psychopy/tests/data/test_loops/testStaircase.psyexp +105 -0
- psychopy/tests/data/test_loops/test_current_loop_attr.psyexp +185 -0
- psychopy/tests/data/test_panorama/panoramaTestImage.png +0 -0
- psychopy/tests/data/test_panorama/panoramaTestImage.svg +1 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_-0.3.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_0.3.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_-0.3.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_0.3.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_-1.0.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_1.0.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_-0.3.png +0 -0
- psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_0.3.png +0 -0
- psychopy/tests/data/test_resources.psyexp +491 -0
- psychopy/tests/data/test_session/outside_root/externalExp.psyexp +116 -0
- psychopy/tests/data/test_session/root/annotation/annotation.psyexp +161 -0
- psychopy/tests/data/test_session/root/error/error.psyexp +93 -0
- psychopy/tests/data/test_session/root/exp1/exp1.psyexp +133 -0
- psychopy/tests/data/test_session/root/exp2/exp2.psyexp +133 -0
- psychopy/tests/data/test_session/root/frameRate/frameRate.psyexp +114 -0
- psychopy/tests/data/test_session/root/invUseVersion/invUseVersion.psyexp +133 -0
- psychopy/tests/data/test_session/root/testClockFormat/testClockFormat.psyexp +122 -0
- psychopy/tests/data/test_session/root/testCtrls/testCtrls.psyexp +115 -0
- psychopy/tests/data/test_session/root/testEditExpInfo/testEditExpInfo.psyexp +135 -0
- psychopy/tests/data/test_session/root/testFutureTrials/testFutureTrials.psyexp +155 -0
- psychopy/tests/data/test_session/root/testNamedButtonBox/testNamedButtonBox.psyexp +145 -0
- psychopy/tests/data/test_session/root/testTrialNav/trialNav.psyexp +158 -0
- psychopy/tests/data/test_slider_horiz_accute_horiz.png +0 -0
- psychopy/tests/data/test_slider_horiz_accute_vert.png +0 -0
- psychopy/tests/data/test_slider_horiz_horiz.png +0 -0
- psychopy/tests/data/test_slider_horiz_obtuse_horiz.png +0 -0
- psychopy/tests/data/test_slider_horiz_obtuse_vert.png +0 -0
- psychopy/tests/data/test_slider_horiz_vert.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_blanks.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_clustered.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_morelabels.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_morelabelsclustered.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_moreticks.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_moreticksclustered.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_nolabels.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_noticks.png +0 -0
- psychopy/tests/data/test_slider_ticklabelloc_simple.png +0 -0
- psychopy/tests/data/test_slider_triangle_horiz_False_flip_False.png +0 -0
- psychopy/tests/data/test_slider_triangle_horiz_False_flip_True.png +0 -0
- psychopy/tests/data/test_slider_triangle_horiz_True_flip_False.png +0 -0
- psychopy/tests/data/test_slider_triangle_horiz_True_flip_True.png +0 -0
- psychopy/tests/data/test_sounds/default_16000.wav +0 -0
- psychopy/tests/data/test_sounds/default_192000.wav +0 -0
- psychopy/tests/data/test_sounds/default_22050.wav +0 -0
- psychopy/tests/data/test_sounds/default_32000.wav +0 -0
- psychopy/tests/data/test_sounds/default_44100.wav +0 -0
- psychopy/tests/data/test_sounds/default_48000.wav +0 -0
- psychopy/tests/data/test_sounds/default_8000.wav +0 -0
- psychopy/tests/data/test_sounds/default_96000.wav +0 -0
- psychopy/tests/data/test_static_component_script.psyexp +76 -0
- psychopy/tests/data/test_win_bg_large_256_default.png +0 -0
- psychopy/tests/data/test_win_bg_large_500_default.png +0 -0
- psychopy/tests/data/test_win_bg_small_200_default.png +0 -0
- psychopy/tests/data/test_win_bg_small_256_default.png +0 -0
- psychopy/tests/data/test_win_bg_tall_200_default.png +0 -0
- psychopy/tests/data/test_win_bg_tall_256_default.png +0 -0
- psychopy/tests/data/test_win_bg_tall_500_default.png +0 -0
- psychopy/tests/data/test_win_bg_tall_fill_default.png +0 -0
- psychopy/tests/data/test_win_bg_wide_200_default.png +0 -0
- psychopy/tests/data/test_win_bg_wide_256_default.png +0 -0
- psychopy/tests/data/test_win_bg_wide_500_default.png +0 -0
- psychopy/tests/data/test_win_bg_wide_fill_default.png +0 -0
- psychopy/tests/data/test_win_bgcolor_blue.png +0 -0
- psychopy/tests/data/test_win_bgcolor_green.png +0 -0
- psychopy/tests/data/test_win_bgcolor_red.png +0 -0
- psychopy/tests/data/testimage.jpg +0 -0
- psychopy/tests/data/testimagegray.jpg +0 -0
- psychopy/tests/data/testpixels.png +0 -0
- psychopy/tests/data/testwedges.png +0 -0
- psychopy/tests/data/text1_cm.png +0 -0
- psychopy/tests/data/text1_deg.png +0 -0
- psychopy/tests/data/text1_degFlat.png +0 -0
- psychopy/tests/data/text1_degFlatPos.png +0 -0
- psychopy/tests/data/text1_height.png +0 -0
- psychopy/tests/data/text1_norm.png +0 -0
- psychopy/tests/data/text1_normAddBlend.png +0 -0
- psychopy/tests/data/text1_normHexbackground.png +0 -0
- psychopy/tests/data/text1_normNoShade.png +0 -0
- psychopy/tests/data/text1_pix.png +0 -0
- psychopy/tests/data/text1_stencil.png +0 -0
- psychopy/tests/data/text2_cm.png +0 -0
- psychopy/tests/data/text2_deg.png +0 -0
- psychopy/tests/data/text2_degFlat.png +0 -0
- psychopy/tests/data/text2_degFlatPos.png +0 -0
- psychopy/tests/data/text2_norm.png +0 -0
- psychopy/tests/data/text2_normNoShade.png +0 -0
- psychopy/tests/data/text2_pix.png +0 -0
- psychopy/tests/data/textbox_charcolors_default_roygbiv.png +0 -0
- psychopy/tests/data/textbox_charcolors_default_white_hello_black_there.png +0 -0
- psychopy/tests/data/textbox_default_align_bottom_center.png +0 -0
- psychopy/tests/data/textbox_default_align_bottom_left.png +0 -0
- psychopy/tests/data/textbox_default_align_bottom_right.png +0 -0
- psychopy/tests/data/textbox_default_align_center.png +0 -0
- psychopy/tests/data/textbox_default_align_center_center.png +0 -0
- psychopy/tests/data/textbox_default_align_center_left.png +0 -0
- psychopy/tests/data/textbox_default_align_center_right.png +0 -0
- psychopy/tests/data/textbox_default_align_centre.png +0 -0
- psychopy/tests/data/textbox_default_align_centre_centre.png +0 -0
- psychopy/tests/data/textbox_default_align_more_than_two_words.png +0 -0
- psychopy/tests/data/textbox_default_align_someword.png +0 -0
- psychopy/tests/data/textbox_default_align_top_center.png +0 -0
- psychopy/tests/data/textbox_default_align_top_left.png +0 -0
- psychopy/tests/data/textbox_default_align_top_right.png +0 -0
- psychopy/tests/data/textbox_default_colors_WOB.png +0 -0
- psychopy/tests/data/textbox_default_colors_exemplar1.png +0 -0
- psychopy/tests/data/textbox_default_colors_exemplar2.png +0 -0
- psychopy/tests/data/textbox_default_colors_exemplar3.png +0 -0
- psychopy/tests/data/textbox_default_colors_tyke1.png +0 -0
- psychopy/tests/data/textbox_default_colors_tyke2.png +0 -0
- psychopy/tests/data/textbox_default_colors_tyke3.png +0 -0
- psychopy/tests/data/textbox_default_cutoff_top.png +0 -0
- psychopy/tests/data/textbox_default_exemplar_1.png +0 -0
- psychopy/tests/data/textbox_default_exemplar_2.png +0 -0
- psychopy/tests/data/textbox_default_exemplar_3.png +0 -0
- psychopy/tests/data/textbox_default_exemplar_4.png +0 -0
- psychopy/tests/data/textbox_default_tyke_1.png +0 -0
- psychopy/tests/data/textbox_default_tyke_2.png +0 -0
- psychopy/tests/data/textbox_typing_blank.png +0 -0
- psychopy/tests/data/textbox_typing_longKoeran.png +0 -0
- psychopy/tests/data/textbox_typing_longWord.png +0 -0
- psychopy/tests/data/textbox_typing_navDel.png +0 -0
- psychopy/tests/data/textbox_typing_navLR.png +0 -0
- psychopy/tests/data/textbox_typing_newline.png +0 -0
- psychopy/tests/data/textbox_typing_pangram.png +0 -0
- psychopy/tests/data/textbox_uax14_align_bottom_center.png +0 -0
- psychopy/tests/data/textbox_uax14_align_bottom_left.png +0 -0
- psychopy/tests/data/textbox_uax14_align_bottom_right.png +0 -0
- psychopy/tests/data/textbox_uax14_align_center.png +0 -0
- psychopy/tests/data/textbox_uax14_align_center_center.png +0 -0
- psychopy/tests/data/textbox_uax14_align_center_left.png +0 -0
- psychopy/tests/data/textbox_uax14_align_center_right.png +0 -0
- psychopy/tests/data/textbox_uax14_align_centre.png +0 -0
- psychopy/tests/data/textbox_uax14_align_centre_centre.png +0 -0
- psychopy/tests/data/textbox_uax14_align_more_than_two_words.png +0 -0
- psychopy/tests/data/textbox_uax14_align_someword.png +0 -0
- psychopy/tests/data/textbox_uax14_align_top_center.png +0 -0
- psychopy/tests/data/textbox_uax14_align_top_left.png +0 -0
- psychopy/tests/data/textbox_uax14_align_top_right.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_WOB.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_exemplar1.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_exemplar2.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_exemplar3.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_tyke1.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_tyke2.png +0 -0
- psychopy/tests/data/textbox_uax14_colors_tyke3.png +0 -0
- psychopy/tests/data/textbox_uax14_cutoff_top.png +0 -0
- psychopy/tests/data/textbox_uax14_exemplar_1.png +0 -0
- psychopy/tests/data/textbox_uax14_exemplar_2.png +0 -0
- psychopy/tests/data/textbox_uax14_exemplar_3.png +0 -0
- psychopy/tests/data/textbox_uax14_exemplar_4.png +0 -0
- psychopy/tests/data/textbox_uax14_tyke_1.png +0 -0
- psychopy/tests/data/textbox_uax14_tyke_2.png +0 -0
- psychopy/tests/data/trialTypes.csv +1 -0
- psychopy/tests/data/trialTypes.docx +0 -0
- psychopy/tests/data/trialTypes.pkl +0 -0
- psychopy/tests/data/trialTypes.tsv +7 -0
- psychopy/tests/data/trialTypes.xls +0 -0
- psychopy/tests/data/trialTypes.xlsx +0 -0
- psychopy/tests/data/trialTypes_eu.csv +7 -0
- psychopy/tests/data/trialsBlankCols.xlsx +0 -0
- psychopy/tests/data/wedge1_cm.png +0 -0
- psychopy/tests/data/wedge1_deg.png +0 -0
- psychopy/tests/data/wedge1_degFlat.png +0 -0
- psychopy/tests/data/wedge1_degFlatPos.png +0 -0
- psychopy/tests/data/wedge1_height.png +0 -0
- psychopy/tests/data/wedge1_norm.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground.png +0 -0
- psychopy/tests/data/wedge1_normNoShade.png +0 -0
- psychopy/tests/data/wedge1_pix.png +0 -0
- psychopy/tests/data/wedge1_stencil.png +0 -0
- psychopy/tests/data/wedge2_cm.png +0 -0
- psychopy/tests/data/wedge2_deg.png +0 -0
- psychopy/tests/data/wedge2_degFlat.png +0 -0
- psychopy/tests/data/wedge2_degFlatPos.png +0 -0
- psychopy/tests/data/wedge2_height.png +0 -0
- psychopy/tests/data/wedge2_norm.png +0 -0
- psychopy/tests/data/wedge2_normAddBlend.png +0 -0
- psychopy/tests/data/wedge2_normHexbackground.png +0 -0
- psychopy/tests/data/wedge2_normNoShade.png +0 -0
- psychopy/tests/data/wedge2_pix.png +0 -0
- psychopy/tests/data/wedge2_stencil.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-1_1_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-1_1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-2_2_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale-2_2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale1_-1_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale1_-1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale1_1_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale1_1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale2_-2_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale2_-2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale2_2_pos-0.4_0.png +0 -0
- psychopy/tests/data/winScalePos_ori0_scale2_2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale-1_-1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale-1_1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale-2_-2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale-2_2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale1_-1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale1_1_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale2_-2_pos0_0.png +0 -0
- psychopy/tests/data/winScalePos_ori45_scale2_2_pos0_0.png +0 -0
- psychopy/tests/doc/run_btn.png +0 -0
- psychopy/tests/doc/test-suite-bugs.jpg +0 -0
- psychopy/tests/doc/user-bugs.jpg +0 -0
- psychopy/tests/dummy_xorg.conf +21 -0
- psychopy/tests/run.py +50 -0
- psychopy/tests/test_Installation.py +38 -0
- psychopy/tests/test_alerts/test_alerts.py +37 -0
- psychopy/tests/test_alerts/test_alerttools.py +132 -0
- psychopy/tests/test_app/__init__.py +0 -0
- psychopy/tests/test_app/conftest.py +40 -0
- psychopy/tests/test_app/test_builder/__init__.py +0 -0
- psychopy/tests/test_app/test_builder/test_BuilderFrame.py +166 -0
- psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +133 -0
- psychopy/tests/test_app/test_builder/test_ComponentDialogs.py +98 -0
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_app/test_runner/__init__.py +0 -0
- psychopy/tests/test_app/test_runner/test_RunnerFrame.py +166 -0
- psychopy/tests/test_app/test_speed.py +147 -0
- psychopy/tests/test_app/test_themes/test_icons.py +79 -0
- psychopy/tests/test_codecov.py +29 -0
- psychopy/tests/test_colors/test_Color.py +41 -0
- psychopy/tests/test_data/dataPrev.xlsx +0 -0
- psychopy/tests/test_data/test_ExperimentHandler.py +171 -0
- psychopy/tests/test_data/test_MultiStairHandler.py +174 -0
- psychopy/tests/test_data/test_StairHandlers.py +1241 -0
- psychopy/tests/test_data/test_TrialHandler.py +335 -0
- psychopy/tests/test_data/test_TrialHandler2.py +584 -0
- psychopy/tests/test_data/test_TrialHandlerExt.py +359 -0
- psychopy/tests/test_data/test_fitFunctions.py +101 -0
- psychopy/tests/test_data/test_utils.py +173 -0
- psychopy/tests/test_data/test_xlsx.py +92 -0
- psychopy/tests/test_demos/test_builder_demos.py +52 -0
- psychopy/tests/test_experiment/__init__.py +0 -0
- psychopy/tests/test_experiment/known_py_diffs.txt +47 -0
- psychopy/tests/test_experiment/needs_wx/__init__.py +0 -0
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +14780 -0
- psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +130 -0
- psychopy/tests/test_experiment/needs_wx/test_Experiment.py +406 -0
- psychopy/tests/test_experiment/needs_wx/test_components.py +170 -0
- psychopy/tests/test_experiment/test_component_compile_js.py +59 -0
- psychopy/tests/test_experiment/test_component_compile_python.py +165 -0
- psychopy/tests/test_experiment/test_components/__init__.py +1 -0
- psychopy/tests/test_experiment/test_components/test_ButtonBoxComponent.py +218 -0
- psychopy/tests/test_experiment/test_components/test_CodeComponent.py +70 -0
- psychopy/tests/test_experiment/test_components/test_GratingComponent.py +7 -0
- psychopy/tests/test_experiment/test_components/test_ImageComponent.py +8 -0
- psychopy/tests/test_experiment/test_components/test_KeyboardComponent.py +28 -0
- psychopy/tests/test_experiment/test_components/test_MouseComponent.py +136 -0
- psychopy/tests/test_experiment/test_components/test_PolygonComponent.py +65 -0
- psychopy/tests/test_experiment/test_components/test_ResourceManagerComponent.py +50 -0
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_SettingsComponent.py +80 -0
- psychopy/tests/test_experiment/test_components/test_StaticComponent.py +51 -0
- psychopy/tests/test_experiment/test_components/test_UnknownPluginComponent.py +27 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +104 -0
- psychopy/tests/test_experiment/test_components/test_base_components.py +477 -0
- psychopy/tests/test_experiment/test_experiment.py +199 -0
- psychopy/tests/test_experiment/test_loops.py +103 -0
- psychopy/tests/test_experiment/test_params.py +363 -0
- psychopy/tests/test_experiment/test_py2js.py +230 -0
- psychopy/tests/test_experiment/test_routines/__init__.py +1 -0
- psychopy/tests/test_experiment/test_routines/test_EyetrackerCalibrationRoutine.py +9 -0
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +9 -0
- psychopy/tests/test_experiment/test_routines/test_all_routines.py +23 -0
- psychopy/tests/test_experiment/test_routines/test_base_routine.py +154 -0
- psychopy/tests/test_experiment/test_routines/test_standalone_routines.py +36 -0
- psychopy/tests/test_gui/test_DlgFromDictQt.py +82 -0
- psychopy/tests/test_gui/test_DlgFromDictWx.py +82 -0
- psychopy/tests/test_hardware/__init__.py +0 -0
- psychopy/tests/test_hardware/test_device_manager.py +36 -0
- psychopy/tests/test_hardware/test_emulator.py +106 -0
- psychopy/tests/test_hardware/test_gammasci.py +35 -0
- psychopy/tests/test_hardware/test_keyboard.py +241 -0
- psychopy/tests/test_hardware/test_keyboard_events.py +362 -0
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_hardware/test_ports.py +129 -0
- psychopy/tests/test_iohub/__init__.py +1 -0
- psychopy/tests/test_iohub/test_computer.py +124 -0
- psychopy/tests/test_iohub/test_event_get_and_clear.py +94 -0
- psychopy/tests/test_iohub/test_keyboard.py +91 -0
- psychopy/tests/test_iohub/test_launch.py +19 -0
- psychopy/tests/test_iohub/testutil.py +54 -0
- psychopy/tests/test_liaison/test_Liaison.py +275 -0
- psychopy/tests/test_misc/__init__.py +0 -0
- psychopy/tests/test_misc/memory_usage.py +164 -0
- psychopy/tests/test_misc/test_GammaFun.py +15 -0
- psychopy/tests/test_misc/test_clock.py +63 -0
- psychopy/tests/test_misc/test_color.py +205 -0
- psychopy/tests/test_misc/test_core.py +451 -0
- psychopy/tests/test_misc/test_event.py +308 -0
- psychopy/tests/test_misc/test_info.py +18 -0
- psychopy/tests/test_misc/test_layout.py +49 -0
- psychopy/tests/test_misc/test_locale.py +38 -0
- psychopy/tests/test_misc/test_web.py +22 -0
- psychopy/tests/test_monitors/test_monitors.py +91 -0
- psychopy/tests/test_plugins/__init__.py +0 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_preferences/__init__.py +0 -0
- psychopy/tests/test_preferences/test_prefs.py +28 -0
- psychopy/tests/test_session/test_Session.py +257 -0
- psychopy/tests/test_sound/__init__.py +0 -0
- psychopy/tests/test_sound/test_audioclip.py +331 -0
- psychopy/tests/test_sound/test_hamming.py +45 -0
- psychopy/tests/test_sound/test_sound.py +138 -0
- psychopy/tests/test_sound/test_sound_pygame.py +67 -0
- psychopy/tests/test_tools/test_animationtools.py +51 -0
- psychopy/tests/test_tools/test_arraytools.py +242 -0
- psychopy/tests/test_tools/test_attributetools.py +257 -0
- psychopy/tests/test_tools/test_colorspacetools.py +150 -0
- psychopy/tests/test_tools/test_environmenttools.py +52 -0
- psychopy/tests/test_tools/test_fileerrortools.py +97 -0
- psychopy/tests/test_tools/test_filetools.py +104 -0
- psychopy/tests/test_tools/test_imagetools.py +57 -0
- psychopy/tests/test_tools/test_mathtools.py +688 -0
- psychopy/tests/test_tools/test_stringtools.py +143 -0
- psychopy/tests/test_tools/test_versionchooser.py +209 -0
- psychopy/tests/test_tools/test_viewtools.py +168 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/__init__.py +0 -0
- psychopy/tests/test_visual/measure_parity.py +243 -0
- psychopy/tests/test_visual/test_all_stimuli.py +655 -0
- psychopy/tests/test_visual/test_basevisual.py +564 -0
- psychopy/tests/test_visual/test_brush.py +68 -0
- psychopy/tests/test_visual/test_button.py +15 -0
- psychopy/tests/test_visual/test_circle.py +74 -0
- psychopy/tests/test_visual/test_contains_overlaps.py +242 -0
- psychopy/tests/test_visual/test_custommouse.py +47 -0
- psychopy/tests/test_visual/test_dots.py +155 -0
- psychopy/tests/test_visual/test_form.py +414 -0
- psychopy/tests/test_visual/test_framepacking.py +41 -0
- psychopy/tests/test_visual/test_gamma.py +152 -0
- psychopy/tests/test_visual/test_glfw_backend.py +14 -0
- psychopy/tests/test_visual/test_image.py +219 -0
- psychopy/tests/test_visual/test_panorama.py +41 -0
- psychopy/tests/test_visual/test_progress.py +96 -0
- psychopy/tests/test_visual/test_projections.py +215 -0
- psychopy/tests/test_visual/test_projections_interactive.py +163 -0
- psychopy/tests/test_visual/test_roi.py +105 -0
- psychopy/tests/test_visual/test_shape.py +23 -0
- psychopy/tests/test_visual/test_slider.py +328 -0
- psychopy/tests/test_visual/test_target.py +35 -0
- psychopy/tests/test_visual/test_textbox.py +508 -0
- psychopy/tests/test_visual/test_winFlipTiming.py +95 -0
- psychopy/tests/test_visual/test_winScalePos.py +78 -0
- psychopy/tests/test_visual/test_window.py +124 -0
- psychopy/tests/utils.py +372 -0
- psychopy/tools/LineBreak.txt +3597 -0
- psychopy/tools/__init__.py +9 -0
- psychopy/tools/animationtools.py +49 -0
- psychopy/tools/apptools.py +32 -0
- psychopy/tools/arraytools.py +561 -0
- psychopy/tools/attributetools.py +263 -0
- psychopy/tools/audiotools.py +361 -0
- psychopy/tools/colorspacetools.py +717 -0
- psychopy/tools/coordinatetools.py +104 -0
- psychopy/tools/environmenttools.py +62 -0
- psychopy/tools/fileerrortools.py +66 -0
- psychopy/tools/filetools.py +406 -0
- psychopy/tools/fontmanager.py +1065 -0
- psychopy/tools/gltools.py +7367 -0
- psychopy/tools/imagetools.py +65 -0
- psychopy/tools/linebreak.py +322 -0
- psychopy/tools/mathtools.py +4910 -0
- psychopy/tools/monitorunittools.py +276 -0
- psychopy/tools/movietools.py +1111 -0
- psychopy/tools/pkgtools.py +654 -0
- psychopy/tools/plottools.py +25 -0
- psychopy/tools/rifttools.py +76 -0
- psychopy/tools/stereotools.py +9 -0
- psychopy/tools/stimulustools.py +198 -0
- psychopy/tools/stringtools.py +466 -0
- psychopy/tools/systemtools.py +1331 -0
- psychopy/tools/typetools.py +52 -0
- psychopy/tools/unittools.py +16 -0
- psychopy/tools/versionchooser.py +604 -0
- psychopy/tools/viewtools.py +1068 -0
- psychopy/tools/wizard.py +804 -0
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +78 -0
- psychopy/validation/visual.py +119 -0
- psychopy/visual/__init__.py +121 -0
- psychopy/visual/aperture.py +333 -0
- psychopy/visual/backends/__init__.py +77 -0
- psychopy/visual/backends/_base.py +481 -0
- psychopy/visual/backends/gamma.py +349 -0
- psychopy/visual/backends/glfwbackend.py +24 -0
- psychopy/visual/backends/pygamebackend.py +343 -0
- psychopy/visual/backends/pygletbackend.py +970 -0
- psychopy/visual/basevisual.py +2027 -0
- psychopy/visual/brush.py +204 -0
- psychopy/visual/bufferimage.py +311 -0
- psychopy/visual/button.py +194 -0
- psychopy/visual/circle.py +165 -0
- psychopy/visual/custommouse.py +263 -0
- psychopy/visual/dot.py +734 -0
- psychopy/visual/dropdown.py +165 -0
- psychopy/visual/elementarray.py +802 -0
- psychopy/visual/filters.py +419 -0
- psychopy/visual/form.py +1195 -0
- psychopy/visual/globalVars.py +24 -0
- psychopy/visual/grating.py +581 -0
- psychopy/visual/helpers.py +336 -0
- psychopy/visual/image.py +438 -0
- psychopy/visual/line.py +227 -0
- psychopy/visual/movie.py +12 -0
- psychopy/visual/movie2.py +21 -0
- psychopy/visual/movie3.py +18 -0
- psychopy/visual/movies/__init__.py +2334 -0
- psychopy/visual/movies/frame.py +258 -0
- psychopy/visual/movies/metadata.py +242 -0
- psychopy/visual/movies/players/_base.py +364 -0
- psychopy/visual/nnlvs.py +830 -0
- psychopy/visual/noise.py +32 -0
- psychopy/visual/panorama.py +313 -0
- psychopy/visual/patch.py +21 -0
- psychopy/visual/pie.py +237 -0
- psychopy/visual/polygon.py +226 -0
- psychopy/visual/progress.py +313 -0
- psychopy/visual/radial.py +29 -0
- psychopy/visual/ratingscale.py +18 -0
- psychopy/visual/rect.py +195 -0
- psychopy/visual/rift.py +2660 -0
- psychopy/visual/roi.py +141 -0
- psychopy/visual/secondorder.py +27 -0
- psychopy/visual/shaders.py +787 -0
- psychopy/visual/shape.py +897 -0
- psychopy/visual/simpleimage.py +303 -0
- psychopy/visual/slider.py +1222 -0
- psychopy/visual/stim3d.py +2109 -0
- psychopy/visual/target.py +278 -0
- psychopy/visual/text.py +769 -0
- psychopy/visual/textbox/__init__.py +1280 -0
- psychopy/visual/textbox/fontmanager.py +574 -0
- psychopy/visual/textbox/parsedtext.py +317 -0
- psychopy/visual/textbox/textgrid.py +278 -0
- psychopy/visual/textbox/textureatlas.py +248 -0
- psychopy/visual/textbox2/__init__.py +4 -0
- psychopy/visual/textbox2/textbox2.py +1970 -0
- psychopy/visual/vlcmoviestim.py +1294 -0
- psychopy/visual/window.py +3910 -0
- psychopy/visual/windowframepack.py +86 -0
- psychopy/visual/windowwarp.py +457 -0
- psychopy/voicekey/__init__.py +56 -0
- psychopy/voicekey/labjack_vks.py +9 -0
- psychopy/voicekey/parallel_vks.py +9 -0
- psychopy/voicekey/vk_tools.py +131 -0
- psychopy/web.py +289 -0
- psychopy-2025.2.4.dist-info/METADATA +160 -0
- psychopy-2025.2.4.dist-info/RECORD +3127 -0
- psychopy-2025.2.4.dist-info/WHEEL +4 -0
- psychopy-2025.2.4.dist-info/entry_points.txt +5 -0
- psychopy-2025.2.4.dist-info/licenses/LICENSE +674 -0
psychopy/visual/rift.py
ADDED
|
@@ -0,0 +1,2660 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Oculus Rift HMD support for PsychoPy.
|
|
4
|
+
|
|
5
|
+
Copyright (C) 2019 - Matthew D. Cutone, The Centre for Vision Research, Toronto,
|
|
6
|
+
Ontario, Canada
|
|
7
|
+
|
|
8
|
+
Uses PsychXR to interface with the Oculus Rift runtime (LibOVR) and SDK. See
|
|
9
|
+
http://psychxr.org for more information. The Oculus PC SDK is Copyright (c)
|
|
10
|
+
Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Part of the PsychoPy library
|
|
15
|
+
# Copyright (C) 2018 Jonathan Peirce
|
|
16
|
+
# Distributed under the terms of the GNU General Public License (GPL).
|
|
17
|
+
|
|
18
|
+
__all__ = ['Rift']
|
|
19
|
+
|
|
20
|
+
# ----------
|
|
21
|
+
# Initialize
|
|
22
|
+
# ----------
|
|
23
|
+
|
|
24
|
+
# Check if they system has PsychXR installed and is importable. If not, this
|
|
25
|
+
# module will still load, but the `Rift` class will fail to load. This allows
|
|
26
|
+
# the Rift library to be lazy-loaded on systems without PsychXR.
|
|
27
|
+
#
|
|
28
|
+
_HAS_PSYCHXR_ = True
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
import psychxr.drivers.libovr as libovr
|
|
32
|
+
except ImportError:
|
|
33
|
+
_HAS_PSYCHXR_ = False
|
|
34
|
+
|
|
35
|
+
# -------
|
|
36
|
+
# Imports
|
|
37
|
+
# -------
|
|
38
|
+
|
|
39
|
+
import warnings
|
|
40
|
+
import platform
|
|
41
|
+
import ctypes
|
|
42
|
+
import numpy as np
|
|
43
|
+
import pyglet.gl as GL
|
|
44
|
+
from psychopy.visual import window
|
|
45
|
+
from psychopy.hardware.exceptions import DeviceNotConnectedError
|
|
46
|
+
from psychopy import platform_specific, logging, core
|
|
47
|
+
from psychopy.tools.attributetools import setAttribute
|
|
48
|
+
from psychopy.localization import _translate
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
from PIL import Image
|
|
52
|
+
except ImportError:
|
|
53
|
+
import Image
|
|
54
|
+
|
|
55
|
+
reportNDroppedFrames = 5
|
|
56
|
+
|
|
57
|
+
# -------------------------------------------
|
|
58
|
+
# Look-up tables for PsychXR/LibOVR constants
|
|
59
|
+
#
|
|
60
|
+
|
|
61
|
+
if _HAS_PSYCHXR_:
|
|
62
|
+
# Controller types supported by PsychXR
|
|
63
|
+
RIFT_CONTROLLER_TYPES = {
|
|
64
|
+
'Xbox': libovr.CONTROLLER_TYPE_XBOX,
|
|
65
|
+
'Remote': libovr.CONTROLLER_TYPE_REMOTE,
|
|
66
|
+
'Touch': libovr.CONTROLLER_TYPE_TOUCH,
|
|
67
|
+
'LeftTouch': libovr.CONTROLLER_TYPE_LTOUCH,
|
|
68
|
+
'RightTouch': libovr.CONTROLLER_TYPE_RTOUCH,
|
|
69
|
+
'Object0': libovr.CONTROLLER_TYPE_OBJECT0,
|
|
70
|
+
'Object1': libovr.CONTROLLER_TYPE_OBJECT1,
|
|
71
|
+
'Object2': libovr.CONTROLLER_TYPE_OBJECT2,
|
|
72
|
+
'Object3': libovr.CONTROLLER_TYPE_OBJECT3,
|
|
73
|
+
libovr.CONTROLLER_TYPE_XBOX: 'Xbox',
|
|
74
|
+
libovr.CONTROLLER_TYPE_REMOTE: 'Remote',
|
|
75
|
+
libovr.CONTROLLER_TYPE_TOUCH: 'Touch',
|
|
76
|
+
libovr.CONTROLLER_TYPE_LTOUCH: 'LeftTouch',
|
|
77
|
+
libovr.CONTROLLER_TYPE_RTOUCH: 'RightTouch',
|
|
78
|
+
libovr.CONTROLLER_TYPE_OBJECT0: 'Object0',
|
|
79
|
+
libovr.CONTROLLER_TYPE_OBJECT1: 'Object1',
|
|
80
|
+
libovr.CONTROLLER_TYPE_OBJECT2: 'Object2',
|
|
81
|
+
libovr.CONTROLLER_TYPE_OBJECT3: 'Object3'
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Button types supported by PsychXR
|
|
85
|
+
RIFT_BUTTON_TYPES = {
|
|
86
|
+
"A": libovr.BUTTON_A,
|
|
87
|
+
"B": libovr.BUTTON_B,
|
|
88
|
+
"RThumb": libovr.BUTTON_RTHUMB,
|
|
89
|
+
"RShoulder": libovr.BUTTON_RSHOULDER,
|
|
90
|
+
"X": libovr.BUTTON_X,
|
|
91
|
+
"Y": libovr.BUTTON_Y,
|
|
92
|
+
"LThumb": libovr.BUTTON_LTHUMB,
|
|
93
|
+
"LShoulder": libovr.BUTTON_LSHOULDER,
|
|
94
|
+
"Up": libovr.BUTTON_UP,
|
|
95
|
+
"Down": libovr.BUTTON_DOWN,
|
|
96
|
+
"Left": libovr.BUTTON_LEFT,
|
|
97
|
+
"Right": libovr.BUTTON_RIGHT,
|
|
98
|
+
"Enter": libovr.BUTTON_ENTER,
|
|
99
|
+
"Back": libovr.BUTTON_BACK,
|
|
100
|
+
"VolUp": libovr.BUTTON_VOLUP,
|
|
101
|
+
"VolDown": libovr.BUTTON_VOLDOWN,
|
|
102
|
+
"Home": libovr.BUTTON_HOME,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# Touch types supported by PsychXR
|
|
106
|
+
RIFT_TOUCH_TYPES = {
|
|
107
|
+
"A": libovr.TOUCH_A,
|
|
108
|
+
"B": libovr.TOUCH_B,
|
|
109
|
+
"RThumb": libovr.TOUCH_RTHUMB,
|
|
110
|
+
"RThumbRest": libovr.TOUCH_RTHUMBREST,
|
|
111
|
+
"RThumbUp": libovr.TOUCH_RTHUMBUP,
|
|
112
|
+
"RIndexPointing": libovr.TOUCH_RINDEXPOINTING,
|
|
113
|
+
"X": libovr.TOUCH_X,
|
|
114
|
+
"Y": libovr.TOUCH_Y,
|
|
115
|
+
"LThumb": libovr.TOUCH_LTHUMB,
|
|
116
|
+
"LThumbRest": libovr.TOUCH_LTHUMBREST,
|
|
117
|
+
"LThumbUp": libovr.TOUCH_LTHUMBUP,
|
|
118
|
+
"LIndexPointing": libovr.TOUCH_LINDEXPOINTING
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# Tracked device identifiers
|
|
122
|
+
RIFT_TRACKED_DEVICE_TYPES = {
|
|
123
|
+
"HMD": libovr.TRACKED_DEVICE_TYPE_HMD,
|
|
124
|
+
"LTouch": libovr.TRACKED_DEVICE_TYPE_LTOUCH,
|
|
125
|
+
"RTouch": libovr.TRACKED_DEVICE_TYPE_RTOUCH,
|
|
126
|
+
"Touch": libovr.TRACKED_DEVICE_TYPE_TOUCH,
|
|
127
|
+
"Object0": libovr.TRACKED_DEVICE_TYPE_OBJECT0,
|
|
128
|
+
"Object1": libovr.TRACKED_DEVICE_TYPE_OBJECT1,
|
|
129
|
+
"Object2": libovr.TRACKED_DEVICE_TYPE_OBJECT2,
|
|
130
|
+
"Object3": libovr.TRACKED_DEVICE_TYPE_OBJECT3
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# Tracking origin types
|
|
134
|
+
RIFT_TRACKING_ORIGIN_TYPE = {
|
|
135
|
+
"floor": libovr.TRACKING_ORIGIN_FLOOR_LEVEL,
|
|
136
|
+
"eye": libovr.TRACKING_ORIGIN_EYE_LEVEL
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# Performance hud modes
|
|
140
|
+
RIFT_PERF_HUD_MODES = {
|
|
141
|
+
'PerfSummary': libovr.PERF_HUD_PERF_SUMMARY,
|
|
142
|
+
'LatencyTiming': libovr.PERF_HUD_LATENCY_TIMING,
|
|
143
|
+
'AppRenderTiming': libovr.PERF_HUD_APP_RENDER_TIMING,
|
|
144
|
+
'CompRenderTiming': libovr.PERF_HUD_COMP_RENDER_TIMING,
|
|
145
|
+
'AswStats': libovr.PERF_HUD_ASW_STATS,
|
|
146
|
+
'VersionInfo': libovr.PERF_HUD_VERSION_INFO,
|
|
147
|
+
'Off': libovr.PERF_HUD_OFF
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# stereo debug hud modes
|
|
151
|
+
RIFT_STEREO_DEBUG_HUD_MODES = {
|
|
152
|
+
'Off': libovr.DEBUG_HUD_STEREO_MODE_OFF,
|
|
153
|
+
'Quad': libovr.DEBUG_HUD_STEREO_MODE_QUAD,
|
|
154
|
+
'QuadWithCrosshair': libovr.DEBUG_HUD_STEREO_MODE_QUAD_WITH_CROSSHAIR,
|
|
155
|
+
'CrosshairAtInfinity': libovr.DEBUG_HUD_STEREO_MODE_CROSSHAIR_AT_INFINITY
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Boundary types
|
|
159
|
+
RIFT_BOUNDARY_TYPE = {
|
|
160
|
+
'PlayArea': libovr.BOUNDARY_PLAY_AREA,
|
|
161
|
+
'Outer': libovr.BOUNDARY_OUTER
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# mirror modes
|
|
165
|
+
RIFT_MIRROR_MODES = {
|
|
166
|
+
'left': libovr.MIRROR_OPTION_LEFT_EYE_ONLY,
|
|
167
|
+
'right': libovr.MIRROR_OPTION_RIGHT_EYE_ONLY,
|
|
168
|
+
'distortion': libovr.MIRROR_OPTION_POST_DISTORTION,
|
|
169
|
+
'default': libovr.MIRROR_OPTION_DEFAULT
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# eye types
|
|
173
|
+
RIFT_EYE_TYPE = {'left': libovr.EYE_LEFT, 'right': libovr.EYE_RIGHT}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# ------------------------------------------------------------------------------
|
|
177
|
+
# LibOVR Error Handler
|
|
178
|
+
#
|
|
179
|
+
# Exceptions raised by LibOVR will wrapped with this Python exception. This will
|
|
180
|
+
# display the error string passed from LibOVR.
|
|
181
|
+
#
|
|
182
|
+
|
|
183
|
+
class LibOVRError(Exception):
|
|
184
|
+
"""Exception for LibOVR errors."""
|
|
185
|
+
pass
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class Rift(window.Window):
|
|
189
|
+
"""Class provides a display and peripheral interface for the Oculus Rift
|
|
190
|
+
(see: https://www.oculus.com/) head-mounted display. This is a
|
|
191
|
+
lazy-imported class, therefore import using full path
|
|
192
|
+
`from psychopy.visual.rift import Rift` when inheriting from it.
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
Requires PsychXR 0.2.4 to be installed. Setting the `winType='glfw'` is
|
|
196
|
+
preferred for VR applications.
|
|
197
|
+
|
|
198
|
+
"""
|
|
199
|
+
def __init__(
|
|
200
|
+
self,
|
|
201
|
+
fovType='recommended',
|
|
202
|
+
trackingOriginType='floor',
|
|
203
|
+
texelsPerPixel=1.0,
|
|
204
|
+
headLocked=False,
|
|
205
|
+
highQuality=True,
|
|
206
|
+
monoscopic=False,
|
|
207
|
+
samples=1,
|
|
208
|
+
mirrorMode='default',
|
|
209
|
+
mirrorRes=None,
|
|
210
|
+
warnAppFrameDropped=True,
|
|
211
|
+
autoUpdateInput=True,
|
|
212
|
+
legacyOpenGL=True,
|
|
213
|
+
*args,
|
|
214
|
+
**kwargs):
|
|
215
|
+
"""
|
|
216
|
+
Parameters
|
|
217
|
+
----------
|
|
218
|
+
fovType : str
|
|
219
|
+
Field-of-view (FOV) configuration type. Using 'recommended'
|
|
220
|
+
auto-configures the FOV using the recommended parameters computed by
|
|
221
|
+
the runtime. Using 'symmetric' forces a symmetric FOV using optimal
|
|
222
|
+
parameters from the SDK, this mode is required for displaying 2D
|
|
223
|
+
stimuli. Specifying 'max' will use the maximum FOVs supported by the
|
|
224
|
+
HMD.
|
|
225
|
+
trackingOriginType : str
|
|
226
|
+
Specify the HMD origin type. If 'floor', the height of the user
|
|
227
|
+
is added to the head tracker by LibOVR.
|
|
228
|
+
texelsPerPixel : float
|
|
229
|
+
Texture pixels per display pixel at FOV center. A value of 1.0
|
|
230
|
+
results in 1:1 mapping. A fractional value results in a lower
|
|
231
|
+
resolution draw buffer which may increase performance.
|
|
232
|
+
headLocked : bool
|
|
233
|
+
Lock the compositor render layer in-place, disabling Asynchronous
|
|
234
|
+
Space Warp (ASW). Enable this if you plan on computing eye poses
|
|
235
|
+
using custom or modified head poses.
|
|
236
|
+
highQuality : bool
|
|
237
|
+
Configure the compositor to use anisotropic texture sampling (4x).
|
|
238
|
+
This reduces aliasing artifacts resulting from high frequency
|
|
239
|
+
details particularly in the periphery.
|
|
240
|
+
nearClip, farClip : float
|
|
241
|
+
Location of the near and far clipping plane in GL units (meters by
|
|
242
|
+
default) from the viewer. These values can be updated after
|
|
243
|
+
initialization.
|
|
244
|
+
monoscopic : bool
|
|
245
|
+
Enable monoscopic rendering mode which presents the same image to
|
|
246
|
+
both eyes. Eye poses used will be both centered at the HMD origin.
|
|
247
|
+
Monoscopic mode uses a separate rendering pipeline which reduces
|
|
248
|
+
VRAM usage. When in monoscopic mode, you do not need to call
|
|
249
|
+
'setBuffer' prior to rendering (doing so will do have no effect).
|
|
250
|
+
samples : int or str
|
|
251
|
+
Specify the number of samples for multi-sample anti-aliasing (MSAA).
|
|
252
|
+
When >1, multi-sampling logic is enabled in the rendering pipeline.
|
|
253
|
+
If 'max' is specified, the largest number of samples supported by
|
|
254
|
+
the platform is used. If floating point textures are used, MSAA
|
|
255
|
+
sampling is disabled. Must be power of two value.
|
|
256
|
+
mirrorMode : str
|
|
257
|
+
On-screen mirror mode. Values 'left' and 'right' show rectilinear
|
|
258
|
+
images of a single eye. Value 'distortion` shows the post-distortion
|
|
259
|
+
image after being processed by the compositor. Value 'default'
|
|
260
|
+
displays rectilinear images of both eyes side-by-side.
|
|
261
|
+
mirrorRes : list of int
|
|
262
|
+
Resolution of the mirror texture. If `None`, the resolution will
|
|
263
|
+
match the window size. The value of `mirrorRes` is used for to
|
|
264
|
+
define the resolution of movie frames.
|
|
265
|
+
warnAppFrameDropped : bool
|
|
266
|
+
Log a warning if the application drops a frame. This occurs when
|
|
267
|
+
the application fails to submit a frame to the compositor on-time.
|
|
268
|
+
Application frame drops can have many causes, such as running
|
|
269
|
+
routines in your application loop that take too long to complete.
|
|
270
|
+
However, frame drops can happen sporadically due to driver bugs and
|
|
271
|
+
running background processes (such as Windows Update). Use the
|
|
272
|
+
performance HUD to help diagnose the causes of frame drops.
|
|
273
|
+
autoUpdateInput : bool
|
|
274
|
+
Automatically update controller input states at the start of each
|
|
275
|
+
frame. If `False`, you must manually call `updateInputState` before
|
|
276
|
+
getting input values from `LibOVR` managed input devices.
|
|
277
|
+
legacyOpenGL : bool
|
|
278
|
+
Disable 'immediate mode' OpenGL calls in the rendering pipeline.
|
|
279
|
+
Specifying False maintains compatibility with existing PsychoPy
|
|
280
|
+
stimuli drawing routines. Use True when computing transformations
|
|
281
|
+
using some other method and supplying shaders matrices directly.
|
|
282
|
+
|
|
283
|
+
"""
|
|
284
|
+
if not _HAS_PSYCHXR_:
|
|
285
|
+
raise ModuleNotFoundError(
|
|
286
|
+
"PsychXR must be installed to use the `Rift` class. Exiting.")
|
|
287
|
+
|
|
288
|
+
self._closed = False
|
|
289
|
+
self._legacyOpenGL = legacyOpenGL
|
|
290
|
+
self._monoscopic = monoscopic
|
|
291
|
+
self._texelsPerPixel = texelsPerPixel
|
|
292
|
+
self._headLocked = headLocked
|
|
293
|
+
self._highQuality = highQuality
|
|
294
|
+
|
|
295
|
+
self._samples = samples
|
|
296
|
+
self._mirrorRes = mirrorRes
|
|
297
|
+
self._mirrorMode = mirrorMode
|
|
298
|
+
|
|
299
|
+
self.autoUpdateInput = autoUpdateInput
|
|
300
|
+
|
|
301
|
+
# performance statistics
|
|
302
|
+
# this can be changed while running
|
|
303
|
+
self.warnAppFrameDropped = warnAppFrameDropped
|
|
304
|
+
|
|
305
|
+
# check if we are using Windows
|
|
306
|
+
if platform.system() != 'Windows':
|
|
307
|
+
raise RuntimeError("`Rift` class only supports Windows OS at this " +
|
|
308
|
+
"time, exiting.")
|
|
309
|
+
|
|
310
|
+
# check if we are using 64-bit Python
|
|
311
|
+
if platform.architecture()[0] != '64bit': # sys.maxsize != 2**64
|
|
312
|
+
raise RuntimeError("`Rift` class only supports 64-bit Python, " +
|
|
313
|
+
"exiting.")
|
|
314
|
+
|
|
315
|
+
# check if the background service is running and an HMD is connected
|
|
316
|
+
if not libovr.isOculusServiceRunning():
|
|
317
|
+
raise RuntimeError("HMD service is not available or started, " +
|
|
318
|
+
"exiting.")
|
|
319
|
+
|
|
320
|
+
if not libovr.isHmdConnected():
|
|
321
|
+
raise DeviceNotConnectedError(
|
|
322
|
+
_translate(
|
|
323
|
+
"Cannot find any connected HMD, check connections and try again."
|
|
324
|
+
),
|
|
325
|
+
deviceClass=Rift
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
# create a VR session, do some initial configuration
|
|
329
|
+
initResult = libovr.initialize() # removed logging callback
|
|
330
|
+
if libovr.failure(initResult):
|
|
331
|
+
_, msg = libovr.getLastErrorInfo()
|
|
332
|
+
raise LibOVRError(msg)
|
|
333
|
+
|
|
334
|
+
if libovr.failure(libovr.create()):
|
|
335
|
+
libovr.shutdown() # shutdown the session
|
|
336
|
+
_, msg = libovr.getLastErrorInfo()
|
|
337
|
+
raise LibOVRError(msg)
|
|
338
|
+
|
|
339
|
+
if libovr.failure(libovr.resetPerfStats()):
|
|
340
|
+
logging.warn('Failed to reset performance stats.')
|
|
341
|
+
|
|
342
|
+
self._perfStats = libovr.getPerfStats()
|
|
343
|
+
self._lastAppDroppedFrameCount = 0
|
|
344
|
+
|
|
345
|
+
# update session status object
|
|
346
|
+
_, status = libovr.getSessionStatus()
|
|
347
|
+
self._sessionStatus = status
|
|
348
|
+
|
|
349
|
+
# get HMD information
|
|
350
|
+
self._hmdInfo = libovr.getHmdInfo()
|
|
351
|
+
|
|
352
|
+
# configure the internal render descriptors based on the requested
|
|
353
|
+
# viewing parameters.
|
|
354
|
+
if fovType == 'symmetric' or self._monoscopic:
|
|
355
|
+
# Use symmetric FOVs for cases where off-center frustums are not
|
|
356
|
+
# desired. This is required for monoscopic rendering to permit
|
|
357
|
+
# comfortable binocular fusion.
|
|
358
|
+
eyeFovs = self._hmdInfo.symmetricEyeFov
|
|
359
|
+
logging.info('Using symmetric eye FOVs.')
|
|
360
|
+
elif fovType == 'recommended' or fovType == 'default':
|
|
361
|
+
# use the recommended FOVs, these have wider FOVs looking outward
|
|
362
|
+
# due to off-center frustums.
|
|
363
|
+
eyeFovs = self._hmdInfo.defaultEyeFov
|
|
364
|
+
logging.info('Using default/recommended eye FOVs.')
|
|
365
|
+
elif fovType == 'max':
|
|
366
|
+
# the maximum FOVs for the HMD supports
|
|
367
|
+
eyeFovs = self._hmdInfo.maxEyeFov
|
|
368
|
+
logging.info('Using maximum eye FOVs.')
|
|
369
|
+
else:
|
|
370
|
+
raise ValueError(
|
|
371
|
+
"Invalid FOV type '{}' specified.".format(fovType))
|
|
372
|
+
|
|
373
|
+
# pass the FOVs to PsychXR
|
|
374
|
+
for eye, fov in enumerate(eyeFovs):
|
|
375
|
+
libovr.setEyeRenderFov(eye, fov)
|
|
376
|
+
|
|
377
|
+
libovr.setHeadLocked(headLocked) # enable head locked mode
|
|
378
|
+
libovr.setHighQuality(highQuality) # enable high quality mode
|
|
379
|
+
|
|
380
|
+
# Compute texture sizes for render buffers, these are reported by the
|
|
381
|
+
# LibOVR SDK based on the FOV settings specified above.
|
|
382
|
+
texSizeLeft = libovr.calcEyeBufferSize(libovr.EYE_LEFT)
|
|
383
|
+
texSizeRight = libovr.calcEyeBufferSize(libovr.EYE_RIGHT)
|
|
384
|
+
|
|
385
|
+
# we are using a shared texture, so we need to combine dimensions
|
|
386
|
+
if not self._monoscopic:
|
|
387
|
+
hmdBufferWidth = texSizeLeft[0] + texSizeRight[0]
|
|
388
|
+
else:
|
|
389
|
+
hmdBufferWidth = max(texSizeLeft[0], texSizeRight[0])
|
|
390
|
+
|
|
391
|
+
hmdBufferHeight = max(texSizeLeft[1], texSizeRight[1])
|
|
392
|
+
|
|
393
|
+
# buffer viewport size
|
|
394
|
+
self._hmdBufferSize = hmdBufferWidth, hmdBufferHeight
|
|
395
|
+
logging.debug(
|
|
396
|
+
'Required HMD buffer size is {}x{}.'.format(*self._hmdBufferSize))
|
|
397
|
+
|
|
398
|
+
# Calculate the swap texture size. These can differ in later
|
|
399
|
+
# configurations, right now they are the same.
|
|
400
|
+
self._swapTextureSize = self._hmdBufferSize
|
|
401
|
+
|
|
402
|
+
# Compute the required viewport parameters for the given buffer and
|
|
403
|
+
# texture sizes. If we are using a power of two texture, we need to
|
|
404
|
+
# centre the viewports on the textures.
|
|
405
|
+
if not self._monoscopic:
|
|
406
|
+
leftViewport = (0, 0, texSizeLeft[0], texSizeLeft[1])
|
|
407
|
+
rightViewport = (texSizeLeft[0], 0, texSizeRight[0], texSizeRight[1])
|
|
408
|
+
else:
|
|
409
|
+
# In mono mode, we use the same viewport for both eyes. Therefore,
|
|
410
|
+
# the swap texture only needs to be half as wide. This save VRAM
|
|
411
|
+
# and does not require buffer changes when rendering.
|
|
412
|
+
leftViewport = (0, 0, texSizeLeft[0], texSizeLeft[1])
|
|
413
|
+
rightViewport = (0, 0, texSizeRight[0], texSizeRight[1])
|
|
414
|
+
|
|
415
|
+
libovr.setEyeRenderViewport(libovr.EYE_LEFT, leftViewport)
|
|
416
|
+
logging.debug(
|
|
417
|
+
'Set left eye viewport to: x={}, y={}, w={}, h={}.'.format(
|
|
418
|
+
*leftViewport))
|
|
419
|
+
|
|
420
|
+
libovr.setEyeRenderViewport(libovr.EYE_RIGHT, rightViewport)
|
|
421
|
+
logging.debug(
|
|
422
|
+
'Set right eye viewport to: x={}, y={}, w={}, h={}.'.format(
|
|
423
|
+
*rightViewport))
|
|
424
|
+
|
|
425
|
+
self.scrWidthPIX = max(texSizeLeft[0], texSizeRight[0])
|
|
426
|
+
|
|
427
|
+
# frame index
|
|
428
|
+
self._frameIndex = 0
|
|
429
|
+
|
|
430
|
+
# setup a mirror texture
|
|
431
|
+
self._mirrorRes = mirrorRes
|
|
432
|
+
|
|
433
|
+
# view buffer to divert operations to, if None, drawing is sent to the
|
|
434
|
+
# on-screen window.
|
|
435
|
+
self.buffer = None
|
|
436
|
+
|
|
437
|
+
# View matrices, these are updated every frame based on computed head
|
|
438
|
+
# position. Projection matrices need only to be computed once.
|
|
439
|
+
if not self._monoscopic:
|
|
440
|
+
self._projectionMatrix = [
|
|
441
|
+
np.identity(4, dtype=np.float32),
|
|
442
|
+
np.identity(4, dtype=np.float32)]
|
|
443
|
+
self._viewMatrix = [
|
|
444
|
+
np.identity(4, dtype=np.float32),
|
|
445
|
+
np.identity(4, dtype=np.float32)]
|
|
446
|
+
else:
|
|
447
|
+
self._projectionMatrix = np.identity(4, dtype=np.float32)
|
|
448
|
+
self._viewMatrix = np.identity(4, dtype=np.float32)
|
|
449
|
+
|
|
450
|
+
# disable v-sync since the HMD runs at a different frequency
|
|
451
|
+
kwargs['waitBlanking'] = False
|
|
452
|
+
|
|
453
|
+
# force checkTiming and quad-buffer stereo off
|
|
454
|
+
kwargs["checkTiming"] = False # not used here for now
|
|
455
|
+
kwargs["stereo"] = False # false, using our own stuff for stereo
|
|
456
|
+
kwargs['useFBO'] = True # true, but uses it's ow FBO logic
|
|
457
|
+
kwargs['multiSample'] = False # not for the back buffer of the widow
|
|
458
|
+
|
|
459
|
+
# do not allow 'endFrame' to be called until _startOfFlip is called
|
|
460
|
+
self._allowHmdRendering = False
|
|
461
|
+
|
|
462
|
+
# VR pose data, updated every frame
|
|
463
|
+
self._headPose = libovr.LibOVRPose()
|
|
464
|
+
|
|
465
|
+
# set the tracking origin type
|
|
466
|
+
self.trackingOriginType = trackingOriginType
|
|
467
|
+
|
|
468
|
+
# performance information
|
|
469
|
+
self.nDroppedFrames = 0
|
|
470
|
+
self.controllerPollTimes = {}
|
|
471
|
+
|
|
472
|
+
# call up a new window object
|
|
473
|
+
super(Rift, self).__init__(*args, **kwargs)
|
|
474
|
+
|
|
475
|
+
self._updateProjectionMatrix()
|
|
476
|
+
|
|
477
|
+
def close(self):
|
|
478
|
+
"""Close the window and cleanly shutdown the LibOVR session.
|
|
479
|
+
"""
|
|
480
|
+
logging.info('Closing `Rift` window, de-allocating resources and '
|
|
481
|
+
'shutting down VR session.')
|
|
482
|
+
|
|
483
|
+
# switch off persistent HUD features
|
|
484
|
+
self.perfHudMode = 'Off'
|
|
485
|
+
self.stereoDebugHudMode = 'Off'
|
|
486
|
+
|
|
487
|
+
# clean up allocated LibOVR resources before closing the window
|
|
488
|
+
logging.debug('Destroying mirror texture.')
|
|
489
|
+
libovr.destroyMirrorTexture()
|
|
490
|
+
logging.debug('Destroying texture GL swap chain.')
|
|
491
|
+
libovr.destroyTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
|
|
492
|
+
logging.debug('Destroying LibOVR session.')
|
|
493
|
+
libovr.destroy()
|
|
494
|
+
|
|
495
|
+
# start closing the window
|
|
496
|
+
self._closed = True
|
|
497
|
+
logging.debug('Closing window associated with LibOVR session.')
|
|
498
|
+
self.backend.close()
|
|
499
|
+
|
|
500
|
+
try:
|
|
501
|
+
core.openWindows.remove(self)
|
|
502
|
+
except Exception:
|
|
503
|
+
pass
|
|
504
|
+
|
|
505
|
+
try:
|
|
506
|
+
self.mouseVisible = True
|
|
507
|
+
except Exception:
|
|
508
|
+
pass
|
|
509
|
+
|
|
510
|
+
# shutdown the session completely
|
|
511
|
+
#libovr.shutdown()
|
|
512
|
+
logging.info('LibOVR session shutdown cleanly.')
|
|
513
|
+
|
|
514
|
+
try:
|
|
515
|
+
logging.flush()
|
|
516
|
+
except Exception:
|
|
517
|
+
pass
|
|
518
|
+
|
|
519
|
+
@property
|
|
520
|
+
def size(self):
|
|
521
|
+
"""Size property to get the dimensions of the view buffer instead of
|
|
522
|
+
the window. If there are no view buffers, always return the dims of the
|
|
523
|
+
window.
|
|
524
|
+
|
|
525
|
+
"""
|
|
526
|
+
# this is a hack to get stimuli to draw correctly
|
|
527
|
+
if self.buffer is None:
|
|
528
|
+
return self.frameBufferSize
|
|
529
|
+
else:
|
|
530
|
+
if self._monoscopic:
|
|
531
|
+
return np.array(
|
|
532
|
+
(self._hmdBufferSize[0], self._hmdBufferSize[1]),
|
|
533
|
+
int)
|
|
534
|
+
else:
|
|
535
|
+
return np.array(
|
|
536
|
+
(int(self._hmdBufferSize[0] / 2), self._hmdBufferSize[1]),
|
|
537
|
+
int)
|
|
538
|
+
|
|
539
|
+
@size.setter
|
|
540
|
+
def size(self, value):
|
|
541
|
+
"""Set the size of the window.
|
|
542
|
+
|
|
543
|
+
"""
|
|
544
|
+
self.__dict__['size'] = np.array(value, int)
|
|
545
|
+
|
|
546
|
+
def setSize(self, value, log=True):
|
|
547
|
+
setAttribute(self, 'size', value, log=log)
|
|
548
|
+
|
|
549
|
+
def perfHudMode(self, mode='Off'):
|
|
550
|
+
"""Set the performance HUD mode.
|
|
551
|
+
|
|
552
|
+
Parameters
|
|
553
|
+
----------
|
|
554
|
+
mode : str
|
|
555
|
+
HUD mode to use.
|
|
556
|
+
|
|
557
|
+
"""
|
|
558
|
+
result = libovr.setInt(libovr.PERF_HUD_MODE, RIFT_PERF_HUD_MODES[mode])
|
|
559
|
+
if libovr.success(result):
|
|
560
|
+
logging.info("Performance HUD mode set to '{}'.".format(mode))
|
|
561
|
+
else:
|
|
562
|
+
logging.error('Failed to set performance HUD mode to "{}".'.format(
|
|
563
|
+
mode))
|
|
564
|
+
|
|
565
|
+
def hidePerfHud(self):
|
|
566
|
+
"""Hide the performance HUD."""
|
|
567
|
+
libovr.setInt(libovr.PERF_HUD_MODE, libovr.PERF_HUD_OFF)
|
|
568
|
+
logging.info('Performance HUD disabled.')
|
|
569
|
+
|
|
570
|
+
def stereoDebugHudMode(self, mode):
|
|
571
|
+
"""Set the debug stereo HUD mode.
|
|
572
|
+
|
|
573
|
+
This makes the compositor add stereoscopic reference guides to the
|
|
574
|
+
scene. You can configure the HUD can be configured using other methods.
|
|
575
|
+
|
|
576
|
+
Parameters
|
|
577
|
+
----------
|
|
578
|
+
mode : str
|
|
579
|
+
Stereo debug mode to use. Valid options are `Off`, `Quad`,
|
|
580
|
+
`QuadWithCrosshair`, and `CrosshairAtInfinity`.
|
|
581
|
+
|
|
582
|
+
Examples
|
|
583
|
+
--------
|
|
584
|
+
Enable a stereo debugging guide::
|
|
585
|
+
|
|
586
|
+
hmd.stereoDebugHudMode('CrosshairAtInfinity')
|
|
587
|
+
|
|
588
|
+
Hide the debugging guide. Should be called before exiting the
|
|
589
|
+
application since it's persistent until the Oculus service is
|
|
590
|
+
restarted::
|
|
591
|
+
|
|
592
|
+
hmd.stereoDebugHudMode('Off')
|
|
593
|
+
|
|
594
|
+
"""
|
|
595
|
+
result = libovr.setInt(
|
|
596
|
+
libovr.DEBUG_HUD_STEREO_MODE, RIFT_STEREO_DEBUG_HUD_MODES[mode])
|
|
597
|
+
|
|
598
|
+
if result:
|
|
599
|
+
logging.info("Stereo debug HUD mode set to '{}'.".format(mode))
|
|
600
|
+
else:
|
|
601
|
+
logging.warning(
|
|
602
|
+
"Failed to set stereo debug HUD mode set to '{}'.".format(mode))
|
|
603
|
+
|
|
604
|
+
def setStereoDebugHudOption(self, option, value):
|
|
605
|
+
"""Configure stereo debug HUD guides.
|
|
606
|
+
|
|
607
|
+
Parameters
|
|
608
|
+
----------
|
|
609
|
+
option : str
|
|
610
|
+
Option to set. Valid options are `InfoEnable`, `Size`, `Position`,
|
|
611
|
+
`YawPitchRoll`, and `Color`.
|
|
612
|
+
value : array_like or bool
|
|
613
|
+
Value to set for a given `option`. Appropriate types for each
|
|
614
|
+
option are:
|
|
615
|
+
|
|
616
|
+
* `InfoEnable` - bool, `True` to show, `False` to hide.
|
|
617
|
+
* `Size` - array_like, [w, h] in meters.
|
|
618
|
+
* `Position` - array_like, [x, y, z] in meters.
|
|
619
|
+
* `YawPitchRoll` - array_like, [pitch, yaw, roll] in degrees.
|
|
620
|
+
* `Color` - array_like, [r, g, b] as floats ranging 0.0 to 1.0.
|
|
621
|
+
|
|
622
|
+
Returns
|
|
623
|
+
-------
|
|
624
|
+
bool
|
|
625
|
+
``True`` if the option was successfully set.
|
|
626
|
+
|
|
627
|
+
Examples
|
|
628
|
+
--------
|
|
629
|
+
Configuring a stereo debug HUD guide::
|
|
630
|
+
|
|
631
|
+
# show a quad with a crosshair
|
|
632
|
+
hmd.stereoDebugHudMode('QuadWithCrosshair')
|
|
633
|
+
# enable displaying guide information
|
|
634
|
+
hmd.setStereoDebugHudOption('InfoEnable', True)
|
|
635
|
+
# set the position of the guide quad in the scene
|
|
636
|
+
hmd.setStereoDebugHudOption('Position', [0.0, 1.7, -2.0])
|
|
637
|
+
|
|
638
|
+
"""
|
|
639
|
+
if option == 'InfoEnable':
|
|
640
|
+
result = libovr.setBool(
|
|
641
|
+
libovr.DEBUG_HUD_STEREO_GUIDE_INFO_ENABLE, value)
|
|
642
|
+
elif option == 'Size':
|
|
643
|
+
value = np.asarray(value, dtype=np.float32)
|
|
644
|
+
result = libovr.setFloatArray(
|
|
645
|
+
libovr.DEBUG_HUD_STEREO_GUIDE_SIZE, value)
|
|
646
|
+
elif option == 'Position':
|
|
647
|
+
value = np.asarray(value, dtype=np.float32)
|
|
648
|
+
result = libovr.setFloatArray(
|
|
649
|
+
libovr.DEBUG_HUD_STEREO_GUIDE_POSITION, value)
|
|
650
|
+
elif option == 'YawPitchRoll':
|
|
651
|
+
value = np.asarray(value, dtype=np.float32)
|
|
652
|
+
result = libovr.setFloatArray(
|
|
653
|
+
libovr.DEBUG_HUD_STEREO_GUIDE_YAWPITCHROLL, value)
|
|
654
|
+
elif option == 'Color' or option == 'Colour':
|
|
655
|
+
value = np.asarray(value, dtype=np.float32)
|
|
656
|
+
result = libovr.setFloatArray(
|
|
657
|
+
libovr.DEBUG_HUD_STEREO_GUIDE_COLOR, value)
|
|
658
|
+
else:
|
|
659
|
+
raise ValueError("Invalid option `{}` specified.".format(option))
|
|
660
|
+
|
|
661
|
+
if result:
|
|
662
|
+
logging.info(
|
|
663
|
+
"Stereo debug HUD option '{}' set to {}.".format(
|
|
664
|
+
option, str(value)))
|
|
665
|
+
else:
|
|
666
|
+
logging.warning(
|
|
667
|
+
"Failed to set stereo debug HUD option '{}' set to {}.".format(
|
|
668
|
+
option, str(value)))
|
|
669
|
+
|
|
670
|
+
@property
|
|
671
|
+
def userHeight(self):
|
|
672
|
+
"""Get user height in meters (`float`)."""
|
|
673
|
+
return libovr.getFloat(libovr.KEY_PLAYER_HEIGHT,
|
|
674
|
+
libovr.DEFAULT_PLAYER_HEIGHT)
|
|
675
|
+
|
|
676
|
+
@property
|
|
677
|
+
def eyeHeight(self):
|
|
678
|
+
"""Eye height in meters (`float`)."""
|
|
679
|
+
return libovr.getFloat(libovr.KEY_EYE_HEIGHT,
|
|
680
|
+
libovr.DEFAULT_EYE_HEIGHT)
|
|
681
|
+
|
|
682
|
+
@property
|
|
683
|
+
def eyeToNoseDistance(self):
|
|
684
|
+
"""Eye to nose distance in meters (`float`).
|
|
685
|
+
|
|
686
|
+
Examples
|
|
687
|
+
--------
|
|
688
|
+
Generate your own eye poses. These are used when
|
|
689
|
+
:py:meth:`calcEyePoses` is called::
|
|
690
|
+
|
|
691
|
+
leftEyePose = Rift.createPose((-self.eyeToNoseDistance, 0., 0.))
|
|
692
|
+
rightEyePose = Rift.createPose((self.eyeToNoseDistance, 0., 0.))
|
|
693
|
+
|
|
694
|
+
Get the inter-axial separation (IAS) reported by `LibOVR`::
|
|
695
|
+
|
|
696
|
+
iad = self.eyeToNoseDistance * 2.0
|
|
697
|
+
|
|
698
|
+
"""
|
|
699
|
+
eyeToNoseDist = np.zeros((2,), dtype=np.float32)
|
|
700
|
+
libovr.getFloatArray(libovr.KEY_EYE_TO_NOSE_DISTANCE, eyeToNoseDist)
|
|
701
|
+
|
|
702
|
+
return eyeToNoseDist
|
|
703
|
+
|
|
704
|
+
@property
|
|
705
|
+
def eyeOffset(self):
|
|
706
|
+
"""Eye separation in centimeters (`float`).
|
|
707
|
+
|
|
708
|
+
"""
|
|
709
|
+
leftEyeHmdPose = libovr.getHmdToEyePose(libovr.EYE_LEFT)
|
|
710
|
+
rightEyeHmdPose = libovr.getHmdToEyePose(libovr.EYE_RIGHT)
|
|
711
|
+
|
|
712
|
+
return (-leftEyeHmdPose.pos[0] + rightEyeHmdPose.pos[0]) / 100.0
|
|
713
|
+
|
|
714
|
+
@eyeOffset.setter
|
|
715
|
+
def eyeOffset(self, value):
|
|
716
|
+
halfIAS = (value / 2.0) * 100.0
|
|
717
|
+
libovr.setHmdToEyePose(
|
|
718
|
+
libovr.EYE_LEFT, libovr.LibOVRPose((halfIAS, 0.0, 0.0)))
|
|
719
|
+
libovr.setHmdToEyePose(
|
|
720
|
+
libovr.EYE_RIGHT, libovr.LibOVRPose((-halfIAS, 0.0, 0.0)))
|
|
721
|
+
|
|
722
|
+
logging.info(
|
|
723
|
+
'Eye separation set to {} centimeters.'.format(value))
|
|
724
|
+
|
|
725
|
+
@property
|
|
726
|
+
def hasPositionTracking(self):
|
|
727
|
+
"""``True`` if the HMD is capable of tracking position."""
|
|
728
|
+
return self._hmdInfo.hasPositionTracking
|
|
729
|
+
|
|
730
|
+
@property
|
|
731
|
+
def hasOrientationTracking(self):
|
|
732
|
+
"""``True`` if the HMD is capable of tracking orientation."""
|
|
733
|
+
return self._hmdInfo.hasOrientationTracking
|
|
734
|
+
|
|
735
|
+
@property
|
|
736
|
+
def hasMagYawCorrection(self):
|
|
737
|
+
"""``True`` if this HMD supports yaw drift correction."""
|
|
738
|
+
return self._hmdInfo.hasMagYawCorrection
|
|
739
|
+
|
|
740
|
+
@property
|
|
741
|
+
def productName(self):
|
|
742
|
+
"""Get the HMD's product name (`str`).
|
|
743
|
+
"""
|
|
744
|
+
return self._hmdInfo.productName
|
|
745
|
+
|
|
746
|
+
@property
|
|
747
|
+
def manufacturer(self):
|
|
748
|
+
"""Get the connected HMD's manufacturer (`str`).
|
|
749
|
+
"""
|
|
750
|
+
return self._hmdInfo.manufacturer
|
|
751
|
+
|
|
752
|
+
@property
|
|
753
|
+
def serialNumber(self):
|
|
754
|
+
"""Get the connected HMD's unique serial number (`str`).
|
|
755
|
+
|
|
756
|
+
Use this to identify a particular unit if you own many.
|
|
757
|
+
"""
|
|
758
|
+
return self._hmdInfo.serialNumber
|
|
759
|
+
|
|
760
|
+
@property
|
|
761
|
+
def hid(self):
|
|
762
|
+
"""USB human interface device (HID) identifiers (`int`, `int`).
|
|
763
|
+
|
|
764
|
+
"""
|
|
765
|
+
return self._hmdInfo.hid
|
|
766
|
+
|
|
767
|
+
@property
|
|
768
|
+
def firmwareVersion(self):
|
|
769
|
+
"""Get the firmware version of the active HMD (`int`, `int`).
|
|
770
|
+
|
|
771
|
+
"""
|
|
772
|
+
return self._hmdInfo.firmwareVersion
|
|
773
|
+
|
|
774
|
+
@property
|
|
775
|
+
def displayResolution(self):
|
|
776
|
+
"""Get the HMD's raster display size (`int`, `int`).
|
|
777
|
+
|
|
778
|
+
"""
|
|
779
|
+
return self._hmdInfo.resolution
|
|
780
|
+
|
|
781
|
+
@property
|
|
782
|
+
def displayRefreshRate(self):
|
|
783
|
+
"""Get the HMD's display refresh rate in Hz (`float`).
|
|
784
|
+
|
|
785
|
+
"""
|
|
786
|
+
return self._hmdInfo.refreshRate
|
|
787
|
+
|
|
788
|
+
@property
|
|
789
|
+
def pixelsPerTanAngleAtCenter(self):
|
|
790
|
+
"""Horizontal and vertical pixels per tangent angle (=1) at the center
|
|
791
|
+
of the display.
|
|
792
|
+
|
|
793
|
+
This can be used to compute pixels-per-degree for the display.
|
|
794
|
+
|
|
795
|
+
"""
|
|
796
|
+
return [libovr.getPixelsPerTanAngleAtCenter(libovr.EYE_LEFT),
|
|
797
|
+
libovr.getPixelsPerTanAngleAtCenter(libovr.EYE_RIGHT)]
|
|
798
|
+
|
|
799
|
+
def tanAngleToNDC(self, horzTan, vertTan):
|
|
800
|
+
"""Convert tan angles to the normalized device coordinates for the
|
|
801
|
+
current buffer.
|
|
802
|
+
|
|
803
|
+
Parameters
|
|
804
|
+
----------
|
|
805
|
+
horzTan : float
|
|
806
|
+
Horizontal tan angle.
|
|
807
|
+
vertTan : float
|
|
808
|
+
Vertical tan angle.
|
|
809
|
+
|
|
810
|
+
Returns
|
|
811
|
+
-------
|
|
812
|
+
tuple of float
|
|
813
|
+
Normalized device coordinates X, Y. Coordinates range between -1.0
|
|
814
|
+
and 1.0. Returns `None` if an invalid buffer is selected.
|
|
815
|
+
|
|
816
|
+
"""
|
|
817
|
+
if self.buffer == 'left':
|
|
818
|
+
return libovr.getTanAngleToRenderTargetNDC(
|
|
819
|
+
libovr.EYE_LEFT, (horzTan, vertTan))
|
|
820
|
+
elif self.buffer == 'right':
|
|
821
|
+
return libovr.getTanAngleToRenderTargetNDC(
|
|
822
|
+
libovr.EYE_RIGHT, (horzTan, vertTan))
|
|
823
|
+
|
|
824
|
+
@property
|
|
825
|
+
def trackerCount(self):
|
|
826
|
+
"""Number of attached trackers."""
|
|
827
|
+
return libovr.getTrackerCount()
|
|
828
|
+
|
|
829
|
+
def getTrackerInfo(self, trackerIdx):
|
|
830
|
+
"""Get tracker information.
|
|
831
|
+
|
|
832
|
+
Parameters
|
|
833
|
+
----------
|
|
834
|
+
trackerIdx : int
|
|
835
|
+
Tracker index, ranging from 0 to :py:class:`~Rift.trackerCount`.
|
|
836
|
+
|
|
837
|
+
Returns
|
|
838
|
+
-------
|
|
839
|
+
:py:class:`~psychxr.libovr.LibOVRTrackerInfo`
|
|
840
|
+
Object containing tracker information.
|
|
841
|
+
|
|
842
|
+
Raises
|
|
843
|
+
------
|
|
844
|
+
IndexError
|
|
845
|
+
Raised when `trackerIdx` out of range.
|
|
846
|
+
|
|
847
|
+
"""
|
|
848
|
+
if 0 <= trackerIdx < libovr.getTrackerCount():
|
|
849
|
+
return libovr.getTrackerInfo(trackerIdx)
|
|
850
|
+
else:
|
|
851
|
+
raise IndexError(
|
|
852
|
+
"Tracker index '{}' out of range.".format(trackerIdx))
|
|
853
|
+
|
|
854
|
+
@property
|
|
855
|
+
def headLocked(self):
|
|
856
|
+
"""`True` if head locking is enabled."""
|
|
857
|
+
return libovr.isHeadLocked()
|
|
858
|
+
|
|
859
|
+
@headLocked.setter
|
|
860
|
+
def headLocked(self, value):
|
|
861
|
+
libovr.setHeadLocked(bool(value))
|
|
862
|
+
|
|
863
|
+
@property
|
|
864
|
+
def trackingOriginType(self):
|
|
865
|
+
"""Current tracking origin type (`str`).
|
|
866
|
+
|
|
867
|
+
Valid tracking origin types are 'floor' and 'eye'.
|
|
868
|
+
|
|
869
|
+
"""
|
|
870
|
+
originType = libovr.getTrackingOriginType()
|
|
871
|
+
|
|
872
|
+
if originType == libovr.TRACKING_ORIGIN_FLOOR_LEVEL:
|
|
873
|
+
return 'floor'
|
|
874
|
+
elif originType == libovr.TRACKING_ORIGIN_EYE_LEVEL:
|
|
875
|
+
return 'eye'
|
|
876
|
+
else:
|
|
877
|
+
raise ValueError("LibOVR returned unknown tracking origin type.")
|
|
878
|
+
|
|
879
|
+
@trackingOriginType.setter
|
|
880
|
+
def trackingOriginType(self, value):
|
|
881
|
+
libovr.setTrackingOriginType(RIFT_TRACKING_ORIGIN_TYPE[value])
|
|
882
|
+
|
|
883
|
+
def recenterTrackingOrigin(self):
|
|
884
|
+
"""Recenter the tracking origin using the current head position."""
|
|
885
|
+
libovr.recenterTrackingOrigin()
|
|
886
|
+
|
|
887
|
+
def specifyTrackingOrigin(self, pose):
|
|
888
|
+
"""Specify a tracking origin. If `trackingOriginType='floor'`, this
|
|
889
|
+
function sets the origin of the scene in the ground plane. If
|
|
890
|
+
`trackingOriginType='eye'`, the scene origin is set to the known eye
|
|
891
|
+
height.
|
|
892
|
+
|
|
893
|
+
Parameters
|
|
894
|
+
----------
|
|
895
|
+
pose : LibOVRPose
|
|
896
|
+
Tracking origin pose.
|
|
897
|
+
|
|
898
|
+
"""
|
|
899
|
+
libovr.specifyTrackingOrigin(pose)
|
|
900
|
+
|
|
901
|
+
def specifyTrackingOriginPosOri(self, pos=(0., 0., 0.), ori=(0., 0., 0., 1.)):
|
|
902
|
+
"""Specify a tracking origin using a pose and orientation. This is the
|
|
903
|
+
same as `specifyTrackingOrigin`, but accepts a position vector [x, y, z]
|
|
904
|
+
and orientation quaternion [x, y, z, w].
|
|
905
|
+
|
|
906
|
+
Parameters
|
|
907
|
+
----------
|
|
908
|
+
pos : tuple or list of float, or ndarray
|
|
909
|
+
Position coordinate of origin (x, y, z).
|
|
910
|
+
ori : tuple or list of float, or ndarray
|
|
911
|
+
Quaternion specifying orientation (x, y, z, w).
|
|
912
|
+
|
|
913
|
+
"""
|
|
914
|
+
libovr.specifyTrackingOrigin(libovr.LibOVRPose(pos, ori))
|
|
915
|
+
|
|
916
|
+
def clearShouldRecenterFlag(self):
|
|
917
|
+
"""Clear the 'shouldRecenter' status flag at the API level."""
|
|
918
|
+
libovr.clearShouldRecenterFlag()
|
|
919
|
+
|
|
920
|
+
def testBoundary(self, deviceType, bounadryType='PlayArea'):
|
|
921
|
+
"""Test if tracked devices are colliding with the play area boundary.
|
|
922
|
+
|
|
923
|
+
This returns an object containing test result data.
|
|
924
|
+
|
|
925
|
+
Parameters
|
|
926
|
+
----------
|
|
927
|
+
deviceType : str, list or tuple
|
|
928
|
+
The device to check for boundary collision. If a list of names is
|
|
929
|
+
provided, they will be combined and all tested.
|
|
930
|
+
boundaryType : str
|
|
931
|
+
Boundary type to test.
|
|
932
|
+
|
|
933
|
+
"""
|
|
934
|
+
if isinstance(deviceType, (list, tuple,)):
|
|
935
|
+
deviceBits = 0x00000000
|
|
936
|
+
for device in deviceType:
|
|
937
|
+
deviceBits |= RIFT_TRACKED_DEVICE_TYPES[device]
|
|
938
|
+
elif isinstance(deviceType, str):
|
|
939
|
+
deviceBits = RIFT_TRACKED_DEVICE_TYPES[deviceType]
|
|
940
|
+
elif isinstance(deviceType, int):
|
|
941
|
+
deviceBits = deviceType
|
|
942
|
+
else:
|
|
943
|
+
raise TypeError("Invalid type specified for `deviceType`.")
|
|
944
|
+
|
|
945
|
+
result, testResult = libovr.testBoundary(
|
|
946
|
+
deviceBits, RIFT_BOUNDARY_TYPE[bounadryType])
|
|
947
|
+
|
|
948
|
+
if libovr.failure(result):
|
|
949
|
+
raise RuntimeError('Failed to get boundary test result')
|
|
950
|
+
|
|
951
|
+
return testResult
|
|
952
|
+
|
|
953
|
+
@property
|
|
954
|
+
def sensorSampleTime(self):
|
|
955
|
+
"""Sensor sample time (`float`). This value corresponds to the time the
|
|
956
|
+
head (HMD) position was sampled, which is required for computing
|
|
957
|
+
motion-to-photon latency. This does not need to be specified if
|
|
958
|
+
`getTrackingState` was called with `latencyMarker=True`.
|
|
959
|
+
"""
|
|
960
|
+
return libovr.getSensorSampleTime()
|
|
961
|
+
|
|
962
|
+
@sensorSampleTime.setter
|
|
963
|
+
def sensorSampleTime(self, value):
|
|
964
|
+
libovr.setSensorSampleTime(value)
|
|
965
|
+
|
|
966
|
+
def getDevicePose(self, deviceName, absTime=None, latencyMarker=False):
|
|
967
|
+
"""Get the pose of a tracked device. For head (HMD) and hand poses
|
|
968
|
+
(Touch controllers) it is better to use :py:meth:`getTrackingState`
|
|
969
|
+
instead.
|
|
970
|
+
|
|
971
|
+
Parameters
|
|
972
|
+
----------
|
|
973
|
+
deviceName : str
|
|
974
|
+
Name of the device. Valid device names are: 'HMD', 'LTouch',
|
|
975
|
+
'RTouch', 'Touch', 'Object0', 'Object1', 'Object2', and 'Object3'.
|
|
976
|
+
absTime : float, optional
|
|
977
|
+
Absolute time in seconds the device pose refers to. If not
|
|
978
|
+
specified, the predicted time is used.
|
|
979
|
+
latencyMarker : bool
|
|
980
|
+
Insert a marker for motion-to-photon latency calculation. Should
|
|
981
|
+
only be `True` if the HMD pose is being used to compute eye poses.
|
|
982
|
+
|
|
983
|
+
Returns
|
|
984
|
+
-------
|
|
985
|
+
`LibOVRPoseState` or `None`
|
|
986
|
+
Pose state object. `None` if device tracking was lost.
|
|
987
|
+
|
|
988
|
+
"""
|
|
989
|
+
if absTime is None:
|
|
990
|
+
absTime = self.getPredictedDisplayTime()
|
|
991
|
+
|
|
992
|
+
deviceStatus, devicePose = libovr.getDevicePoses(
|
|
993
|
+
[RIFT_TRACKED_DEVICE_TYPES[deviceName]], absTime, latencyMarker)
|
|
994
|
+
|
|
995
|
+
# check if tracking was lost
|
|
996
|
+
if deviceStatus == libovr.ERROR_LOST_TRACKING:
|
|
997
|
+
return None
|
|
998
|
+
|
|
999
|
+
return devicePose[0]
|
|
1000
|
+
|
|
1001
|
+
def getTrackingState(self, absTime=None, latencyMarker=True):
|
|
1002
|
+
"""Get the tracking state of the head and hands.
|
|
1003
|
+
|
|
1004
|
+
Calling this function retrieves the tracking state of the head (HMD)
|
|
1005
|
+
and hands at `absTime` from the `LibOVR` runtime. The returned object is
|
|
1006
|
+
a :py:class:`~psychxr.libovr.LibOVRTrackingState` instance with poses,
|
|
1007
|
+
motion derivatives (i.e. linear and angular velocity/acceleration), and
|
|
1008
|
+
tracking status flags accessible through its attributes.
|
|
1009
|
+
|
|
1010
|
+
The pose states of the head and hands are available by accessing the
|
|
1011
|
+
`headPose` and `handPoses` attributes, respectively.
|
|
1012
|
+
|
|
1013
|
+
Parameters
|
|
1014
|
+
----------
|
|
1015
|
+
absTime : float, optional
|
|
1016
|
+
Absolute time the tracking state refers to. If not specified,
|
|
1017
|
+
the predicted display time is used.
|
|
1018
|
+
latencyMarker : bool, optional
|
|
1019
|
+
Set a latency marker upon getting the tracking state. This is used
|
|
1020
|
+
for motion-to-photon calculations.
|
|
1021
|
+
|
|
1022
|
+
Returns
|
|
1023
|
+
-------
|
|
1024
|
+
:py:class:`~psychxr.libovr.LibOVRTrackingState`
|
|
1025
|
+
Tracking state object. For more information about this type see:
|
|
1026
|
+
|
|
1027
|
+
See Also
|
|
1028
|
+
--------
|
|
1029
|
+
getPredictedDisplayTime
|
|
1030
|
+
Time at mid-frame for the current frame index.
|
|
1031
|
+
|
|
1032
|
+
Examples
|
|
1033
|
+
--------
|
|
1034
|
+
Get the tracked head pose and use it to calculate render eye poses::
|
|
1035
|
+
|
|
1036
|
+
# get tracking state at predicted mid-frame time
|
|
1037
|
+
absTime = getPredictedDisplayTime()
|
|
1038
|
+
trackingState = hmd.getTrackingState(absTime)
|
|
1039
|
+
|
|
1040
|
+
# get the head pose from the tracking state
|
|
1041
|
+
headPose = trackingState.headPose.thePose
|
|
1042
|
+
hmd.calcEyePoses(headPose) # compute eye poses
|
|
1043
|
+
|
|
1044
|
+
Get linear/angular velocity and acceleration vectors of the right
|
|
1045
|
+
touch controller::
|
|
1046
|
+
|
|
1047
|
+
# right hand is the second value (index 1) at `handPoses`
|
|
1048
|
+
rightHandState = trackingState.handPoses[1] # is `LibOVRPoseState`
|
|
1049
|
+
|
|
1050
|
+
# access `LibOVRPoseState` fields to get the data
|
|
1051
|
+
linearVel = rightHandState.linearVelocity # m/s
|
|
1052
|
+
angularVel = rightHandState.angularVelocity # rad/s
|
|
1053
|
+
linearAcc = rightHandState.linearAcceleration # m/s^2
|
|
1054
|
+
angularAcc = rightHandState.angularAcceleration # rad/s^2
|
|
1055
|
+
|
|
1056
|
+
# extract components like this if desired
|
|
1057
|
+
vx, vy, vz = linearVel
|
|
1058
|
+
ax, ay, az = angularVel
|
|
1059
|
+
|
|
1060
|
+
Above is useful for physics simulations, where one can compute the
|
|
1061
|
+
magnitude and direction of a force applied to a virtual object.
|
|
1062
|
+
|
|
1063
|
+
It's often the case that object tracking becomes unreliable for some
|
|
1064
|
+
reason, for instance, if it becomes occluded and is no longer visible to
|
|
1065
|
+
the sensors. In such cases, the reported pose state is invalid and may
|
|
1066
|
+
not be useful. You can check if the position and orientation of a
|
|
1067
|
+
tracked object is invalid using flags associated with the tracking
|
|
1068
|
+
state. This shows how to check if head position and orientation tracking
|
|
1069
|
+
was valid when sampled::
|
|
1070
|
+
|
|
1071
|
+
if trackingState.positionValid and trackingState.orientationValid:
|
|
1072
|
+
print('Tracking valid.')
|
|
1073
|
+
|
|
1074
|
+
It's up to the programmer to determine what to do in such cases. Note
|
|
1075
|
+
that tracking may still be valid even if
|
|
1076
|
+
|
|
1077
|
+
Get the calibrated origin used for tracking during the sample period
|
|
1078
|
+
of the tracking state::
|
|
1079
|
+
|
|
1080
|
+
calibratedOrigin = trackingState.calibratedOrigin
|
|
1081
|
+
calibPos, calibOri = calibratedOrigin.posOri
|
|
1082
|
+
|
|
1083
|
+
Time integrate a tracking state. This extrapolates the pose over time
|
|
1084
|
+
given the present computed motion derivatives. The contrived example
|
|
1085
|
+
below shows how to implement head pose forward prediction::
|
|
1086
|
+
|
|
1087
|
+
# get current system time
|
|
1088
|
+
absTime = getTimeInSeconds()
|
|
1089
|
+
|
|
1090
|
+
# get the elapsed time from `absTime` to predicted v-sync time,
|
|
1091
|
+
# again this is an example, you would usually pass predicted time to
|
|
1092
|
+
# `getTrackingState` directly.
|
|
1093
|
+
dt = getPredictedDisplayTime() - absTime
|
|
1094
|
+
|
|
1095
|
+
# get the tracking state for the current time, poses will lag where
|
|
1096
|
+
# they are expected at predicted time by `dt` seconds
|
|
1097
|
+
trackingState = hmd.getTrackingState(absTime)
|
|
1098
|
+
|
|
1099
|
+
# time integrate a pose by `dt`
|
|
1100
|
+
headPoseState = trackingState.headPose
|
|
1101
|
+
headPosePredicted = headPoseState.timeIntegrate(dt)
|
|
1102
|
+
|
|
1103
|
+
# calc eye poses with predicted head pose, this is a custom pose to
|
|
1104
|
+
# head-locking should be enabled!
|
|
1105
|
+
hmd.calcEyePoses(headPosePredicted)
|
|
1106
|
+
|
|
1107
|
+
The resulting head pose is usually very close to what `getTrackingState`
|
|
1108
|
+
would return if the predicted time was used. Simple forward prediction
|
|
1109
|
+
with time integration becomes increasingly unstable as the prediction
|
|
1110
|
+
interval increases. Under normal circumstances, let the runtime handle
|
|
1111
|
+
forward prediction by using the pose states returned at the predicted
|
|
1112
|
+
display time. If you plan on doing your own forward prediction, you need
|
|
1113
|
+
enable head-locking, clamp the prediction interval, and apply some sort
|
|
1114
|
+
of smoothing to keep the image as stable as possible.
|
|
1115
|
+
|
|
1116
|
+
"""
|
|
1117
|
+
if absTime is None:
|
|
1118
|
+
absTime = self.getPredictedDisplayTime()
|
|
1119
|
+
|
|
1120
|
+
return libovr.getTrackingState(absTime, latencyMarker)
|
|
1121
|
+
|
|
1122
|
+
def calcEyePoses(self, headPose, originPose=None):
|
|
1123
|
+
"""Calculate eye poses for rendering.
|
|
1124
|
+
|
|
1125
|
+
This function calculates the eye poses to define the viewpoint
|
|
1126
|
+
transformation for each eye buffer. Upon starting a new frame, the
|
|
1127
|
+
application loop is halted until this function is called and returns.
|
|
1128
|
+
|
|
1129
|
+
Once this function returns, `setBuffer` may be called and frame
|
|
1130
|
+
rendering can commence. The computed eye pose for the selected buffer is
|
|
1131
|
+
accessible through the :py:attr:`eyeRenderPose` attribute after calling
|
|
1132
|
+
:py:meth:`setBuffer`. If `monoscopic=True`, the eye poses are set to
|
|
1133
|
+
the head pose.
|
|
1134
|
+
|
|
1135
|
+
The source data specified to `headPose` can originate from the tracking
|
|
1136
|
+
state retrieved by calling :py:meth:`getTrackingState`, or from
|
|
1137
|
+
other sources. If a custom head pose is specified (for instance, from a
|
|
1138
|
+
motion tracker), you must ensure `head-locking` is enabled to prevent
|
|
1139
|
+
the ASW feature of the compositor from engaging. Furthermore, you must
|
|
1140
|
+
specify sensor sample time for motion-to-photon calculation derived from
|
|
1141
|
+
the sample time of the custom tracking source.
|
|
1142
|
+
|
|
1143
|
+
Parameters
|
|
1144
|
+
----------
|
|
1145
|
+
headPose : LibOVRPose
|
|
1146
|
+
Head pose to use.
|
|
1147
|
+
originPose : LibOVRPose, optional
|
|
1148
|
+
Origin of tracking in the VR scene.
|
|
1149
|
+
|
|
1150
|
+
Examples
|
|
1151
|
+
--------
|
|
1152
|
+
Get the tracking state and calculate the eye poses::
|
|
1153
|
+
|
|
1154
|
+
# get tracking state at predicted mid-frame time
|
|
1155
|
+
trackingState = hmd.getTrackingState()
|
|
1156
|
+
|
|
1157
|
+
# get the head pose from the tracking state
|
|
1158
|
+
headPose = trackingState.headPose.thePose
|
|
1159
|
+
hmd.calcEyePoses(headPose) # compute eye poses
|
|
1160
|
+
|
|
1161
|
+
# begin rendering to each eye
|
|
1162
|
+
for eye in ('left', 'right'):
|
|
1163
|
+
hmd.setBuffer(eye)
|
|
1164
|
+
hmd.setRiftView()
|
|
1165
|
+
# draw stuff here ...
|
|
1166
|
+
|
|
1167
|
+
Using a custom head pose (make sure ``headLocked=True`` before doing
|
|
1168
|
+
this)::
|
|
1169
|
+
|
|
1170
|
+
headPose = createPose((0., 1.75, 0.))
|
|
1171
|
+
hmd.calcEyePoses(headPose) # compute eye poses
|
|
1172
|
+
|
|
1173
|
+
"""
|
|
1174
|
+
if not self._allowHmdRendering:
|
|
1175
|
+
return
|
|
1176
|
+
|
|
1177
|
+
libovr.calcEyePoses(headPose, originPose)
|
|
1178
|
+
self._headPose = headPose
|
|
1179
|
+
|
|
1180
|
+
# Calculate eye poses, this needs to be called every frame.
|
|
1181
|
+
# apply additional transformations to eye poses
|
|
1182
|
+
if not self._monoscopic:
|
|
1183
|
+
for eye, matrix in enumerate(self._viewMatrix):
|
|
1184
|
+
# compute each eye's transformation modelMatrix from returned poses
|
|
1185
|
+
libovr.getEyeViewMatrix(eye, matrix)
|
|
1186
|
+
else:
|
|
1187
|
+
# view modelMatrix derived from head position when in monoscopic mode
|
|
1188
|
+
self._viewMatrix = headPose.getViewMatrix()
|
|
1189
|
+
|
|
1190
|
+
self._startHmdFrame()
|
|
1191
|
+
|
|
1192
|
+
@property
|
|
1193
|
+
def eyeRenderPose(self):
|
|
1194
|
+
"""Computed eye pose for the current buffer. Only valid after calling
|
|
1195
|
+
:func:`calcEyePoses`.
|
|
1196
|
+
|
|
1197
|
+
"""
|
|
1198
|
+
if not self._monoscopic:
|
|
1199
|
+
if self.buffer == 'left':
|
|
1200
|
+
return libovr.getEyeRenderPose(libovr.EYE_LEFT)
|
|
1201
|
+
elif self.buffer == 'right':
|
|
1202
|
+
return libovr.getEyeRenderPose(libovr.EYE_RIGHT)
|
|
1203
|
+
else:
|
|
1204
|
+
return self._headPose
|
|
1205
|
+
|
|
1206
|
+
@property
|
|
1207
|
+
def shouldQuit(self):
|
|
1208
|
+
"""`True` if the user requested the application should quit through the
|
|
1209
|
+
headset's interface.
|
|
1210
|
+
"""
|
|
1211
|
+
return self._sessionStatus.shouldQuit
|
|
1212
|
+
|
|
1213
|
+
@property
|
|
1214
|
+
def isVisible(self):
|
|
1215
|
+
"""`True` if the app has focus in the HMD and is visible to the viewer.
|
|
1216
|
+
"""
|
|
1217
|
+
return self._sessionStatus.isVisible
|
|
1218
|
+
|
|
1219
|
+
@property
|
|
1220
|
+
def hmdMounted(self):
|
|
1221
|
+
"""`True` if the HMD is mounted on the user's head.
|
|
1222
|
+
"""
|
|
1223
|
+
return self._sessionStatus.hmdMounted
|
|
1224
|
+
|
|
1225
|
+
@property
|
|
1226
|
+
def hmdPresent(self):
|
|
1227
|
+
"""`True` if the HMD is present.
|
|
1228
|
+
"""
|
|
1229
|
+
return self._sessionStatus.hmdPresent
|
|
1230
|
+
|
|
1231
|
+
@property
|
|
1232
|
+
def shouldRecenter(self):
|
|
1233
|
+
"""`True` if the user requested the origin be re-centered through the
|
|
1234
|
+
headset's interface.
|
|
1235
|
+
"""
|
|
1236
|
+
return self._sessionStatus.shouldRecenter
|
|
1237
|
+
|
|
1238
|
+
@property
|
|
1239
|
+
def hasInputFocus(self):
|
|
1240
|
+
"""`True` if the application currently has input focus.
|
|
1241
|
+
"""
|
|
1242
|
+
return self._sessionStatus.hasInputFocus
|
|
1243
|
+
|
|
1244
|
+
@property
|
|
1245
|
+
def overlayPresent(self):
|
|
1246
|
+
return self._sessionStatus.overlayPresent
|
|
1247
|
+
|
|
1248
|
+
def _setupFrameBuffer(self):
|
|
1249
|
+
"""Override the default framebuffer init code in window.Window to use
|
|
1250
|
+
the HMD swap chain. The HMD's swap texture and render buffer are
|
|
1251
|
+
configured here.
|
|
1252
|
+
|
|
1253
|
+
If multisample anti-aliasing (MSAA) is enabled, a secondary render
|
|
1254
|
+
buffer is created. Rendering is diverted to the multi-sample buffer
|
|
1255
|
+
when drawing, which is then resolved into the HMD's swap chain texture
|
|
1256
|
+
prior to committing it to the chain. Consequently, you cannot pass
|
|
1257
|
+
the texture attached to the FBO specified by `frameBuffer` until the
|
|
1258
|
+
MSAA buffer is resolved. Doing so will result in a blank texture.
|
|
1259
|
+
|
|
1260
|
+
"""
|
|
1261
|
+
# create a texture swap chain for both eye textures
|
|
1262
|
+
result = libovr.createTextureSwapChainGL(
|
|
1263
|
+
libovr.TEXTURE_SWAP_CHAIN0,
|
|
1264
|
+
self._swapTextureSize[0],
|
|
1265
|
+
self._swapTextureSize[1])
|
|
1266
|
+
|
|
1267
|
+
if libovr.success(result):
|
|
1268
|
+
logging.info(
|
|
1269
|
+
'Created texture swap chain with dimensions {w}x{h}.'.format(
|
|
1270
|
+
w=self._swapTextureSize[0],
|
|
1271
|
+
h=self._swapTextureSize[1]))
|
|
1272
|
+
else:
|
|
1273
|
+
_, msg = libovr.getLastErrorInfo()
|
|
1274
|
+
raise LibOVRError(msg)
|
|
1275
|
+
|
|
1276
|
+
# assign the same swap chain to both eyes
|
|
1277
|
+
for eye in range(libovr.EYE_COUNT):
|
|
1278
|
+
libovr.setEyeColorTextureSwapChain(eye, libovr.TEXTURE_SWAP_CHAIN0)
|
|
1279
|
+
|
|
1280
|
+
# Use MSAA if more than one sample is specified. If enabled, a render
|
|
1281
|
+
# buffer will be created.
|
|
1282
|
+
#
|
|
1283
|
+
max_samples = GL.GLint()
|
|
1284
|
+
GL.glGetIntegerv(GL.GL_MAX_SAMPLES, max_samples)
|
|
1285
|
+
if isinstance(self._samples, int):
|
|
1286
|
+
if (self._samples & (self._samples - 1)) != 0:
|
|
1287
|
+
# power of two?
|
|
1288
|
+
logging.warning(
|
|
1289
|
+
'Invalid number of MSAA samples provided, must be '
|
|
1290
|
+
'power of two. Disabling.')
|
|
1291
|
+
elif 0 > self._samples > max_samples.value:
|
|
1292
|
+
# check if within range
|
|
1293
|
+
logging.warning(
|
|
1294
|
+
'Invalid number of MSAA samples provided, outside of valid '
|
|
1295
|
+
'range. Disabling.')
|
|
1296
|
+
elif isinstance(self._samples, str):
|
|
1297
|
+
if self._samples == 'max':
|
|
1298
|
+
self._samples = max_samples.value
|
|
1299
|
+
|
|
1300
|
+
# create an MSAA render buffer if self._samples > 1
|
|
1301
|
+
self.frameBufferMsaa = GL.GLuint() # is zero if not configured
|
|
1302
|
+
if self._samples > 1:
|
|
1303
|
+
logging.info(
|
|
1304
|
+
'Samples > 1, creating multi-sample framebuffer with dimensions'
|
|
1305
|
+
'{w}x{h}.'.format(w=int(self._swapTextureSize[0]),
|
|
1306
|
+
h=int(self._swapTextureSize[1])))
|
|
1307
|
+
|
|
1308
|
+
# multi-sample FBO and rander buffer
|
|
1309
|
+
GL.glGenFramebuffers(1, ctypes.byref(self.frameBufferMsaa))
|
|
1310
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
|
|
1311
|
+
|
|
1312
|
+
# we don't need a multi-sample texture
|
|
1313
|
+
rb_color_msaa_id = GL.GLuint()
|
|
1314
|
+
GL.glGenRenderbuffers(1, ctypes.byref(rb_color_msaa_id))
|
|
1315
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, rb_color_msaa_id)
|
|
1316
|
+
GL.glRenderbufferStorageMultisample(
|
|
1317
|
+
GL.GL_RENDERBUFFER,
|
|
1318
|
+
self._samples,
|
|
1319
|
+
GL.GL_RGBA8,
|
|
1320
|
+
int(self._swapTextureSize[0]),
|
|
1321
|
+
int(self._swapTextureSize[1]))
|
|
1322
|
+
GL.glFramebufferRenderbuffer(
|
|
1323
|
+
GL.GL_FRAMEBUFFER,
|
|
1324
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
1325
|
+
GL.GL_RENDERBUFFER,
|
|
1326
|
+
rb_color_msaa_id)
|
|
1327
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
|
|
1328
|
+
|
|
1329
|
+
rb_depth_msaa_id = GL.GLuint()
|
|
1330
|
+
GL.glGenRenderbuffers(1, ctypes.byref(rb_depth_msaa_id))
|
|
1331
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, rb_depth_msaa_id)
|
|
1332
|
+
GL.glRenderbufferStorageMultisample(
|
|
1333
|
+
GL.GL_RENDERBUFFER,
|
|
1334
|
+
self._samples,
|
|
1335
|
+
GL.GL_DEPTH24_STENCIL8,
|
|
1336
|
+
int(self._swapTextureSize[0]),
|
|
1337
|
+
int(self._swapTextureSize[1]))
|
|
1338
|
+
GL.glFramebufferRenderbuffer(
|
|
1339
|
+
GL.GL_FRAMEBUFFER,
|
|
1340
|
+
GL.GL_DEPTH_ATTACHMENT,
|
|
1341
|
+
GL.GL_RENDERBUFFER,
|
|
1342
|
+
rb_depth_msaa_id)
|
|
1343
|
+
GL.glFramebufferRenderbuffer(
|
|
1344
|
+
GL.GL_FRAMEBUFFER,
|
|
1345
|
+
GL.GL_STENCIL_ATTACHMENT,
|
|
1346
|
+
GL.GL_RENDERBUFFER,
|
|
1347
|
+
rb_depth_msaa_id)
|
|
1348
|
+
|
|
1349
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
|
|
1350
|
+
GL.glClear(GL.GL_STENCIL_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
|
|
1351
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1352
|
+
|
|
1353
|
+
# create a frame buffer object as a render target for the HMD textures
|
|
1354
|
+
self.frameBuffer = GL.GLuint()
|
|
1355
|
+
GL.glGenFramebuffers(1, ctypes.byref(self.frameBuffer))
|
|
1356
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
1357
|
+
|
|
1358
|
+
# initialize the frame texture variable
|
|
1359
|
+
self.frameTexture = 0
|
|
1360
|
+
|
|
1361
|
+
# create depth and stencil render buffers
|
|
1362
|
+
depth_rb_id = GL.GLuint()
|
|
1363
|
+
GL.glGenRenderbuffers(1, ctypes.byref(depth_rb_id))
|
|
1364
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, depth_rb_id)
|
|
1365
|
+
GL.glRenderbufferStorage(
|
|
1366
|
+
GL.GL_RENDERBUFFER,
|
|
1367
|
+
GL.GL_DEPTH24_STENCIL8,
|
|
1368
|
+
int(self._swapTextureSize[0]),
|
|
1369
|
+
int(self._swapTextureSize[1]))
|
|
1370
|
+
GL.glFramebufferRenderbuffer(
|
|
1371
|
+
GL.GL_FRAMEBUFFER,
|
|
1372
|
+
GL.GL_DEPTH_ATTACHMENT,
|
|
1373
|
+
GL.GL_RENDERBUFFER,
|
|
1374
|
+
depth_rb_id)
|
|
1375
|
+
GL.glFramebufferRenderbuffer(
|
|
1376
|
+
GL.GL_FRAMEBUFFER,
|
|
1377
|
+
GL.GL_STENCIL_ATTACHMENT,
|
|
1378
|
+
GL.GL_RENDERBUFFER,
|
|
1379
|
+
depth_rb_id)
|
|
1380
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
|
|
1381
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1382
|
+
self._frameStencil = depth_rb_id # should make this the MSAA's?
|
|
1383
|
+
|
|
1384
|
+
GL.glClear(GL.GL_STENCIL_BUFFER_BIT)
|
|
1385
|
+
GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
|
|
1386
|
+
|
|
1387
|
+
# Setup the mirror texture framebuffer. The swap chain is managed
|
|
1388
|
+
# internally by PsychXR.
|
|
1389
|
+
self._mirrorFbo = GL.GLuint()
|
|
1390
|
+
GL.glGenFramebuffers(1, ctypes.byref(self._mirrorFbo))
|
|
1391
|
+
|
|
1392
|
+
if self._mirrorRes is None:
|
|
1393
|
+
self._mirrorRes = self.frameBufferSize
|
|
1394
|
+
|
|
1395
|
+
mirrorW, mirrorH = self._mirrorRes
|
|
1396
|
+
if libovr.success(libovr.createMirrorTexture(
|
|
1397
|
+
mirrorW,
|
|
1398
|
+
mirrorH,
|
|
1399
|
+
mirrorOptions=RIFT_MIRROR_MODES[self._mirrorMode])):
|
|
1400
|
+
logging.info(
|
|
1401
|
+
'Created mirror texture with dimensions {w} x {h}'.format(
|
|
1402
|
+
w=mirrorW, h=mirrorH))
|
|
1403
|
+
else:
|
|
1404
|
+
_, msg = libovr.getLastErrorInfo()
|
|
1405
|
+
raise LibOVRError(msg)
|
|
1406
|
+
|
|
1407
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
1408
|
+
|
|
1409
|
+
return True # assume the FBOs are complete for now
|
|
1410
|
+
|
|
1411
|
+
def _resolveMSAA(self):
|
|
1412
|
+
"""Resolve multisample anti-aliasing (MSAA). If MSAA is enabled, drawing
|
|
1413
|
+
operations are diverted to a special multisample render buffer. Pixel
|
|
1414
|
+
data must be 'resolved' by blitting it to the swap chain texture. If
|
|
1415
|
+
not, the texture will be blank.
|
|
1416
|
+
|
|
1417
|
+
Notes
|
|
1418
|
+
-----
|
|
1419
|
+
You cannot perform operations on the default FBO (at `frameBuffer`) when
|
|
1420
|
+
MSAA is enabled. Any changes will be over-written when 'flip' is called.
|
|
1421
|
+
|
|
1422
|
+
"""
|
|
1423
|
+
# if multi-sampling is off just NOP
|
|
1424
|
+
if self._samples == 1:
|
|
1425
|
+
return
|
|
1426
|
+
|
|
1427
|
+
# bind framebuffer
|
|
1428
|
+
GL.glBindFramebuffer(GL.GL_READ_FRAMEBUFFER, self.frameBufferMsaa)
|
|
1429
|
+
GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, self.frameBuffer)
|
|
1430
|
+
|
|
1431
|
+
# bind the HMD swap texture to the draw buffer
|
|
1432
|
+
GL.glFramebufferTexture2D(
|
|
1433
|
+
GL.GL_DRAW_FRAMEBUFFER,
|
|
1434
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
1435
|
+
GL.GL_TEXTURE_2D,
|
|
1436
|
+
self.frameTexture,
|
|
1437
|
+
0)
|
|
1438
|
+
|
|
1439
|
+
# blit the texture
|
|
1440
|
+
fbo_w, fbo_h = self._swapTextureSize
|
|
1441
|
+
self.viewport = self.scissor = (0, 0, fbo_w, fbo_h)
|
|
1442
|
+
GL.glBlitFramebuffer(
|
|
1443
|
+
0, 0, fbo_w, fbo_h,
|
|
1444
|
+
0, 0, fbo_w, fbo_h, # flips texture
|
|
1445
|
+
GL.GL_COLOR_BUFFER_BIT,
|
|
1446
|
+
GL.GL_NEAREST)
|
|
1447
|
+
|
|
1448
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1449
|
+
|
|
1450
|
+
def _prepareMonoFrame(self, clear=True):
|
|
1451
|
+
"""Prepare a frame for monoscopic rendering. This is called
|
|
1452
|
+
automatically after :func:`_startHmdFrame` if monoscopic rendering is
|
|
1453
|
+
enabled.
|
|
1454
|
+
|
|
1455
|
+
"""
|
|
1456
|
+
# bind the framebuffer, if MSAA is enabled binding the texture is
|
|
1457
|
+
# deferred until the MSAA buffer is resolved.
|
|
1458
|
+
if self._samples > 1:
|
|
1459
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
|
|
1460
|
+
else:
|
|
1461
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
1462
|
+
GL.glFramebufferTexture2D(
|
|
1463
|
+
GL.GL_FRAMEBUFFER,
|
|
1464
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
1465
|
+
GL.GL_TEXTURE_2D,
|
|
1466
|
+
self.frameTexture,
|
|
1467
|
+
0)
|
|
1468
|
+
|
|
1469
|
+
# use the mono viewport
|
|
1470
|
+
self.buffer = 'mono'
|
|
1471
|
+
GL.glEnable(GL.GL_SCISSOR_TEST)
|
|
1472
|
+
|
|
1473
|
+
self.viewport = self.scissor = \
|
|
1474
|
+
libovr.getEyeRenderViewport(libovr.EYE_LEFT) # mono mode
|
|
1475
|
+
GL.glDepthMask(GL.GL_TRUE)
|
|
1476
|
+
|
|
1477
|
+
if clear:
|
|
1478
|
+
self.setColor(self.color, colorSpace=self.colorSpace) # clear the texture to the window color
|
|
1479
|
+
GL.glClear(
|
|
1480
|
+
GL.GL_COLOR_BUFFER_BIT |
|
|
1481
|
+
GL.GL_DEPTH_BUFFER_BIT |
|
|
1482
|
+
GL.GL_STENCIL_BUFFER_BIT
|
|
1483
|
+
)
|
|
1484
|
+
|
|
1485
|
+
# if self.sRGB:
|
|
1486
|
+
# GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
|
|
1487
|
+
|
|
1488
|
+
if self._samples > 1:
|
|
1489
|
+
GL.glEnable(GL.GL_MULTISAMPLE)
|
|
1490
|
+
|
|
1491
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
1492
|
+
GL.glEnable(GL.GL_BLEND)
|
|
1493
|
+
|
|
1494
|
+
def setBuffer(self, buffer, clear=True):
|
|
1495
|
+
"""Set the active draw buffer.
|
|
1496
|
+
|
|
1497
|
+
Warnings
|
|
1498
|
+
--------
|
|
1499
|
+
The window.Window.size property will return the buffer's dimensions in
|
|
1500
|
+
pixels instead of the window's when `setBuffer` is set to 'left' or
|
|
1501
|
+
'right'.
|
|
1502
|
+
|
|
1503
|
+
Parameters
|
|
1504
|
+
----------
|
|
1505
|
+
buffer : str
|
|
1506
|
+
View buffer to divert successive drawing operations to, can be
|
|
1507
|
+
either 'left' or 'right'.
|
|
1508
|
+
clear : boolean
|
|
1509
|
+
Clear the color, stencil and depth buffer.
|
|
1510
|
+
|
|
1511
|
+
"""
|
|
1512
|
+
# if monoscopic, nop
|
|
1513
|
+
if self._monoscopic:
|
|
1514
|
+
warnings.warn("`setBuffer` called in monoscopic mode.", RuntimeWarning)
|
|
1515
|
+
return
|
|
1516
|
+
|
|
1517
|
+
# check if the buffer name is valid
|
|
1518
|
+
if buffer not in ('left', 'right'):
|
|
1519
|
+
raise RuntimeError("Invalid buffer name specified.")
|
|
1520
|
+
|
|
1521
|
+
# bind the framebuffer, if MSAA is enabled binding the texture is
|
|
1522
|
+
# deferred until the MSAA buffer is resolved.
|
|
1523
|
+
if self._samples > 1:
|
|
1524
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
|
|
1525
|
+
else:
|
|
1526
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
1527
|
+
GL.glFramebufferTexture2D(
|
|
1528
|
+
GL.GL_FRAMEBUFFER,
|
|
1529
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
1530
|
+
GL.GL_TEXTURE_2D,
|
|
1531
|
+
self.frameTexture,
|
|
1532
|
+
0)
|
|
1533
|
+
|
|
1534
|
+
self.buffer = buffer # set buffer string
|
|
1535
|
+
GL.glEnable(GL.GL_SCISSOR_TEST)
|
|
1536
|
+
|
|
1537
|
+
# set the viewport and scissor rect for the buffer
|
|
1538
|
+
if buffer == 'left':
|
|
1539
|
+
self.viewport = self.scissor = libovr.getEyeRenderViewport(
|
|
1540
|
+
libovr.EYE_LEFT)
|
|
1541
|
+
elif buffer == 'right':
|
|
1542
|
+
self.viewport = self.scissor = libovr.getEyeRenderViewport(
|
|
1543
|
+
libovr.EYE_RIGHT)
|
|
1544
|
+
|
|
1545
|
+
if clear:
|
|
1546
|
+
self.setColor(self.color, colorSpace=self.colorSpace) # clear the texture to the window color
|
|
1547
|
+
GL.glClearDepth(1.0)
|
|
1548
|
+
GL.glDepthMask(GL.GL_TRUE)
|
|
1549
|
+
GL.glClear(
|
|
1550
|
+
GL.GL_COLOR_BUFFER_BIT |
|
|
1551
|
+
GL.GL_DEPTH_BUFFER_BIT |
|
|
1552
|
+
GL.GL_STENCIL_BUFFER_BIT)
|
|
1553
|
+
|
|
1554
|
+
# if self.sRGB:
|
|
1555
|
+
# GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
|
|
1556
|
+
|
|
1557
|
+
if self._samples > 1:
|
|
1558
|
+
GL.glEnable(GL.GL_MULTISAMPLE)
|
|
1559
|
+
|
|
1560
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
1561
|
+
GL.glEnable(GL.GL_BLEND)
|
|
1562
|
+
|
|
1563
|
+
def getPredictedDisplayTime(self):
|
|
1564
|
+
"""Get the predicted time the next frame will be displayed on the HMD.
|
|
1565
|
+
The returned time is referenced to the clock `LibOVR` is using.
|
|
1566
|
+
|
|
1567
|
+
Returns
|
|
1568
|
+
-------
|
|
1569
|
+
float
|
|
1570
|
+
Absolute frame mid-point time for the given frame index in seconds.
|
|
1571
|
+
|
|
1572
|
+
"""
|
|
1573
|
+
return libovr.getPredictedDisplayTime(self._frameIndex)
|
|
1574
|
+
|
|
1575
|
+
def getTimeInSeconds(self):
|
|
1576
|
+
"""Absolute time in seconds. The returned time is referenced to the
|
|
1577
|
+
clock `LibOVR` is using.
|
|
1578
|
+
|
|
1579
|
+
Returns
|
|
1580
|
+
-------
|
|
1581
|
+
float
|
|
1582
|
+
Time in seconds.
|
|
1583
|
+
|
|
1584
|
+
"""
|
|
1585
|
+
return libovr.timeInSeconds()
|
|
1586
|
+
|
|
1587
|
+
@property
|
|
1588
|
+
def viewMatrix(self):
|
|
1589
|
+
"""The view matrix for the current eye buffer. Only valid after a
|
|
1590
|
+
:py:meth:`calcEyePoses` call. Note that setting `viewMatrix` manually
|
|
1591
|
+
will break visibility culling.
|
|
1592
|
+
|
|
1593
|
+
"""
|
|
1594
|
+
if not self._monoscopic:
|
|
1595
|
+
if self.buffer == 'left':
|
|
1596
|
+
return self._viewMatrix[libovr.EYE_LEFT]
|
|
1597
|
+
elif self.buffer == 'right':
|
|
1598
|
+
return self._viewMatrix[libovr.EYE_RIGHT]
|
|
1599
|
+
else:
|
|
1600
|
+
return self._viewMatrix
|
|
1601
|
+
|
|
1602
|
+
@property
|
|
1603
|
+
def nearClip(self):
|
|
1604
|
+
"""Distance to the near clipping plane in meters."""
|
|
1605
|
+
return self._nearClip
|
|
1606
|
+
|
|
1607
|
+
@nearClip.setter
|
|
1608
|
+
def nearClip(self, value):
|
|
1609
|
+
self._nearClip = value
|
|
1610
|
+
self._updateProjectionMatrix()
|
|
1611
|
+
|
|
1612
|
+
@property
|
|
1613
|
+
def farClip(self):
|
|
1614
|
+
"""Distance to the far clipping plane in meters."""
|
|
1615
|
+
return self._farClip
|
|
1616
|
+
|
|
1617
|
+
@farClip.setter
|
|
1618
|
+
def farClip(self, value):
|
|
1619
|
+
self._farClip = value
|
|
1620
|
+
self._updateProjectionMatrix()
|
|
1621
|
+
|
|
1622
|
+
@property
|
|
1623
|
+
def projectionMatrix(self):
|
|
1624
|
+
"""Get the projection matrix for the current eye buffer. Note that
|
|
1625
|
+
setting `projectionMatrix` manually will break visibility culling.
|
|
1626
|
+
|
|
1627
|
+
"""
|
|
1628
|
+
if not self._monoscopic:
|
|
1629
|
+
if self.buffer == 'left':
|
|
1630
|
+
return self._projectionMatrix[libovr.EYE_LEFT]
|
|
1631
|
+
elif self.buffer == 'right':
|
|
1632
|
+
return self._projectionMatrix[libovr.EYE_RIGHT]
|
|
1633
|
+
else:
|
|
1634
|
+
return self._projectionMatrix
|
|
1635
|
+
|
|
1636
|
+
@property
|
|
1637
|
+
def isBoundaryVisible(self):
|
|
1638
|
+
"""True if the VR boundary is visible.
|
|
1639
|
+
"""
|
|
1640
|
+
result, isVisible = libovr.getBoundaryVisible()
|
|
1641
|
+
return bool(isVisible)
|
|
1642
|
+
|
|
1643
|
+
def getBoundaryDimensions(self, boundaryType='PlayArea'):
|
|
1644
|
+
"""Get boundary dimensions.
|
|
1645
|
+
|
|
1646
|
+
Parameters
|
|
1647
|
+
----------
|
|
1648
|
+
boundaryType : str
|
|
1649
|
+
Boundary type, can be 'PlayArea' or 'Outer'.
|
|
1650
|
+
|
|
1651
|
+
Returns
|
|
1652
|
+
-------
|
|
1653
|
+
ndarray
|
|
1654
|
+
Dimensions of the boundary meters [x, y, z].
|
|
1655
|
+
|
|
1656
|
+
"""
|
|
1657
|
+
result, dims = libovr.getBoundaryDimensions(
|
|
1658
|
+
RIFT_BOUNDARY_TYPE[boundaryType])
|
|
1659
|
+
|
|
1660
|
+
return dims
|
|
1661
|
+
|
|
1662
|
+
@property
|
|
1663
|
+
def connectedControllers(self):
|
|
1664
|
+
"""Connected controller types (`list` of `str`)"""
|
|
1665
|
+
controllers = libovr.getConnectedControllerTypes()
|
|
1666
|
+
ctrlKeys = {val: key for key, val in RIFT_CONTROLLER_TYPES.items()}
|
|
1667
|
+
|
|
1668
|
+
return [ctrlKeys[ctrl] for ctrl in controllers]
|
|
1669
|
+
|
|
1670
|
+
def updateInputState(self, controllers=None):
|
|
1671
|
+
"""Update all connected controller states. This updates controller input
|
|
1672
|
+
states for an input device managed by `LibOVR`.
|
|
1673
|
+
|
|
1674
|
+
The polling time for each device is accessible through the
|
|
1675
|
+
`controllerPollTimes` attribute. This attribute returns a dictionary
|
|
1676
|
+
where the polling time from the last `updateInputState` call for a
|
|
1677
|
+
given controller can be retrieved by using the name as a key.
|
|
1678
|
+
|
|
1679
|
+
Parameters
|
|
1680
|
+
----------
|
|
1681
|
+
controllers : tuple or list, optional
|
|
1682
|
+
List of controllers to poll. If `None`, all available controllers
|
|
1683
|
+
will be polled.
|
|
1684
|
+
|
|
1685
|
+
Examples
|
|
1686
|
+
--------
|
|
1687
|
+
Poll the state of specific controllers by name::
|
|
1688
|
+
|
|
1689
|
+
controllers = ['XBox', 'Touch']
|
|
1690
|
+
updateInputState(controllers)
|
|
1691
|
+
|
|
1692
|
+
"""
|
|
1693
|
+
if controllers is None:
|
|
1694
|
+
toPoll = libovr.getConnectedControllerTypes()
|
|
1695
|
+
elif isinstance(controllers, (list, tuple,)):
|
|
1696
|
+
toPoll = [RIFT_CONTROLLER_TYPES[ctrl] for ctrl in controllers]
|
|
1697
|
+
else:
|
|
1698
|
+
raise TypeError("Argument 'controllers' must be iterable type.")
|
|
1699
|
+
|
|
1700
|
+
for i in toPoll:
|
|
1701
|
+
result, t_sec = libovr.updateInputState(i)
|
|
1702
|
+
self.controllerPollTimes[RIFT_CONTROLLER_TYPES[i]] = t_sec
|
|
1703
|
+
|
|
1704
|
+
def _waitToBeginHmdFrame(self):
|
|
1705
|
+
"""Wait until the HMD surfaces are available for rendering.
|
|
1706
|
+
"""
|
|
1707
|
+
# First time this function is called, make True.
|
|
1708
|
+
if not self._allowHmdRendering:
|
|
1709
|
+
self._allowHmdRendering = True
|
|
1710
|
+
|
|
1711
|
+
# update session status
|
|
1712
|
+
result, status = libovr.getSessionStatus()
|
|
1713
|
+
self._sessionStatus = status
|
|
1714
|
+
|
|
1715
|
+
# get performance stats for the last frame
|
|
1716
|
+
self._updatePerfStats()
|
|
1717
|
+
|
|
1718
|
+
# Wait for the buffer to be freed by the compositor, this is like
|
|
1719
|
+
# waiting for v-sync.
|
|
1720
|
+
libovr.waitToBeginFrame(self._frameIndex)
|
|
1721
|
+
|
|
1722
|
+
# update input states
|
|
1723
|
+
if self.autoUpdateInput:
|
|
1724
|
+
self.updateInputState()
|
|
1725
|
+
|
|
1726
|
+
#if result == ovr.SUCCESS_NOT_VISIBLE:
|
|
1727
|
+
# pass
|
|
1728
|
+
#self.updateInputState() # poll controller states
|
|
1729
|
+
|
|
1730
|
+
# # update the tracking state
|
|
1731
|
+
# if self.autoUpdatePoses:
|
|
1732
|
+
# # get the current frame time
|
|
1733
|
+
# absTime = libovr.getPredictedDisplayTime(self._frameIndex)
|
|
1734
|
+
# # Get the current tracking state structure, estimated poses for the
|
|
1735
|
+
# # head and hands are stored here. The latency marker for computing
|
|
1736
|
+
# # motion-to-photon latency is set when this function is called.
|
|
1737
|
+
# self.calcEyePoses()
|
|
1738
|
+
|
|
1739
|
+
def _startHmdFrame(self):
|
|
1740
|
+
"""Prepare to render an HMD frame. This must be called every frame
|
|
1741
|
+
before flipping or setting the view buffer.
|
|
1742
|
+
|
|
1743
|
+
This function will wait until the HMD is ready to begin rendering before
|
|
1744
|
+
continuing. The current frame texture from the swap chain are pulled
|
|
1745
|
+
from the SDK and made available for binding.
|
|
1746
|
+
|
|
1747
|
+
"""
|
|
1748
|
+
# begin frame
|
|
1749
|
+
libovr.beginFrame(self._frameIndex)
|
|
1750
|
+
# get the next available buffer texture in the swap chain
|
|
1751
|
+
result, swapChainIdx = libovr.getTextureSwapChainCurrentIndex(
|
|
1752
|
+
libovr.TEXTURE_SWAP_CHAIN0)
|
|
1753
|
+
result, colorTextureId = libovr.getTextureSwapChainBufferGL(
|
|
1754
|
+
libovr.TEXTURE_SWAP_CHAIN0, swapChainIdx)
|
|
1755
|
+
self.frameTexture = colorTextureId
|
|
1756
|
+
|
|
1757
|
+
# If mono mode, we want to configure the render framebuffer at this
|
|
1758
|
+
# point since 'setBuffer' will not be called.
|
|
1759
|
+
if self._monoscopic:
|
|
1760
|
+
self._prepareMonoFrame()
|
|
1761
|
+
|
|
1762
|
+
def _startOfFlip(self):
|
|
1763
|
+
"""Custom :py:class:`~Rift._startOfFlip` for HMD rendering. This
|
|
1764
|
+
finalizes the HMD texture before diverting drawing operations back to
|
|
1765
|
+
the on-screen window. This allows :py:class:`~Rift.flip` to swap the
|
|
1766
|
+
on-screen and HMD buffers when called. This function always returns
|
|
1767
|
+
`True`.
|
|
1768
|
+
|
|
1769
|
+
Returns
|
|
1770
|
+
-------
|
|
1771
|
+
True
|
|
1772
|
+
|
|
1773
|
+
"""
|
|
1774
|
+
# Switch off multi-sampling
|
|
1775
|
+
GL.glDisable(GL.GL_MULTISAMPLE)
|
|
1776
|
+
|
|
1777
|
+
if self._allowHmdRendering:
|
|
1778
|
+
# resolve MSAA buffers
|
|
1779
|
+
self._resolveMSAA()
|
|
1780
|
+
|
|
1781
|
+
# commit current texture buffer to the swap chain
|
|
1782
|
+
libovr.commitTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
|
|
1783
|
+
|
|
1784
|
+
# Call end_frame and increment the frame index, no more rendering to
|
|
1785
|
+
# HMD's view texture at this point.
|
|
1786
|
+
result, _ = libovr.endFrame(self._frameIndex)
|
|
1787
|
+
|
|
1788
|
+
if libovr.failure(result):
|
|
1789
|
+
if result == libovr.ERROR_DISPLAY_LOST: # display lost!
|
|
1790
|
+
libovr.destroyMirrorTexture()
|
|
1791
|
+
libovr.destroyTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
|
|
1792
|
+
libovr.destroy()
|
|
1793
|
+
#libovr.shutdown() # avoid error
|
|
1794
|
+
|
|
1795
|
+
_, msg = libovr.getLastErrorInfo()
|
|
1796
|
+
raise LibOVRError(msg)
|
|
1797
|
+
|
|
1798
|
+
self._frameIndex += 1 # increment frame index
|
|
1799
|
+
|
|
1800
|
+
# Set to None so the 'size' attribute returns the on-screen window size.
|
|
1801
|
+
self.buffer = None
|
|
1802
|
+
|
|
1803
|
+
# Make sure this is called after flipping, this updates VR information
|
|
1804
|
+
# and diverts rendering to the HMD texture.
|
|
1805
|
+
#self.callOnFlip(self._waitToBeginHmdFrame)
|
|
1806
|
+
|
|
1807
|
+
# Call frame timing routines
|
|
1808
|
+
#self.callOnFlip(self._updatePerformanceStats)
|
|
1809
|
+
|
|
1810
|
+
# This always returns True
|
|
1811
|
+
return True
|
|
1812
|
+
|
|
1813
|
+
def flip(self, clearBuffer=True, drawMirror=True):
|
|
1814
|
+
"""Submit view buffer images to the HMD's compositor for display at next
|
|
1815
|
+
V-SYNC and draw the mirror texture to the on-screen window. This must
|
|
1816
|
+
be called every frame.
|
|
1817
|
+
|
|
1818
|
+
Parameters
|
|
1819
|
+
----------
|
|
1820
|
+
clearBuffer : bool
|
|
1821
|
+
Clear the frame after flipping.
|
|
1822
|
+
drawMirror : bool
|
|
1823
|
+
Draw the HMD mirror texture from the compositor to the window.
|
|
1824
|
+
|
|
1825
|
+
Returns
|
|
1826
|
+
-------
|
|
1827
|
+
float
|
|
1828
|
+
Absolute time in seconds when control was given back to the
|
|
1829
|
+
application. The difference between the current and previous values
|
|
1830
|
+
should be very close to 1 / refreshRate of the HMD.
|
|
1831
|
+
|
|
1832
|
+
Notes
|
|
1833
|
+
-----
|
|
1834
|
+
|
|
1835
|
+
* The HMD compositor and application are asynchronous, therefore there
|
|
1836
|
+
is no guarantee that the timestamp returned by 'flip' corresponds to
|
|
1837
|
+
the exact vertical retrace time of the HMD.
|
|
1838
|
+
|
|
1839
|
+
"""
|
|
1840
|
+
# NOTE: Most of this code is shared with the regular Window's flip
|
|
1841
|
+
# function for compatibility. We're only concerned with calling the
|
|
1842
|
+
# _startOfFlip function and drawing the mirror texture to the onscreen
|
|
1843
|
+
# window. Display timing functions are kept in for now, but they are not
|
|
1844
|
+
# active.
|
|
1845
|
+
#
|
|
1846
|
+
|
|
1847
|
+
flipThisFrame = self._startOfFlip()
|
|
1848
|
+
if flipThisFrame:
|
|
1849
|
+
self._prepareFBOrender()
|
|
1850
|
+
# need blit the framebuffer object to the actual back buffer
|
|
1851
|
+
result, mirrorTexId = libovr.getMirrorTexture()
|
|
1852
|
+
if libovr.failure(result):
|
|
1853
|
+
_, msg = libovr.getLastErrorInfo()
|
|
1854
|
+
raise LibOVRError(msg)
|
|
1855
|
+
|
|
1856
|
+
# unbind the framebuffer as the render target
|
|
1857
|
+
GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
|
|
1858
|
+
GL.glDisable(GL.GL_BLEND)
|
|
1859
|
+
stencilOn = GL.glIsEnabled(GL.GL_STENCIL_TEST)
|
|
1860
|
+
GL.glDisable(GL.GL_STENCIL_TEST)
|
|
1861
|
+
|
|
1862
|
+
win_w, win_h = self.frameBufferSize
|
|
1863
|
+
self.viewport = self.scissor = (0, 0, win_w, win_h)
|
|
1864
|
+
|
|
1865
|
+
# draw the mirror texture, if not anything drawn to the backbuffer
|
|
1866
|
+
# will be displayed instead
|
|
1867
|
+
if drawMirror:
|
|
1868
|
+
# blit mirror texture
|
|
1869
|
+
GL.glBindFramebuffer(GL.GL_READ_FRAMEBUFFER, self._mirrorFbo)
|
|
1870
|
+
GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, 0)
|
|
1871
|
+
|
|
1872
|
+
GL.glEnable(GL.GL_FRAMEBUFFER_SRGB)
|
|
1873
|
+
# bind the rift's texture to the framebuffer
|
|
1874
|
+
GL.glFramebufferTexture2D(
|
|
1875
|
+
GL.GL_READ_FRAMEBUFFER,
|
|
1876
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
1877
|
+
GL.GL_TEXTURE_2D, mirrorTexId, 0)
|
|
1878
|
+
|
|
1879
|
+
win_w, win_h = self.frameBufferSize
|
|
1880
|
+
|
|
1881
|
+
tex_w, tex_h = self._mirrorRes
|
|
1882
|
+
self.viewport = self.scissor = (0, 0, win_w, win_h)
|
|
1883
|
+
GL.glClearColor(0.0, 0.0, 0.0, 1.0)
|
|
1884
|
+
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
|
|
1885
|
+
GL.glBlitFramebuffer(0, 0, tex_w, tex_h,
|
|
1886
|
+
0, win_h, win_w, 0, # flips texture
|
|
1887
|
+
GL.GL_COLOR_BUFFER_BIT,
|
|
1888
|
+
GL.GL_LINEAR)
|
|
1889
|
+
|
|
1890
|
+
GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
|
|
1891
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1892
|
+
|
|
1893
|
+
self._finishFBOrender()
|
|
1894
|
+
|
|
1895
|
+
# call this before flip() whether FBO was used or not
|
|
1896
|
+
self._afterFBOrender()
|
|
1897
|
+
|
|
1898
|
+
# flip the mirror window
|
|
1899
|
+
self.backend.swapBuffers(flipThisFrame)
|
|
1900
|
+
|
|
1901
|
+
if flipThisFrame:
|
|
1902
|
+
# set rendering back to the framebuffer object
|
|
1903
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1904
|
+
#GL.glReadBuffer(GL.GL_BACK)
|
|
1905
|
+
#GL.glDrawBuffer(GL.GL_BACK)
|
|
1906
|
+
GL.glClearColor(0.0, 0.0, 0.0, 1.0)
|
|
1907
|
+
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
|
|
1908
|
+
# set to no active rendering texture
|
|
1909
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
1910
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
1911
|
+
if stencilOn:
|
|
1912
|
+
GL.glEnable(GL.GL_STENCIL_TEST)
|
|
1913
|
+
|
|
1914
|
+
# reset returned buffer for next frame
|
|
1915
|
+
self._endOfFlip(clearBuffer)
|
|
1916
|
+
|
|
1917
|
+
# wait until surfaces are available for drawing
|
|
1918
|
+
self._waitToBeginHmdFrame()
|
|
1919
|
+
|
|
1920
|
+
# get timestamp at the point control is handed back to the application
|
|
1921
|
+
now = logging.defaultClock.getTime()
|
|
1922
|
+
|
|
1923
|
+
# run other functions immediately after flip completes
|
|
1924
|
+
for callEntry in self._toCall:
|
|
1925
|
+
callEntry['function'](*callEntry['args'], **callEntry['kwargs'])
|
|
1926
|
+
del self._toCall[:]
|
|
1927
|
+
|
|
1928
|
+
# do bookkeeping
|
|
1929
|
+
if self.recordFrameIntervals:
|
|
1930
|
+
self.frames += 1
|
|
1931
|
+
deltaT = now - self.lastFrameT
|
|
1932
|
+
self.lastFrameT = now
|
|
1933
|
+
if self.recordFrameIntervalsJustTurnedOn: # don't do anything
|
|
1934
|
+
self.recordFrameIntervalsJustTurnedOn = False
|
|
1935
|
+
else: # past the first frame since turned on
|
|
1936
|
+
self.frameIntervals.append(deltaT)
|
|
1937
|
+
if deltaT > self.refreshThreshold:
|
|
1938
|
+
self.nDroppedFrames += 1
|
|
1939
|
+
if self.nDroppedFrames < reportNDroppedFrames:
|
|
1940
|
+
txt = 't of last frame was %.2fms (=1/%i)'
|
|
1941
|
+
msg = txt % (deltaT * 1000, 1 / deltaT)
|
|
1942
|
+
logging.warning(msg, t=now)
|
|
1943
|
+
elif self.nDroppedFrames == reportNDroppedFrames:
|
|
1944
|
+
logging.warning("Multiple dropped frames have "
|
|
1945
|
+
"occurred - I'll stop bothering you "
|
|
1946
|
+
"about them!")
|
|
1947
|
+
|
|
1948
|
+
# log events
|
|
1949
|
+
for logEntry in self._toLog:
|
|
1950
|
+
# {'msg':msg, 'level':level, 'obj':copy.copy(obj)}
|
|
1951
|
+
logging.log(msg=logEntry['msg'],
|
|
1952
|
+
level=logEntry['level'],
|
|
1953
|
+
t=now,
|
|
1954
|
+
obj=logEntry['obj'])
|
|
1955
|
+
del self._toLog[:]
|
|
1956
|
+
|
|
1957
|
+
# keep the system awake (prevent screen-saver or sleep)
|
|
1958
|
+
platform_specific.sendStayAwake()
|
|
1959
|
+
|
|
1960
|
+
return now
|
|
1961
|
+
|
|
1962
|
+
def multiplyViewMatrixGL(self):
|
|
1963
|
+
"""Multiply the local eye pose transformation modelMatrix obtained from the
|
|
1964
|
+
SDK using ``glMultMatrixf``. The modelMatrix used depends on the current eye
|
|
1965
|
+
buffer set by :func:`setBuffer`.
|
|
1966
|
+
|
|
1967
|
+
Returns
|
|
1968
|
+
-------
|
|
1969
|
+
None
|
|
1970
|
+
|
|
1971
|
+
"""
|
|
1972
|
+
if not self._legacyOpenGL:
|
|
1973
|
+
return
|
|
1974
|
+
|
|
1975
|
+
if not self._monoscopic:
|
|
1976
|
+
if self.buffer == 'left':
|
|
1977
|
+
GL.glMultTransposeMatrixf(
|
|
1978
|
+
self._viewMatrix[0].flatten().ctypes.data_as(
|
|
1979
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
1980
|
+
elif self.buffer == 'right':
|
|
1981
|
+
GL.glMultTransposeMatrixf(
|
|
1982
|
+
self._viewMatrix[1].flatten().ctypes.data_as(
|
|
1983
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
1984
|
+
else:
|
|
1985
|
+
GL.glMultTransposeMatrixf(self._viewMatrix.ctypes.data_as(
|
|
1986
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
1987
|
+
|
|
1988
|
+
def multiplyProjectionMatrixGL(self):
|
|
1989
|
+
"""Multiply the current projection modelMatrix obtained from the SDK
|
|
1990
|
+
using ``glMultMatrixf``. The projection matrix used depends on the
|
|
1991
|
+
current eye buffer set by :func:`setBuffer`.
|
|
1992
|
+
|
|
1993
|
+
"""
|
|
1994
|
+
if not self._legacyOpenGL:
|
|
1995
|
+
return
|
|
1996
|
+
|
|
1997
|
+
if not self._monoscopic:
|
|
1998
|
+
if self.buffer == 'left':
|
|
1999
|
+
GL.glMultTransposeMatrixf(
|
|
2000
|
+
self._projectionMatrix[0].flatten().ctypes.data_as(
|
|
2001
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
2002
|
+
elif self.buffer == 'right':
|
|
2003
|
+
GL.glMultTransposeMatrixf(
|
|
2004
|
+
self._projectionMatrix[1].flatten().ctypes.data_as(
|
|
2005
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
2006
|
+
else:
|
|
2007
|
+
GL.glMultTransposeMatrixf(
|
|
2008
|
+
self._projectionMatrix.flatten().ctypes.data_as(
|
|
2009
|
+
ctypes.POINTER(ctypes.c_float)))
|
|
2010
|
+
|
|
2011
|
+
def setRiftView(self, clearDepth=True):
|
|
2012
|
+
"""Set head-mounted display view. Gets the projection and view matrices
|
|
2013
|
+
from the HMD and applies them.
|
|
2014
|
+
|
|
2015
|
+
Note: This only has an effect if using Rift in legacy immediate mode
|
|
2016
|
+
OpenGL.
|
|
2017
|
+
|
|
2018
|
+
Parameters
|
|
2019
|
+
----------
|
|
2020
|
+
clearDepth : bool
|
|
2021
|
+
Clear the depth buffer prior after configuring the view parameters.
|
|
2022
|
+
|
|
2023
|
+
"""
|
|
2024
|
+
if self._legacyOpenGL:
|
|
2025
|
+
GL.glMatrixMode(GL.GL_PROJECTION)
|
|
2026
|
+
GL.glLoadIdentity()
|
|
2027
|
+
self.multiplyProjectionMatrixGL()
|
|
2028
|
+
|
|
2029
|
+
GL.glMatrixMode(GL.GL_MODELVIEW)
|
|
2030
|
+
GL.glLoadIdentity()
|
|
2031
|
+
self.multiplyViewMatrixGL()
|
|
2032
|
+
|
|
2033
|
+
if clearDepth:
|
|
2034
|
+
GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
|
|
2035
|
+
|
|
2036
|
+
def setDefaultView(self, clearDepth=True):
|
|
2037
|
+
"""Return to default projection. Call this before drawing PsychoPy's
|
|
2038
|
+
2D stimuli after a stereo projection change.
|
|
2039
|
+
|
|
2040
|
+
Note: This only has an effect if using Rift in legacy immediate mode
|
|
2041
|
+
OpenGL.
|
|
2042
|
+
|
|
2043
|
+
Parameters
|
|
2044
|
+
----------
|
|
2045
|
+
clearDepth : bool
|
|
2046
|
+
Clear the depth buffer prior after configuring the view parameters.
|
|
2047
|
+
|
|
2048
|
+
"""
|
|
2049
|
+
if self._legacyOpenGL:
|
|
2050
|
+
GL.glMatrixMode(GL.GL_PROJECTION)
|
|
2051
|
+
GL.glLoadIdentity()
|
|
2052
|
+
GL.glOrtho(-1, 1, -1, 1, -1, 1)
|
|
2053
|
+
GL.glMatrixMode(GL.GL_MODELVIEW)
|
|
2054
|
+
GL.glLoadIdentity()
|
|
2055
|
+
|
|
2056
|
+
if clearDepth:
|
|
2057
|
+
GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
|
|
2058
|
+
|
|
2059
|
+
def _updateProjectionMatrix(self):
|
|
2060
|
+
"""Update or re-calculate projection matrices based on the current
|
|
2061
|
+
render descriptor configuration.
|
|
2062
|
+
"""
|
|
2063
|
+
if not self._monoscopic:
|
|
2064
|
+
libovr.getEyeProjectionMatrix(
|
|
2065
|
+
libovr.EYE_LEFT,
|
|
2066
|
+
self._projectionMatrix[0])
|
|
2067
|
+
libovr.getEyeProjectionMatrix(
|
|
2068
|
+
libovr.EYE_RIGHT,
|
|
2069
|
+
self._projectionMatrix[1])
|
|
2070
|
+
else:
|
|
2071
|
+
libovr.getEyeProjectionMatrix(
|
|
2072
|
+
libovr.EYE_LEFT,
|
|
2073
|
+
self._projectionMatrix)
|
|
2074
|
+
|
|
2075
|
+
def getMovieFrame(self, buffer='mirror'):
|
|
2076
|
+
"""Capture the current HMD frame as an image.
|
|
2077
|
+
|
|
2078
|
+
Saves to stack for :py:attr:`~Window.saveMovieFrames()`. As of v1.81.00
|
|
2079
|
+
this also returns the frame as a PIL image.
|
|
2080
|
+
|
|
2081
|
+
This can be done at any time (usually after a :py:attr:`~Window.flip()`
|
|
2082
|
+
command).
|
|
2083
|
+
|
|
2084
|
+
Frames are stored in memory until a :py:attr:`~Window.saveMovieFrames()`
|
|
2085
|
+
command is issued. You can issue :py:attr:`~Window.getMovieFrame()` as
|
|
2086
|
+
often as you like and then save them all in one go when finished.
|
|
2087
|
+
|
|
2088
|
+
For HMD frames, you should call `getMovieFrame` after calling `flip` to
|
|
2089
|
+
ensure that the mirror texture saved reflects what is presently being
|
|
2090
|
+
shown on the HMD. Note, that this function is somewhat slow and may
|
|
2091
|
+
impact performance. Only call this function when you're not collecting
|
|
2092
|
+
experimental data.
|
|
2093
|
+
|
|
2094
|
+
Parameters
|
|
2095
|
+
----------
|
|
2096
|
+
buffer : str, optional
|
|
2097
|
+
Buffer to capture. For the HMD, only 'mirror' is available at this
|
|
2098
|
+
time.
|
|
2099
|
+
|
|
2100
|
+
Returns
|
|
2101
|
+
-------
|
|
2102
|
+
Image
|
|
2103
|
+
Buffer pixel contents as a PIL/Pillow image object.
|
|
2104
|
+
|
|
2105
|
+
"""
|
|
2106
|
+
im = self._getFrame(buffer=buffer)
|
|
2107
|
+
self.movieFrames.append(im)
|
|
2108
|
+
return im
|
|
2109
|
+
|
|
2110
|
+
def _getFrame(self, rect=None, buffer='mirror'):
|
|
2111
|
+
"""Return the current HMD view as an image.
|
|
2112
|
+
|
|
2113
|
+
Parameters
|
|
2114
|
+
----------
|
|
2115
|
+
rect : array_like
|
|
2116
|
+
Rectangle [x, y, w, h] defining a sub-region of the frame to
|
|
2117
|
+
capture. This should remain `None` for HMD frames.
|
|
2118
|
+
buffer : str, optional
|
|
2119
|
+
Buffer to capture. For the HMD, only 'mirror' is available at this
|
|
2120
|
+
time.
|
|
2121
|
+
|
|
2122
|
+
Returns
|
|
2123
|
+
-------
|
|
2124
|
+
Image
|
|
2125
|
+
Buffer pixel contents as a PIL/Pillow image object.
|
|
2126
|
+
|
|
2127
|
+
"""
|
|
2128
|
+
if buffer == 'mirror':
|
|
2129
|
+
result, mirrorTexId = libovr.getMirrorTexture()
|
|
2130
|
+
if libovr.failure(result):
|
|
2131
|
+
_, msg = libovr.getLastErrorInfo()
|
|
2132
|
+
raise LibOVRError(msg)
|
|
2133
|
+
|
|
2134
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self._mirrorFbo)
|
|
2135
|
+
|
|
2136
|
+
# GL.glEnable(GL.GL_FRAMEBUFFER_SRGB)
|
|
2137
|
+
# bind the rift's texture to the framebuffer
|
|
2138
|
+
GL.glFramebufferTexture2D(
|
|
2139
|
+
GL.GL_READ_FRAMEBUFFER,
|
|
2140
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
2141
|
+
GL.GL_TEXTURE_2D, mirrorTexId, 0)
|
|
2142
|
+
else:
|
|
2143
|
+
raise ValueError("Requested read from buffer '{}' but should be "
|
|
2144
|
+
"'mirror'.".format(buffer))
|
|
2145
|
+
|
|
2146
|
+
if rect:
|
|
2147
|
+
x, y = self._mirrorRes
|
|
2148
|
+
|
|
2149
|
+
# box corners in pix
|
|
2150
|
+
left = int((rect[0] / 2. + 0.5) * x)
|
|
2151
|
+
top = int((rect[1] / -2. + 0.5) * y)
|
|
2152
|
+
w = int((rect[2] / 2. + 0.5) * x) - left
|
|
2153
|
+
h = int((rect[3] / -2. + 0.5) * y) - top
|
|
2154
|
+
else:
|
|
2155
|
+
left = top = 0
|
|
2156
|
+
w, h = self.size # of window, not image
|
|
2157
|
+
|
|
2158
|
+
# http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml
|
|
2159
|
+
bufferDat = (GL.GLubyte * (4 * w * h))()
|
|
2160
|
+
GL.glReadPixels(left, top, w, h,
|
|
2161
|
+
GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, bufferDat)
|
|
2162
|
+
try:
|
|
2163
|
+
im = Image.fromstring(mode='RGBA', size=(w, h),
|
|
2164
|
+
data=bufferDat)
|
|
2165
|
+
except Exception:
|
|
2166
|
+
im = Image.frombytes(mode='RGBA', size=(w, h),
|
|
2167
|
+
data=bufferDat)
|
|
2168
|
+
|
|
2169
|
+
im = im.transpose(Image.FLIP_TOP_BOTTOM)
|
|
2170
|
+
im = im.convert('RGB')
|
|
2171
|
+
|
|
2172
|
+
if self.buffer is not None:
|
|
2173
|
+
self.setBuffer(self.buffer, clear=False) # go back to previous buffer
|
|
2174
|
+
else:
|
|
2175
|
+
GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
|
|
2176
|
+
|
|
2177
|
+
return im
|
|
2178
|
+
|
|
2179
|
+
def getThumbstickValues(self, controller='Xbox', deadzone=False):
|
|
2180
|
+
"""Get controller thumbstick values.
|
|
2181
|
+
|
|
2182
|
+
Parameters
|
|
2183
|
+
----------
|
|
2184
|
+
controller : str
|
|
2185
|
+
Name of the controller to get thumbstick values. Possible values for
|
|
2186
|
+
`controller` are 'Xbox', 'Touch', 'RTouch', 'LTouch', 'Object0',
|
|
2187
|
+
'Object1', 'Object2', and 'Object3'; the only devices with
|
|
2188
|
+
thumbsticks the SDK manages. For additional controllers, use
|
|
2189
|
+
PsychPy's built-in event or hardware support.
|
|
2190
|
+
deadzone : bool
|
|
2191
|
+
Apply the deadzone to thumbstick values. This pre-filters stick
|
|
2192
|
+
input to apply a dead-zone where 0.0 will be returned if the sticks
|
|
2193
|
+
return a displacement within -0.2746 to 0.2746.
|
|
2194
|
+
|
|
2195
|
+
Returns
|
|
2196
|
+
-------
|
|
2197
|
+
tuple
|
|
2198
|
+
Left and right, X and Y thumbstick values. Axis displacements are
|
|
2199
|
+
represented in each tuple by floats ranging from -1.0 (full
|
|
2200
|
+
left/down) to 1.0 (full right/up). The returned values reflect the
|
|
2201
|
+
controller state since the last :py:class:`~Rift.updateInputState`
|
|
2202
|
+
or :py:class:`~Rift.flip` call.
|
|
2203
|
+
|
|
2204
|
+
"""
|
|
2205
|
+
return libovr.getThumbstickValues(RIFT_CONTROLLER_TYPES[controller],
|
|
2206
|
+
deadzone)
|
|
2207
|
+
|
|
2208
|
+
def getIndexTriggerValues(self, controller='Xbox', deadzone=False):
|
|
2209
|
+
"""Get the values of the index triggers.
|
|
2210
|
+
|
|
2211
|
+
Parameters
|
|
2212
|
+
----------
|
|
2213
|
+
controller : str
|
|
2214
|
+
Name of the controller to get index trigger values. Possible values
|
|
2215
|
+
for `controller` are 'Xbox', 'Touch', 'RTouch', 'LTouch', 'Object0',
|
|
2216
|
+
'Object1', 'Object2', and 'Object3'; the only devices with index
|
|
2217
|
+
triggers the SDK manages. For additional controllers, use PsychPy's
|
|
2218
|
+
built-in event or hardware support.
|
|
2219
|
+
deadzone : bool
|
|
2220
|
+
Apply the deadzone to index trigger values. This pre-filters stick
|
|
2221
|
+
input to apply a dead-zone where 0.0 will be returned if the trigger
|
|
2222
|
+
returns a displacement within 0.2746.
|
|
2223
|
+
|
|
2224
|
+
Returns
|
|
2225
|
+
-------
|
|
2226
|
+
tuple of float
|
|
2227
|
+
Left and right index trigger values. Displacements are represented
|
|
2228
|
+
as `tuple` of two float representing the left anr right displacement
|
|
2229
|
+
values, which range from 0.0 to 1.0. The returned values reflect the
|
|
2230
|
+
controller state since the last :py:class:`~Rift.updateInputState`
|
|
2231
|
+
or :py:class:`~Rift.flip` call.
|
|
2232
|
+
|
|
2233
|
+
"""
|
|
2234
|
+
return libovr.getIndexTriggerValues(RIFT_CONTROLLER_TYPES[controller],
|
|
2235
|
+
deadzone)
|
|
2236
|
+
|
|
2237
|
+
def getHandTriggerValues(self, controller='Touch', deadzone=False):
|
|
2238
|
+
"""Get the values of the hand triggers.
|
|
2239
|
+
|
|
2240
|
+
Parameters
|
|
2241
|
+
----------
|
|
2242
|
+
controller : str
|
|
2243
|
+
Name of the controller to get hand trigger values. Possible values
|
|
2244
|
+
for `controller` are 'Touch', 'RTouch', 'LTouch', 'Object0',
|
|
2245
|
+
'Object1', 'Object2', and 'Object3'; the only devices with hand
|
|
2246
|
+
triggers the SDK manages. For additional controllers, use PsychPy's
|
|
2247
|
+
built-in event or hardware support.
|
|
2248
|
+
deadzone : bool
|
|
2249
|
+
Apply the deadzone to hand trigger values. This pre-filters stick
|
|
2250
|
+
input to apply a dead-zone where 0.0 will be returned if the trigger
|
|
2251
|
+
returns a displacement within 0.2746.
|
|
2252
|
+
|
|
2253
|
+
Returns
|
|
2254
|
+
-------
|
|
2255
|
+
tuple
|
|
2256
|
+
Left and right hand trigger values. Displacements are represented
|
|
2257
|
+
as `tuple` of two float representing the left anr right displacement
|
|
2258
|
+
values, which range from 0.0 to 1.0. The returned values reflect the
|
|
2259
|
+
controller state since the last :py:class:`~Rift.updateInputState`
|
|
2260
|
+
or :py:class:`~Rift.flip` call.
|
|
2261
|
+
|
|
2262
|
+
"""
|
|
2263
|
+
return libovr.getHandTriggerValues(RIFT_CONTROLLER_TYPES[controller],
|
|
2264
|
+
deadzone)
|
|
2265
|
+
|
|
2266
|
+
def getButtons(self, buttons, controller='Xbox', testState='continuous'):
|
|
2267
|
+
"""Get button states from a controller.
|
|
2268
|
+
|
|
2269
|
+
Returns `True` if any names specified to `buttons` reflect `testState`
|
|
2270
|
+
since the last :py:class:`~Rift.updateInputState` or
|
|
2271
|
+
:py:class:`~Rift.flip` call. If multiple button names are specified as a
|
|
2272
|
+
`list` or `tuple` to `buttons`, multiple button states are tested,
|
|
2273
|
+
returning `True` if all the buttons presently satisfy the `testState`.
|
|
2274
|
+
Note that not all controllers available share the same buttons. If a
|
|
2275
|
+
button is not available, this function will always return `False`.
|
|
2276
|
+
|
|
2277
|
+
Parameters
|
|
2278
|
+
----------
|
|
2279
|
+
buttons : `list` of `str` or `str`
|
|
2280
|
+
Buttons to test. Valid `buttons` names are 'A', 'B', 'RThumb',
|
|
2281
|
+
'RShoulder' 'X', 'Y', 'LThumb', 'LShoulder', 'Up', 'Down', 'Left',
|
|
2282
|
+
'Right', 'Enter', 'Back', 'VolUp', 'VolDown', and 'Home'. Names can
|
|
2283
|
+
be passed as a `list` to test multiple button states.
|
|
2284
|
+
controller : `str`
|
|
2285
|
+
Controller name.
|
|
2286
|
+
testState : `str`
|
|
2287
|
+
State to test. Valid values are:
|
|
2288
|
+
|
|
2289
|
+
* **continuous** - Button is presently being held down.
|
|
2290
|
+
* **rising** or **pressed** - Button has been *pressed* since
|
|
2291
|
+
the last update.
|
|
2292
|
+
* **falling** or **released** - Button has been *released* since
|
|
2293
|
+
the last update.
|
|
2294
|
+
|
|
2295
|
+
Returns
|
|
2296
|
+
-------
|
|
2297
|
+
tuple of bool, float
|
|
2298
|
+
Button state and timestamp in seconds the controller was polled.
|
|
2299
|
+
|
|
2300
|
+
Examples
|
|
2301
|
+
--------
|
|
2302
|
+
|
|
2303
|
+
Check if the 'Enter' button on the Oculus remote was released::
|
|
2304
|
+
|
|
2305
|
+
isPressed, tsec = hmd.getButtons(['Enter'], 'Remote', 'falling')
|
|
2306
|
+
|
|
2307
|
+
Check if the 'A' button was pressed on the touch controller::
|
|
2308
|
+
|
|
2309
|
+
isPressed, tsec = hmd.getButtons(['A'], 'Touch', 'pressed')
|
|
2310
|
+
|
|
2311
|
+
"""
|
|
2312
|
+
if isinstance(buttons, str): # single value
|
|
2313
|
+
return libovr.getButton(
|
|
2314
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2315
|
+
RIFT_BUTTON_TYPES[buttons],
|
|
2316
|
+
testState)
|
|
2317
|
+
elif isinstance(buttons, (list, tuple,)): # combine buttons
|
|
2318
|
+
buttonBits = 0x00000000
|
|
2319
|
+
for buttonName in buttons:
|
|
2320
|
+
buttonBits |= RIFT_BUTTON_TYPES[buttonName]
|
|
2321
|
+
return libovr.getButton(
|
|
2322
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2323
|
+
buttonBits,
|
|
2324
|
+
testState)
|
|
2325
|
+
elif isinstance(buttons, int): # using enums directly
|
|
2326
|
+
return libovr.getButton(
|
|
2327
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2328
|
+
buttons,
|
|
2329
|
+
testState)
|
|
2330
|
+
else:
|
|
2331
|
+
raise ValueError("Invalid 'buttons' specified.")
|
|
2332
|
+
|
|
2333
|
+
def getTouches(self, touches, controller='Touch', testState='continuous'):
|
|
2334
|
+
"""Get touch states from a controller.
|
|
2335
|
+
|
|
2336
|
+
Returns `True` if any names specified to `touches` reflect `testState`
|
|
2337
|
+
since the last :py:class:`~Rift.updateInputState` or
|
|
2338
|
+
:py:class:`~Rift.flip` call. If multiple button names are specified as a
|
|
2339
|
+
`list` or `tuple` to `touches`, multiple button states are tested,
|
|
2340
|
+
returning `True` if all the touches presently satisfy the `testState`.
|
|
2341
|
+
Note that not all controllers available support touches. If a touch is
|
|
2342
|
+
not supported or available, this function will always return `False`.
|
|
2343
|
+
|
|
2344
|
+
Special states can be used for basic gesture recognition, such as
|
|
2345
|
+
'LThumbUp', 'RThumbUp', 'LIndexPointing', and 'RIndexPointing'.
|
|
2346
|
+
|
|
2347
|
+
Parameters
|
|
2348
|
+
----------
|
|
2349
|
+
touches : `list` of `str` or `str`
|
|
2350
|
+
Buttons to test. Valid `touches` names are 'A', 'B', 'RThumb',
|
|
2351
|
+
'RThumbRest' 'RThumbUp', 'RIndexPointing', 'LThumb', 'LThumbRest',
|
|
2352
|
+
'LThumbUp', 'LIndexPointing', 'X', and 'Y'. Names can be passed as a
|
|
2353
|
+
`list` to test multiple button states.
|
|
2354
|
+
controller : `str`
|
|
2355
|
+
Controller name.
|
|
2356
|
+
testState : `str`
|
|
2357
|
+
State to test. Valid values are:
|
|
2358
|
+
|
|
2359
|
+
* **continuous** - User is touching something on the controller.
|
|
2360
|
+
* **rising** or **pressed** - User began touching something since
|
|
2361
|
+
the last call to `updateInputState`.
|
|
2362
|
+
* **falling** or **released** - User stopped touching something
|
|
2363
|
+
since the last call to `updateInputState`.
|
|
2364
|
+
|
|
2365
|
+
Returns
|
|
2366
|
+
-------
|
|
2367
|
+
tuple of bool, float
|
|
2368
|
+
Touch state and timestamp in seconds the controller was polled.
|
|
2369
|
+
|
|
2370
|
+
Examples
|
|
2371
|
+
--------
|
|
2372
|
+
|
|
2373
|
+
Check if the 'Enter' button on the Oculus remote was released::
|
|
2374
|
+
|
|
2375
|
+
isPressed, tsec = hmd.getButtons(['Enter'], 'Remote', 'falling')
|
|
2376
|
+
|
|
2377
|
+
Check if the 'A' button was pressed on the touch controller::
|
|
2378
|
+
|
|
2379
|
+
isPressed, tsec = hmd.getButtons(['A'], 'Touch', 'pressed')
|
|
2380
|
+
|
|
2381
|
+
"""
|
|
2382
|
+
if isinstance(touches, str): # single value
|
|
2383
|
+
return libovr.getTouch(
|
|
2384
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2385
|
+
RIFT_TOUCH_TYPES[touches],
|
|
2386
|
+
testState)
|
|
2387
|
+
elif isinstance(touches, (list, tuple,)): # combine buttons
|
|
2388
|
+
touchBits = 0x00000000
|
|
2389
|
+
for buttonName in touches:
|
|
2390
|
+
touchBits |= RIFT_TOUCH_TYPES[buttonName]
|
|
2391
|
+
return libovr.getTouch(
|
|
2392
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2393
|
+
touchBits,
|
|
2394
|
+
testState)
|
|
2395
|
+
elif isinstance(touches, int): # using enums directly
|
|
2396
|
+
return libovr.getTouch(
|
|
2397
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2398
|
+
touches,
|
|
2399
|
+
testState)
|
|
2400
|
+
else:
|
|
2401
|
+
raise ValueError("Invalid 'touches' specified.")
|
|
2402
|
+
|
|
2403
|
+
def startHaptics(self, controller, frequency='low', amplitude=1.0):
|
|
2404
|
+
"""Start haptic feedback (vibration).
|
|
2405
|
+
|
|
2406
|
+
Vibration is constant at fixed frequency and amplitude. Vibration lasts
|
|
2407
|
+
2.5 seconds, so this function needs to be called more often than that
|
|
2408
|
+
for sustained vibration. Only controllers which support vibration can be
|
|
2409
|
+
used here.
|
|
2410
|
+
|
|
2411
|
+
There are only two frequencies permitted 'high' and 'low', however,
|
|
2412
|
+
amplitude can vary from 0.0 to 1.0. Specifying `frequency`='off' stops
|
|
2413
|
+
vibration if in progress.
|
|
2414
|
+
|
|
2415
|
+
Parameters
|
|
2416
|
+
----------
|
|
2417
|
+
controller : str
|
|
2418
|
+
Name of the controller to vibrate.
|
|
2419
|
+
frequency : str
|
|
2420
|
+
Vibration frequency. Valid values are: 'off', 'low', or 'high'.
|
|
2421
|
+
amplitude : float
|
|
2422
|
+
Vibration amplitude in the range of [0.0 and 1.0]. Values outside
|
|
2423
|
+
this range are clamped.
|
|
2424
|
+
|
|
2425
|
+
"""
|
|
2426
|
+
libovr.setControllerVibration(
|
|
2427
|
+
RIFT_CONTROLLER_TYPES[controller],
|
|
2428
|
+
frequency,
|
|
2429
|
+
amplitude)
|
|
2430
|
+
|
|
2431
|
+
def stopHaptics(self, controller):
|
|
2432
|
+
"""Stop haptic feedback.
|
|
2433
|
+
|
|
2434
|
+
Convenience function to stop controller vibration initiated by the last
|
|
2435
|
+
:py:class:`~Rift.vibrateController` call. This is the same as calling
|
|
2436
|
+
``vibrateController(controller, frequency='off')``.
|
|
2437
|
+
|
|
2438
|
+
Parameters
|
|
2439
|
+
----------
|
|
2440
|
+
controller : str
|
|
2441
|
+
Name of the controller to stop vibrating.
|
|
2442
|
+
|
|
2443
|
+
"""
|
|
2444
|
+
libovr.setControllerVibration(
|
|
2445
|
+
RIFT_CONTROLLER_TYPES[controller], 'off', 0.0)
|
|
2446
|
+
|
|
2447
|
+
@staticmethod
|
|
2448
|
+
def createHapticsBuffer(samples):
|
|
2449
|
+
"""Create a new haptics buffer.
|
|
2450
|
+
|
|
2451
|
+
A haptics buffer is object which stores vibration amplitude samples for
|
|
2452
|
+
playback through the Touch controllers. To play a haptics buffer, pass
|
|
2453
|
+
it to :py:meth:`submitHapticsBuffer`.
|
|
2454
|
+
|
|
2455
|
+
Parameters
|
|
2456
|
+
----------
|
|
2457
|
+
samples : array_like
|
|
2458
|
+
1-D array of amplitude samples, ranging from 0 to 1. Values outside
|
|
2459
|
+
of this range will be clipped. The buffer must not exceed
|
|
2460
|
+
`HAPTICS_BUFFER_SAMPLES_MAX` samples, any additional samples will be
|
|
2461
|
+
dropped.
|
|
2462
|
+
|
|
2463
|
+
Returns
|
|
2464
|
+
-------
|
|
2465
|
+
LibOVRHapticsBuffer
|
|
2466
|
+
Haptics buffer object.
|
|
2467
|
+
|
|
2468
|
+
Notes
|
|
2469
|
+
-----
|
|
2470
|
+
Methods `startHaptics` and `stopHaptics` cannot be used interchangeably
|
|
2471
|
+
with this function.
|
|
2472
|
+
|
|
2473
|
+
Examples
|
|
2474
|
+
--------
|
|
2475
|
+
Create a haptics buffer where vibration amplitude ramps down over the
|
|
2476
|
+
course of playback::
|
|
2477
|
+
|
|
2478
|
+
samples = np.linspace(
|
|
2479
|
+
1.0, 0.0, num=HAPTICS_BUFFER_SAMPLES_MAX-1, dtype=np.float32)
|
|
2480
|
+
hbuff = Rift.createHapticsBuffer(samples)
|
|
2481
|
+
|
|
2482
|
+
# vibrate right Touch controller
|
|
2483
|
+
hmd.submitControllerVibration(CONTROLLER_TYPE_RTOUCH, hbuff)
|
|
2484
|
+
|
|
2485
|
+
"""
|
|
2486
|
+
if len(samples) > libovr.HAPTICS_BUFFER_SAMPLES_MAX:
|
|
2487
|
+
samples = samples[:libovr.HAPTICS_BUFFER_SAMPLES_MAX]
|
|
2488
|
+
|
|
2489
|
+
return libovr.LibOVRHapticsBuffer(samples)
|
|
2490
|
+
|
|
2491
|
+
def submitControllerVibration(self, controller, hapticsBuffer):
|
|
2492
|
+
"""Submit a haptics buffer to begin controller vibration.
|
|
2493
|
+
|
|
2494
|
+
Parameters
|
|
2495
|
+
----------
|
|
2496
|
+
controller : str
|
|
2497
|
+
Name of controller to vibrate.
|
|
2498
|
+
hapticsBuffer : LibOVRHapticsBuffer
|
|
2499
|
+
Haptics buffer to playback.
|
|
2500
|
+
|
|
2501
|
+
Notes
|
|
2502
|
+
-----
|
|
2503
|
+
Methods `startHaptics` and `stopHaptics` cannot be used interchangeably
|
|
2504
|
+
with this function.
|
|
2505
|
+
|
|
2506
|
+
"""
|
|
2507
|
+
libovr.submitControllerVibration(
|
|
2508
|
+
RIFT_CONTROLLER_TYPES[controller], hapticsBuffer)
|
|
2509
|
+
|
|
2510
|
+
@staticmethod
|
|
2511
|
+
def createPose(pos=(0., 0., 0.), ori=(0., 0., 0., 1.)):
|
|
2512
|
+
"""Create a new Rift pose object
|
|
2513
|
+
(:py:class:`~psychxr.libovr.LibOVRPose`).
|
|
2514
|
+
|
|
2515
|
+
:py:class:`~psychxr.libovr.LibOVRPose` is used to represent a rigid body
|
|
2516
|
+
pose mainly for use with the PsychXR's LibOVR module. There are several
|
|
2517
|
+
methods associated with the object to manipulate the pose.
|
|
2518
|
+
|
|
2519
|
+
This function exposes the :py:class:`~psychxr.libovr.LibOVRPose` class
|
|
2520
|
+
so you don't need to access it by importing `psychxr`.
|
|
2521
|
+
|
|
2522
|
+
Parameters
|
|
2523
|
+
----------
|
|
2524
|
+
pos : tuple, list, or ndarray of float
|
|
2525
|
+
Position vector/coordinate (x, y, z).
|
|
2526
|
+
ori : tuple, list, or ndarray of float
|
|
2527
|
+
Orientation quaternion (x, y, z, w).
|
|
2528
|
+
|
|
2529
|
+
Returns
|
|
2530
|
+
-------
|
|
2531
|
+
:py:class:`~psychxr.libovr.LibOVRPose`
|
|
2532
|
+
Object representing a rigid body pose for use with LibOVR.
|
|
2533
|
+
|
|
2534
|
+
"""
|
|
2535
|
+
return libovr.LibOVRPose(pos, ori)
|
|
2536
|
+
|
|
2537
|
+
@staticmethod
|
|
2538
|
+
def createBoundingBox(extents=None):
|
|
2539
|
+
"""Create a new bounding box object
|
|
2540
|
+
(:py:class:`~psychxr.libovr.LibOVRBounds`).
|
|
2541
|
+
|
|
2542
|
+
:py:class:`~psychxr.libovr.LibOVRBounds` represents an axis-aligned
|
|
2543
|
+
bounding box with dimensions defined by `extents`. Bounding boxes are
|
|
2544
|
+
primarily used for visibility testing and culling by `PsychXR`. The
|
|
2545
|
+
dimensions of the bounding box can be specified explicitly, or fitted
|
|
2546
|
+
to meshes by passing vertices to the
|
|
2547
|
+
:py:meth:`~psychxr.libovr.LibOVRBounds.fit` method after initialization.
|
|
2548
|
+
|
|
2549
|
+
This function exposes the :py:class:`~psychxr.libovr.LibOVRBounds` class
|
|
2550
|
+
so you don't need to access it by importing `psychxr`.
|
|
2551
|
+
|
|
2552
|
+
Parameters
|
|
2553
|
+
----------
|
|
2554
|
+
extents : array_like or None
|
|
2555
|
+
Extents of the bounding box as (`mins`, `maxs`). Where `mins`
|
|
2556
|
+
(x, y, z) is the minimum and `maxs` (x, y, z) is the maximum extents
|
|
2557
|
+
of the bounding box in world units. If `None` is specified, the
|
|
2558
|
+
returned bounding box will be invalid. The bounding box can be later
|
|
2559
|
+
constructed using the :py:meth:`~psychxr.libovr.LibOVRBounds.fit`
|
|
2560
|
+
method or the :py:attr:`~psychxr.libovr.LibOVRBounds.extents`
|
|
2561
|
+
attribute.
|
|
2562
|
+
|
|
2563
|
+
Returns
|
|
2564
|
+
-------
|
|
2565
|
+
`~psychxr.libovr.LibOVRBounds`
|
|
2566
|
+
Object representing a bounding box.
|
|
2567
|
+
|
|
2568
|
+
Examples
|
|
2569
|
+
--------
|
|
2570
|
+
Add a bounding box to a pose::
|
|
2571
|
+
|
|
2572
|
+
# create a 1 meter cube bounding box centered with the pose
|
|
2573
|
+
bbox = Rift.createBoundingBox(((-.5, -.5, -.5), (.5, .5, .5)))
|
|
2574
|
+
|
|
2575
|
+
# create a pose and attach the bounding box
|
|
2576
|
+
modelPose = Rift.createPose()
|
|
2577
|
+
modelPose.boundingBox = bbox
|
|
2578
|
+
|
|
2579
|
+
Perform visibility culling on the pose using the bounding box by
|
|
2580
|
+
using the :py:meth:`~psychxr.libovr.LibOVRBounds.isVisible` method::
|
|
2581
|
+
|
|
2582
|
+
if hmd.isPoseVisible(modelPose):
|
|
2583
|
+
modelPose.draw()
|
|
2584
|
+
|
|
2585
|
+
"""
|
|
2586
|
+
return libovr.LibOVRBounds(extents)
|
|
2587
|
+
|
|
2588
|
+
def isPoseVisible(self, pose):
|
|
2589
|
+
"""Check if a pose object if visible to the present eye. This method can
|
|
2590
|
+
be used to perform visibility culling to avoid executing draw commands
|
|
2591
|
+
for objects that fall outside the FOV for the current eye buffer.
|
|
2592
|
+
|
|
2593
|
+
If :py:attr:`~psychxr.libovr.LibOVRPose.boundingBox` has a valid
|
|
2594
|
+
bounding box object, this function will return `False` if all the box
|
|
2595
|
+
points fall completely to one side of the view frustum. If
|
|
2596
|
+
:py:attr:`~psychxr.libovr.LibOVRPose.boundingBox` is `None`, the point
|
|
2597
|
+
at :py:attr:`~psychxr.libovr.LibOVRPose.pos` is checked, returning
|
|
2598
|
+
`False` if it falls outside of the frustum. If the present buffer is not
|
|
2599
|
+
'left' or 'right', this function will always return `False`.
|
|
2600
|
+
|
|
2601
|
+
Parameters
|
|
2602
|
+
----------
|
|
2603
|
+
pose : :py:class:`~psychxr.libovr.LibOVRPose`
|
|
2604
|
+
Pose to test for visibility.
|
|
2605
|
+
|
|
2606
|
+
Returns
|
|
2607
|
+
-------
|
|
2608
|
+
bool
|
|
2609
|
+
`True` if pose's bounding box or origin is outside of the view
|
|
2610
|
+
frustum.
|
|
2611
|
+
|
|
2612
|
+
"""
|
|
2613
|
+
if self.buffer == 'left' or self.buffer == 'mono':
|
|
2614
|
+
return pose.isVisible(libovr.EYE_LEFT)
|
|
2615
|
+
elif self.buffer == 'right':
|
|
2616
|
+
return pose.isVisible(libovr.EYE_RIGHT)
|
|
2617
|
+
|
|
2618
|
+
return False
|
|
2619
|
+
|
|
2620
|
+
def _updatePerfStats(self):
|
|
2621
|
+
"""Update and process performance statistics obtained from LibOVR. This
|
|
2622
|
+
should be called at the beginning of each frame to get the stats of the
|
|
2623
|
+
last frame.
|
|
2624
|
+
|
|
2625
|
+
This is called automatically when
|
|
2626
|
+
:py:meth:`~psychopy.visual.Rift._waitToBeginHmdFrame` is called at the
|
|
2627
|
+
beginning of each frame.
|
|
2628
|
+
|
|
2629
|
+
"""
|
|
2630
|
+
# update perf stats
|
|
2631
|
+
self._perfStats = libovr.getPerfStats()
|
|
2632
|
+
|
|
2633
|
+
# if we have more >1 stat available, process the stats
|
|
2634
|
+
if self._perfStats.frameStatsCount > 0:
|
|
2635
|
+
recentStat = self._perfStats.frameStats[0] # get the most recent
|
|
2636
|
+
# check for dropped frames since last call
|
|
2637
|
+
if self.warnAppFrameDropped and \
|
|
2638
|
+
reportNDroppedFrames > self._lastAppDroppedFrameCount:
|
|
2639
|
+
appDroppedFrameCount = recentStat.appDroppedFrameCount
|
|
2640
|
+
if appDroppedFrameCount > self._lastAppDroppedFrameCount:
|
|
2641
|
+
logging.warn(
|
|
2642
|
+
'Application failed to meet deadline to submit frame '
|
|
2643
|
+
'to HMD ({}).'.format(self._frameIndex))
|
|
2644
|
+
|
|
2645
|
+
self._lastAppDroppedFrameCount = appDroppedFrameCount
|
|
2646
|
+
|
|
2647
|
+
if reportNDroppedFrames == self._lastAppDroppedFrameCount:
|
|
2648
|
+
logging.warn(
|
|
2649
|
+
"Maximum number of dropped frames detected. I'll stop "
|
|
2650
|
+
"warning you about them.")
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
# def _logCallback(level, msg):
|
|
2654
|
+
# """Callback function for log messages generated by LibOVR."""
|
|
2655
|
+
# if level == libovr.LOG_LEVEL_INFO:
|
|
2656
|
+
# logging.info(msg)
|
|
2657
|
+
# elif level == libovr.LOG_LEVEL_DEBUG:
|
|
2658
|
+
# logging.debug(msg)
|
|
2659
|
+
# elif level == libovr.LOG_LEVEL_ERROR:
|
|
2660
|
+
# logging.error(msg)
|