psychopy 2024.2.5__py3-none-any.whl → 2025.1.1__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.
Potentially problematic release.
This version of psychopy might be problematic. Click here for more details.
- psychopy/CHANGELOG.txt +4 -4
- psychopy/GIT_SHA +1 -1
- psychopy/LICENSE.txt +1 -1
- psychopy/VERSION +1 -1
- psychopy/__init__.py +10 -7
- psychopy/alerts/__init__.py +1 -1
- psychopy/alerts/_alerts.py +53 -17
- psychopy/alerts/_errorHandler.py +3 -4
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
- psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
- psychopy/alerts/alerttools.py +0 -16
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@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/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/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/find.png +0 -0
- psychopy/app/Resources/classic/find@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/regex.png +0 -0
- psychopy/app/Resources/classic/regex@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/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/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/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/find.png +0 -0
- psychopy/app/Resources/dark/find@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/regex.png +0 -0
- psychopy/app/Resources/dark/regex@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/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/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/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/find.png +0 -0
- psychopy/app/Resources/light/find@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/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
- psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/__init__.py +49 -8
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +134 -125
- psychopy/app/builder/builder.py +42 -22
- psychopy/app/builder/dialogs/__init__.py +44 -11
- psychopy/app/builder/dialogs/dlgsCode.py +1 -1
- psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
- psychopy/app/builder/dialogs/findDlg.py +106 -20
- psychopy/app/builder/dialogs/paramCtrls.py +42 -1
- psychopy/app/builder/validators.py +1 -1
- psychopy/app/coder/codeEditorBase.py +8 -8
- psychopy/app/coder/coder.py +32 -29
- psychopy/app/coder/fileBrowser.py +68 -22
- psychopy/app/coder/folding.py +1 -1
- psychopy/app/coder/psychoParser.py +1 -1
- psychopy/app/coder/repl.py +1 -1
- psychopy/app/coder/sourceTree.py +1 -1
- psychopy/app/connections/__init__.py +1 -1
- psychopy/app/connections/news.py +1 -1
- psychopy/app/connections/sendusage.py +1 -1
- psychopy/app/connections/updates.py +1 -1
- psychopy/app/console.py +1 -1
- psychopy/app/errorDlg.py +1 -1
- psychopy/app/frametracker.py +1 -1
- psychopy/app/idle.py +1 -1
- psychopy/app/jobs.py +5 -2
- psychopy/app/linuxconfig/__init__.py +1 -1
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
- psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
- psychopy/app/pavlovia_ui/__init__.py +1 -1
- psychopy/app/pavlovia_ui/_base.py +1 -1
- psychopy/app/pavlovia_ui/functions.py +1 -1
- psychopy/app/pavlovia_ui/menu.py +1 -1
- psychopy/app/pavlovia_ui/project.py +1 -1
- psychopy/app/pavlovia_ui/search.py +1 -1
- psychopy/app/pavlovia_ui/sync.py +1 -1
- psychopy/app/pavlovia_ui/user.py +1 -1
- psychopy/app/plugin_manager/dialog.py +34 -96
- psychopy/app/plugin_manager/packages.py +10 -14
- psychopy/app/plugin_manager/plugins.py +64 -4
- psychopy/app/preferencesDlg.py +12 -37
- psychopy/app/psychopyApp.py +130 -44
- psychopy/app/ribbon.py +1 -0
- psychopy/app/runner/runner.py +19 -7
- psychopy/app/runner/scriptProcess.py +11 -6
- psychopy/app/stdout/stdOutRich.py +9 -2
- psychopy/app/themes/fonts.py +1 -1
- psychopy/app/themes/icons.py +2 -38
- psychopy/app/ui/__init__.py +1 -1
- psychopy/app/utils.py +3 -3
- psychopy/assets/default.mp3 +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/voicekeyThresholdStim.wav +0 -0
- psychopy/clock.py +4 -1
- psychopy/colors.py +12 -5
- psychopy/core.py +1 -1
- psychopy/data/base.py +1 -1
- psychopy/data/experiment.py +151 -46
- psychopy/data/routine.py +27 -1
- psychopy/data/staircase.py +2 -1
- psychopy/data/trial.py +62 -14
- psychopy/data/utils.py +2 -2
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +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 +779 -866
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
- 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/mentalRotation/MentalRotation.psyexp +583 -542
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
- psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
- 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 +329 -273
- 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 +450 -404
- psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
- psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
- psychopy/devices/__init__.py +1 -1
- psychopy/event.py +1 -1
- psychopy/exceptions.py +1 -1
- psychopy/experiment/__init__.py +1 -1
- psychopy/experiment/_experiment.py +30 -9
- psychopy/experiment/components/__init__.py +1 -6
- psychopy/experiment/components/_base.py +44 -19
- psychopy/experiment/components/aperture/__init__.py +1 -1
- psychopy/experiment/components/brush/__init__.py +2 -2
- psychopy/experiment/components/button/__init__.py +24 -28
- psychopy/experiment/components/camera/__init__.py +38 -39
- psychopy/experiment/components/code/__init__.py +1 -1
- psychopy/experiment/components/dots/__init__.py +1 -1
- psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
- psychopy/experiment/components/form/__init__.py +3 -3
- psychopy/experiment/components/grating/__init__.py +1 -1
- psychopy/experiment/components/image/__init__.py +1 -1
- psychopy/experiment/components/joyButtons/__init__.py +2 -2
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
- psychopy/experiment/components/joystick/__init__.py +3 -3
- psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
- psychopy/experiment/components/keyboard/__init__.py +98 -122
- psychopy/experiment/components/microphone/__init__.py +54 -98
- psychopy/experiment/components/mouse/__init__.py +92 -93
- psychopy/experiment/components/movie/__init__.py +28 -50
- psychopy/experiment/components/parallelOut/__init__.py +3 -3
- psychopy/experiment/components/polygon/__init__.py +2 -3
- psychopy/experiment/components/roi/__init__.py +2 -2
- psychopy/experiment/components/routineSettings/__init__.py +2 -0
- psychopy/experiment/components/serialOut/__init__.py +7 -7
- psychopy/experiment/components/settings/__init__.py +317 -313
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/slider/__init__.py +5 -5
- psychopy/experiment/components/sound/__init__.py +168 -78
- psychopy/experiment/components/soundsensor/__init__.py +361 -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 +59 -33
- psychopy/experiment/components/text/__init__.py +2 -6
- psychopy/experiment/components/textbox/__init__.py +3 -7
- psychopy/experiment/components/unknown/__init__.py +2 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
- psychopy/experiment/exports.py +1 -1
- psychopy/experiment/flow.py +2 -2
- psychopy/experiment/localization.py +1 -1
- psychopy/experiment/loops.py +43 -10
- psychopy/experiment/params.py +6 -4
- psychopy/experiment/plugins.py +8 -1
- psychopy/experiment/py2js.py +1 -1
- psychopy/experiment/py2js_transpiler.py +1 -1
- psychopy/experiment/routines/__init__.py +1 -1
- psychopy/experiment/routines/_base.py +23 -24
- psychopy/experiment/routines/audioValidator/__init__.py +343 -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/eyetracker_calibrate/__init__.py +76 -17
- psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
- psychopy/experiment/routines/unknown/__init__.py +2 -0
- psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
- 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/utils.py +1 -1
- psychopy/gui/__init__.py +1 -1
- psychopy/gui/qtgui.py +15 -6
- psychopy/gui/wxgui.py +1 -1
- psychopy/hardware/__init__.py +0 -1
- psychopy/hardware/base.py +147 -16
- psychopy/hardware/bbtk/__init__.py +10 -16
- psychopy/hardware/brainproducts.py +7 -13
- psychopy/hardware/button.py +21 -2
- psychopy/hardware/buttonbox/__init__.py +1 -1
- psychopy/hardware/camera/__init__.py +18 -5
- psychopy/hardware/cedrus.py +5 -16
- psychopy/hardware/crs/__init__.py +1 -1
- psychopy/hardware/crs/bits.py +36 -33
- psychopy/hardware/crs/colorcal.py +8 -11
- psychopy/hardware/crs/optical.py +7 -10
- psychopy/hardware/crs/shaders.py +18 -5
- psychopy/hardware/emotiv.py +1 -1
- psychopy/hardware/emulator.py +11 -5
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/forp.py +18 -23
- psychopy/hardware/gammasci.py +8 -3
- psychopy/hardware/iolab.py +8 -19
- psychopy/hardware/joystick/__init__.py +865 -266
- 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 +4 -2
- psychopy/hardware/labhackers.py +1 -1
- psychopy/hardware/labjacks.py +9 -13
- psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
- psychopy/hardware/listener.py +9 -8
- psychopy/hardware/manager.py +24 -35
- psychopy/hardware/microphone.py +535 -155
- psychopy/hardware/minolta.py +14 -4
- psychopy/hardware/mouse/__init__.py +1 -1
- psychopy/hardware/photometer/__init__.py +2 -2
- psychopy/hardware/pr.py +14 -4
- psychopy/hardware/qmix.py +18 -27
- psychopy/hardware/serialdevice.py +43 -12
- psychopy/hardware/soundsensor.py +473 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +298 -36
- psychopy/hardware/triggerbox/__init__.py +1 -1
- psychopy/hardware/triggerbox/base.py +1 -1
- psychopy/hardware/triggerbox/parallel.py +1 -1
- psychopy/info.py +1 -1
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +2 -1
- psychopy/layout.py +1 -1
- psychopy/liaison.py +91 -39
- psychopy/locale_setup.py +11 -1
- psychopy/localization/__init__.py +1 -1
- psychopy/localization/_localization.py +1 -1
- psychopy/localization/messages.pot +2 -2
- psychopy/logging.py +14 -12
- psychopy/microphone.py +4 -3
- psychopy/misc.py +1 -1
- psychopy/monitors/MonitorCenter.py +3 -3
- psychopy/monitors/__init__.py +1 -1
- psychopy/monitors/calibData.py +1 -1
- psychopy/monitors/calibTools.py +3 -2
- psychopy/platform_specific/__init__.py +1 -1
- psychopy/platform_specific/darwin.py +1 -1
- psychopy/platform_specific/linux.py +1 -1
- psychopy/platform_specific/win32.py +1 -1
- psychopy/plugins/__init__.py +26 -17
- psychopy/plugins/util.py +65 -0
- psychopy/preferences/Darwin.spec +11 -3
- psychopy/preferences/FreeBSD.spec +11 -3
- psychopy/preferences/Linux.spec +11 -3
- psychopy/preferences/Windows.spec +11 -3
- psychopy/preferences/__init__.py +1 -1
- psychopy/preferences/baseNoArch.spec +11 -3
- psychopy/preferences/hints.py +78 -61
- psychopy/preferences/preferences.py +82 -13
- psychopy/projects/__init__.py +1 -1
- psychopy/projects/pavlovia.py +29 -13
- psychopy/scripts/psyexpCompile.py +1 -1
- psychopy/session.py +81 -8
- psychopy/sound/__init__.py +25 -10
- psychopy/sound/_base.py +134 -34
- psychopy/sound/audioclip.py +38 -15
- psychopy/sound/audiodevice.py +1 -1
- psychopy/sound/backend_ptb.py +53 -321
- psychopy/sound/backend_pygame.py +7 -3
- psychopy/sound/backend_pyo.py +53 -22
- psychopy/sound/backend_pysound.py +10 -27
- psychopy/sound/backend_sounddevice.py +33 -21
- psychopy/sound/exceptions.py +1 -1
- psychopy/sound/microphone.py +83 -5
- psychopy/sound/transcribe.py +3 -3
- psychopy/tests/data/test_basic_run.py +1 -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/test_alerts/test_alerttools.py +2 -1
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_data/test_TrialHandler2.py +18 -7
- psychopy/tests/test_demos/test_builder_demos.py +1 -1
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
- psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
- psychopy/tests/test_experiment/test_loops.py +12 -4
- psychopy/tests/test_experiment/test_params.py +17 -4
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_liaison/test_Liaison.py +4 -4
- psychopy/tests/test_misc/test_clock.py +2 -0
- psychopy/tests/test_misc/test_color.py +2 -0
- psychopy/tests/test_misc/test_event.py +1 -0
- psychopy/tests/test_plugins/__init__.py +0 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_sound/test_sound.py +111 -40
- psychopy/tests/test_tools/test_colorspacetools.py +24 -23
- psychopy/tests/test_tools/test_mathtools.py +9 -9
- psychopy/tests/test_tools/test_viewtools.py +101 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/test_all_stimuli.py +2 -2
- psychopy/tests/test_visual/test_basevisual.py +37 -7
- psychopy/tests/test_visual/test_button.py +2 -2
- psychopy/tests/test_visual/test_circle.py +10 -2
- psychopy/tests/test_visual/test_dots.py +1 -1
- psychopy/tests/test_visual/test_form.py +13 -13
- psychopy/tests/test_visual/test_gamma.py +3 -3
- psychopy/tests/test_visual/test_image.py +2 -2
- psychopy/tests/test_visual/test_progress.py +2 -2
- psychopy/tests/test_visual/test_roi.py +8 -2
- psychopy/tests/test_visual/test_shape.py +2 -2
- psychopy/tests/test_visual/test_slider.py +2 -2
- psychopy/tests/test_visual/test_target.py +2 -2
- psychopy/tests/test_visual/test_textbox.py +6 -8
- psychopy/tests/test_visual/test_winScalePos.py +6 -5
- psychopy/tests/test_visual/test_window.py +17 -0
- psychopy/tests/utils.py +51 -1
- psychopy/tools/__init__.py +1 -1
- psychopy/tools/arraytools.py +2 -2
- psychopy/tools/attributetools.py +52 -1
- psychopy/tools/audiotools.py +4 -1
- psychopy/tools/colorspacetools.py +6 -4
- psychopy/tools/coordinatetools.py +1 -1
- psychopy/tools/fileerrortools.py +21 -9
- psychopy/tools/filetools.py +2 -2
- psychopy/tools/fontmanager.py +47 -28
- psychopy/tools/gltools.py +2967 -559
- psychopy/tools/imagetools.py +1 -1
- psychopy/tools/mathtools.py +997 -127
- psychopy/tools/monitorunittools.py +7 -1
- psychopy/tools/movietools.py +1 -2
- psychopy/tools/pkgtools.py +157 -127
- psychopy/tools/plottools.py +1 -1
- psychopy/tools/rifttools.py +1 -1
- psychopy/tools/stereotools.py +1 -1
- psychopy/tools/stimulustools.py +172 -2
- psychopy/tools/stringtools.py +22 -2
- psychopy/tools/systemtools.py +1 -1
- psychopy/tools/typetools.py +1 -1
- psychopy/tools/unittools.py +1 -1
- psychopy/tools/versionchooser.py +3 -1
- psychopy/tools/viewtools.py +54 -70
- psychopy/tools/wizard.py +2 -2
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +74 -0
- psychopy/validation/visual.py +115 -0
- psychopy/visual/__init__.py +1 -4
- psychopy/visual/aperture.py +9 -6
- psychopy/visual/backends/__init__.py +1 -1
- psychopy/visual/backends/_base.py +1 -1
- psychopy/visual/backends/gamma.py +1 -1
- psychopy/visual/backends/glfwbackend.py +8 -12
- psychopy/visual/backends/pygamebackend.py +1 -1
- psychopy/visual/backends/pygletbackend.py +32 -11
- psychopy/visual/basevisual.py +93 -13
- psychopy/visual/brush.py +1 -1
- psychopy/visual/bufferimage.py +90 -10
- psychopy/visual/button.py +1 -1
- psychopy/visual/circle.py +12 -20
- psychopy/visual/custommouse.py +1 -1
- psychopy/visual/dot.py +80 -14
- psychopy/visual/elementarray.py +84 -10
- psychopy/visual/filters.py +1 -1
- psychopy/visual/form.py +43 -28
- psychopy/visual/grating.py +105 -25
- psychopy/visual/helpers.py +4 -2
- psychopy/visual/image.py +98 -20
- psychopy/visual/line.py +15 -25
- psychopy/visual/movie.py +1 -1
- psychopy/visual/movie2.py +4 -3
- psychopy/visual/movie3.py +4 -3
- psychopy/visual/movies/__init__.py +1 -1
- psychopy/visual/movies/frame.py +1 -1
- psychopy/visual/movies/metadata.py +1 -1
- psychopy/visual/movies/players/__init__.py +1 -1
- psychopy/visual/movies/players/_base.py +1 -1
- psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
- psychopy/visual/nnlvs.py +9 -6
- psychopy/visual/noise.py +4 -16
- psychopy/visual/patch.py +4 -3
- psychopy/visual/pie.py +3 -14
- psychopy/visual/polygon.py +21 -28
- psychopy/visual/radial.py +4 -18
- psychopy/visual/ratingscale.py +4 -3
- psychopy/visual/rect.py +16 -25
- psychopy/visual/rift.py +8 -2
- psychopy/visual/secondorder.py +4 -16
- psychopy/visual/shaders.py +620 -286
- psychopy/visual/shape.py +281 -90
- psychopy/visual/simpleimage.py +1 -1
- psychopy/visual/slider.py +78 -25
- psychopy/visual/stim3d.py +5 -608
- psychopy/visual/text.py +13 -3
- psychopy/visual/textbox2/textbox2.py +188 -56
- psychopy/visual/vlcmoviestim.py +1 -1
- psychopy/visual/window.py +374 -201
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/METADATA +13 -12
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/RECORD +647 -624
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/WHEEL +1 -1
- psychopy/.DS_Store +0 -0
- psychopy/__init__.py.orig +0 -65
- psychopy/app/.DS_Store +0 -0
- psychopy/app/Resources/.DS_Store +0 -0
- psychopy/app/Resources/classic/filecsv16.png +0 -0
- psychopy/app/Resources/classic/fileimage16.png +0 -0
- psychopy/app/Resources/classic/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/filecsv16.png +0 -0
- psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage16.png +0 -0
- psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
- psychopy/app/Resources/light/filecsv16.png +0 -0
- psychopy/app/Resources/light/filecsv16@2x.png +0 -0
- psychopy/app/Resources/light/fileimage16.png +0 -0
- psychopy/app/Resources/light/fileimage16@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown16.png +0 -0
- psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/psychopySplash.png +0 -0
- psychopy/app/Resources/psychopySplash@2x.png +0 -0
- psychopy/app/builder/builder.py.orig +0 -3932
- psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
- psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
- psychopy/app/colorpicker/__init__.py.orig +0 -411
- psychopy/app/locale/ar_001/.DS_Store +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
- psychopy/demos/builder/Experiments/.DS_Store +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
- psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
- psychopy/demos/builder/Tools/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/coder/.DS_Store +0 -0
- psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
- psychopy/demos/coder/iohub/.iohpid +0 -1
- psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
- psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/.DS_Store +0 -0
- psychopy/experiment/_experiment.py.orig +0 -1032
- psychopy/experiment/components/.DS_Store +0 -0
- psychopy/experiment/components/_base.py.orig +0 -823
- psychopy/experiment/components/form/.DS_Store +0 -0
- psychopy/experiment/components/microphone/__init__.py.orig +0 -490
- psychopy/experiment/components/settings/__init__.py.orig +0 -1337
- psychopy/experiment/components/textbox/__init__.py.orig +0 -310
- psychopy/experiment/components/webcam/.DS_Store +0 -0
- psychopy/experiment/components/webcam/light/.DS_Store +0 -0
- psychopy/experiment/loops.py.orig +0 -829
- psychopy/experiment/params.py.orig +0 -408
- psychopy/experiment/routine.py.orig +0 -503
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
- psychopy/hardware/.DS_Store +0 -0
- psychopy/hardware/brainproducts.py.orig +0 -680
- psychopy/hardware/iolab.py.orig +0 -238
- psychopy/iohub/datastore/__init__.py.orig +0 -443
- psychopy/iohub/datastore/util.py.orig +0 -692
- psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
- psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
- psychopy/preferences/.DS_Store +0 -0
- psychopy/projects/pavlovia.py.orig +0 -1295
- psychopy/tests/.DS_Store +0 -0
- psychopy/tests/data/.DS_Store +0 -0
- psychopy/tests/data/TestCircle_fill_local.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
- psychopy/tests/data/aperture1_norm_local.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_height_local.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_norm_local.png +0 -0
- psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
- psychopy/tests/data/blend_add_height_local.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
- psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
- psychopy/tests/data/blend_add_norm_local.png +0 -0
- psychopy/tests/data/blend_add_stencil_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
- psychopy/tests/data/circleHex_height_local.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
- psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
- psychopy/tests/data/circleHex_norm_local.png +0 -0
- psychopy/tests/data/circleHex_stencil_local.png +0 -0
- psychopy/tests/data/color_comparison_local.png +0 -0
- psychopy/tests/data/correctScript/.DS_Store +0 -0
- psychopy/tests/data/dots_height_local.png +0 -0
- psychopy/tests/data/dots_normAddBlend_local.png +0 -0
- psychopy/tests/data/dots_normHexbackground_local.png +0 -0
- psychopy/tests/data/dots_normNoShade_local.png +0 -0
- psychopy/tests/data/dots_norm_local.png +0 -0
- psychopy/tests/data/dots_stencil_local.png +0 -0
- psychopy/tests/data/elarray1_height_local.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
- psychopy/tests/data/elarray1_norm_local.png +0 -0
- psychopy/tests/data/elarray1_stencil_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
- psychopy/tests/data/gabor1_height_local.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
- psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
- psychopy/tests/data/gabor1_norm_local.png +0 -0
- psychopy/tests/data/gabor1_stencil_local.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_height_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
- psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
- psychopy/tests/data/movFrame1_stencil_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/numpyImage_height_local.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
- psychopy/tests/data/numpyImage_norm_local.png +0 -0
- psychopy/tests/data/numpyImage_stencil_local.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
- psychopy/tests/data/shape2_1_norm_local.png +0 -0
- psychopy/tests/data/shape2_1_stencil_local.png +0 -0
- psychopy/tests/data/text1_height_local.png +0 -0
- psychopy/tests/data/text1_normAddBlend_local.png +0 -0
- psychopy/tests/data/text1_normHexbackground_local.png +0 -0
- psychopy/tests/data/text1_norm_local.png +0 -0
- psychopy/tests/data/text1_stencil_local.png +0 -0
- psychopy/tests/data/wedge1_height_local.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
- psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
- psychopy/tests/data/wedge1_norm_local.png +0 -0
- psychopy/tests/data/wedge1_stencil_local.png +0 -0
- psychopy/tests/test_app/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
- psychopy/tests/test_data/.DS_Store +0 -0
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
- psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
- psychopy/tests/test_visual/test_image.py.orig +0 -219
- psychopy/visual/basevisual.py.orig +0 -1723
- psychopy/visual/form.py.orig +0 -1181
- psychopy/visual/text.py.orig +0 -752
- psychopy/visual/textbox2/textbox2.py.orig +0 -1315
- psychopy/visual/windowwarp.py.orig +0 -463
- /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/licenses/LICENSE +0 -0
psychopy/visual/shape.py
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
"""Create geometric (vector) shapes by defining vertex locations."""
|
|
5
5
|
|
|
6
6
|
# Part of the PsychoPy library
|
|
7
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
7
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
8
8
|
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
9
|
|
|
10
|
-
import copy
|
|
11
10
|
import numpy
|
|
12
11
|
|
|
13
12
|
# Ensure setting pyglet.options['debug_gl'] to False is done prior to any
|
|
@@ -18,23 +17,25 @@ import pyglet
|
|
|
18
17
|
|
|
19
18
|
import psychopy # so we can get the __path__
|
|
20
19
|
from psychopy import logging
|
|
21
|
-
from psychopy.colors import Color
|
|
22
20
|
|
|
23
21
|
# tools must only be imported *after* event or MovieStim breaks on win32
|
|
24
22
|
# (JWP has no idea why!)
|
|
25
23
|
# from psychopy.tools.monitorunittools import cm2pix, deg2pix
|
|
26
24
|
from psychopy.tools.attributetools import (attributeSetter, # logAttrib,
|
|
27
|
-
setAttribute)
|
|
28
|
-
from psychopy.tools
|
|
25
|
+
setAttribute, undefined)
|
|
26
|
+
from psychopy.tools import gltools as gt
|
|
29
27
|
from psychopy.visual.basevisual import (
|
|
30
28
|
BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin, WindowMixin
|
|
31
29
|
)
|
|
30
|
+
from psychopy.colors import Color
|
|
32
31
|
# from psychopy.visual.helpers import setColor
|
|
33
32
|
import psychopy.visual
|
|
34
33
|
|
|
35
34
|
pyglet.options['debug_gl'] = False
|
|
36
35
|
GL = pyglet.gl
|
|
37
36
|
|
|
37
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
38
|
+
|
|
38
39
|
|
|
39
40
|
knownShapes = {
|
|
40
41
|
"triangle": [
|
|
@@ -113,15 +114,12 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
113
114
|
|
|
114
115
|
"""
|
|
115
116
|
|
|
116
|
-
_defaultFillColor = None
|
|
117
|
-
_defaultLineColor = "black"
|
|
118
|
-
|
|
119
117
|
def __init__(self,
|
|
120
118
|
win,
|
|
121
119
|
units='',
|
|
122
120
|
lineWidth=1.5,
|
|
123
|
-
lineColor=
|
|
124
|
-
fillColor=
|
|
121
|
+
lineColor="black",
|
|
122
|
+
fillColor=None,
|
|
125
123
|
colorSpace='rgb',
|
|
126
124
|
vertices=((-0.5, 0), (0, +0.5), (+0.5, 0)),
|
|
127
125
|
closeShape=True,
|
|
@@ -138,11 +136,11 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
138
136
|
autoLog=None,
|
|
139
137
|
autoDraw=False,
|
|
140
138
|
# legacy
|
|
141
|
-
color=
|
|
142
|
-
lineRGB=
|
|
143
|
-
fillRGB=
|
|
144
|
-
fillColorSpace=
|
|
145
|
-
lineColorSpace=
|
|
139
|
+
color=undefined,
|
|
140
|
+
lineRGB=undefined,
|
|
141
|
+
fillRGB=undefined,
|
|
142
|
+
fillColorSpace=undefined,
|
|
143
|
+
lineColorSpace=undefined,
|
|
146
144
|
):
|
|
147
145
|
""" """ # all doc is in the attributes
|
|
148
146
|
# what local vars are defined (these are the init params) for use by
|
|
@@ -161,34 +159,34 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
161
159
|
self.lineWidth = lineWidth
|
|
162
160
|
self.interpolate = interpolate
|
|
163
161
|
|
|
162
|
+
# handle legacy fill color attributes
|
|
163
|
+
if color is not undefined:
|
|
164
|
+
fillColor = color
|
|
165
|
+
if fillColorSpace is not undefined:
|
|
166
|
+
logging.warning(
|
|
167
|
+
"fillColorSpace parameter is deprecated. Please use colorSpace instead."
|
|
168
|
+
)
|
|
169
|
+
fillColor = Color(fillColor, space=fillColorSpace)
|
|
170
|
+
if fillRGB is not undefined:
|
|
171
|
+
logging.warning(
|
|
172
|
+
"fillRGB parameter is deprecated. Please use lineColor and colorSpace instead"
|
|
173
|
+
)
|
|
174
|
+
fillColor = Color(fillColor, space="rgb")
|
|
175
|
+
# handle legacy border color attributes
|
|
176
|
+
if lineColorSpace is not undefined:
|
|
177
|
+
logging.warning(
|
|
178
|
+
"lineColorSpace parameter is deprecated. Please use colorSpace instead."
|
|
179
|
+
)
|
|
180
|
+
lineColor = Color(lineColor, space=lineColorSpace)
|
|
181
|
+
if lineRGB is not undefined:
|
|
182
|
+
logging.warning(
|
|
183
|
+
"lineRGB parameter is deprecated. Please use lineColor and colorSpace instead"
|
|
184
|
+
)
|
|
185
|
+
lineColor = Color(lineColor, space="rgb")
|
|
164
186
|
# Appearance
|
|
165
187
|
self.colorSpace = colorSpace
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
elif color is not False:
|
|
169
|
-
# Override fillColor with color if not set
|
|
170
|
-
self.fillColor = color
|
|
171
|
-
else:
|
|
172
|
-
# Default to None if neither are set
|
|
173
|
-
self.fillColor = self._defaultFillColor
|
|
174
|
-
if lineColor is not False:
|
|
175
|
-
self.lineColor = lineColor
|
|
176
|
-
elif color is not False:
|
|
177
|
-
# Override lineColor with color if not set
|
|
178
|
-
self.lineColor = color
|
|
179
|
-
else:
|
|
180
|
-
# Default to black if neither are set
|
|
181
|
-
self.lineColor = self._defaultLineColor
|
|
182
|
-
if lineRGB is not False:
|
|
183
|
-
# Override with RGB if set
|
|
184
|
-
logging.warning("Use of rgb arguments to stimuli are deprecated."
|
|
185
|
-
" Please use color and colorSpace args instead")
|
|
186
|
-
self.setLineColor(lineRGB, colorSpace='rgb', log=None)
|
|
187
|
-
if fillRGB is not False:
|
|
188
|
-
# Override with RGB if set
|
|
189
|
-
logging.warning("Use of rgb arguments to stimuli are deprecated."
|
|
190
|
-
" Please use color and colorSpace args instead")
|
|
191
|
-
self.setFillColor(fillRGB, colorSpace='rgb', log=None)
|
|
188
|
+
self.fillColor = fillColor
|
|
189
|
+
self.lineColor = lineColor
|
|
192
190
|
self.contrast = contrast
|
|
193
191
|
if opacity is not None:
|
|
194
192
|
self.opacity = opacity
|
|
@@ -322,8 +320,8 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
322
320
|
# Angles in a shape add up to 360, so theta is 360/2n, solve for n
|
|
323
321
|
return int((360 / theta) / 2)
|
|
324
322
|
|
|
325
|
-
def
|
|
326
|
-
"""
|
|
323
|
+
def _drawLegacyGL(self, win, keepMatrix):
|
|
324
|
+
"""Legacy draw the stimulus in its relevant window.
|
|
327
325
|
|
|
328
326
|
You must call this method after every MyWin.flip() if you want the
|
|
329
327
|
stimulus to appear on that frame and then update the screen again.
|
|
@@ -336,13 +334,16 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
336
334
|
if win._haveShaders:
|
|
337
335
|
_prog = self.win._progSignedFrag
|
|
338
336
|
GL.glUseProgram(_prog)
|
|
337
|
+
|
|
339
338
|
# will check if it needs updating (check just once)
|
|
340
339
|
vertsPix = self.verticesPix
|
|
341
340
|
nVerts = vertsPix.shape[0]
|
|
341
|
+
|
|
342
342
|
# scale the drawing frame etc...
|
|
343
343
|
if not keepMatrix:
|
|
344
344
|
GL.glPushMatrix() # push before drawing, pop after
|
|
345
345
|
win.setScale('pix')
|
|
346
|
+
|
|
346
347
|
# load Null textures into multitexteureARB - or they modulate glColor
|
|
347
348
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
348
349
|
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
@@ -357,7 +358,7 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
357
358
|
else:
|
|
358
359
|
GL.glDisable(GL.GL_LINE_SMOOTH)
|
|
359
360
|
GL.glDisable(GL.GL_MULTISAMPLE)
|
|
360
|
-
|
|
361
|
+
|
|
361
362
|
GL.glVertexPointer(2, GL.GL_DOUBLE, 0, vertsPix.ctypes)
|
|
362
363
|
|
|
363
364
|
GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
|
|
@@ -366,6 +367,7 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
366
367
|
# then draw
|
|
367
368
|
GL.glColor4f(*self._fillColor.render('rgba1'))
|
|
368
369
|
GL.glDrawArrays(GL.GL_POLYGON, 0, nVerts)
|
|
370
|
+
|
|
369
371
|
if self._borderColor != None and self.lineWidth != 0.0:
|
|
370
372
|
# then draw
|
|
371
373
|
GL.glLineWidth(self.lineWidth)
|
|
@@ -379,12 +381,92 @@ class BaseShapeStim(BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin):
|
|
|
379
381
|
GL.glDrawArrays(GL.GL_LINE_LOOP, 0, nVerts)
|
|
380
382
|
else:
|
|
381
383
|
GL.glDrawArrays(GL.GL_LINE_STRIP, 0, nVerts)
|
|
384
|
+
|
|
382
385
|
GL.glDisableClientState(GL.GL_VERTEX_ARRAY)
|
|
386
|
+
|
|
383
387
|
if win._haveShaders:
|
|
384
388
|
GL.glUseProgram(0)
|
|
389
|
+
|
|
385
390
|
if not keepMatrix:
|
|
386
391
|
GL.glPopMatrix()
|
|
387
392
|
|
|
393
|
+
def draw(self, win=None, keepMatrix=False):
|
|
394
|
+
"""Draw the stimulus in its relevant window.
|
|
395
|
+
|
|
396
|
+
You must call this method after every MyWin.flip() if you want the
|
|
397
|
+
stimulus to appear on that frame and then update the screen again.
|
|
398
|
+
"""
|
|
399
|
+
# The keepMatrix option is needed by Aperture
|
|
400
|
+
if win is None:
|
|
401
|
+
win = self.win
|
|
402
|
+
self._selectWindow(win)
|
|
403
|
+
|
|
404
|
+
if USE_LEGACY_GL:
|
|
405
|
+
self._drawLegacyGL(win, keepMatrix)
|
|
406
|
+
return
|
|
407
|
+
|
|
408
|
+
win.setOrthographicView()
|
|
409
|
+
|
|
410
|
+
# will check if it needs updating (check just once)
|
|
411
|
+
vertsPix = self.verticesPix
|
|
412
|
+
|
|
413
|
+
if vertsPix is None or vertsPix.shape[0] < 2: # nothing to draw
|
|
414
|
+
return
|
|
415
|
+
|
|
416
|
+
if self.interpolate:
|
|
417
|
+
gt.enable('GL_LINE_SMOOTH')
|
|
418
|
+
gt.enable('GL_MULTISAMPLE')
|
|
419
|
+
else:
|
|
420
|
+
gt.disable('GL_LINE_SMOOTH')
|
|
421
|
+
gt.disable('GL_MULTISAMPLE')
|
|
422
|
+
|
|
423
|
+
# bind shader program
|
|
424
|
+
_prog = self.win._progSignedFrag
|
|
425
|
+
gt.useProgram(_prog)
|
|
426
|
+
|
|
427
|
+
# if vertsPix.shape[0] > 2: # draw a filled polygon first
|
|
428
|
+
if self._fillColor != None:
|
|
429
|
+
gt.setUniformValue(
|
|
430
|
+
_prog,
|
|
431
|
+
b'uColor',
|
|
432
|
+
self._fillColor.render('rgba1'))
|
|
433
|
+
gt.setUniformMatrix(
|
|
434
|
+
_prog,
|
|
435
|
+
b'uProjectionMatrix',
|
|
436
|
+
win._projectionMatrix,
|
|
437
|
+
transpose=True)
|
|
438
|
+
gt.setUniformMatrix(
|
|
439
|
+
_prog,
|
|
440
|
+
b'uModelViewMatrix',
|
|
441
|
+
win._viewMatrix,
|
|
442
|
+
transpose=True)
|
|
443
|
+
gt.drawClientArrays(
|
|
444
|
+
{'gl_Vertex': self.verticesPix},
|
|
445
|
+
'GL_TRIANGLES')
|
|
446
|
+
|
|
447
|
+
# draw the border
|
|
448
|
+
if self._borderColor != None and self.lineWidth != 0.0:
|
|
449
|
+
gt.setLineWidth(self.lineWidth)
|
|
450
|
+
borderRGBA = self._borderColor.render('rgba1')
|
|
451
|
+
if self.opacity is not None:
|
|
452
|
+
borderRGBA[-1] = self.opacity # override opacity
|
|
453
|
+
gt.setUniformValue(_prog, b'uColor', borderRGBA)
|
|
454
|
+
gt.setUniformMatrix(
|
|
455
|
+
_prog,
|
|
456
|
+
b'uProjectionMatrix',
|
|
457
|
+
win._projectionMatrix,
|
|
458
|
+
transpose=True)
|
|
459
|
+
gt.setUniformMatrix(
|
|
460
|
+
_prog,
|
|
461
|
+
b'uModelViewMatrix',
|
|
462
|
+
win._viewMatrix,
|
|
463
|
+
transpose=True)
|
|
464
|
+
gt.drawClientArrays(
|
|
465
|
+
{'gl_Vertex': self.verticesPix},
|
|
466
|
+
'GL_LINE_LOOP' if self.closeShape else 'GL_LINE_STRIP')
|
|
467
|
+
|
|
468
|
+
gt.useProgram(None)
|
|
469
|
+
|
|
388
470
|
|
|
389
471
|
class ShapeStim(BaseShapeStim):
|
|
390
472
|
"""A class for arbitrary shapes defined as lists of vertices (x,y).
|
|
@@ -492,18 +574,10 @@ class ShapeStim(BaseShapeStim):
|
|
|
492
574
|
frame without the need to explicitly call the
|
|
493
575
|
:py:meth:`~psychopy.visual.ShapeStim.draw` method.
|
|
494
576
|
color : array_like, str, :class:`~psychopy.colors.Color` or None
|
|
495
|
-
|
|
496
|
-
lineRGB, fillRGB: array_like, :class:`~psychopy.colors.Color` or None
|
|
497
|
-
*Deprecated*. Please use `lineColor` and `fillColor`. These
|
|
498
|
-
arguments may be removed in a future version.
|
|
499
|
-
lineColorSpace, fillColorSpace : str
|
|
500
|
-
Colorspace to use for the outline and fill. These change how the
|
|
501
|
-
values passed to `lineColor` and `fillColor` are interpreted.
|
|
502
|
-
*Deprecated*. Please use `colorSpace` to set both outline and fill
|
|
503
|
-
colorspace. These arguments may be removed in a future version.
|
|
504
|
-
|
|
577
|
+
Synonymous with `fillColor`
|
|
505
578
|
"""
|
|
506
579
|
# Author: Jeremy Gray, November 2015, using psychopy.contrib.tesselate
|
|
580
|
+
_tesselMode = 'triangle' # best for most shapes
|
|
507
581
|
|
|
508
582
|
def __init__(self,
|
|
509
583
|
win,
|
|
@@ -528,43 +602,50 @@ class ShapeStim(BaseShapeStim):
|
|
|
528
602
|
autoLog=None,
|
|
529
603
|
autoDraw=False,
|
|
530
604
|
# legacy
|
|
531
|
-
color=
|
|
532
|
-
lineRGB=
|
|
533
|
-
fillRGB=
|
|
534
|
-
fillColorSpace=
|
|
535
|
-
lineColorSpace=
|
|
605
|
+
color=undefined,
|
|
606
|
+
lineRGB=undefined,
|
|
607
|
+
fillRGB=undefined,
|
|
608
|
+
fillColorSpace=undefined,
|
|
609
|
+
lineColorSpace=undefined
|
|
536
610
|
):
|
|
537
611
|
|
|
538
612
|
# what local vars are defined (init params, for use by __repr__)
|
|
539
613
|
self._initParamsOrig = dir()
|
|
540
614
|
self._initParamsOrig.remove('self')
|
|
541
615
|
|
|
542
|
-
super(ShapeStim, self).__init__(
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
616
|
+
super(ShapeStim, self).__init__(
|
|
617
|
+
win,
|
|
618
|
+
units=units,
|
|
619
|
+
lineWidth=lineWidth,
|
|
620
|
+
colorSpace=colorSpace,
|
|
621
|
+
lineColor=lineColor,
|
|
622
|
+
fillColor=fillColor,
|
|
623
|
+
vertices=None, # dummy verts
|
|
624
|
+
closeShape=self.closeShape,
|
|
625
|
+
pos=pos,
|
|
626
|
+
size=size,
|
|
627
|
+
anchor=anchor,
|
|
628
|
+
ori=ori,
|
|
629
|
+
opacity=opacity,
|
|
630
|
+
contrast=contrast,
|
|
631
|
+
depth=depth,
|
|
632
|
+
interpolate=interpolate,
|
|
633
|
+
draggable=draggable,
|
|
634
|
+
name=name,
|
|
635
|
+
autoLog=False,
|
|
636
|
+
autoDraw=autoDraw,
|
|
637
|
+
# legacy
|
|
638
|
+
color=color,
|
|
639
|
+
lineRGB=lineRGB,
|
|
640
|
+
fillRGB=fillRGB,
|
|
641
|
+
fillColorSpace=fillColorSpace,
|
|
642
|
+
lineColorSpace=lineColorSpace
|
|
643
|
+
)
|
|
564
644
|
|
|
565
645
|
self.closeShape = closeShape
|
|
566
646
|
self.windingRule = windingRule
|
|
567
647
|
self.vertices = vertices
|
|
648
|
+
self.border = vertices
|
|
568
649
|
|
|
569
650
|
# remove deprecated params (from ShapeStim.__init__):
|
|
570
651
|
self._initParams = self._initParamsOrig
|
|
@@ -575,14 +656,14 @@ class ShapeStim(BaseShapeStim):
|
|
|
575
656
|
if self.autoLog:
|
|
576
657
|
logging.exp("Created %s = %s" % (self.name, str(self)))
|
|
577
658
|
|
|
578
|
-
def
|
|
579
|
-
"""
|
|
580
|
-
tessellation.
|
|
659
|
+
def _legacyTesselate(self, newVertices):
|
|
660
|
+
"""Legacy tessellation method for ShapeStim.
|
|
581
661
|
"""
|
|
582
662
|
# TO-DO: handle borders properly for multiloop stim like holes
|
|
583
663
|
# likely requires changes in ContainerMixin to iterate over each
|
|
584
664
|
# border loop
|
|
585
665
|
from psychopy.contrib import tesselate
|
|
666
|
+
import copy
|
|
586
667
|
|
|
587
668
|
self.border = copy.deepcopy(newVertices)
|
|
588
669
|
tessVertices = [] # define to keep the linter happy
|
|
@@ -613,6 +694,33 @@ class ShapeStim(BaseShapeStim):
|
|
|
613
694
|
initVertices = tessVertices
|
|
614
695
|
self.__dict__['_tesselVertices'] = numpy.array(initVertices, float)
|
|
615
696
|
|
|
697
|
+
def _tesselate(self, newVertices):
|
|
698
|
+
"""Set the `.vertices` and `.border` to new values, invoking
|
|
699
|
+
tessellation.
|
|
700
|
+
|
|
701
|
+
Parameters
|
|
702
|
+
----------
|
|
703
|
+
newVertices : array_like
|
|
704
|
+
Nx2 array of points (eg., `[[-0.5, 0], [0, 0.5], [0.5, 0]`).
|
|
705
|
+
|
|
706
|
+
"""
|
|
707
|
+
if USE_LEGACY_GL:
|
|
708
|
+
self._legacyTesselate(newVertices)
|
|
709
|
+
return
|
|
710
|
+
|
|
711
|
+
if len(newVertices) < 3:
|
|
712
|
+
self.closeShape = False
|
|
713
|
+
|
|
714
|
+
if not hasattr(self, '_tesselMode'):
|
|
715
|
+
self._tesselMode = 'triangle'
|
|
716
|
+
|
|
717
|
+
vertices, _, _, faces = gt.tesselate(newVertices, mode=self._tesselMode)
|
|
718
|
+
|
|
719
|
+
# unpack the vertices into a numpy array
|
|
720
|
+
initVertices = numpy.ascontiguousarray(vertices)[faces.flatten()]
|
|
721
|
+
|
|
722
|
+
self.__dict__['_tesselVertices'] = numpy.array(initVertices, float)
|
|
723
|
+
|
|
616
724
|
@property
|
|
617
725
|
def vertices(self):
|
|
618
726
|
"""A list of lists or a numpy array (Nx2) specifying xy positions of
|
|
@@ -639,8 +747,8 @@ class ShapeStim(BaseShapeStim):
|
|
|
639
747
|
self._needVertexUpdate = True
|
|
640
748
|
self._tesselate(self.vertices)
|
|
641
749
|
|
|
642
|
-
def
|
|
643
|
-
"""
|
|
750
|
+
def _drawLegacyGL(self, win, keepMatrix):
|
|
751
|
+
"""Legacy draw the stimulus in the relevant window.
|
|
644
752
|
|
|
645
753
|
You must call this method after every `win.flip()` if you want the
|
|
646
754
|
stimulus to appear on that frame and then update the screen again.
|
|
@@ -650,10 +758,6 @@ class ShapeStim(BaseShapeStim):
|
|
|
650
758
|
# border) keepMatrix is needed by Aperture, although Aperture
|
|
651
759
|
# currently relies on BaseShapeStim instead
|
|
652
760
|
|
|
653
|
-
if win is None:
|
|
654
|
-
win = self.win
|
|
655
|
-
self._selectWindow(win)
|
|
656
|
-
|
|
657
761
|
# scale the drawing frame etc...
|
|
658
762
|
if not keepMatrix:
|
|
659
763
|
GL.glPushMatrix()
|
|
@@ -664,6 +768,9 @@ class ShapeStim(BaseShapeStim):
|
|
|
664
768
|
_prog = self.win._progSignedFrag
|
|
665
769
|
GL.glUseProgram(_prog)
|
|
666
770
|
|
|
771
|
+
# will check if it needs updating (check just once)
|
|
772
|
+
vertsPix = self.verticesPix
|
|
773
|
+
|
|
667
774
|
# load Null textures into multitexteureARB - or they modulate glColor
|
|
668
775
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
669
776
|
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
@@ -678,6 +785,7 @@ class ShapeStim(BaseShapeStim):
|
|
|
678
785
|
else:
|
|
679
786
|
GL.glDisable(GL.GL_LINE_SMOOTH)
|
|
680
787
|
GL.glDisable(GL.GL_MULTISAMPLE)
|
|
788
|
+
|
|
681
789
|
GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
|
|
682
790
|
|
|
683
791
|
# fill interior triangles if there are any
|
|
@@ -700,7 +808,90 @@ class ShapeStim(BaseShapeStim):
|
|
|
700
808
|
GL.glDrawArrays(gl_line, 0, self._borderPix.shape[0])
|
|
701
809
|
|
|
702
810
|
GL.glDisableClientState(GL.GL_VERTEX_ARRAY)
|
|
811
|
+
|
|
703
812
|
if win._haveShaders:
|
|
704
813
|
GL.glUseProgram(0)
|
|
814
|
+
|
|
705
815
|
if not keepMatrix:
|
|
706
816
|
GL.glPopMatrix()
|
|
817
|
+
|
|
818
|
+
def draw(self, win=None, keepMatrix=False):
|
|
819
|
+
"""Draw the stimulus in the relevant window.
|
|
820
|
+
|
|
821
|
+
You must call this method after every `win.flip()` if you want the
|
|
822
|
+
stimulus to appear on that frame and then update the screen again.
|
|
823
|
+
|
|
824
|
+
Parameters
|
|
825
|
+
----------
|
|
826
|
+
win : :class:`~psychopy.visual.Window`, optional
|
|
827
|
+
Window to draw the stimulus in. If not specified, the stimulus
|
|
828
|
+
will be drawn in the window specified at initialization.
|
|
829
|
+
keepMatrix : bool, optional
|
|
830
|
+
*DEPRECATED* If `True`, the current transformation matrix will be
|
|
831
|
+
preserved. This is useful when drawing multiple stimuli with the
|
|
832
|
+
same transformation matrix. Default is `False`.
|
|
833
|
+
|
|
834
|
+
"""
|
|
835
|
+
if win is None:
|
|
836
|
+
win = self.win
|
|
837
|
+
self._selectWindow(win)
|
|
838
|
+
|
|
839
|
+
# legacy pipeline
|
|
840
|
+
if USE_LEGACY_GL:
|
|
841
|
+
self._drawLegacyGL(win, keepMatrix)
|
|
842
|
+
return
|
|
843
|
+
|
|
844
|
+
# scale the drawing frame etc...
|
|
845
|
+
win.setScale('pix')
|
|
846
|
+
win.setOrthographicView()
|
|
847
|
+
|
|
848
|
+
_prog = self.win._progSignedFrag # shader program handle
|
|
849
|
+
gt.useProgram(_prog)
|
|
850
|
+
|
|
851
|
+
if self.interpolate:
|
|
852
|
+
gt.enable('GL_LINE_SMOOTH')
|
|
853
|
+
gt.enable('GL_MULTISAMPLE')
|
|
854
|
+
else:
|
|
855
|
+
gt.disable('GL_LINE_SMOOTH')
|
|
856
|
+
gt.disable('GL_MULTISAMPLE')
|
|
857
|
+
|
|
858
|
+
# fill interior triangles if there are any
|
|
859
|
+
if (self.closeShape and
|
|
860
|
+
self.verticesPix.shape[0] > 2 and
|
|
861
|
+
self._fillColor != None):
|
|
862
|
+
gt.setUniformValue(
|
|
863
|
+
_prog, b'uColor', self._fillColor.render('rgba1'))
|
|
864
|
+
gt.setUniformMatrix(
|
|
865
|
+
_prog,
|
|
866
|
+
b'uProjectionMatrix',
|
|
867
|
+
win._projectionMatrix,
|
|
868
|
+
transpose=True)
|
|
869
|
+
gt.setUniformMatrix(
|
|
870
|
+
_prog,
|
|
871
|
+
b'uModelViewMatrix',
|
|
872
|
+
win._viewMatrix,
|
|
873
|
+
transpose=True)
|
|
874
|
+
gt.drawClientArrays(
|
|
875
|
+
{'gl_Vertex': self.verticesPix},
|
|
876
|
+
'GL_TRIANGLES')
|
|
877
|
+
|
|
878
|
+
# draw the border (= a line connecting the non-tesselated vertices)
|
|
879
|
+
if self._borderColor != None and self.lineWidth:
|
|
880
|
+
GL.glLineWidth(self.lineWidth)
|
|
881
|
+
gt.setUniformValue(
|
|
882
|
+
_prog, b'uColor', self._borderColor.render('rgba1'))
|
|
883
|
+
gt.setUniformMatrix(
|
|
884
|
+
_prog,
|
|
885
|
+
b'uProjectionMatrix',
|
|
886
|
+
win._projectionMatrix,
|
|
887
|
+
transpose=True)
|
|
888
|
+
gt.setUniformMatrix(
|
|
889
|
+
_prog,
|
|
890
|
+
b'uModelViewMatrix',
|
|
891
|
+
win._viewMatrix,
|
|
892
|
+
transpose=True)
|
|
893
|
+
gt.drawClientArrays(
|
|
894
|
+
{'gl_Vertex': self._borderPix},
|
|
895
|
+
'GL_LINE_LOOP' if self.closeShape else 'GL_LINE_STRIP')
|
|
896
|
+
|
|
897
|
+
gt.useProgram(None)
|
psychopy/visual/simpleimage.py
CHANGED
|
@@ -6,7 +6,7 @@ the resolution and color in the file (subject to gamma correction if set).
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
# Part of the PsychoPy library
|
|
9
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
9
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
10
10
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
11
11
|
|
|
12
12
|
import os
|