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
|
@@ -0,0 +1,2109 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
"""Classes for 3D stimuli."""
|
|
5
|
+
|
|
6
|
+
# Part of the PsychoPy library
|
|
7
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL).
|
|
9
|
+
|
|
10
|
+
from psychopy import logging
|
|
11
|
+
from psychopy.tools.attributetools import attributeSetter, setAttribute
|
|
12
|
+
from psychopy.visual.basevisual import WindowMixin, ColorMixin
|
|
13
|
+
from psychopy.visual.helpers import setColor
|
|
14
|
+
from psychopy.colors import Color, colorSpaces
|
|
15
|
+
import psychopy.tools.mathtools as mt
|
|
16
|
+
import psychopy.tools.gltools as gt
|
|
17
|
+
import psychopy.tools.arraytools as at
|
|
18
|
+
import psychopy.tools.viewtools as vt
|
|
19
|
+
import psychopy.visual.shaders as _shaders
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
from io import StringIO
|
|
23
|
+
from PIL import Image
|
|
24
|
+
|
|
25
|
+
import numpy as np
|
|
26
|
+
|
|
27
|
+
import pyglet.gl as GL
|
|
28
|
+
|
|
29
|
+
# classes moved out of this module
|
|
30
|
+
RigidBodyPose = mt.RigidBodyPose
|
|
31
|
+
BoundingBox = mt.BoundingBox
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class LightSource:
|
|
35
|
+
"""Class for representing a light source in a scene. This is a
|
|
36
|
+
lazy-imported class, therefore import using full path
|
|
37
|
+
`from psychopy.visual.stim3d import LightSource` when inheriting from it.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
Only point and directional lighting is supported by this object for now. The
|
|
41
|
+
ambient color of the light source contributes to the scene ambient color
|
|
42
|
+
defined by :py:attr:`~psychopy.visual.Window.ambientLight`.
|
|
43
|
+
|
|
44
|
+
Warnings
|
|
45
|
+
--------
|
|
46
|
+
This class is experimental and may result in undefined behavior.
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
def __init__(self,
|
|
50
|
+
win,
|
|
51
|
+
pos=(0., 0., 0.),
|
|
52
|
+
diffuseColor=(1., 1., 1.),
|
|
53
|
+
specularColor=(1., 1., 1.),
|
|
54
|
+
ambientColor=(0., 0., 0.),
|
|
55
|
+
colorSpace='rgb',
|
|
56
|
+
contrast=1.0,
|
|
57
|
+
lightType='point',
|
|
58
|
+
attenuation=(1, 0, 0)):
|
|
59
|
+
"""
|
|
60
|
+
Parameters
|
|
61
|
+
----------
|
|
62
|
+
win : `~psychopy.visual.Window`
|
|
63
|
+
Window associated with this light source.
|
|
64
|
+
pos : array_like
|
|
65
|
+
Position of the light source (x, y, z, w). If `w=1.0` the light will
|
|
66
|
+
be a point source and `x`, `y`, and `z` is the position in the
|
|
67
|
+
scene. If `w=0.0`, the light source will be directional and `x`,
|
|
68
|
+
`y`, and `z` will define the vector pointing to the direction the
|
|
69
|
+
light source is coming from. For instance, a vector of (0, 1, 0, 0)
|
|
70
|
+
will indicate that a light source is coming from above.
|
|
71
|
+
diffuseColor : array_like
|
|
72
|
+
Diffuse light color.
|
|
73
|
+
specularColor : array_like
|
|
74
|
+
Specular light color.
|
|
75
|
+
ambientColor : array_like
|
|
76
|
+
Ambient light color.
|
|
77
|
+
colorSpace : str or None
|
|
78
|
+
Colorspace for diffuse, specular, and ambient color components.
|
|
79
|
+
contrast : float
|
|
80
|
+
Contrast of the lighting color components. This acts as a 'gain'
|
|
81
|
+
factor which scales color values. Must be between 0.0 and 1.0.
|
|
82
|
+
attenuation : array_like
|
|
83
|
+
Values for the constant, linear, and quadratic terms of the lighting
|
|
84
|
+
attenuation formula. Default is (1, 0, 0) which results in no
|
|
85
|
+
attenuation.
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
self.win = win
|
|
89
|
+
|
|
90
|
+
self._pos = np.zeros((4,), np.float32)
|
|
91
|
+
self._diffuseColor = Color()
|
|
92
|
+
self._specularColor = Color()
|
|
93
|
+
self._ambientColor = Color()
|
|
94
|
+
self._lightType = None # set later
|
|
95
|
+
|
|
96
|
+
# internal RGB values post colorspace conversion
|
|
97
|
+
self._diffuseRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
98
|
+
self._specularRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
99
|
+
self._ambientRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
100
|
+
|
|
101
|
+
self.contrast = contrast
|
|
102
|
+
self.colorSpace = colorSpace
|
|
103
|
+
|
|
104
|
+
# set the colors
|
|
105
|
+
self.diffuseColor = diffuseColor
|
|
106
|
+
self.specularColor = specularColor
|
|
107
|
+
self.ambientColor = ambientColor
|
|
108
|
+
|
|
109
|
+
self.lightType = lightType
|
|
110
|
+
self.pos = pos
|
|
111
|
+
|
|
112
|
+
# attenuation factors
|
|
113
|
+
self._kAttenuation = np.asarray(attenuation, np.float32)
|
|
114
|
+
|
|
115
|
+
# --------------------------------------------------------------------------
|
|
116
|
+
# Lighting
|
|
117
|
+
#
|
|
118
|
+
# Properties about the lighting position and type. This affects the shading
|
|
119
|
+
# of the material.
|
|
120
|
+
#
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def pos(self):
|
|
124
|
+
"""Position of the light source in the scene in scene units."""
|
|
125
|
+
return self._pos[:3]
|
|
126
|
+
|
|
127
|
+
@pos.setter
|
|
128
|
+
def pos(self, value):
|
|
129
|
+
self._pos = np.zeros((4,), np.float32)
|
|
130
|
+
self._pos[:3] = value
|
|
131
|
+
|
|
132
|
+
if self._lightType == 'point': # if a point source then `w` == 1.0
|
|
133
|
+
self._pos[3] = 1.0
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def lightType(self):
|
|
137
|
+
"""Type of light source, can be 'point' or 'directional'."""
|
|
138
|
+
return self._lightType
|
|
139
|
+
|
|
140
|
+
@lightType.setter
|
|
141
|
+
def lightType(self, value):
|
|
142
|
+
self._lightType = value
|
|
143
|
+
|
|
144
|
+
if self._lightType == 'point':
|
|
145
|
+
self._pos[3] = 1.0
|
|
146
|
+
elif self._lightType == 'directional':
|
|
147
|
+
self._pos[3] = 0.0
|
|
148
|
+
else:
|
|
149
|
+
raise ValueError(
|
|
150
|
+
"Unknown `lightType` specified, must be 'directional' or "
|
|
151
|
+
"'point'.")
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def attenuation(self):
|
|
155
|
+
"""Values for the constant, linear, and quadratic terms of the lighting
|
|
156
|
+
attenuation formula.
|
|
157
|
+
"""
|
|
158
|
+
return self._kAttenuation
|
|
159
|
+
|
|
160
|
+
@attenuation.setter
|
|
161
|
+
def attenuation(self, value):
|
|
162
|
+
self._kAttenuation = np.asarray(value, np.float32)
|
|
163
|
+
|
|
164
|
+
# --------------------------------------------------------------------------
|
|
165
|
+
# Lighting colors
|
|
166
|
+
#
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def colorSpace(self):
|
|
170
|
+
"""The name of the color space currently being used (`str` or `None`).
|
|
171
|
+
|
|
172
|
+
For strings and hex values this is not needed. If `None` the default
|
|
173
|
+
`colorSpace` for the stimulus is used (defined during initialisation).
|
|
174
|
+
|
|
175
|
+
Please note that changing `colorSpace` does not change stimulus
|
|
176
|
+
parameters. Thus, you usually want to specify `colorSpace` before
|
|
177
|
+
setting the color.
|
|
178
|
+
|
|
179
|
+
"""
|
|
180
|
+
if hasattr(self, '_colorSpace'):
|
|
181
|
+
return self._colorSpace
|
|
182
|
+
else:
|
|
183
|
+
return 'rgba'
|
|
184
|
+
|
|
185
|
+
@colorSpace.setter
|
|
186
|
+
def colorSpace(self, value):
|
|
187
|
+
if value in colorSpaces:
|
|
188
|
+
self._colorSpace = value
|
|
189
|
+
else:
|
|
190
|
+
logging.error(f"'{value}' is not a valid color space")
|
|
191
|
+
|
|
192
|
+
@property
|
|
193
|
+
def contrast(self):
|
|
194
|
+
"""A value that is simply multiplied by the color (`float`).
|
|
195
|
+
|
|
196
|
+
This may be used to adjust the gain of the light source. This is applied
|
|
197
|
+
to all lighting color components.
|
|
198
|
+
|
|
199
|
+
Examples
|
|
200
|
+
--------
|
|
201
|
+
Basic usage::
|
|
202
|
+
|
|
203
|
+
stim.contrast = 1.0 # unchanged contrast
|
|
204
|
+
stim.contrast = 0.5 # decrease contrast
|
|
205
|
+
stim.contrast = 0.0 # uniform, no contrast
|
|
206
|
+
stim.contrast = -0.5 # slightly inverted
|
|
207
|
+
stim.contrast = -1.0 # totally inverted
|
|
208
|
+
|
|
209
|
+
Setting contrast outside range -1 to 1 is permitted, but may
|
|
210
|
+
produce strange results if color values exceeds the monitor limits.::
|
|
211
|
+
|
|
212
|
+
stim.contrast = 1.2 # increases contrast
|
|
213
|
+
stim.contrast = -1.2 # inverts with increased contrast
|
|
214
|
+
|
|
215
|
+
"""
|
|
216
|
+
return self._diffuseColor.contrast
|
|
217
|
+
|
|
218
|
+
@contrast.setter
|
|
219
|
+
def contrast(self, value):
|
|
220
|
+
self._diffuseColor.contrast = value
|
|
221
|
+
self._specularColor.contrast = value
|
|
222
|
+
self._ambientColor.contrast = value
|
|
223
|
+
|
|
224
|
+
@property
|
|
225
|
+
def diffuseColor(self):
|
|
226
|
+
"""Diffuse color for the light source (`psychopy.color.Color`,
|
|
227
|
+
`ArrayLike` or None).
|
|
228
|
+
"""
|
|
229
|
+
return self._diffuseColor.render(self.colorSpace)
|
|
230
|
+
|
|
231
|
+
@diffuseColor.setter
|
|
232
|
+
def diffuseColor(self, value):
|
|
233
|
+
if isinstance(value, Color):
|
|
234
|
+
self._diffuseColor = value
|
|
235
|
+
else:
|
|
236
|
+
self._diffuseColor = Color(
|
|
237
|
+
value,
|
|
238
|
+
self.colorSpace,
|
|
239
|
+
contrast=self.contrast)
|
|
240
|
+
|
|
241
|
+
if not self._diffuseColor:
|
|
242
|
+
# If given an invalid color, set as transparent and log error
|
|
243
|
+
self._diffuseColor = Color()
|
|
244
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
245
|
+
|
|
246
|
+
# set the RGB values
|
|
247
|
+
self._diffuseRGB[:3] = self._diffuseColor.rgb1
|
|
248
|
+
self._diffuseRGB[3] = self._diffuseColor.opacity
|
|
249
|
+
|
|
250
|
+
def setDiffuseColor(self, color, colorSpace=None, operation='', log=None):
|
|
251
|
+
"""Set the diffuse color for the light source. Use this function if you
|
|
252
|
+
wish to supress logging or apply operations on the color component.
|
|
253
|
+
|
|
254
|
+
Parameters
|
|
255
|
+
----------
|
|
256
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
257
|
+
Color to set as the diffuse component of the light source.
|
|
258
|
+
colorSpace : str or None
|
|
259
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
260
|
+
`diffuseColor` after setting uses the color space of the object.
|
|
261
|
+
operation : str
|
|
262
|
+
Operation string.
|
|
263
|
+
log : bool or None
|
|
264
|
+
Enable logging.
|
|
265
|
+
|
|
266
|
+
"""
|
|
267
|
+
setColor(
|
|
268
|
+
obj=self,
|
|
269
|
+
colorAttrib="diffuseColor",
|
|
270
|
+
color=color,
|
|
271
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
272
|
+
operation=operation,
|
|
273
|
+
log=log)
|
|
274
|
+
|
|
275
|
+
@property
|
|
276
|
+
def specularColor(self):
|
|
277
|
+
"""Specular color of the light source (`psychopy.color.Color`,
|
|
278
|
+
`ArrayLike` or None).
|
|
279
|
+
"""
|
|
280
|
+
return self._specularColor.render(self.colorSpace)
|
|
281
|
+
|
|
282
|
+
@specularColor.setter
|
|
283
|
+
def specularColor(self, value):
|
|
284
|
+
if isinstance(value, Color):
|
|
285
|
+
self._specularColor = value
|
|
286
|
+
else:
|
|
287
|
+
self._specularColor = Color(
|
|
288
|
+
value,
|
|
289
|
+
self.colorSpace,
|
|
290
|
+
contrast=self.contrast)
|
|
291
|
+
|
|
292
|
+
if not self._specularColor:
|
|
293
|
+
# If given an invalid color, set as transparent and log error
|
|
294
|
+
self._specularColor = Color()
|
|
295
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
296
|
+
|
|
297
|
+
self._specularRGB[:3] = self._specularColor.rgb1
|
|
298
|
+
self._specularRGB[3] = self._specularColor.opacity
|
|
299
|
+
|
|
300
|
+
def setSpecularColor(self, color, colorSpace=None, operation='', log=None):
|
|
301
|
+
"""Set the diffuse color for the light source. Use this function if you
|
|
302
|
+
wish to supress logging or apply operations on the color component.
|
|
303
|
+
|
|
304
|
+
Parameters
|
|
305
|
+
----------
|
|
306
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
307
|
+
Color to set as the specular component of the light source.
|
|
308
|
+
colorSpace : str or None
|
|
309
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
310
|
+
`diffuseColor` after setting uses the color space of the object.
|
|
311
|
+
operation : str
|
|
312
|
+
Operation string.
|
|
313
|
+
log : bool or None
|
|
314
|
+
Enable logging.
|
|
315
|
+
|
|
316
|
+
"""
|
|
317
|
+
setColor(
|
|
318
|
+
obj=self,
|
|
319
|
+
colorAttrib="specularColor",
|
|
320
|
+
color=color,
|
|
321
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
322
|
+
operation=operation,
|
|
323
|
+
log=log)
|
|
324
|
+
|
|
325
|
+
@property
|
|
326
|
+
def ambientColor(self):
|
|
327
|
+
"""Ambient color of the light source (`psychopy.color.Color`,
|
|
328
|
+
`ArrayLike` or None).
|
|
329
|
+
|
|
330
|
+
The ambient color component is used to simulate indirect lighting caused
|
|
331
|
+
by the light source. For instance, light bouncing off adjacent surfaces
|
|
332
|
+
or atmospheric scattering if the light source is a sun. This is
|
|
333
|
+
independent of the global ambient color.
|
|
334
|
+
|
|
335
|
+
"""
|
|
336
|
+
return self._ambientColor.render(self.colorSpace)
|
|
337
|
+
|
|
338
|
+
@ambientColor.setter
|
|
339
|
+
def ambientColor(self, value):
|
|
340
|
+
if isinstance(value, Color):
|
|
341
|
+
self._ambientColor = value
|
|
342
|
+
else:
|
|
343
|
+
self._ambientColor = Color(
|
|
344
|
+
value,
|
|
345
|
+
self.colorSpace,
|
|
346
|
+
contrast=self.contrast)
|
|
347
|
+
|
|
348
|
+
if not self._ambientColor:
|
|
349
|
+
# If given an invalid color, set as transparent and log error
|
|
350
|
+
self._ambientColor = Color()
|
|
351
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
352
|
+
|
|
353
|
+
self._ambientRGB[:3] = self._ambientColor.rgb1
|
|
354
|
+
self._ambientRGB[3] = self._ambientColor.opacity
|
|
355
|
+
|
|
356
|
+
def setAmbientColor(self, color, colorSpace=None, operation='', log=None):
|
|
357
|
+
"""Set the ambient color for the light source.
|
|
358
|
+
|
|
359
|
+
Use this function if you wish to supress logging or apply operations on
|
|
360
|
+
the color component.
|
|
361
|
+
|
|
362
|
+
Parameters
|
|
363
|
+
----------
|
|
364
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
365
|
+
Color to set as the ambient component of the light source.
|
|
366
|
+
colorSpace : str or None
|
|
367
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
368
|
+
`ambientColor` after setting uses the color space of the object.
|
|
369
|
+
operation : str
|
|
370
|
+
Operation string.
|
|
371
|
+
log : bool or None
|
|
372
|
+
Enable logging.
|
|
373
|
+
|
|
374
|
+
"""
|
|
375
|
+
setColor(
|
|
376
|
+
obj=self,
|
|
377
|
+
colorAttrib="ambientColor",
|
|
378
|
+
color=color,
|
|
379
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
380
|
+
operation=operation,
|
|
381
|
+
log=log)
|
|
382
|
+
|
|
383
|
+
# --------------------------------------------------------------------------
|
|
384
|
+
# Lighting RGB colors
|
|
385
|
+
#
|
|
386
|
+
# These are the color values for the light which will be passed to the
|
|
387
|
+
# shader. We protect these values since we don't want the user changing the
|
|
388
|
+
# array type or size.
|
|
389
|
+
#
|
|
390
|
+
|
|
391
|
+
@property
|
|
392
|
+
def diffuseRGB(self):
|
|
393
|
+
"""Diffuse RGB1 color of the material. This value is passed to OpenGL.
|
|
394
|
+
"""
|
|
395
|
+
return self._diffuseRGB
|
|
396
|
+
|
|
397
|
+
@property
|
|
398
|
+
def specularRGB(self):
|
|
399
|
+
"""Specular RGB1 color of the material. This value is passed to OpenGL.
|
|
400
|
+
"""
|
|
401
|
+
return self._specularRGB
|
|
402
|
+
|
|
403
|
+
@property
|
|
404
|
+
def ambientRGB(self):
|
|
405
|
+
"""Ambient RGB1 color of the material. This value is passed to OpenGL.
|
|
406
|
+
"""
|
|
407
|
+
return self._ambientRGB
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
class SceneSkybox:
|
|
411
|
+
"""Class to render scene skyboxes. This is a
|
|
412
|
+
lazy-imported class, therefore import using full path
|
|
413
|
+
`from psychopy.visual.stim3d import SceneSkybox` when inheriting from it.
|
|
414
|
+
|
|
415
|
+
A skybox provides background imagery to serve as a visual reference for the
|
|
416
|
+
scene. Background images are projected onto faces of a cube centered about
|
|
417
|
+
the viewpoint regardless of any viewpoint translations, giving the illusion
|
|
418
|
+
that the background is very far away. Usually, only one skybox can be
|
|
419
|
+
rendered per buffer each frame. Render targets must have a depth buffer
|
|
420
|
+
associated with them.
|
|
421
|
+
|
|
422
|
+
Background images are specified as a set of image paths passed to
|
|
423
|
+
`faceTextures`::
|
|
424
|
+
|
|
425
|
+
sky = SceneSkybox(
|
|
426
|
+
win, ('rt.jpg', 'lf.jpg', 'up.jpg', 'dn.jpg', 'bk.jpg', 'ft.jpg'))
|
|
427
|
+
|
|
428
|
+
The skybox is rendered by calling `draw()` after drawing all other 3D
|
|
429
|
+
stimuli.
|
|
430
|
+
|
|
431
|
+
Skyboxes are not affected by lighting, however, their colors can be
|
|
432
|
+
modulated by setting the window's `sceneAmbient` value. Skyboxes should be
|
|
433
|
+
drawn after all other 3D stimuli, but before any successive call that clears
|
|
434
|
+
the depth buffer (eg. `setPerspectiveView`, `resetEyeTransform`, etc.)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
"""
|
|
438
|
+
def __init__(self, win, tex=(), ori=0.0, axis=(0, 1, 0)):
|
|
439
|
+
"""
|
|
440
|
+
Parameters
|
|
441
|
+
----------
|
|
442
|
+
win : `~psychopy.visual.Window`
|
|
443
|
+
Window this skybox is associated with.
|
|
444
|
+
tex : list or tuple or TexCubeMap
|
|
445
|
+
List of files paths to images to use for each face. Images are
|
|
446
|
+
assigned to faces depending on their index within the list ([+X,
|
|
447
|
+
-X, +Y, -Y, +Z, -Z] or [right, left, top, bottom, back, front]). If
|
|
448
|
+
`None` is specified, the cube map may be specified later by setting
|
|
449
|
+
the `cubemap` attribute. Alternatively, you can specify a
|
|
450
|
+
`TexCubeMap` object to set the cube map directly.
|
|
451
|
+
ori : float
|
|
452
|
+
Rotation of the skybox about `axis` in degrees.
|
|
453
|
+
axis : array_like
|
|
454
|
+
Axis [ax, ay, az] to rotate about, default is (0, 1, 0).
|
|
455
|
+
|
|
456
|
+
"""
|
|
457
|
+
self.win = win
|
|
458
|
+
|
|
459
|
+
self._ori = ori
|
|
460
|
+
self._axis = np.ascontiguousarray(axis, dtype=np.float32)
|
|
461
|
+
|
|
462
|
+
if tex:
|
|
463
|
+
if isinstance(tex, (list, tuple,)):
|
|
464
|
+
if len(tex) == 6:
|
|
465
|
+
imgFace = []
|
|
466
|
+
for img in tex:
|
|
467
|
+
im = Image.open(img)
|
|
468
|
+
im = im.convert("RGBA")
|
|
469
|
+
pixelData = np.array(im).ctypes
|
|
470
|
+
imgFace.append(pixelData)
|
|
471
|
+
|
|
472
|
+
width = imgFace[0].shape[1]
|
|
473
|
+
height = imgFace[0].shape[0]
|
|
474
|
+
|
|
475
|
+
self._skyCubemap = gt.createCubeMap(
|
|
476
|
+
width,
|
|
477
|
+
height,
|
|
478
|
+
internalFormat=GL.GL_RGBA,
|
|
479
|
+
pixelFormat=GL.GL_RGBA,
|
|
480
|
+
dataType=GL.GL_UNSIGNED_BYTE,
|
|
481
|
+
data=imgFace,
|
|
482
|
+
unpackAlignment=1,
|
|
483
|
+
texParams={
|
|
484
|
+
GL.GL_TEXTURE_MAG_FILTER: GL.GL_LINEAR,
|
|
485
|
+
GL.GL_TEXTURE_MIN_FILTER: GL.GL_LINEAR,
|
|
486
|
+
GL.GL_TEXTURE_WRAP_S: GL.GL_CLAMP_TO_EDGE,
|
|
487
|
+
GL.GL_TEXTURE_WRAP_T: GL.GL_CLAMP_TO_EDGE,
|
|
488
|
+
GL.GL_TEXTURE_WRAP_R: GL.GL_CLAMP_TO_EDGE})
|
|
489
|
+
else:
|
|
490
|
+
raise ValueError("Not enough textures specified, must be 6.")
|
|
491
|
+
elif isinstance(tex, gt.TexCubeMap):
|
|
492
|
+
self._skyCubemap = tex
|
|
493
|
+
else:
|
|
494
|
+
raise TypeError("Invalid type specified to `tex`.")
|
|
495
|
+
else:
|
|
496
|
+
self._skyCubemap = None
|
|
497
|
+
|
|
498
|
+
# create cube vertices and faces, discard texcoords and normals
|
|
499
|
+
vertices, _, _, faces = gt.createBox(1.0, True)
|
|
500
|
+
|
|
501
|
+
# upload to buffers
|
|
502
|
+
vertexVBO = gt.createVBO(vertices)
|
|
503
|
+
|
|
504
|
+
# create an index buffer with faces
|
|
505
|
+
indexBuffer = gt.createVBO(
|
|
506
|
+
faces.flatten(),
|
|
507
|
+
target=GL.GL_ELEMENT_ARRAY_BUFFER,
|
|
508
|
+
dataType=GL.GL_UNSIGNED_SHORT)
|
|
509
|
+
|
|
510
|
+
# create the VAO for drawing
|
|
511
|
+
self._vao = gt.createVAO(
|
|
512
|
+
{GL.GL_VERTEX_ARRAY: vertexVBO},
|
|
513
|
+
indexBuffer=indexBuffer,
|
|
514
|
+
legacy=True)
|
|
515
|
+
|
|
516
|
+
# shader for the skybox
|
|
517
|
+
self._shaderProg = _shaders.compileProgram(
|
|
518
|
+
_shaders.vertSkyBox, _shaders.fragSkyBox)
|
|
519
|
+
|
|
520
|
+
# store the skybox transformation matrix, this is not to be updated
|
|
521
|
+
# externally
|
|
522
|
+
self._skyboxViewMatrix = np.identity(4, dtype=np.float32)
|
|
523
|
+
self._prtSkyboxMatrix = at.array2pointer(self._skyboxViewMatrix)
|
|
524
|
+
|
|
525
|
+
@property
|
|
526
|
+
def skyCubeMap(self):
|
|
527
|
+
"""Cubemap for the sky."""
|
|
528
|
+
return self._skyCubemap
|
|
529
|
+
|
|
530
|
+
@skyCubeMap.setter
|
|
531
|
+
def skyCubeMap(self, value):
|
|
532
|
+
self._skyCubemap = value
|
|
533
|
+
|
|
534
|
+
def draw(self, win=None):
|
|
535
|
+
"""Draw the skybox.
|
|
536
|
+
|
|
537
|
+
This should be called last after drawing other 3D stimuli for
|
|
538
|
+
performance reasons.
|
|
539
|
+
|
|
540
|
+
Parameters
|
|
541
|
+
----------
|
|
542
|
+
win : `~psychopy.visual.Window`, optional
|
|
543
|
+
Window to draw the skybox to. If `None`, the window set when
|
|
544
|
+
initializing this object will be used. The window must share a
|
|
545
|
+
context with the window which this objects was initialized with.
|
|
546
|
+
|
|
547
|
+
"""
|
|
548
|
+
if self._skyCubemap is None: # nop if no cubemap is assigned
|
|
549
|
+
return
|
|
550
|
+
|
|
551
|
+
if win is None:
|
|
552
|
+
win = self.win
|
|
553
|
+
else:
|
|
554
|
+
win._makeCurrent()
|
|
555
|
+
|
|
556
|
+
# enable 3D drawing
|
|
557
|
+
win.draw3d = True
|
|
558
|
+
|
|
559
|
+
# do transformations
|
|
560
|
+
GL.glPushMatrix()
|
|
561
|
+
GL.glLoadIdentity()
|
|
562
|
+
|
|
563
|
+
# rotate the skybox if needed
|
|
564
|
+
if self._ori != 0.0:
|
|
565
|
+
GL.glRotatef(self._ori, *self._axis)
|
|
566
|
+
|
|
567
|
+
# get/set the rotation sub-matrix from the current view matrix
|
|
568
|
+
self._skyboxViewMatrix[:3, :3] = win.viewMatrix[:3, :3]
|
|
569
|
+
GL.glMultTransposeMatrixf(self._prtSkyboxMatrix)
|
|
570
|
+
|
|
571
|
+
# use the shader program
|
|
572
|
+
gt.useProgram(self._shaderProg)
|
|
573
|
+
|
|
574
|
+
# enable texture sampler
|
|
575
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
576
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
577
|
+
GL.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, self._skyCubemap.name)
|
|
578
|
+
|
|
579
|
+
# draw the cube VAO
|
|
580
|
+
oldDepthFunc = win.depthFunc
|
|
581
|
+
win.depthFunc = 'lequal' # optimized for being drawn last
|
|
582
|
+
gt.drawVAO(self._vao, GL.GL_TRIANGLES)
|
|
583
|
+
win.depthFunc = oldDepthFunc
|
|
584
|
+
gt.useProgram(0)
|
|
585
|
+
|
|
586
|
+
# disable sampler
|
|
587
|
+
GL.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, 0)
|
|
588
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
589
|
+
|
|
590
|
+
# return to previous transformation
|
|
591
|
+
GL.glPopMatrix()
|
|
592
|
+
|
|
593
|
+
# disable 3D drawing
|
|
594
|
+
win.draw3d = False
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
class BlinnPhongMaterial:
|
|
598
|
+
"""Class representing a material using the Blinn-Phong lighting model.
|
|
599
|
+
This is a lazy-imported class, therefore import using full path
|
|
600
|
+
`from psychopy.visual.stim3d import BlinnPhongMaterial` when inheriting
|
|
601
|
+
from it.
|
|
602
|
+
|
|
603
|
+
This class stores material information to modify the appearance of drawn
|
|
604
|
+
primitives with respect to lighting, such as color (diffuse, specular,
|
|
605
|
+
ambient, and emission), shininess, and textures. Simple materials are
|
|
606
|
+
intended to work with features supported by the fixed-function OpenGL
|
|
607
|
+
pipeline. However, one may use shaders that implement the Blinn-Phong
|
|
608
|
+
shading model for per-pixel lighting.
|
|
609
|
+
|
|
610
|
+
If shaders are enabled, the colors of objects will appear different than
|
|
611
|
+
without. This is due to the lighting/material colors being computed on a
|
|
612
|
+
per-pixel basis, and the formulation of the lighting model. The Phong shader
|
|
613
|
+
determines the ambient color/intensity by adding up both the scene and light
|
|
614
|
+
ambient colors, then multiplies them by the diffuse color of the
|
|
615
|
+
material, as the ambient light's color should be a product of the surface
|
|
616
|
+
reflectance (albedo) and the light color (the ambient light needs to reflect
|
|
617
|
+
off something to be visible). Diffuse reflectance is Lambertian, where the
|
|
618
|
+
cosine angle between the incident light ray and surface normal determines
|
|
619
|
+
color. The size of specular highlights are related to the `shininess` factor
|
|
620
|
+
which ranges from 1.0 to 128.0. The greater this number, the tighter the
|
|
621
|
+
specular highlight making the surface appear smoother. If shaders are not
|
|
622
|
+
being used, specular highlights will be computed using the Phong lighting
|
|
623
|
+
model. The emission color is optional, it simply adds to the color of every
|
|
624
|
+
pixel much like ambient lighting does. Usually, you would not really want
|
|
625
|
+
this, but it can be used to add bias to the overall color of the shape.
|
|
626
|
+
|
|
627
|
+
If there are no lights in the scene, the diffuse color is simply multiplied
|
|
628
|
+
by the scene and material ambient color to give the final color.
|
|
629
|
+
|
|
630
|
+
Lights are attenuated (fall-off with distance) using the formula::
|
|
631
|
+
|
|
632
|
+
attenuationFactor = 1.0 / (k0 + k1 * distance + k2 * pow(distance, 2))
|
|
633
|
+
|
|
634
|
+
The coefficients for attenuation can be specified by setting `attenuation`
|
|
635
|
+
in the lighting object. Values `k0=1.0, k1=0.0, and k2=0.0` results in a
|
|
636
|
+
light that does not fall-off with distance.
|
|
637
|
+
|
|
638
|
+
Parameters
|
|
639
|
+
----------
|
|
640
|
+
win : `~psychopy.visual.Window` or `None`
|
|
641
|
+
Window this material is associated with, required for shaders and some
|
|
642
|
+
color space conversions.
|
|
643
|
+
diffuseColor : array_like
|
|
644
|
+
Diffuse material color (r, g, b) with values between -1.0 and 1.0.
|
|
645
|
+
specularColor : array_like
|
|
646
|
+
Specular material color (r, g, b) with values between -1.0 and 1.0.
|
|
647
|
+
ambientColor : array_like
|
|
648
|
+
Ambient material color (r, g, b) with values between -1.0 and 1.0.
|
|
649
|
+
emissionColor : array_like
|
|
650
|
+
Emission material color (r, g, b) with values between -1.0 and 1.0.
|
|
651
|
+
shininess : float
|
|
652
|
+
Material shininess, usually ranges from 0.0 to 128.0.
|
|
653
|
+
colorSpace : str
|
|
654
|
+
Color space for `diffuseColor`, `specularColor`, `ambientColor`, and
|
|
655
|
+
`emissionColor`. This is no longer used.
|
|
656
|
+
opacity : float
|
|
657
|
+
Opacity of the material. Ranges from 0.0 to 1.0 where 1.0 is fully
|
|
658
|
+
opaque.
|
|
659
|
+
contrast : float
|
|
660
|
+
Contrast of the material colors.
|
|
661
|
+
diffuseTexture : TexImage2D
|
|
662
|
+
Optional 2D texture to apply to the material. Color values from the
|
|
663
|
+
texture are blended with the `diffuseColor` of the material. The target
|
|
664
|
+
primitives must have texture coordinates to specify how texels are
|
|
665
|
+
mapped to the surface.
|
|
666
|
+
face : str
|
|
667
|
+
Face to apply material to. Values are `front`, `back` or `both`.
|
|
668
|
+
|
|
669
|
+
Warnings
|
|
670
|
+
--------
|
|
671
|
+
This class is experimental and may result in undefined behavior.
|
|
672
|
+
|
|
673
|
+
"""
|
|
674
|
+
def __init__(self,
|
|
675
|
+
win=None,
|
|
676
|
+
diffuseColor=(-1., -1., -1.),
|
|
677
|
+
specularColor=(-1., -1., -1.),
|
|
678
|
+
ambientColor=(-1., -1., -1.),
|
|
679
|
+
emissionColor=(-1., -1., -1.),
|
|
680
|
+
shininess=10.0,
|
|
681
|
+
colorSpace='rgb',
|
|
682
|
+
diffuseTexture=None,
|
|
683
|
+
opacity=1.0,
|
|
684
|
+
contrast=1.0,
|
|
685
|
+
face='front'):
|
|
686
|
+
|
|
687
|
+
self.win = win
|
|
688
|
+
|
|
689
|
+
self._diffuseColor = Color()
|
|
690
|
+
self._specularColor = Color()
|
|
691
|
+
self._ambientColor = Color()
|
|
692
|
+
self._emissionColor = Color()
|
|
693
|
+
self._shininess = float(shininess)
|
|
694
|
+
self._face = None # set later
|
|
695
|
+
|
|
696
|
+
# internal RGB values post colorspace conversion
|
|
697
|
+
self._diffuseRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
698
|
+
self._specularRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
699
|
+
self._ambientRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
700
|
+
self._emissionRGB = np.array((0., 0., 0., 1.), np.float32)
|
|
701
|
+
|
|
702
|
+
# internal pointers to arrays, initialized below
|
|
703
|
+
self._ptrDiffuse = None
|
|
704
|
+
self._ptrSpecular = None
|
|
705
|
+
self._ptrAmbient = None
|
|
706
|
+
self._ptrEmission = None
|
|
707
|
+
|
|
708
|
+
self.diffuseColor = diffuseColor
|
|
709
|
+
self.specularColor = specularColor
|
|
710
|
+
self.ambientColor = ambientColor
|
|
711
|
+
self.emissionColor = emissionColor
|
|
712
|
+
|
|
713
|
+
self.colorSpace = colorSpace
|
|
714
|
+
self.opacity = opacity
|
|
715
|
+
self.contrast = contrast
|
|
716
|
+
self.face = face
|
|
717
|
+
|
|
718
|
+
self._diffuseTexture = diffuseTexture
|
|
719
|
+
self._normalTexture = None
|
|
720
|
+
|
|
721
|
+
self._useTextures = False # keeps track if textures are being used
|
|
722
|
+
|
|
723
|
+
# --------------------------------------------------------------------------
|
|
724
|
+
# Material colors and other properties
|
|
725
|
+
#
|
|
726
|
+
# These properties are used to set the color components of various material
|
|
727
|
+
# properties.
|
|
728
|
+
#
|
|
729
|
+
|
|
730
|
+
@property
|
|
731
|
+
def colorSpace(self):
|
|
732
|
+
"""The name of the color space currently being used (`str` or `None`).
|
|
733
|
+
|
|
734
|
+
For strings and hex values this is not needed. If `None` the default
|
|
735
|
+
`colorSpace` for the stimulus is used (defined during initialisation).
|
|
736
|
+
|
|
737
|
+
Please note that changing `colorSpace` does not change stimulus
|
|
738
|
+
parameters. Thus, you usually want to specify `colorSpace` before
|
|
739
|
+
setting the color.
|
|
740
|
+
|
|
741
|
+
"""
|
|
742
|
+
if hasattr(self, '_colorSpace'):
|
|
743
|
+
return self._colorSpace
|
|
744
|
+
else:
|
|
745
|
+
return 'rgba'
|
|
746
|
+
|
|
747
|
+
@colorSpace.setter
|
|
748
|
+
def colorSpace(self, value):
|
|
749
|
+
if value in colorSpaces:
|
|
750
|
+
self._colorSpace = value
|
|
751
|
+
else:
|
|
752
|
+
logging.error(f"'{value}' is not a valid color space")
|
|
753
|
+
|
|
754
|
+
@property
|
|
755
|
+
def contrast(self):
|
|
756
|
+
"""A value that is simply multiplied by the color (`float`).
|
|
757
|
+
|
|
758
|
+
This may be used to adjust the lightness of the material. This is
|
|
759
|
+
applied to all material color components.
|
|
760
|
+
|
|
761
|
+
Examples
|
|
762
|
+
--------
|
|
763
|
+
Basic usage::
|
|
764
|
+
|
|
765
|
+
stim.contrast = 1.0 # unchanged contrast
|
|
766
|
+
stim.contrast = 0.5 # decrease contrast
|
|
767
|
+
stim.contrast = 0.0 # uniform, no contrast
|
|
768
|
+
stim.contrast = -0.5 # slightly inverted
|
|
769
|
+
stim.contrast = -1.0 # totally inverted
|
|
770
|
+
|
|
771
|
+
Setting contrast outside range -1 to 1 is permitted, but may
|
|
772
|
+
produce strange results if color values exceeds the monitor limits.::
|
|
773
|
+
|
|
774
|
+
stim.contrast = 1.2 # increases contrast
|
|
775
|
+
stim.contrast = -1.2 # inverts with increased contrast
|
|
776
|
+
|
|
777
|
+
"""
|
|
778
|
+
return self._diffuseColor.contrast
|
|
779
|
+
|
|
780
|
+
@contrast.setter
|
|
781
|
+
def contrast(self, value):
|
|
782
|
+
self._diffuseColor.contrast = value
|
|
783
|
+
self._specularColor.contrast = value
|
|
784
|
+
self._ambientColor.contrast = value
|
|
785
|
+
self._emissionColor.contrast = value
|
|
786
|
+
|
|
787
|
+
@property
|
|
788
|
+
def shininess(self):
|
|
789
|
+
"""Material shininess coefficient (`float`).
|
|
790
|
+
|
|
791
|
+
This is used to specify the 'tightness' of the specular highlights.
|
|
792
|
+
Values usually range between 0 and 128, but the range depends on the
|
|
793
|
+
specular highlight formula used by the shader.
|
|
794
|
+
|
|
795
|
+
"""
|
|
796
|
+
return self._shininess
|
|
797
|
+
|
|
798
|
+
@shininess.setter
|
|
799
|
+
def shininess(self, value):
|
|
800
|
+
self._shininess = float(value)
|
|
801
|
+
|
|
802
|
+
@property
|
|
803
|
+
def face(self):
|
|
804
|
+
"""Face to apply the material to (`str`). Possible values are one of
|
|
805
|
+
`'front'`, `'back'` or `'both'`.
|
|
806
|
+
"""
|
|
807
|
+
return self._face
|
|
808
|
+
|
|
809
|
+
@face.setter
|
|
810
|
+
def face(self, value):
|
|
811
|
+
# which faces to apply the material
|
|
812
|
+
if value == 'front':
|
|
813
|
+
self._face = GL.GL_FRONT
|
|
814
|
+
elif value == 'back':
|
|
815
|
+
self._face = GL.GL_BACK
|
|
816
|
+
elif value == 'both':
|
|
817
|
+
self._face = GL.GL_FRONT_AND_BACK
|
|
818
|
+
else:
|
|
819
|
+
raise ValueError(
|
|
820
|
+
"Invalid value for `face` specified, must be 'front', 'back' "
|
|
821
|
+
"or 'both'.")
|
|
822
|
+
|
|
823
|
+
@property
|
|
824
|
+
def diffuseColor(self):
|
|
825
|
+
"""Diffuse color `(r, g, b)` for the material (`psychopy.color.Color`,
|
|
826
|
+
`ArrayLike` or `None`).
|
|
827
|
+
"""
|
|
828
|
+
return self._diffuseColor.render(self.colorSpace)
|
|
829
|
+
|
|
830
|
+
@diffuseColor.setter
|
|
831
|
+
def diffuseColor(self, value):
|
|
832
|
+
if isinstance(value, Color):
|
|
833
|
+
self._diffuseColor = value
|
|
834
|
+
else:
|
|
835
|
+
self._diffuseColor = Color(
|
|
836
|
+
value,
|
|
837
|
+
self.colorSpace,
|
|
838
|
+
contrast=self.contrast)
|
|
839
|
+
|
|
840
|
+
if not self._diffuseColor:
|
|
841
|
+
# If given an invalid color, set as transparent and log error
|
|
842
|
+
self._diffuseColor = Color()
|
|
843
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
844
|
+
|
|
845
|
+
# compute RGB values for the shader
|
|
846
|
+
self._diffuseRGB[:3] = self._diffuseColor.rgb1
|
|
847
|
+
self._diffuseRGB[3] = self._diffuseColor.opacity
|
|
848
|
+
|
|
849
|
+
# need to create a pointer for the shader
|
|
850
|
+
self._ptrDiffuse = np.ctypeslib.as_ctypes(self._diffuseRGB)
|
|
851
|
+
|
|
852
|
+
def setDiffuseColor(self, color, colorSpace=None, operation='', log=None):
|
|
853
|
+
"""Set the diffuse color for the material.
|
|
854
|
+
|
|
855
|
+
Use this method if you wish to supress logging or apply operations on
|
|
856
|
+
the color component.
|
|
857
|
+
|
|
858
|
+
Parameters
|
|
859
|
+
----------
|
|
860
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
861
|
+
Color to set as the diffuse component of the material.
|
|
862
|
+
colorSpace : str or None
|
|
863
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
864
|
+
`diffuseColor` after setting uses the color space of the object.
|
|
865
|
+
operation : str
|
|
866
|
+
Operation string.
|
|
867
|
+
log : bool or None
|
|
868
|
+
Enable logging.
|
|
869
|
+
|
|
870
|
+
"""
|
|
871
|
+
setColor(
|
|
872
|
+
obj=self,
|
|
873
|
+
colorAttrib="diffuseColor",
|
|
874
|
+
color=color,
|
|
875
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
876
|
+
operation=operation,
|
|
877
|
+
log=log)
|
|
878
|
+
|
|
879
|
+
@property
|
|
880
|
+
def specularColor(self):
|
|
881
|
+
"""Specular color `(r, g, b)` of the material (`psychopy.color.Color`,
|
|
882
|
+
`ArrayLike` or `None`).
|
|
883
|
+
"""
|
|
884
|
+
return self._specularColor.render(self.colorSpace)
|
|
885
|
+
|
|
886
|
+
@specularColor.setter
|
|
887
|
+
def specularColor(self, value):
|
|
888
|
+
if isinstance(value, Color):
|
|
889
|
+
self._specularColor = value
|
|
890
|
+
else:
|
|
891
|
+
self._specularColor = Color(
|
|
892
|
+
value,
|
|
893
|
+
self.colorSpace,
|
|
894
|
+
contrast=self.contrast)
|
|
895
|
+
|
|
896
|
+
if not self._specularColor:
|
|
897
|
+
# If given an invalid color, set as transparent and log error
|
|
898
|
+
self._specularColor = Color()
|
|
899
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
900
|
+
|
|
901
|
+
self._specularRGB[:3] = self._specularColor.rgb1
|
|
902
|
+
self._specularRGB[3] = self._specularColor.opacity
|
|
903
|
+
|
|
904
|
+
self._ptrSpecular = np.ctypeslib.as_ctypes(self._specularRGB)
|
|
905
|
+
|
|
906
|
+
def setSpecularColor(self, color, colorSpace=None, operation='', log=None):
|
|
907
|
+
"""Set the diffuse color for the material. Use this function if you
|
|
908
|
+
wish to supress logging or apply operations on the color component.
|
|
909
|
+
|
|
910
|
+
Parameters
|
|
911
|
+
----------
|
|
912
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
913
|
+
Color to set as the specular component of the light source.
|
|
914
|
+
colorSpace : str or None
|
|
915
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
916
|
+
`diffuseColor` after setting uses the color space of the object.
|
|
917
|
+
operation : str
|
|
918
|
+
Operation string.
|
|
919
|
+
log : bool or None
|
|
920
|
+
Enable logging.
|
|
921
|
+
|
|
922
|
+
"""
|
|
923
|
+
setColor(
|
|
924
|
+
obj=self,
|
|
925
|
+
colorAttrib="specularColor",
|
|
926
|
+
color=color,
|
|
927
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
928
|
+
operation=operation,
|
|
929
|
+
log=log)
|
|
930
|
+
|
|
931
|
+
@property
|
|
932
|
+
def ambientColor(self):
|
|
933
|
+
"""Ambient color `(r, g, b)` of the material (`psychopy.color.Color`,
|
|
934
|
+
`ArrayLike` or `None`).
|
|
935
|
+
"""
|
|
936
|
+
return self._ambientColor.render(self.colorSpace)
|
|
937
|
+
|
|
938
|
+
@ambientColor.setter
|
|
939
|
+
def ambientColor(self, value):
|
|
940
|
+
if isinstance(value, Color):
|
|
941
|
+
self._ambientColor = value
|
|
942
|
+
else:
|
|
943
|
+
self._ambientColor = Color(
|
|
944
|
+
value,
|
|
945
|
+
self.colorSpace,
|
|
946
|
+
contrast=self.contrast)
|
|
947
|
+
|
|
948
|
+
if not self._ambientColor:
|
|
949
|
+
# If given an invalid color, set as transparent and log error
|
|
950
|
+
self._ambientColor = Color()
|
|
951
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
952
|
+
|
|
953
|
+
self._ambientRGB[:3] = self._ambientColor.rgb1
|
|
954
|
+
self._ambientRGB[3] = self._ambientColor.opacity
|
|
955
|
+
|
|
956
|
+
self._ptrAmbient = np.ctypeslib.as_ctypes(self._ambientRGB)
|
|
957
|
+
|
|
958
|
+
def setAmbientColor(self, color, colorSpace=None, operation='', log=None):
|
|
959
|
+
"""Set the ambient color for the material.
|
|
960
|
+
|
|
961
|
+
Use this function if you wish to supress logging or apply operations on
|
|
962
|
+
the color component.
|
|
963
|
+
|
|
964
|
+
Parameters
|
|
965
|
+
----------
|
|
966
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
967
|
+
Color to set as the ambient component of the light source.
|
|
968
|
+
colorSpace : str or None
|
|
969
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
970
|
+
`ambientColor` after setting uses the color space of the object.
|
|
971
|
+
operation : str
|
|
972
|
+
Operation string.
|
|
973
|
+
log : bool or None
|
|
974
|
+
Enable logging.
|
|
975
|
+
|
|
976
|
+
"""
|
|
977
|
+
setColor(
|
|
978
|
+
obj=self,
|
|
979
|
+
colorAttrib="ambientColor",
|
|
980
|
+
color=color,
|
|
981
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
982
|
+
operation=operation,
|
|
983
|
+
log=log)
|
|
984
|
+
|
|
985
|
+
@property
|
|
986
|
+
def emissionColor(self):
|
|
987
|
+
"""Emission color `(r, g, b)` of the material (`psychopy.color.Color`,
|
|
988
|
+
`ArrayLike` or `None`).
|
|
989
|
+
"""
|
|
990
|
+
return self._emissionColor.render(self.colorSpace)
|
|
991
|
+
|
|
992
|
+
@emissionColor.setter
|
|
993
|
+
def emissionColor(self, value):
|
|
994
|
+
if isinstance(value, Color):
|
|
995
|
+
self._emissionColor = value
|
|
996
|
+
else:
|
|
997
|
+
self._emissionColor = Color(
|
|
998
|
+
value,
|
|
999
|
+
self.colorSpace,
|
|
1000
|
+
contrast=self.contrast)
|
|
1001
|
+
|
|
1002
|
+
if not self._emissionColor:
|
|
1003
|
+
# If given an invalid color, set as transparent and log error
|
|
1004
|
+
self._emissionColor = Color()
|
|
1005
|
+
logging.error(f"'{value}' is not a valid {self.colorSpace} color")
|
|
1006
|
+
|
|
1007
|
+
self._emissionRGB[:3] = self._emissionColor.rgb1
|
|
1008
|
+
self._emissionRGB[3] = self._emissionColor.opacity
|
|
1009
|
+
|
|
1010
|
+
self._ptrEmission = np.ctypeslib.as_ctypes(self._emissionRGB)
|
|
1011
|
+
|
|
1012
|
+
def setEmissionColor(self, color, colorSpace=None, operation='', log=None):
|
|
1013
|
+
"""Set the emission color for the material.
|
|
1014
|
+
|
|
1015
|
+
Use this function if you wish to supress logging or apply operations on
|
|
1016
|
+
the color component.
|
|
1017
|
+
|
|
1018
|
+
Parameters
|
|
1019
|
+
----------
|
|
1020
|
+
color : ArrayLike or `~psychopy.colors.Color`
|
|
1021
|
+
Color to set as the ambient component of the light source.
|
|
1022
|
+
colorSpace : str or None
|
|
1023
|
+
Colorspace to use. This is only used to set the color, the value of
|
|
1024
|
+
`ambientColor` after setting uses the color space of the object.
|
|
1025
|
+
operation : str
|
|
1026
|
+
Operation string.
|
|
1027
|
+
log : bool or None
|
|
1028
|
+
Enable logging.
|
|
1029
|
+
|
|
1030
|
+
"""
|
|
1031
|
+
setColor(
|
|
1032
|
+
obj=self,
|
|
1033
|
+
colorAttrib="emissionColor",
|
|
1034
|
+
color=color,
|
|
1035
|
+
colorSpace=colorSpace or self.colorSpace,
|
|
1036
|
+
operation=operation,
|
|
1037
|
+
log=log)
|
|
1038
|
+
|
|
1039
|
+
# --------------------------------------------------------------------------
|
|
1040
|
+
# Material RGB colors
|
|
1041
|
+
#
|
|
1042
|
+
# These are the color values formatted for use in OpenGL.
|
|
1043
|
+
#
|
|
1044
|
+
|
|
1045
|
+
@property
|
|
1046
|
+
def diffuseRGB(self):
|
|
1047
|
+
"""RGB values of the diffuse color of the material (`numpy.ndarray`).
|
|
1048
|
+
"""
|
|
1049
|
+
return self._diffuseRGB[:3]
|
|
1050
|
+
|
|
1051
|
+
@property
|
|
1052
|
+
def specularRGB(self):
|
|
1053
|
+
"""RGB values of the specular color of the material (`numpy.ndarray`).
|
|
1054
|
+
"""
|
|
1055
|
+
return self._specularRGB[:3]
|
|
1056
|
+
|
|
1057
|
+
@property
|
|
1058
|
+
def ambientRGB(self):
|
|
1059
|
+
"""RGB values of the ambient color of the material (`numpy.ndarray`).
|
|
1060
|
+
"""
|
|
1061
|
+
return self._ambientRGB[:3]
|
|
1062
|
+
|
|
1063
|
+
@property
|
|
1064
|
+
def emissionRGB(self):
|
|
1065
|
+
"""RGB values of the emission color of the material (`numpy.ndarray`).
|
|
1066
|
+
"""
|
|
1067
|
+
return self._emissionRGB[:3]
|
|
1068
|
+
|
|
1069
|
+
# Texture setter -----------------------------------------------------------
|
|
1070
|
+
|
|
1071
|
+
@property
|
|
1072
|
+
def diffuseTexture(self):
|
|
1073
|
+
"""Diffuse texture of the material (`psychopy.tools.gltools.TexImage2D`
|
|
1074
|
+
or `None`).
|
|
1075
|
+
"""
|
|
1076
|
+
return self._diffuseTexture
|
|
1077
|
+
|
|
1078
|
+
@diffuseTexture.setter
|
|
1079
|
+
def diffuseTexture(self, value):
|
|
1080
|
+
self._diffuseTexture = value
|
|
1081
|
+
|
|
1082
|
+
# --------------------------------------------------------------------------
|
|
1083
|
+
|
|
1084
|
+
def begin(self, useTextures=True):
|
|
1085
|
+
"""Use this material for successive rendering calls.
|
|
1086
|
+
|
|
1087
|
+
Parameters
|
|
1088
|
+
----------
|
|
1089
|
+
useTextures : bool
|
|
1090
|
+
Enable textures.
|
|
1091
|
+
|
|
1092
|
+
"""
|
|
1093
|
+
GL.glDisable(GL.GL_COLOR_MATERIAL) # disable color tracking
|
|
1094
|
+
face = self._face
|
|
1095
|
+
|
|
1096
|
+
# check if lighting is enabled, otherwise don't render lights
|
|
1097
|
+
nLights = len(self.win.lights) if self.win.useLights else 0
|
|
1098
|
+
|
|
1099
|
+
useTextures = useTextures and self.diffuseTexture is not None
|
|
1100
|
+
shaderKey = (nLights, useTextures)
|
|
1101
|
+
gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
|
|
1102
|
+
|
|
1103
|
+
# pass values to OpenGL
|
|
1104
|
+
GL.glMaterialfv(face, GL.GL_DIFFUSE, self._ptrDiffuse)
|
|
1105
|
+
GL.glMaterialfv(face, GL.GL_SPECULAR, self._ptrSpecular)
|
|
1106
|
+
GL.glMaterialfv(face, GL.GL_AMBIENT, self._ptrAmbient)
|
|
1107
|
+
GL.glMaterialfv(face, GL.GL_EMISSION, self._ptrEmission)
|
|
1108
|
+
GL.glMaterialf(face, GL.GL_SHININESS, self.shininess)
|
|
1109
|
+
|
|
1110
|
+
# setup textures
|
|
1111
|
+
if useTextures and self.diffuseTexture is not None:
|
|
1112
|
+
self._useTextures = True
|
|
1113
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
1114
|
+
gt.bindTexture(self.diffuseTexture, 0)
|
|
1115
|
+
|
|
1116
|
+
def end(self, clear=True):
|
|
1117
|
+
"""Stop using this material.
|
|
1118
|
+
|
|
1119
|
+
Must be called after `begin` before using another material or else later
|
|
1120
|
+
drawing operations may have undefined behavior.
|
|
1121
|
+
|
|
1122
|
+
Upon returning, `GL_COLOR_MATERIAL` is enabled so material colors will
|
|
1123
|
+
track the current `glColor`.
|
|
1124
|
+
|
|
1125
|
+
Parameters
|
|
1126
|
+
----------
|
|
1127
|
+
clear : bool
|
|
1128
|
+
Overwrite material state settings with default values. This
|
|
1129
|
+
ensures material colors are set to OpenGL defaults. You can forgo
|
|
1130
|
+
clearing if successive materials are used which overwrite
|
|
1131
|
+
`glMaterialfv` values for `GL_DIFFUSE`, `GL_SPECULAR`, `GL_AMBIENT`,
|
|
1132
|
+
`GL_EMISSION`, and `GL_SHININESS`. This reduces a bit of overhead
|
|
1133
|
+
if there is no need to return to default values intermittently
|
|
1134
|
+
between successive material `begin` and `end` calls. Textures and
|
|
1135
|
+
shaders previously enabled will still be disabled.
|
|
1136
|
+
|
|
1137
|
+
"""
|
|
1138
|
+
if clear:
|
|
1139
|
+
GL.glMaterialfv(
|
|
1140
|
+
self._face,
|
|
1141
|
+
GL.GL_DIFFUSE,
|
|
1142
|
+
(GL.GLfloat * 4)(0.8, 0.8, 0.8, 1.0))
|
|
1143
|
+
GL.glMaterialfv(
|
|
1144
|
+
self._face,
|
|
1145
|
+
GL.GL_SPECULAR,
|
|
1146
|
+
(GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0))
|
|
1147
|
+
GL.glMaterialfv(
|
|
1148
|
+
self._face,
|
|
1149
|
+
GL.GL_AMBIENT,
|
|
1150
|
+
(GL.GLfloat * 4)(0.2, 0.2, 0.2, 1.0))
|
|
1151
|
+
GL.glMaterialfv(
|
|
1152
|
+
self._face,
|
|
1153
|
+
GL.GL_EMISSION,
|
|
1154
|
+
(GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0))
|
|
1155
|
+
GL.glMaterialf(self._face, GL.GL_SHININESS, 0.0)
|
|
1156
|
+
|
|
1157
|
+
if self._useTextures:
|
|
1158
|
+
self._useTextures = False
|
|
1159
|
+
gt.unbindTexture(self.diffuseTexture)
|
|
1160
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
1161
|
+
|
|
1162
|
+
gt.useProgram(0)
|
|
1163
|
+
|
|
1164
|
+
GL.glEnable(GL.GL_COLOR_MATERIAL)
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
class BaseRigidBodyStim(ColorMixin, WindowMixin):
|
|
1168
|
+
"""Base class for rigid body 3D stimuli.
|
|
1169
|
+
|
|
1170
|
+
This class handles the pose of a rigid body 3D stimulus. Poses are
|
|
1171
|
+
represented by a `RigidBodyClass` object accessed via `thePose` attribute.
|
|
1172
|
+
|
|
1173
|
+
Any class the implements `pos` and `ori` attributes can be used in place of
|
|
1174
|
+
a `RigidBodyPose` instance for `thePose`. This common interface allows for
|
|
1175
|
+
custom classes which handle 3D transformations to be used for stimulus
|
|
1176
|
+
transformations (eg. `LibOVRPose` in PsychXR can be used instead of
|
|
1177
|
+
`RigidBodyPose` which supports more VR specific features).
|
|
1178
|
+
|
|
1179
|
+
Warnings
|
|
1180
|
+
--------
|
|
1181
|
+
This class is experimental and may result in undefined behavior.
|
|
1182
|
+
|
|
1183
|
+
"""
|
|
1184
|
+
def __init__(self,
|
|
1185
|
+
win,
|
|
1186
|
+
pos=(0., 0., 0.),
|
|
1187
|
+
ori=(0., 0., 0., 1.),
|
|
1188
|
+
color=(0.0, 0.0, 0.0),
|
|
1189
|
+
colorSpace='rgb',
|
|
1190
|
+
contrast=1.0,
|
|
1191
|
+
opacity=1.0,
|
|
1192
|
+
name='',
|
|
1193
|
+
autoLog=True):
|
|
1194
|
+
"""
|
|
1195
|
+
Parameters
|
|
1196
|
+
----------
|
|
1197
|
+
win : `~psychopy.visual.Window`
|
|
1198
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1199
|
+
across windows unless they share the same context.
|
|
1200
|
+
pos : array_like
|
|
1201
|
+
Position vector `[x, y, z]` for the origin of the rigid body.
|
|
1202
|
+
ori : array_like
|
|
1203
|
+
Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
|
|
1204
|
+
imaginary and `w` is real.
|
|
1205
|
+
|
|
1206
|
+
"""
|
|
1207
|
+
self.name = name
|
|
1208
|
+
|
|
1209
|
+
super(BaseRigidBodyStim, self).__init__()
|
|
1210
|
+
|
|
1211
|
+
self.win = win
|
|
1212
|
+
self.autoLog = autoLog
|
|
1213
|
+
self.colorSpace = colorSpace
|
|
1214
|
+
self.contrast = contrast
|
|
1215
|
+
self.opacity = opacity
|
|
1216
|
+
self.color = color
|
|
1217
|
+
|
|
1218
|
+
self._thePose = RigidBodyPose(pos, ori)
|
|
1219
|
+
self.material = None
|
|
1220
|
+
|
|
1221
|
+
self._vao = None
|
|
1222
|
+
|
|
1223
|
+
@property
|
|
1224
|
+
def thePose(self):
|
|
1225
|
+
"""The pose of the rigid body. This is a class which has `pos` and `ori`
|
|
1226
|
+
attributes."""
|
|
1227
|
+
return self._thePose
|
|
1228
|
+
|
|
1229
|
+
@thePose.setter
|
|
1230
|
+
def thePose(self, value):
|
|
1231
|
+
if hasattr(value, 'pos') and hasattr(value, 'ori'):
|
|
1232
|
+
self._thePose = value
|
|
1233
|
+
else:
|
|
1234
|
+
raise AttributeError(
|
|
1235
|
+
'Class set to `thePose` does not implement `pos` or `ori`.')
|
|
1236
|
+
|
|
1237
|
+
@property
|
|
1238
|
+
def pos(self):
|
|
1239
|
+
"""Position vector (X, Y, Z)."""
|
|
1240
|
+
return self.thePose.pos
|
|
1241
|
+
|
|
1242
|
+
@pos.setter
|
|
1243
|
+
def pos(self, value):
|
|
1244
|
+
self.thePose.pos = value
|
|
1245
|
+
|
|
1246
|
+
def getPos(self):
|
|
1247
|
+
return self.thePose.pos
|
|
1248
|
+
|
|
1249
|
+
def setPos(self, pos):
|
|
1250
|
+
self.thePose.pos = pos
|
|
1251
|
+
|
|
1252
|
+
@property
|
|
1253
|
+
def ori(self):
|
|
1254
|
+
"""Orientation quaternion (X, Y, Z, W)."""
|
|
1255
|
+
return self.thePose.ori
|
|
1256
|
+
|
|
1257
|
+
@ori.setter
|
|
1258
|
+
def ori(self, value):
|
|
1259
|
+
self.thePose.ori = value
|
|
1260
|
+
|
|
1261
|
+
def getOri(self):
|
|
1262
|
+
return self.thePose.ori
|
|
1263
|
+
|
|
1264
|
+
def setOri(self, ori):
|
|
1265
|
+
self.thePose.ori = ori
|
|
1266
|
+
|
|
1267
|
+
def getOriAxisAngle(self, degrees=True):
|
|
1268
|
+
"""Get the axis and angle of rotation for the 3D stimulus. Converts the
|
|
1269
|
+
orientation defined by the `ori` quaternion to and axis-angle
|
|
1270
|
+
representation.
|
|
1271
|
+
|
|
1272
|
+
Parameters
|
|
1273
|
+
----------
|
|
1274
|
+
degrees : bool, optional
|
|
1275
|
+
Specify ``True`` if `angle` is in degrees, or else it will be
|
|
1276
|
+
treated as radians. Default is ``True``.
|
|
1277
|
+
|
|
1278
|
+
Returns
|
|
1279
|
+
-------
|
|
1280
|
+
tuple
|
|
1281
|
+
Axis `[rx, ry, rz]` and angle.
|
|
1282
|
+
|
|
1283
|
+
"""
|
|
1284
|
+
return self.thePose.getOriAxisAngle(degrees)
|
|
1285
|
+
|
|
1286
|
+
def setOriAxisAngle(self, axis, angle, degrees=True):
|
|
1287
|
+
"""Set the orientation of the 3D stimulus using an `axis` and
|
|
1288
|
+
`angle`. This sets the quaternion at `ori`.
|
|
1289
|
+
|
|
1290
|
+
Parameters
|
|
1291
|
+
----------
|
|
1292
|
+
axis : array_like
|
|
1293
|
+
Axis of rotation [rx, ry, rz].
|
|
1294
|
+
angle : float
|
|
1295
|
+
Angle of rotation.
|
|
1296
|
+
degrees : bool, optional
|
|
1297
|
+
Specify ``True`` if `angle` is in degrees, or else it will be
|
|
1298
|
+
treated as radians. Default is ``True``.
|
|
1299
|
+
|
|
1300
|
+
"""
|
|
1301
|
+
self.thePose.setOriAxisAngle(axis, angle, degrees)
|
|
1302
|
+
|
|
1303
|
+
def _createVAO(self, vertices, textureCoords, normals, faces):
|
|
1304
|
+
"""Create a vertex array object for handling vertex attribute data.
|
|
1305
|
+
"""
|
|
1306
|
+
self.thePose.bounds = BoundingBox()
|
|
1307
|
+
self.thePose.bounds.fit(vertices)
|
|
1308
|
+
|
|
1309
|
+
# upload to buffers
|
|
1310
|
+
vertexVBO = gt.createVBO(vertices)
|
|
1311
|
+
texCoordVBO = gt.createVBO(textureCoords)
|
|
1312
|
+
normalsVBO = gt.createVBO(normals)
|
|
1313
|
+
|
|
1314
|
+
# create an index buffer with faces
|
|
1315
|
+
indexBuffer = gt.createVBO(
|
|
1316
|
+
faces.flatten(),
|
|
1317
|
+
target=GL.GL_ELEMENT_ARRAY_BUFFER,
|
|
1318
|
+
dataType=GL.GL_UNSIGNED_INT)
|
|
1319
|
+
|
|
1320
|
+
return gt.createVAO({GL.GL_VERTEX_ARRAY: vertexVBO,
|
|
1321
|
+
GL.GL_TEXTURE_COORD_ARRAY: texCoordVBO,
|
|
1322
|
+
GL.GL_NORMAL_ARRAY: normalsVBO},
|
|
1323
|
+
indexBuffer=indexBuffer, legacy=True)
|
|
1324
|
+
|
|
1325
|
+
def draw(self, win=None):
|
|
1326
|
+
"""Draw the stimulus.
|
|
1327
|
+
|
|
1328
|
+
This should work for stimuli using a single VAO and material. More
|
|
1329
|
+
complex stimuli with multiple materials should override this method to
|
|
1330
|
+
correctly handle that case.
|
|
1331
|
+
|
|
1332
|
+
Parameters
|
|
1333
|
+
----------
|
|
1334
|
+
win : `~psychopy.visual.Window`
|
|
1335
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1336
|
+
across windows unless they share the same context.
|
|
1337
|
+
|
|
1338
|
+
"""
|
|
1339
|
+
if win is None:
|
|
1340
|
+
win = self.win
|
|
1341
|
+
else:
|
|
1342
|
+
self._selectWindow(win)
|
|
1343
|
+
|
|
1344
|
+
# nop if there is no VAO to draw
|
|
1345
|
+
if self._vao is None:
|
|
1346
|
+
return
|
|
1347
|
+
|
|
1348
|
+
win.draw3d = True
|
|
1349
|
+
|
|
1350
|
+
# apply transformation to mesh
|
|
1351
|
+
GL.glPushMatrix()
|
|
1352
|
+
GL.glMultTransposeMatrixf(at.array2pointer(self.thePose.modelMatrix))
|
|
1353
|
+
|
|
1354
|
+
if self.material is not None: # has a material, use it
|
|
1355
|
+
useTexture = self.material.diffuseTexture is not None
|
|
1356
|
+
self.material.begin(useTexture)
|
|
1357
|
+
gt.drawVAO(self._vao, GL.GL_TRIANGLES)
|
|
1358
|
+
self.material.end()
|
|
1359
|
+
else: # doesn't have a material, use class colors
|
|
1360
|
+
r, g, b = self._foreColor.render('rgb')
|
|
1361
|
+
color = np.ctypeslib.as_ctypes(
|
|
1362
|
+
np.array((r, g, b, self.opacity), np.float32))
|
|
1363
|
+
|
|
1364
|
+
nLights = len(self.win.lights)
|
|
1365
|
+
shaderKey = (nLights, False)
|
|
1366
|
+
gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
|
|
1367
|
+
|
|
1368
|
+
# pass values to OpenGL as material
|
|
1369
|
+
GL.glColor4f(r, g, b, self.opacity)
|
|
1370
|
+
GL.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color)
|
|
1371
|
+
GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color)
|
|
1372
|
+
|
|
1373
|
+
gt.drawVAO(self._vao, GL.GL_TRIANGLES)
|
|
1374
|
+
|
|
1375
|
+
gt.useProgram(0)
|
|
1376
|
+
|
|
1377
|
+
GL.glPopMatrix()
|
|
1378
|
+
|
|
1379
|
+
win.draw3d = False
|
|
1380
|
+
|
|
1381
|
+
@attributeSetter
|
|
1382
|
+
def units(self, value):
|
|
1383
|
+
"""
|
|
1384
|
+
None, 'norm', 'cm', 'deg', 'degFlat', 'degFlatPos', or 'pix'
|
|
1385
|
+
|
|
1386
|
+
If None then the current units of the
|
|
1387
|
+
:class:`~psychopy.visual.Window` will be used.
|
|
1388
|
+
See :ref:`units` for explanation of other options.
|
|
1389
|
+
|
|
1390
|
+
Note that when you change units, you don't change the stimulus
|
|
1391
|
+
parameters and it is likely to change appearance. Example::
|
|
1392
|
+
|
|
1393
|
+
# This stimulus is 20% wide and 50% tall with respect to window
|
|
1394
|
+
stim = visual.PatchStim(win, units='norm', size=(0.2, 0.5)
|
|
1395
|
+
|
|
1396
|
+
# This stimulus is 0.2 degrees wide and 0.5 degrees tall.
|
|
1397
|
+
stim.units = 'deg'
|
|
1398
|
+
"""
|
|
1399
|
+
if value is not None and len(value):
|
|
1400
|
+
self.__dict__['units'] = value
|
|
1401
|
+
else:
|
|
1402
|
+
self.__dict__['units'] = self.win.units
|
|
1403
|
+
|
|
1404
|
+
def _updateList(self):
|
|
1405
|
+
"""The user shouldn't need this method since it gets called
|
|
1406
|
+
after every call to .set()
|
|
1407
|
+
Chooses between using and not using shaders each call.
|
|
1408
|
+
"""
|
|
1409
|
+
pass
|
|
1410
|
+
|
|
1411
|
+
def isVisible(self):
|
|
1412
|
+
"""Check if the object is visible to the observer.
|
|
1413
|
+
|
|
1414
|
+
Test if a pose's bounding box or position falls outside of an eye's view
|
|
1415
|
+
frustum.
|
|
1416
|
+
|
|
1417
|
+
Poses can be assigned bounding boxes which enclose any 3D models
|
|
1418
|
+
associated with them. A model is not visible if all the corners of the
|
|
1419
|
+
bounding box fall outside the viewing frustum. Therefore any primitives
|
|
1420
|
+
(i.e. triangles) associated with the pose can be culled during rendering
|
|
1421
|
+
to reduce CPU/GPU workload.
|
|
1422
|
+
|
|
1423
|
+
Returns
|
|
1424
|
+
-------
|
|
1425
|
+
bool
|
|
1426
|
+
`True` if the object's bounding box is visible.
|
|
1427
|
+
|
|
1428
|
+
Examples
|
|
1429
|
+
--------
|
|
1430
|
+
You can avoid running draw commands if the object is not visible by
|
|
1431
|
+
doing a visibility test first::
|
|
1432
|
+
|
|
1433
|
+
if myStim.isVisible():
|
|
1434
|
+
myStim.draw()
|
|
1435
|
+
|
|
1436
|
+
"""
|
|
1437
|
+
if self.thePose.bounds is None:
|
|
1438
|
+
return True
|
|
1439
|
+
|
|
1440
|
+
if not self.thePose.bounds.isValid:
|
|
1441
|
+
return True
|
|
1442
|
+
|
|
1443
|
+
# transformation matrix
|
|
1444
|
+
mvpMatrix = np.zeros((4, 4), dtype=np.float32)
|
|
1445
|
+
np.matmul(self.win.projectionMatrix, self.win.viewMatrix, out=mvpMatrix)
|
|
1446
|
+
np.matmul(mvpMatrix, self.thePose.modelMatrix, out=mvpMatrix)
|
|
1447
|
+
|
|
1448
|
+
# compute bounding box corners in current view
|
|
1449
|
+
corners = self.thePose.bounds._posCorners.dot(mvpMatrix.T)
|
|
1450
|
+
|
|
1451
|
+
# check if corners are completely off to one side of the frustum
|
|
1452
|
+
if not np.any(corners[:, 0] > -corners[:, 3]):
|
|
1453
|
+
return False
|
|
1454
|
+
|
|
1455
|
+
if not np.any(corners[:, 0] < corners[:, 3]):
|
|
1456
|
+
return False
|
|
1457
|
+
|
|
1458
|
+
if not np.any(corners[:, 1] > -corners[:, 3]):
|
|
1459
|
+
return False
|
|
1460
|
+
|
|
1461
|
+
if not np.any(corners[:, 1] < corners[:, 3]):
|
|
1462
|
+
return False
|
|
1463
|
+
|
|
1464
|
+
if not np.any(corners[:, 2] > -corners[:, 3]):
|
|
1465
|
+
return False
|
|
1466
|
+
|
|
1467
|
+
if not np.any(corners[:, 2] < corners[:, 3]):
|
|
1468
|
+
return False
|
|
1469
|
+
|
|
1470
|
+
return True
|
|
1471
|
+
|
|
1472
|
+
def getRayIntersectBounds(self, rayOrig, rayDir):
|
|
1473
|
+
"""Get the point which a ray intersects the bounding box of this mesh.
|
|
1474
|
+
|
|
1475
|
+
Parameters
|
|
1476
|
+
----------
|
|
1477
|
+
rayOrig : array_like
|
|
1478
|
+
Origin of the ray in space [x, y, z].
|
|
1479
|
+
rayDir : array_like
|
|
1480
|
+
Direction vector of the ray [x, y, z], should be normalized.
|
|
1481
|
+
|
|
1482
|
+
Returns
|
|
1483
|
+
-------
|
|
1484
|
+
tuple
|
|
1485
|
+
Coordinate in world space of the intersection and distance in scene
|
|
1486
|
+
units from `rayOrig`. Returns `None` if there is no intersection.
|
|
1487
|
+
|
|
1488
|
+
"""
|
|
1489
|
+
if self.thePose.bounds is None:
|
|
1490
|
+
return None # nop
|
|
1491
|
+
|
|
1492
|
+
return mt.intersectRayOBB(rayOrig,
|
|
1493
|
+
rayDir,
|
|
1494
|
+
self.thePose.modelMatrix,
|
|
1495
|
+
self.thePose.bounds.extents,
|
|
1496
|
+
dtype=np.float32)
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
class SphereStim(BaseRigidBodyStim):
|
|
1500
|
+
"""Class for drawing a UV sphere. This is a
|
|
1501
|
+
lazy-imported class, therefore import using full path
|
|
1502
|
+
`from psychopy.visual.stim3d import SphereStim` when inheriting from it.
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
The resolution of the sphere mesh can be controlled by setting `sectors`
|
|
1506
|
+
and `stacks` which controls the number of latitudinal and longitudinal
|
|
1507
|
+
subdivisions, respectively. The radius of the sphere is defined by setting
|
|
1508
|
+
`radius` expressed in scene units (meters if using a perspective
|
|
1509
|
+
projection).
|
|
1510
|
+
|
|
1511
|
+
Calling the `draw` method will render the sphere to the current buffer. The
|
|
1512
|
+
render target (FBO or back buffer) must have a depth buffer attached to it
|
|
1513
|
+
for the object to be rendered correctly. Shading is used if the current
|
|
1514
|
+
window has light sources defined and lighting is enabled (by setting
|
|
1515
|
+
`useLights=True` before drawing the stimulus).
|
|
1516
|
+
|
|
1517
|
+
Warnings
|
|
1518
|
+
--------
|
|
1519
|
+
This class is experimental and may result in undefined behavior.
|
|
1520
|
+
|
|
1521
|
+
Examples
|
|
1522
|
+
--------
|
|
1523
|
+
Creating a red sphere 1.5 meters away from the viewer with radius 0.25::
|
|
1524
|
+
|
|
1525
|
+
redSphere = SphereStim(win,
|
|
1526
|
+
pos=(0., 0., -1.5),
|
|
1527
|
+
radius=0.25,
|
|
1528
|
+
color=(1, 0, 0))
|
|
1529
|
+
|
|
1530
|
+
"""
|
|
1531
|
+
def __init__(self,
|
|
1532
|
+
win,
|
|
1533
|
+
radius=0.5,
|
|
1534
|
+
subdiv=(32, 32),
|
|
1535
|
+
flipFaces=False,
|
|
1536
|
+
pos=(0., 0., 0.),
|
|
1537
|
+
ori=(0., 0., 0., 1.),
|
|
1538
|
+
color=(0., 0., 0.),
|
|
1539
|
+
colorSpace='rgb',
|
|
1540
|
+
contrast=1.0,
|
|
1541
|
+
opacity=1.0,
|
|
1542
|
+
useMaterial=None,
|
|
1543
|
+
name='',
|
|
1544
|
+
autoLog=True):
|
|
1545
|
+
"""
|
|
1546
|
+
Parameters
|
|
1547
|
+
----------
|
|
1548
|
+
win : `~psychopy.visual.Window`
|
|
1549
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1550
|
+
across windows unless they share the same context.
|
|
1551
|
+
radius : float
|
|
1552
|
+
Radius of the sphere in scene units.
|
|
1553
|
+
subdiv : array_like
|
|
1554
|
+
Number of latitudinal and longitudinal subdivisions `(lat, long)`
|
|
1555
|
+
for the sphere mesh. The greater the number, the smoother the sphere
|
|
1556
|
+
will appear.
|
|
1557
|
+
flipFaces : bool, optional
|
|
1558
|
+
If `True`, normals and face windings will be set to point inward
|
|
1559
|
+
towards the center of the sphere. Texture coordinates will remain
|
|
1560
|
+
the same. Default is `False`.
|
|
1561
|
+
pos : array_like
|
|
1562
|
+
Position vector `[x, y, z]` for the origin of the rigid body.
|
|
1563
|
+
ori : array_like
|
|
1564
|
+
Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
|
|
1565
|
+
imaginary and `w` is real. If you prefer specifying rotations in
|
|
1566
|
+
axis-angle format, call `setOriAxisAngle` after initialization.
|
|
1567
|
+
useMaterial : PhongMaterial, optional
|
|
1568
|
+
Material to use. The material can be configured by accessing the
|
|
1569
|
+
`material` attribute after initialization. If not material is
|
|
1570
|
+
specified, the diffuse and ambient color of the shape will be set
|
|
1571
|
+
by `color`.
|
|
1572
|
+
color : array_like
|
|
1573
|
+
Diffuse and ambient color of the stimulus if `useMaterial` is not
|
|
1574
|
+
specified. Values are with respect to `colorSpace`.
|
|
1575
|
+
colorSpace : str
|
|
1576
|
+
Colorspace of `color` to use.
|
|
1577
|
+
contrast : float
|
|
1578
|
+
Contrast of the stimulus, value modulates the `color`.
|
|
1579
|
+
opacity : float
|
|
1580
|
+
Opacity of the stimulus ranging from 0.0 to 1.0. Note that
|
|
1581
|
+
transparent objects look best when rendered from farthest to
|
|
1582
|
+
nearest.
|
|
1583
|
+
name : str
|
|
1584
|
+
Name of this object for logging purposes.
|
|
1585
|
+
autoLog : bool
|
|
1586
|
+
Enable automatic logging on attribute changes.
|
|
1587
|
+
|
|
1588
|
+
"""
|
|
1589
|
+
super(SphereStim, self).__init__(win,
|
|
1590
|
+
pos=pos,
|
|
1591
|
+
ori=ori,
|
|
1592
|
+
color=color,
|
|
1593
|
+
colorSpace=colorSpace,
|
|
1594
|
+
contrast=contrast,
|
|
1595
|
+
opacity=opacity,
|
|
1596
|
+
name=name,
|
|
1597
|
+
autoLog=autoLog)
|
|
1598
|
+
|
|
1599
|
+
# create a vertex array object for drawing
|
|
1600
|
+
vertices, textureCoords, normals, faces = gt.createUVSphere(
|
|
1601
|
+
sectors=subdiv[0],
|
|
1602
|
+
stacks=subdiv[1],
|
|
1603
|
+
radius=radius,
|
|
1604
|
+
flipFaces=flipFaces)
|
|
1605
|
+
self._vao = self._createVAO(vertices, textureCoords, normals, faces)
|
|
1606
|
+
|
|
1607
|
+
self.material = useMaterial
|
|
1608
|
+
|
|
1609
|
+
self._radius = radius # for raypicking
|
|
1610
|
+
|
|
1611
|
+
self.extents = (vertices.min(axis=0), vertices.max(axis=0))
|
|
1612
|
+
|
|
1613
|
+
def getRayIntersectSphere(self, rayOrig, rayDir):
|
|
1614
|
+
"""Get the point which a ray intersects the sphere.
|
|
1615
|
+
|
|
1616
|
+
Parameters
|
|
1617
|
+
----------
|
|
1618
|
+
rayOrig : array_like
|
|
1619
|
+
Origin of the ray in space [x, y, z].
|
|
1620
|
+
rayDir : array_like
|
|
1621
|
+
Direction vector of the ray [x, y, z], should be normalized.
|
|
1622
|
+
|
|
1623
|
+
Returns
|
|
1624
|
+
-------
|
|
1625
|
+
tuple
|
|
1626
|
+
Coordinate in world space of the intersection and distance in scene
|
|
1627
|
+
units from `rayOrig`. Returns `None` if there is no intersection.
|
|
1628
|
+
|
|
1629
|
+
"""
|
|
1630
|
+
return mt.intersectRaySphere(rayOrig,
|
|
1631
|
+
rayDir,
|
|
1632
|
+
self.thePose.pos,
|
|
1633
|
+
self._radius,
|
|
1634
|
+
dtype=np.float32)
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
class BoxStim(BaseRigidBodyStim):
|
|
1638
|
+
"""Class for drawing 3D boxes. This is a
|
|
1639
|
+
lazy-imported class, therefore import using full path
|
|
1640
|
+
`from psychopy.visual.stim3d import BoxStim` when inheriting from it.
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
Draws a rectangular box with dimensions specified by `size` (length, width,
|
|
1644
|
+
height) in scene units.
|
|
1645
|
+
|
|
1646
|
+
Calling the `draw` method will render the box to the current buffer. The
|
|
1647
|
+
render target (FBO or back buffer) must have a depth buffer attached to it
|
|
1648
|
+
for the object to be rendered correctly. Shading is used if the current
|
|
1649
|
+
window has light sources defined and lighting is enabled (by setting
|
|
1650
|
+
`useLights=True` before drawing the stimulus).
|
|
1651
|
+
|
|
1652
|
+
Warnings
|
|
1653
|
+
--------
|
|
1654
|
+
This class is experimental and may result in undefined behavior.
|
|
1655
|
+
|
|
1656
|
+
"""
|
|
1657
|
+
def __init__(self,
|
|
1658
|
+
win,
|
|
1659
|
+
size=(.5, .5, .5),
|
|
1660
|
+
flipFaces=False,
|
|
1661
|
+
pos=(0., 0., 0.),
|
|
1662
|
+
ori=(0., 0., 0., 1.),
|
|
1663
|
+
color=(0., 0., 0.),
|
|
1664
|
+
colorSpace='rgb',
|
|
1665
|
+
contrast=1.0,
|
|
1666
|
+
opacity=1.0,
|
|
1667
|
+
useMaterial=None,
|
|
1668
|
+
textureScale=None,
|
|
1669
|
+
name='',
|
|
1670
|
+
autoLog=True):
|
|
1671
|
+
"""
|
|
1672
|
+
Parameters
|
|
1673
|
+
----------
|
|
1674
|
+
win : `~psychopy.visual.Window`
|
|
1675
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1676
|
+
across windows unless they share the same context.
|
|
1677
|
+
size : tuple or float
|
|
1678
|
+
Dimensions of the mesh. If a single value is specified, the box will
|
|
1679
|
+
be a cube. Provide a tuple of floats to specify the width, length,
|
|
1680
|
+
and height of the box (eg. `size=(0.2, 1.3, 2.1)`) in scene units.
|
|
1681
|
+
flipFaces : bool, optional
|
|
1682
|
+
If `True`, normals and face windings will be set to point inward
|
|
1683
|
+
towards the center of the box. Texture coordinates will remain the
|
|
1684
|
+
same. Default is `False`.
|
|
1685
|
+
pos : array_like
|
|
1686
|
+
Position vector `[x, y, z]` for the origin of the rigid body.
|
|
1687
|
+
ori : array_like
|
|
1688
|
+
Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
|
|
1689
|
+
imaginary and `w` is real. If you prefer specifying rotations in
|
|
1690
|
+
axis-angle format, call `setOriAxisAngle` after initialization.
|
|
1691
|
+
useMaterial : PhongMaterial, optional
|
|
1692
|
+
Material to use. The material can be configured by accessing the
|
|
1693
|
+
`material` attribute after initialization. If not material is
|
|
1694
|
+
specified, the diffuse and ambient color of the shape will track the
|
|
1695
|
+
current color specified by `glColor`.
|
|
1696
|
+
color : array_like
|
|
1697
|
+
Diffuse and ambient color of the stimulus if `useMaterial` is not
|
|
1698
|
+
specified. Values are with respect to `colorSpace`.
|
|
1699
|
+
colorSpace : str
|
|
1700
|
+
Colorspace of `color` to use.
|
|
1701
|
+
contrast : float
|
|
1702
|
+
Contrast of the stimulus, value modulates the `color`.
|
|
1703
|
+
opacity : float
|
|
1704
|
+
Opacity of the stimulus ranging from 0.0 to 1.0. Note that
|
|
1705
|
+
transparent objects look best when rendered from farthest to
|
|
1706
|
+
nearest.
|
|
1707
|
+
textureScale : array_like or float, optional
|
|
1708
|
+
Scaling factors for texture coordinates (sx, sy). By default,
|
|
1709
|
+
a factor of 1 will have the entire texture cover the surface of the
|
|
1710
|
+
mesh. If a single number is provided, the texture will be scaled
|
|
1711
|
+
uniformly.
|
|
1712
|
+
name : str
|
|
1713
|
+
Name of this object for logging purposes.
|
|
1714
|
+
autoLog : bool
|
|
1715
|
+
Enable automatic logging on attribute changes.
|
|
1716
|
+
|
|
1717
|
+
"""
|
|
1718
|
+
super(BoxStim, self).__init__(
|
|
1719
|
+
win,
|
|
1720
|
+
pos=pos,
|
|
1721
|
+
ori=ori,
|
|
1722
|
+
color=color,
|
|
1723
|
+
colorSpace=colorSpace,
|
|
1724
|
+
contrast=contrast,
|
|
1725
|
+
opacity=opacity,
|
|
1726
|
+
name=name,
|
|
1727
|
+
autoLog=autoLog)
|
|
1728
|
+
|
|
1729
|
+
# create a vertex array object for drawing
|
|
1730
|
+
vertices, texCoords, normals, faces = gt.createBox(size, flipFaces)
|
|
1731
|
+
|
|
1732
|
+
# scale the texture
|
|
1733
|
+
if textureScale is not None:
|
|
1734
|
+
if isinstance(textureScale, (int, float)):
|
|
1735
|
+
texCoords *= textureScale
|
|
1736
|
+
else:
|
|
1737
|
+
texCoords *= np.asarray(textureScale, dtype=np.float32)
|
|
1738
|
+
|
|
1739
|
+
self._vao = self._createVAO(vertices, texCoords, normals, faces)
|
|
1740
|
+
|
|
1741
|
+
self.setColor(color, colorSpace=self.colorSpace, log=False)
|
|
1742
|
+
self.material = useMaterial
|
|
1743
|
+
|
|
1744
|
+
self.extents = (vertices.min(axis=0), vertices.max(axis=0))
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
class PlaneStim(BaseRigidBodyStim):
|
|
1748
|
+
"""Class for drawing planes. This is a
|
|
1749
|
+
lazy-imported class, therefore import using full path
|
|
1750
|
+
`from psychopy.visual.stim3d import PlaneStim` when inheriting from it.
|
|
1751
|
+
|
|
1752
|
+
|
|
1753
|
+
Draws a plane with dimensions specified by `size` (length, width) in scene
|
|
1754
|
+
units.
|
|
1755
|
+
|
|
1756
|
+
Calling the `draw` method will render the plane to the current buffer. The
|
|
1757
|
+
render target (FBO or back buffer) must have a depth buffer attached to it
|
|
1758
|
+
for the object to be rendered correctly. Shading is used if the current
|
|
1759
|
+
window has light sources defined and lighting is enabled (by setting
|
|
1760
|
+
`useLights=True` before drawing the stimulus).
|
|
1761
|
+
|
|
1762
|
+
Warnings
|
|
1763
|
+
--------
|
|
1764
|
+
This class is experimental and may result in undefined behavior.
|
|
1765
|
+
|
|
1766
|
+
"""
|
|
1767
|
+
def __init__(self,
|
|
1768
|
+
win,
|
|
1769
|
+
size=(.5, .5),
|
|
1770
|
+
pos=(0., 0., 0.),
|
|
1771
|
+
ori=(0., 0., 0., 1.),
|
|
1772
|
+
color=(0., 0., 0.),
|
|
1773
|
+
colorSpace='rgb',
|
|
1774
|
+
contrast=1.0,
|
|
1775
|
+
opacity=1.0,
|
|
1776
|
+
useMaterial=None,
|
|
1777
|
+
textureScale=None,
|
|
1778
|
+
name='',
|
|
1779
|
+
autoLog=True):
|
|
1780
|
+
"""
|
|
1781
|
+
Parameters
|
|
1782
|
+
----------
|
|
1783
|
+
win : `~psychopy.visual.Window`
|
|
1784
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1785
|
+
across windows unless they share the same context.
|
|
1786
|
+
size : tuple or float
|
|
1787
|
+
Dimensions of the mesh. If a single value is specified, the plane
|
|
1788
|
+
will be a square. Provide a tuple of floats to specify the width and
|
|
1789
|
+
length of the plane (eg. `size=(0.2, 1.3)`).
|
|
1790
|
+
pos : array_like
|
|
1791
|
+
Position vector `[x, y, z]` for the origin of the rigid body.
|
|
1792
|
+
ori : array_like
|
|
1793
|
+
Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
|
|
1794
|
+
imaginary and `w` is real. If you prefer specifying rotations in
|
|
1795
|
+
axis-angle format, call `setOriAxisAngle` after initialization. By
|
|
1796
|
+
default, the plane is oriented with normal facing the +Z axis of the
|
|
1797
|
+
scene.
|
|
1798
|
+
useMaterial : PhongMaterial, optional
|
|
1799
|
+
Material to use. The material can be configured by accessing the
|
|
1800
|
+
`material` attribute after initialization. If not material is
|
|
1801
|
+
specified, the diffuse and ambient color of the shape will track the
|
|
1802
|
+
current color specified by `glColor`.
|
|
1803
|
+
colorSpace : str
|
|
1804
|
+
Colorspace of `color` to use.
|
|
1805
|
+
contrast : float
|
|
1806
|
+
Contrast of the stimulus, value modulates the `color`.
|
|
1807
|
+
opacity : float
|
|
1808
|
+
Opacity of the stimulus ranging from 0.0 to 1.0. Note that
|
|
1809
|
+
transparent objects look best when rendered from farthest to
|
|
1810
|
+
nearest.
|
|
1811
|
+
textureScale : array_like or float, optional
|
|
1812
|
+
Scaling factors for texture coordinates (sx, sy). By default,
|
|
1813
|
+
a factor of 1 will have the entire texture cover the surface of the
|
|
1814
|
+
mesh. If a single number is provided, the texture will be scaled
|
|
1815
|
+
uniformly.
|
|
1816
|
+
name : str
|
|
1817
|
+
Name of this object for logging purposes.
|
|
1818
|
+
autoLog : bool
|
|
1819
|
+
Enable automatic logging on attribute changes.
|
|
1820
|
+
|
|
1821
|
+
"""
|
|
1822
|
+
super(PlaneStim, self).__init__(
|
|
1823
|
+
win,
|
|
1824
|
+
pos=pos,
|
|
1825
|
+
ori=ori,
|
|
1826
|
+
color=color,
|
|
1827
|
+
colorSpace=colorSpace,
|
|
1828
|
+
contrast=contrast,
|
|
1829
|
+
opacity=opacity,
|
|
1830
|
+
name=name,
|
|
1831
|
+
autoLog=autoLog)
|
|
1832
|
+
|
|
1833
|
+
# create a vertex array object for drawing
|
|
1834
|
+
vertices, texCoords, normals, faces = gt.createPlane(size)
|
|
1835
|
+
|
|
1836
|
+
# scale the texture
|
|
1837
|
+
if textureScale is not None:
|
|
1838
|
+
if isinstance(textureScale, (int, float)):
|
|
1839
|
+
texCoords *= textureScale
|
|
1840
|
+
else:
|
|
1841
|
+
texCoords *= np.asarray(textureScale, dtype=np.float32)
|
|
1842
|
+
|
|
1843
|
+
self._vao = self._createVAO(vertices, texCoords, normals, faces)
|
|
1844
|
+
|
|
1845
|
+
self.setColor(color, colorSpace=self.colorSpace, log=False)
|
|
1846
|
+
self.material = useMaterial
|
|
1847
|
+
|
|
1848
|
+
self.extents = (vertices.min(axis=0), vertices.max(axis=0))
|
|
1849
|
+
|
|
1850
|
+
|
|
1851
|
+
class ObjMeshStim(BaseRigidBodyStim):
|
|
1852
|
+
"""Class for loading and presenting 3D stimuli in the Wavefront OBJ format.
|
|
1853
|
+
This is a lazy-imported class, therefore import using full path
|
|
1854
|
+
`from psychopy.visual.stim3d import ObjMeshStim` when inheriting from it.
|
|
1855
|
+
|
|
1856
|
+
|
|
1857
|
+
Calling the `draw` method will render the mesh to the current buffer. The
|
|
1858
|
+
render target (FBO or back buffer) must have a depth buffer attached to it
|
|
1859
|
+
for the object to be rendered correctly. Shading is used if the current
|
|
1860
|
+
window has light sources defined and lighting is enabled (by setting
|
|
1861
|
+
`useLights=True` before drawing the stimulus).
|
|
1862
|
+
|
|
1863
|
+
Vertex positions, texture coordinates, and normals are loaded and packed
|
|
1864
|
+
into a single vertex buffer object (VBO). Vertex array objects (VAO) are
|
|
1865
|
+
created for each material with an index buffer referencing vertices assigned
|
|
1866
|
+
that material in the VBO. For maximum performance, keep the number of
|
|
1867
|
+
materials per object as low as possible, as switching between VAOs has some
|
|
1868
|
+
overhead.
|
|
1869
|
+
|
|
1870
|
+
Material attributes are read from the material library file (*.MTL)
|
|
1871
|
+
associated with the *.OBJ file. This file will be automatically searched for
|
|
1872
|
+
and read during loading. Afterwards you can edit material properties by
|
|
1873
|
+
accessing the data structure of the `materials` attribute.
|
|
1874
|
+
|
|
1875
|
+
Keep in mind that OBJ shapes are rigid bodies, the mesh itself cannot be
|
|
1876
|
+
deformed during runtime. However, meshes can be positioned and rotated as
|
|
1877
|
+
desired by manipulating the `RigidBodyPose` instance accessed through the
|
|
1878
|
+
`thePose` attribute.
|
|
1879
|
+
|
|
1880
|
+
Warnings
|
|
1881
|
+
--------
|
|
1882
|
+
Loading an *.OBJ file is a slow process, be sure to do this outside
|
|
1883
|
+
of any time-critical routines! This class is experimental and may result
|
|
1884
|
+
in undefined behavior.
|
|
1885
|
+
|
|
1886
|
+
Examples
|
|
1887
|
+
--------
|
|
1888
|
+
Loading an *.OBJ file from a disk location::
|
|
1889
|
+
|
|
1890
|
+
myObjStim = ObjMeshStim(win, '/path/to/file/model.obj')
|
|
1891
|
+
|
|
1892
|
+
"""
|
|
1893
|
+
def __init__(self,
|
|
1894
|
+
win,
|
|
1895
|
+
objFile,
|
|
1896
|
+
pos=(0, 0, 0),
|
|
1897
|
+
ori=(0, 0, 0, 1),
|
|
1898
|
+
useMaterial=None,
|
|
1899
|
+
loadMtllib=True,
|
|
1900
|
+
color=(0.0, 0.0, 0.0),
|
|
1901
|
+
colorSpace='rgb',
|
|
1902
|
+
contrast=1.0,
|
|
1903
|
+
opacity=1.0,
|
|
1904
|
+
name='',
|
|
1905
|
+
autoLog=True):
|
|
1906
|
+
"""
|
|
1907
|
+
Parameters
|
|
1908
|
+
----------
|
|
1909
|
+
win : `~psychopy.visual.Window`
|
|
1910
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
1911
|
+
across windows unless they share the same context.
|
|
1912
|
+
size : tuple or float
|
|
1913
|
+
Dimensions of the mesh. If a single value is specified, the plane
|
|
1914
|
+
will be a square. Provide a tuple of floats to specify the width and
|
|
1915
|
+
length of the box (eg. `size=(0.2, 1.3)`).
|
|
1916
|
+
pos : array_like
|
|
1917
|
+
Position vector `[x, y, z]` for the origin of the rigid body.
|
|
1918
|
+
ori : array_like
|
|
1919
|
+
Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
|
|
1920
|
+
imaginary and `w` is real. If you prefer specifying rotations in
|
|
1921
|
+
axis-angle format, call `setOriAxisAngle` after initialization. By
|
|
1922
|
+
default, the plane is oriented with normal facing the +Z axis of the
|
|
1923
|
+
scene.
|
|
1924
|
+
useMaterial : PhongMaterial, optional
|
|
1925
|
+
Material to use for all sub-meshes. The material can be configured
|
|
1926
|
+
by accessing the `material` attribute after initialization. If no
|
|
1927
|
+
material is specified, `color` will modulate the diffuse and
|
|
1928
|
+
ambient colors for all meshes in the model. If `loadMtllib` is
|
|
1929
|
+
`True`, this value should be `None`.
|
|
1930
|
+
loadMtllib : bool
|
|
1931
|
+
Load materials from the MTL file associated with the mesh. This will
|
|
1932
|
+
override `useMaterial` if it is `None`. The value of `materials`
|
|
1933
|
+
after initialization will be a dictionary where keys are material
|
|
1934
|
+
names and values are materials. Any textures associated with the
|
|
1935
|
+
model will be loaded as per the material requirements.
|
|
1936
|
+
|
|
1937
|
+
"""
|
|
1938
|
+
super(ObjMeshStim, self).__init__(
|
|
1939
|
+
win,
|
|
1940
|
+
pos=pos,
|
|
1941
|
+
ori=ori,
|
|
1942
|
+
color=color,
|
|
1943
|
+
colorSpace=colorSpace,
|
|
1944
|
+
contrast=contrast,
|
|
1945
|
+
opacity=opacity,
|
|
1946
|
+
name=name,
|
|
1947
|
+
autoLog=autoLog)
|
|
1948
|
+
|
|
1949
|
+
# load the OBJ file
|
|
1950
|
+
objModel = gt.loadObjFile(objFile)
|
|
1951
|
+
|
|
1952
|
+
# load materials from file if requested
|
|
1953
|
+
if loadMtllib and self.material is None:
|
|
1954
|
+
self.material = self._loadMtlLib(objModel.mtlFile)
|
|
1955
|
+
else:
|
|
1956
|
+
self.material = useMaterial
|
|
1957
|
+
|
|
1958
|
+
# load vertex data into an interleaved VBO
|
|
1959
|
+
buffers = np.ascontiguousarray(
|
|
1960
|
+
np.hstack((objModel.vertexPos,
|
|
1961
|
+
objModel.texCoords,
|
|
1962
|
+
objModel.normals)),
|
|
1963
|
+
dtype=np.float32)
|
|
1964
|
+
|
|
1965
|
+
# upload to buffer
|
|
1966
|
+
vertexAttr = gt.createVBO(buffers)
|
|
1967
|
+
|
|
1968
|
+
# load vertex data into VAOs
|
|
1969
|
+
self._vao = {} # dictionary for VAOs
|
|
1970
|
+
# for each material create a VAO
|
|
1971
|
+
# keys are material names, values are index buffers
|
|
1972
|
+
for material, faces in objModel.faces.items():
|
|
1973
|
+
# convert index buffer to VAO
|
|
1974
|
+
indexBuffer = \
|
|
1975
|
+
gt.createVBO(
|
|
1976
|
+
faces.flatten(), # flatten face index for element array
|
|
1977
|
+
target=GL.GL_ELEMENT_ARRAY_BUFFER,
|
|
1978
|
+
dataType=GL.GL_UNSIGNED_INT)
|
|
1979
|
+
|
|
1980
|
+
# see `setVertexAttribPointer` for more information about attribute
|
|
1981
|
+
# pointer indices
|
|
1982
|
+
self._vao[material] = gt.createVAO(
|
|
1983
|
+
{GL.GL_VERTEX_ARRAY: (vertexAttr, 3),
|
|
1984
|
+
GL.GL_TEXTURE_COORD_ARRAY: (vertexAttr, 2, 3),
|
|
1985
|
+
GL.GL_NORMAL_ARRAY: (vertexAttr, 3, 5, True)},
|
|
1986
|
+
indexBuffer=indexBuffer, legacy=True)
|
|
1987
|
+
|
|
1988
|
+
self.extents = objModel.extents
|
|
1989
|
+
|
|
1990
|
+
self.thePose.bounds = BoundingBox()
|
|
1991
|
+
self.thePose.bounds.fit(objModel.vertexPos)
|
|
1992
|
+
|
|
1993
|
+
def _loadMtlLib(self, mtlFile):
|
|
1994
|
+
"""Load a material library associated with the OBJ file. This is usually
|
|
1995
|
+
called by the constructor for this class.
|
|
1996
|
+
|
|
1997
|
+
Parameters
|
|
1998
|
+
----------
|
|
1999
|
+
mtlFile : str
|
|
2000
|
+
Path to MTL file.
|
|
2001
|
+
|
|
2002
|
+
"""
|
|
2003
|
+
with open(mtlFile, 'r') as mtl:
|
|
2004
|
+
mtlBuffer = StringIO(mtl.read())
|
|
2005
|
+
|
|
2006
|
+
foundMaterials = {}
|
|
2007
|
+
foundTextures = {}
|
|
2008
|
+
thisMaterial = 0
|
|
2009
|
+
for line in mtlBuffer.readlines():
|
|
2010
|
+
line = line.strip()
|
|
2011
|
+
if line.startswith('newmtl '): # new material
|
|
2012
|
+
thisMaterial = line[7:]
|
|
2013
|
+
foundMaterials[thisMaterial] = BlinnPhongMaterial(self.win)
|
|
2014
|
+
elif line.startswith('Ns '): # specular exponent
|
|
2015
|
+
foundMaterials[thisMaterial].shininess = line[3:]
|
|
2016
|
+
elif line.startswith('Ks '): # specular color
|
|
2017
|
+
specularColor = np.asarray(list(map(float, line[3:].split(' '))))
|
|
2018
|
+
specularColor = 2.0 * specularColor - 1
|
|
2019
|
+
foundMaterials[thisMaterial].specularColor = specularColor
|
|
2020
|
+
elif line.startswith('Kd '): # diffuse color
|
|
2021
|
+
diffuseColor = np.asarray(list(map(float, line[3:].split(' '))))
|
|
2022
|
+
diffuseColor = 2.0 * diffuseColor - 1
|
|
2023
|
+
foundMaterials[thisMaterial].diffuseColor = diffuseColor
|
|
2024
|
+
elif line.startswith('Ka '): # ambient color
|
|
2025
|
+
ambientColor = np.asarray(list(map(float, line[3:].split(' '))))
|
|
2026
|
+
ambientColor = 2.0 * ambientColor - 1
|
|
2027
|
+
foundMaterials[thisMaterial].ambientColor = ambientColor
|
|
2028
|
+
elif line.startswith('map_Kd '): # diffuse color map
|
|
2029
|
+
# load a diffuse texture from file
|
|
2030
|
+
textureName = line[7:]
|
|
2031
|
+
if textureName not in foundTextures.keys():
|
|
2032
|
+
im = Image.open(
|
|
2033
|
+
os.path.join(os.path.split(mtlFile)[0], textureName))
|
|
2034
|
+
im = im.transpose(Image.FLIP_TOP_BOTTOM)
|
|
2035
|
+
im = im.convert("RGBA")
|
|
2036
|
+
pixelData = np.array(im).ctypes
|
|
2037
|
+
width = pixelData.shape[1]
|
|
2038
|
+
height = pixelData.shape[0]
|
|
2039
|
+
foundTextures[textureName] = gt.createTexImage2D(
|
|
2040
|
+
width,
|
|
2041
|
+
height,
|
|
2042
|
+
internalFormat=GL.GL_RGBA,
|
|
2043
|
+
pixelFormat=GL.GL_RGBA,
|
|
2044
|
+
dataType=GL.GL_UNSIGNED_BYTE,
|
|
2045
|
+
data=pixelData,
|
|
2046
|
+
unpackAlignment=1,
|
|
2047
|
+
texParams={GL.GL_TEXTURE_MAG_FILTER: GL.GL_LINEAR,
|
|
2048
|
+
GL.GL_TEXTURE_MIN_FILTER: GL.GL_LINEAR})
|
|
2049
|
+
foundMaterials[thisMaterial].diffuseTexture = \
|
|
2050
|
+
foundTextures[textureName]
|
|
2051
|
+
|
|
2052
|
+
return foundMaterials
|
|
2053
|
+
|
|
2054
|
+
def draw(self, win=None):
|
|
2055
|
+
"""Draw the mesh.
|
|
2056
|
+
|
|
2057
|
+
Parameters
|
|
2058
|
+
----------
|
|
2059
|
+
win : `~psychopy.visual.Window`
|
|
2060
|
+
Window this stimulus is associated with. Stimuli cannot be shared
|
|
2061
|
+
across windows unless they share the same context.
|
|
2062
|
+
|
|
2063
|
+
"""
|
|
2064
|
+
if win is None:
|
|
2065
|
+
win = self.win
|
|
2066
|
+
else:
|
|
2067
|
+
self._selectWindow(win)
|
|
2068
|
+
|
|
2069
|
+
win.draw3d = True
|
|
2070
|
+
|
|
2071
|
+
GL.glPushMatrix()
|
|
2072
|
+
GL.glMultTransposeMatrixf(at.array2pointer(self.thePose.modelMatrix))
|
|
2073
|
+
|
|
2074
|
+
# iterate over materials, draw associated VAOs
|
|
2075
|
+
if self.material is not None:
|
|
2076
|
+
# if material is a dictionary
|
|
2077
|
+
if isinstance(self.material, dict):
|
|
2078
|
+
for materialName, materialDesc in self.material.items():
|
|
2079
|
+
materialDesc.begin()
|
|
2080
|
+
gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
|
|
2081
|
+
materialDesc.end()
|
|
2082
|
+
else:
|
|
2083
|
+
# material is a single item
|
|
2084
|
+
self.material.begin()
|
|
2085
|
+
for materialName, _ in self._vao.items():
|
|
2086
|
+
gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
|
|
2087
|
+
self.material.end()
|
|
2088
|
+
else:
|
|
2089
|
+
r, g, b = self._foreColor.render('rgb')
|
|
2090
|
+
color = np.ctypeslib.as_ctypes(
|
|
2091
|
+
np.array((r, g, b, self.opacity), np.float32))
|
|
2092
|
+
|
|
2093
|
+
nLights = len(self.win.lights)
|
|
2094
|
+
shaderKey = (nLights, False)
|
|
2095
|
+
gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
|
|
2096
|
+
|
|
2097
|
+
# pass values to OpenGL as material
|
|
2098
|
+
GL.glColor4f(r, g, b, self.opacity)
|
|
2099
|
+
GL.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color)
|
|
2100
|
+
GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color)
|
|
2101
|
+
|
|
2102
|
+
for materialName, _ in self._vao.items():
|
|
2103
|
+
gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
|
|
2104
|
+
|
|
2105
|
+
gt.useProgram(0)
|
|
2106
|
+
|
|
2107
|
+
GL.glPopMatrix()
|
|
2108
|
+
|
|
2109
|
+
win.draw3d = False
|