psychopy 2024.2.4__py3-none-any.whl → 2025.1.0__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 +208 -4
- 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 +1514 -3259
- 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 +37 -15
- 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 +2 -0
- 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 +1 -1
- 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/{Feature Demos/eyetracking/eyetracking.xml → Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp} +154 -140
- 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 +62 -16
- 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 +16 -3
- 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 +534 -154
- 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/client/__init__.py +17 -0
- psychopy/iohub/client/keyboard.py +5 -0
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +6 -1
- psychopy/iohub/devices/mouse/win32.py +5 -0
- 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_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_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_experiment.py +96 -0
- 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/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 +2964 -558
- 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 +1 -1
- 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 +373 -200
- psychopy/web.py +1 -1
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/RECORD +653 -660
- 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/zh_CN/LC_MESSAGE/zh_CN.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.po +0 -6127
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.po +0 -7366
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/index.html +0 -23
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks-legacy-browsers.js +0 -423
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks.js +0 -427
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/chooseBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/facesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/housesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.py +0 -330
- 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/Feature Demos/eyetracking/eyetracking.xsd +0 -120
- 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.psyexp +0 -323
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/questStairs.xlsx +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/low_contrast.png +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/make_2nd_order_tex.py +0 -59
- psychopy/demos/builder/Tools/gammaCalibration/resources/second_order_tex.png +0 -0
- 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/demos/coder/stimuli/radialGratingContracting.py +0 -29
- 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/hardware/serialport.py +0 -51
- 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/__test.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/corrFullRandom_local.csv +0 -16
- psychopy/tests/data/corrFullRandom_local.tsv +0 -6
- 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/testLoopsBlocks.psyexp_local.py +0 -328
- 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/text2_height.png +0 -0
- psychopy/tests/data/text2_normAddBlend.png +0 -0
- psychopy/tests/data/text2_normHexbackground.png +0 -0
- psychopy/tests/data/text2_stencil.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.csv +0 -9
- 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.csv +0 -9
- 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/{demos/builder/Tools/gammaCalibration/readme.md → tests/test_plugins/__init__.py} +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
psychopy/visual/window.py
CHANGED
|
@@ -4,12 +4,9 @@
|
|
|
4
4
|
"""A class representing a window for displaying one or more stimuli"""
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
10
|
import ctypes
|
|
14
11
|
import os
|
|
15
12
|
import sys
|
|
@@ -26,10 +23,12 @@ import math
|
|
|
26
23
|
# from psychopy.clock import monotonicClock
|
|
27
24
|
|
|
28
25
|
# try to find avbin (we'll overload pyglet's load_library tool and then
|
|
29
|
-
# add some paths
|
|
26
|
+
# add some paths
|
|
30
27
|
from ..colors import Color, colorSpaces
|
|
31
28
|
from .textbox2 import TextBox2
|
|
32
29
|
|
|
30
|
+
import pyglet
|
|
31
|
+
|
|
33
32
|
|
|
34
33
|
haveAvbin = False
|
|
35
34
|
|
|
@@ -85,6 +84,7 @@ from psychopy.tools.arraytools import val2array
|
|
|
85
84
|
from psychopy.tools.monitorunittools import convertToPix
|
|
86
85
|
import psychopy.tools.viewtools as viewtools
|
|
87
86
|
import psychopy.tools.gltools as gltools
|
|
87
|
+
import psychopy.tools.mathtools as mathtools
|
|
88
88
|
from .text import TextStim
|
|
89
89
|
from .grating import GratingStim
|
|
90
90
|
from .helpers import setColor
|
|
@@ -154,6 +154,7 @@ class Window():
|
|
|
154
154
|
project (we won't be fixing pygame-specific bugs).
|
|
155
155
|
|
|
156
156
|
"""
|
|
157
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
157
158
|
def __init__(self,
|
|
158
159
|
size=(800, 600),
|
|
159
160
|
pos=None,
|
|
@@ -403,16 +404,6 @@ class Window():
|
|
|
403
404
|
self.dkl_rgb = self.monitor.getDKL_RGB()
|
|
404
405
|
self.lms_rgb = self.monitor.getLMS_RGB()
|
|
405
406
|
|
|
406
|
-
# Projection and view matrices, these can be lists if multiple views are
|
|
407
|
-
# being used.
|
|
408
|
-
# NB - attribute checks needed for Rift compatibility
|
|
409
|
-
if not hasattr(self, '_viewMatrix'):
|
|
410
|
-
self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
|
|
411
|
-
|
|
412
|
-
if not hasattr(self, '_projectionMatrix'):
|
|
413
|
-
self._projectionMatrix = viewtools.orthoProjectionMatrix(
|
|
414
|
-
-1, 1, -1, 1, -1, 1, dtype=numpy.float32)
|
|
415
|
-
|
|
416
407
|
# set screen color
|
|
417
408
|
self.__dict__['colorSpace'] = colorSpace
|
|
418
409
|
if rgb is not None:
|
|
@@ -548,6 +539,11 @@ class Window():
|
|
|
548
539
|
# gl viewport and scissor
|
|
549
540
|
self._viewport = self._scissor = None # set later
|
|
550
541
|
|
|
542
|
+
self._fboVerts = numpy.ascontiguousarray(
|
|
543
|
+
[[-1, -1], [-1, 1], [1, 1], [1, -1]], dtype=numpy.float32)
|
|
544
|
+
self._fboTexCoords = numpy.ascontiguousarray(
|
|
545
|
+
[[0, 0], [0, 1], [1, 1], [1, 0]], dtype=numpy.float32)
|
|
546
|
+
|
|
551
547
|
# scene light sources
|
|
552
548
|
self._lights = []
|
|
553
549
|
self._useLights = False
|
|
@@ -622,6 +618,15 @@ class Window():
|
|
|
622
618
|
self._showSplash = False
|
|
623
619
|
self.resetViewport() # set viewport to full window size
|
|
624
620
|
|
|
621
|
+
# transformation
|
|
622
|
+
self._projectionMatrix = numpy.identity(4, dtype=numpy.float32)
|
|
623
|
+
self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
|
|
624
|
+
|
|
625
|
+
self._projectionMatrixNeedsUpdate = True
|
|
626
|
+
self._viewMatrixNeedsUpdate = True
|
|
627
|
+
|
|
628
|
+
self.setOrthographicView()
|
|
629
|
+
|
|
625
630
|
# piloting indicator
|
|
626
631
|
self._pilotingIndicator = None
|
|
627
632
|
self._showPilotingIndicator = False
|
|
@@ -745,11 +750,87 @@ class Window():
|
|
|
745
750
|
viewPos_norm = viewPos_pix / (self.size / 2.0)
|
|
746
751
|
# Clip to +/- 1; should going out-of-window raise an exception?
|
|
747
752
|
viewPos_norm = numpy.clip(viewPos_norm, a_min=-1., a_max=1.)
|
|
753
|
+
self._viewMatrixNeedsUpdate = True
|
|
748
754
|
self.__dict__['_viewPosNorm'] = viewPos_norm
|
|
749
755
|
|
|
750
756
|
def setViewPos(self, value, log=True):
|
|
751
757
|
setAttribute(self, 'viewPos', value, log=log)
|
|
752
758
|
|
|
759
|
+
@attributeSetter
|
|
760
|
+
def viewOri(self, value):
|
|
761
|
+
"""Set the rotation of the view in degrees.
|
|
762
|
+
|
|
763
|
+
The rotation is applied around the origin of the window, which is
|
|
764
|
+
defined by the viewPos attribute. The rotation is applied after scaling
|
|
765
|
+
but before translation.
|
|
766
|
+
|
|
767
|
+
"""
|
|
768
|
+
self.__dict__['viewOri'] = value
|
|
769
|
+
self._viewMatrixNeedsUpdate = True
|
|
770
|
+
|
|
771
|
+
def setViewOri(self, value, log=True):
|
|
772
|
+
setAttribute(self, 'viewOri', value, log=log)
|
|
773
|
+
|
|
774
|
+
@attributeSetter
|
|
775
|
+
def viewScale(self, value):
|
|
776
|
+
"""Set the scale factors for the view.
|
|
777
|
+
|
|
778
|
+
The scaling is applied around the origin of the window, which is defined
|
|
779
|
+
by the viewPos attribute. The scaling is applied before translation and
|
|
780
|
+
rotation.
|
|
781
|
+
|
|
782
|
+
"""
|
|
783
|
+
self.__dict__['viewScale'] = value
|
|
784
|
+
self._viewMatrixNeedsUpdate = True
|
|
785
|
+
|
|
786
|
+
def setViewScale(self, value, log=True):
|
|
787
|
+
setAttribute(self, 'viewScale', value, log=log)
|
|
788
|
+
|
|
789
|
+
def _updateViewMatrix(self):
|
|
790
|
+
"""Update the default orthographic view matrix based on the current
|
|
791
|
+
window settings.
|
|
792
|
+
"""
|
|
793
|
+
if self._viewMatrixNeedsUpdate:
|
|
794
|
+
if self.viewScale is None:
|
|
795
|
+
sx, sy = [1.0, 1.0]
|
|
796
|
+
else:
|
|
797
|
+
sx, sy = self.viewScale
|
|
798
|
+
|
|
799
|
+
if self.viewOri is None:
|
|
800
|
+
viewOri = 0.0
|
|
801
|
+
else:
|
|
802
|
+
viewOri = self.viewOri
|
|
803
|
+
|
|
804
|
+
if self.viewPos is None:
|
|
805
|
+
tx, ty = [0.0, 0.0]
|
|
806
|
+
else:
|
|
807
|
+
tx, ty = self.viewPos
|
|
808
|
+
|
|
809
|
+
scaleMatrix = mathtools.scaleMatrix([sx, sy, 1.0])
|
|
810
|
+
rotateMatrix = mathtools.rotationMatrix(viewOri, axis='-z')
|
|
811
|
+
translateMatrix = mathtools.translationMatrix([tx, ty, 0.0])
|
|
812
|
+
|
|
813
|
+
# compute SRT matrix
|
|
814
|
+
self._viewMatrix[:, :] = mathtools.multMatrix([
|
|
815
|
+
translateMatrix,
|
|
816
|
+
rotateMatrix,
|
|
817
|
+
scaleMatrix])
|
|
818
|
+
self._viewMatrixNeedsUpdate = False
|
|
819
|
+
|
|
820
|
+
def _updateProjectionMatrix(self):
|
|
821
|
+
"""Update the default projection matrix based on the current window
|
|
822
|
+
settings.
|
|
823
|
+
"""
|
|
824
|
+
if self._projectionMatrixNeedsUpdate:
|
|
825
|
+
widthOver2 = self.size[0] / 2.0
|
|
826
|
+
heightOver2 = self.size[1] / 2.0
|
|
827
|
+
self._projectionMatrix[:, :] = viewtools.orthoProjectionMatrix(
|
|
828
|
+
-widthOver2, widthOver2, # -X, +X
|
|
829
|
+
-heightOver2, heightOver2, # -Y, +Y
|
|
830
|
+
-1.0, 1.0, # -Z, +Z
|
|
831
|
+
dtype=numpy.float32)
|
|
832
|
+
self._projectionMatrixNeedsUpdate = False
|
|
833
|
+
|
|
753
834
|
@property
|
|
754
835
|
def fullscr(self):
|
|
755
836
|
"""Return whether the window is in fullscreen mode."""
|
|
@@ -848,10 +929,10 @@ class Window():
|
|
|
848
929
|
|
|
849
930
|
# if we are using an FBO, bind it
|
|
850
931
|
if hasattr(self, 'frameBuffer'):
|
|
851
|
-
GL.glBindFramebufferEXT(GL.
|
|
932
|
+
GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER,
|
|
852
933
|
self.frameBuffer)
|
|
853
|
-
GL.glReadBuffer(GL.
|
|
854
|
-
GL.glDrawBuffer(GL.
|
|
934
|
+
GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
935
|
+
GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
855
936
|
|
|
856
937
|
# NB - check if we need these
|
|
857
938
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
@@ -1190,6 +1271,10 @@ class Window():
|
|
|
1190
1271
|
# handle dragging
|
|
1191
1272
|
if getattr(thisStim, "draggable", False):
|
|
1192
1273
|
thisStim.doDragging()
|
|
1274
|
+
|
|
1275
|
+
if getattr(thisStim, "clickable", False):
|
|
1276
|
+
thisStim.doPointerActions()
|
|
1277
|
+
|
|
1193
1278
|
else:
|
|
1194
1279
|
self.backend.setCurrent()
|
|
1195
1280
|
|
|
@@ -1200,11 +1285,13 @@ class Window():
|
|
|
1200
1285
|
self.scissorTest = True
|
|
1201
1286
|
|
|
1202
1287
|
# clear the projection and modelview matrix for FBO blit
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1288
|
+
# DEPRECATED: these are all removed from OpenGL 3.1
|
|
1289
|
+
if self.USE_LEGACY_GL:
|
|
1290
|
+
GL.glMatrixMode(GL.GL_PROJECTION)
|
|
1291
|
+
GL.glLoadIdentity()
|
|
1292
|
+
GL.glOrtho(-1, 1, -1, 1, -1, 1)
|
|
1293
|
+
GL.glMatrixMode(GL.GL_MODELVIEW)
|
|
1294
|
+
GL.glLoadIdentity()
|
|
1208
1295
|
|
|
1209
1296
|
# disable lighting
|
|
1210
1297
|
self.useLights = False
|
|
@@ -1239,7 +1326,7 @@ class Window():
|
|
|
1239
1326
|
# need blit the framebuffer object to the actual back buffer
|
|
1240
1327
|
|
|
1241
1328
|
# unbind the framebuffer as the render target
|
|
1242
|
-
GL.
|
|
1329
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
1243
1330
|
GL.glDisable(GL.GL_BLEND)
|
|
1244
1331
|
stencilOn = self.stencilTest
|
|
1245
1332
|
self.stencilTest = False
|
|
@@ -1252,7 +1339,9 @@ class Window():
|
|
|
1252
1339
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
1253
1340
|
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
1254
1341
|
GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture)
|
|
1255
|
-
|
|
1342
|
+
if self.USE_LEGACY_GL:
|
|
1343
|
+
GL.glColor3f(1.0, 1.0, 1.0) # glColor multiplies with texture
|
|
1344
|
+
|
|
1256
1345
|
GL.glColorMask(True, True, True, True)
|
|
1257
1346
|
|
|
1258
1347
|
self._renderFBO()
|
|
@@ -1267,10 +1356,10 @@ class Window():
|
|
|
1267
1356
|
|
|
1268
1357
|
if self.useFBO and flipThisFrame:
|
|
1269
1358
|
# set rendering back to the framebuffer object
|
|
1270
|
-
GL.
|
|
1271
|
-
GL.
|
|
1272
|
-
GL.glReadBuffer(GL.
|
|
1273
|
-
GL.glDrawBuffer(GL.
|
|
1359
|
+
GL.glBindFramebuffer(
|
|
1360
|
+
GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
1361
|
+
GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
1362
|
+
GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
1274
1363
|
# set to no active rendering texture
|
|
1275
1364
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
1276
1365
|
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
@@ -1278,56 +1367,67 @@ class Window():
|
|
|
1278
1367
|
self.stencilTest = True
|
|
1279
1368
|
|
|
1280
1369
|
# rescale, reposition, & rotate
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
GL.
|
|
1285
|
-
absScaleX = abs(self.viewScale[0])
|
|
1286
|
-
absScaleY = abs(self.viewScale[1])
|
|
1287
|
-
else:
|
|
1288
|
-
absScaleX, absScaleY = 1, 1
|
|
1289
|
-
|
|
1290
|
-
if self.viewPos is not None:
|
|
1291
|
-
# here we must use normalised units in _viewPosNorm,
|
|
1292
|
-
# see the corresponding attributeSetter above
|
|
1293
|
-
normRfPosX = self._viewPosNorm[0] / absScaleX
|
|
1294
|
-
normRfPosY = self._viewPosNorm[1] / absScaleY
|
|
1295
|
-
|
|
1296
|
-
GL.glTranslatef(normRfPosX, normRfPosY, 0.0)
|
|
1297
|
-
|
|
1298
|
-
if self.viewOri: # float
|
|
1299
|
-
# the logic below for flip is partially correct, but does not
|
|
1300
|
-
# handle a nonzero viewPos
|
|
1301
|
-
flip = 1
|
|
1370
|
+
# DEPRECATED: these are all removed from OpenGL 3.1
|
|
1371
|
+
if self.USE_LEGACY_GL:
|
|
1372
|
+
GL.glMatrixMode(GL.GL_MODELVIEW)
|
|
1373
|
+
GL.glLoadIdentity()
|
|
1302
1374
|
if self.viewScale is not None:
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1375
|
+
# DEPRECATED: these are all removed from OpenGL 3.1
|
|
1376
|
+
GL.glScalef(self.viewScale[0], self.viewScale[1], 1)
|
|
1377
|
+
|
|
1378
|
+
absScaleX = abs(self.viewScale[0])
|
|
1379
|
+
absScaleY = abs(self.viewScale[1])
|
|
1380
|
+
else:
|
|
1381
|
+
absScaleX, absScaleY = 1, 1
|
|
1382
|
+
|
|
1383
|
+
if self.viewPos is not None:
|
|
1384
|
+
# here we must use normalised units in _viewPosNorm,
|
|
1385
|
+
# see the corresponding attributeSetter above
|
|
1386
|
+
normRfPosX = self._viewPosNorm[0] / absScaleX
|
|
1387
|
+
normRfPosY = self._viewPosNorm[1] / absScaleY
|
|
1388
|
+
|
|
1389
|
+
# DEPRECATED: these are all removed from OpenGL 3.1
|
|
1390
|
+
GL.glTranslatef(normRfPosX, normRfPosY, 0.0)
|
|
1391
|
+
|
|
1392
|
+
if self.viewOri: # float
|
|
1393
|
+
# the logic below for flip is partially correct, but does not
|
|
1394
|
+
# handle a nonzero viewPos
|
|
1395
|
+
flip = 1
|
|
1396
|
+
if self.viewScale is not None:
|
|
1397
|
+
_f = self.viewScale[0] * self.viewScale[1]
|
|
1398
|
+
if _f < 0:
|
|
1399
|
+
flip = -1
|
|
1400
|
+
# DEPERECATED: these are all removed from OpenGL 3.1
|
|
1401
|
+
GL.glRotatef(flip * self.viewOri, 0.0, 0.0, -1.0)
|
|
1307
1402
|
|
|
1308
1403
|
# reset returned buffer for next frame
|
|
1309
1404
|
self._endOfFlip(clearBuffer)
|
|
1310
1405
|
|
|
1311
1406
|
# waitBlanking
|
|
1312
1407
|
if self.waitBlanking and flipThisFrame:
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1408
|
+
# DEPRECATED: these are all removed from OpenGL 3.1
|
|
1409
|
+
if self.USE_LEGACY_GL:
|
|
1410
|
+
GL.glBegin(GL.GL_POINTS)
|
|
1411
|
+
GL.glColor4f(0, 0, 0, 0)
|
|
1412
|
+
if sys.platform == 'win32' and self.glVendor.startswith('ati'):
|
|
1413
|
+
pass
|
|
1414
|
+
else:
|
|
1415
|
+
# this corrupts text rendering on win with some ATI cards :-(
|
|
1416
|
+
GL.glVertex2i(10, 10)
|
|
1417
|
+
pass
|
|
1418
|
+
GL.glEnd()
|
|
1321
1419
|
GL.glFinish()
|
|
1322
1420
|
|
|
1323
1421
|
# get timestamp
|
|
1324
1422
|
self._frameTime = now = logging.defaultClock.getTime()
|
|
1325
1423
|
self._frameTimes.append(self._frameTime)
|
|
1326
1424
|
|
|
1327
|
-
# run
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1425
|
+
# run scheduled functions immediately after flip completes
|
|
1426
|
+
n_items = len(self._toCall)
|
|
1427
|
+
for i in range(n_items):
|
|
1428
|
+
self._toCall[i]['function'](*self._toCall[i]['args'], **self._toCall[i]['kwargs'])
|
|
1429
|
+
# leave newly scheduled functions for next flip
|
|
1430
|
+
del self._toCall[:n_items]
|
|
1331
1431
|
|
|
1332
1432
|
# do bookkeeping
|
|
1333
1433
|
if self.recordFrameIntervals:
|
|
@@ -1753,22 +1853,24 @@ class Window():
|
|
|
1753
1853
|
def useLights(self, value):
|
|
1754
1854
|
self._useLights = value
|
|
1755
1855
|
|
|
1756
|
-
#
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1856
|
+
# DEPRECATED: this is not needed in modern OpenGL
|
|
1857
|
+
|
|
1858
|
+
# # Setup legacy lights, new spec shader programs should access the
|
|
1859
|
+
# # `lights` attribute directly to setup lighting uniforms.
|
|
1860
|
+
# if self._useLights and self._lights:
|
|
1861
|
+
# GL.glEnable(GL.GL_LIGHTING)
|
|
1862
|
+
# # make sure specular lights are computed relative to eye position,
|
|
1863
|
+
# # this is more realistic than the default. Does not affect shaders.
|
|
1864
|
+
# GL.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE)
|
|
1865
|
+
|
|
1866
|
+
# # update light positions for current model matrix
|
|
1867
|
+
# for index, light in enumerate(self._lights):
|
|
1868
|
+
# enumLight = GL.GL_LIGHT0 + index
|
|
1869
|
+
# pos = numpy.ctypeslib.as_ctypes(light.pos)
|
|
1870
|
+
# GL.glLightfv(enumLight, GL.GL_POSITION, pos)
|
|
1871
|
+
# else:
|
|
1872
|
+
# # disable lights
|
|
1873
|
+
# GL.glDisable(GL.GL_LIGHTING)
|
|
1772
1874
|
|
|
1773
1875
|
def updateLights(self, index=None):
|
|
1774
1876
|
"""Explicitly update scene lights if they were modified.
|
|
@@ -1999,6 +2101,16 @@ class Window():
|
|
|
1999
2101
|
def convergeOffset(self, value):
|
|
2000
2102
|
self._convergeOffset = value / 100.0
|
|
2001
2103
|
|
|
2104
|
+
def _clearDepthBuffer(self):
|
|
2105
|
+
"""Clear the depth buffer.
|
|
2106
|
+
"""
|
|
2107
|
+
oldDepthMask = self.depthMask
|
|
2108
|
+
GL.glDepthMask(GL.GL_TRUE)
|
|
2109
|
+
GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
|
|
2110
|
+
|
|
2111
|
+
if oldDepthMask is False: # return to old state if needed
|
|
2112
|
+
GL.glDepthMask(GL.GL_FALSE)
|
|
2113
|
+
|
|
2002
2114
|
def setOffAxisView(self, applyTransform=True, clearDepth=True):
|
|
2003
2115
|
"""Set an off-axis projection.
|
|
2004
2116
|
|
|
@@ -2155,6 +2267,35 @@ class Window():
|
|
|
2155
2267
|
if applyTransform:
|
|
2156
2268
|
self.applyEyeTransform(clearDepth=clearDepth)
|
|
2157
2269
|
|
|
2270
|
+
def setOrthographicView(self, applyTransform=True, clearDepth=True):
|
|
2271
|
+
"""Set the projection and view matrix to render with orthographic view.
|
|
2272
|
+
|
|
2273
|
+
Orthographic projection is used to render 3D objects without perspective
|
|
2274
|
+
distortion. The scene origin is centered on the screen plane. The
|
|
2275
|
+
frustum is defined by the size of the window in pixels, with the origin
|
|
2276
|
+
at the center of the window. 2D stimuli are typically drawn using this
|
|
2277
|
+
projection.
|
|
2278
|
+
|
|
2279
|
+
Note that the values of :py:attr:`~Window.projectionMatrix` and
|
|
2280
|
+
:py:attr:`~Window.viewMatrix` will be replaced when calling this
|
|
2281
|
+
function.
|
|
2282
|
+
|
|
2283
|
+
Parameters
|
|
2284
|
+
----------
|
|
2285
|
+
applyTransform : bool
|
|
2286
|
+
Apply transformations after computing them in immediate mode. Same
|
|
2287
|
+
as calling :py:attr:`~Window.applyEyeTransform()` afterwards if
|
|
2288
|
+
`False`.
|
|
2289
|
+
clearDepth : bool, optional
|
|
2290
|
+
Clear the depth buffer.
|
|
2291
|
+
|
|
2292
|
+
"""
|
|
2293
|
+
self._updateProjectionMatrix()
|
|
2294
|
+
self._updateViewMatrix()
|
|
2295
|
+
|
|
2296
|
+
if applyTransform:
|
|
2297
|
+
self.applyEyeTransform(clearDepth=clearDepth)
|
|
2298
|
+
|
|
2158
2299
|
def applyEyeTransform(self, clearDepth=True):
|
|
2159
2300
|
"""Apply the current view and projection matrices.
|
|
2160
2301
|
|
|
@@ -2164,7 +2305,8 @@ class Window():
|
|
|
2164
2305
|
:py:attr:`~Window.flip()` is called.
|
|
2165
2306
|
|
|
2166
2307
|
All transformations in ``GL_PROJECTION`` and ``GL_MODELVIEW`` matrix
|
|
2167
|
-
stacks will be cleared (set to identity) prior to applying.
|
|
2308
|
+
stacks will be cleared (set to identity) prior to applying. After this
|
|
2309
|
+
is called, the current matrix mode will be set to ``GL_MODELVIEW``.
|
|
2168
2310
|
|
|
2169
2311
|
Parameters
|
|
2170
2312
|
----------
|
|
@@ -2184,15 +2326,14 @@ class Window():
|
|
|
2184
2326
|
# draw 3D objects here ...
|
|
2185
2327
|
|
|
2186
2328
|
"""
|
|
2187
|
-
|
|
2188
|
-
|
|
2329
|
+
if self.USE_LEGACY_GL:
|
|
2330
|
+
# apply the projection and view transformations
|
|
2189
2331
|
GL.glMatrixMode(GL.GL_PROJECTION)
|
|
2190
2332
|
GL.glLoadIdentity()
|
|
2191
2333
|
projMat = self._projectionMatrix.ctypes.data_as(
|
|
2192
2334
|
ctypes.POINTER(ctypes.c_float))
|
|
2193
2335
|
GL.glMultTransposeMatrixf(projMat)
|
|
2194
2336
|
|
|
2195
|
-
if hasattr(self, '_viewMatrix'):
|
|
2196
2337
|
GL.glMatrixMode(GL.GL_MODELVIEW)
|
|
2197
2338
|
GL.glLoadIdentity()
|
|
2198
2339
|
viewMat = self._viewMatrix.ctypes.data_as(
|
|
@@ -2238,16 +2379,10 @@ class Window():
|
|
|
2238
2379
|
win.flip()
|
|
2239
2380
|
|
|
2240
2381
|
"""
|
|
2241
|
-
|
|
2242
|
-
# need to add the retina mode stuff eventually
|
|
2243
|
-
if hasattr(self, '_viewMatrix'):
|
|
2244
|
-
self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
|
|
2382
|
+
self.setOrthographicView(clearDepth)
|
|
2245
2383
|
|
|
2246
|
-
if
|
|
2247
|
-
self.
|
|
2248
|
-
-1, 1, -1, 1, -1, 1, dtype=numpy.float32)
|
|
2249
|
-
|
|
2250
|
-
self.applyEyeTransform(clearDepth)
|
|
2384
|
+
if self.USE_LEGACY_GL:
|
|
2385
|
+
self.applyEyeTransform(clearDepth)
|
|
2251
2386
|
|
|
2252
2387
|
def coordToRay(self, screenXY):
|
|
2253
2388
|
"""Convert a screen coordinate to a direction vector.
|
|
@@ -2431,12 +2566,12 @@ class Window():
|
|
|
2431
2566
|
"""
|
|
2432
2567
|
# do the reading of the pixels
|
|
2433
2568
|
if buffer == 'back' and self.useFBO:
|
|
2434
|
-
GL.glReadBuffer(GL.
|
|
2569
|
+
GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
2435
2570
|
elif buffer == 'back':
|
|
2436
2571
|
GL.glReadBuffer(GL.GL_BACK)
|
|
2437
2572
|
elif buffer == 'front':
|
|
2438
2573
|
if self.useFBO:
|
|
2439
|
-
GL.
|
|
2574
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
2440
2575
|
GL.glReadBuffer(GL.GL_FRONT)
|
|
2441
2576
|
else:
|
|
2442
2577
|
raise ValueError("Requested read from buffer '{}' but should be "
|
|
@@ -2463,7 +2598,7 @@ class Window():
|
|
|
2463
2598
|
|
|
2464
2599
|
# rebind front buffer if needed
|
|
2465
2600
|
if buffer == 'front' and self.useFBO:
|
|
2466
|
-
GL.
|
|
2601
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
2467
2602
|
|
|
2468
2603
|
# if we want the color data without an alpha channel, we need to
|
|
2469
2604
|
# convert the data to a numpy array and remove the alpha channel
|
|
@@ -2484,12 +2619,12 @@ class Window():
|
|
|
2484
2619
|
# GL.glLoadIdentity()
|
|
2485
2620
|
# do the reading of the pixels
|
|
2486
2621
|
if buffer == 'back' and self.useFBO:
|
|
2487
|
-
GL.glReadBuffer(GL.
|
|
2622
|
+
GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
|
|
2488
2623
|
elif buffer == 'back':
|
|
2489
2624
|
GL.glReadBuffer(GL.GL_BACK)
|
|
2490
2625
|
elif buffer == 'front':
|
|
2491
2626
|
if self.useFBO:
|
|
2492
|
-
GL.
|
|
2627
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
2493
2628
|
GL.glReadBuffer(GL.GL_FRONT)
|
|
2494
2629
|
else:
|
|
2495
2630
|
raise ValueError("Requested read from buffer '{}' but should be "
|
|
@@ -2523,7 +2658,7 @@ class Window():
|
|
|
2523
2658
|
im = im.convert('RGB')
|
|
2524
2659
|
|
|
2525
2660
|
if self.useFBO and buffer == 'front':
|
|
2526
|
-
GL.
|
|
2661
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
2527
2662
|
return im
|
|
2528
2663
|
|
|
2529
2664
|
@property
|
|
@@ -3141,8 +3276,10 @@ class Window():
|
|
|
3141
3276
|
thisScale = numpy.array([lw, lw] / self.size * retinaScale / 38.0)
|
|
3142
3277
|
# actually set the scale as appropriate
|
|
3143
3278
|
# allows undoing of a previous scaling procedure
|
|
3144
|
-
|
|
3145
|
-
|
|
3279
|
+
if self.USE_LEGACY_GL:
|
|
3280
|
+
thisScale = thisScale / numpy.asarray(prevScale)
|
|
3281
|
+
GL.glScalef(thisScale[0], thisScale[1], 1.0)
|
|
3282
|
+
|
|
3146
3283
|
return thisScale
|
|
3147
3284
|
|
|
3148
3285
|
def _checkMatchingSizes(self, requested, actual):
|
|
@@ -3167,21 +3304,23 @@ class Window():
|
|
|
3167
3304
|
(0, 0, self.frameBufferSize[0], self.frameBufferSize[1])
|
|
3168
3305
|
self.scissorTest = True
|
|
3169
3306
|
self.stencilTest = False
|
|
3307
|
+
self.depthTest = False
|
|
3170
3308
|
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3309
|
+
if self.USE_LEGACY_GL:
|
|
3310
|
+
GL.glMatrixMode(GL.GL_PROJECTION) # Reset the projection matrix
|
|
3311
|
+
GL.glLoadIdentity()
|
|
3312
|
+
GL.gluOrtho2D(-1, 1, -1, 1)
|
|
3174
3313
|
|
|
3175
|
-
|
|
3176
|
-
|
|
3314
|
+
GL.glMatrixMode(GL.GL_MODELVIEW) # Reset the modelview matrix
|
|
3315
|
+
GL.glLoadIdentity()
|
|
3177
3316
|
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3317
|
+
GL.glEnable(GL.GL_DEPTH_TEST) # Enables Depth Testing
|
|
3318
|
+
GL.glDepthFunc(GL.GL_LESS) # The Type Of Depth Test To Do
|
|
3319
|
+
|
|
3320
|
+
GL.glShadeModel(GL.GL_SMOOTH) # Color Shading (FLAT or SMOOTH)
|
|
3321
|
+
GL.glEnable(GL.GL_POINT_SMOOTH) # Enable Point Smoothing
|
|
3182
3322
|
|
|
3183
|
-
GL.
|
|
3184
|
-
GL.glEnable(GL.GL_POINT_SMOOTH)
|
|
3323
|
+
GL.glEnable(GL.GL_BLEND)
|
|
3185
3324
|
|
|
3186
3325
|
# check for GL_ARB_texture_float
|
|
3187
3326
|
# (which is needed for shaders to be useful)
|
|
@@ -3212,8 +3351,13 @@ class Window():
|
|
|
3212
3351
|
self.blendMode = 'avg'
|
|
3213
3352
|
|
|
3214
3353
|
def _setupShaders(self):
|
|
3215
|
-
self.
|
|
3216
|
-
|
|
3354
|
+
if self.USE_LEGACY_GL:
|
|
3355
|
+
self._progSignedTexFont = _shaders.compileProgram(
|
|
3356
|
+
_shaders.vertSimple, _shaders.fragSignedColorTexFont)
|
|
3357
|
+
else:
|
|
3358
|
+
self._progSignedTexFont = _shaders.compileProgram(
|
|
3359
|
+
_shaders.vertSimpleText, _shaders.fragSignedColorTexFont)
|
|
3360
|
+
|
|
3217
3361
|
self._progFBOtoFrame = _shaders.compileProgram(
|
|
3218
3362
|
_shaders.vertSimple, _shaders.fragFBOtoFrame)
|
|
3219
3363
|
self._shaders = {}
|
|
@@ -3237,102 +3381,124 @@ class Window():
|
|
|
3237
3381
|
_shaders.vertSimple, _shaders.fragImageStim)
|
|
3238
3382
|
self._shaders['imageStim_adding'] = _shaders.compileProgram(
|
|
3239
3383
|
_shaders.vertSimple, _shaders.fragImageStim_adding)
|
|
3240
|
-
self._shaders['stim3d_phong'] = {}
|
|
3241
|
-
|
|
3242
|
-
# Create shader flags, these are used as keys to pick the appropriate
|
|
3243
|
-
# shader for the given material and lighting configuration.
|
|
3244
|
-
shaderFlags = []
|
|
3245
|
-
for i in range(0, 8 + 1):
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
# Compile shaders based on generated flags.
|
|
3250
|
-
for flag in shaderFlags:
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3384
|
+
# self._shaders['stim3d_phong'] = {}
|
|
3385
|
+
|
|
3386
|
+
# # Create shader flags, these are used as keys to pick the appropriate
|
|
3387
|
+
# # shader for the given material and lighting configuration.
|
|
3388
|
+
# shaderFlags = []
|
|
3389
|
+
# for i in range(0, 8 + 1):
|
|
3390
|
+
# for j in product((True, False), repeat=1):
|
|
3391
|
+
# shaderFlags.append((i, j[0]))
|
|
3392
|
+
|
|
3393
|
+
# # Compile shaders based on generated flags.
|
|
3394
|
+
# for flag in shaderFlags:
|
|
3395
|
+
# # Define GLSL preprocessor values to enable code paths for specific
|
|
3396
|
+
# # material properties.
|
|
3397
|
+
# srcDefs = {'MAX_LIGHTS': flag[0]}
|
|
3398
|
+
|
|
3399
|
+
# if flag[1]: # has diffuse texture map
|
|
3400
|
+
# srcDefs['DIFFUSE_TEXTURE'] = 1
|
|
3401
|
+
|
|
3402
|
+
# # embed #DEFINE statements in GLSL source code
|
|
3403
|
+
# vertSrc = gltools.embedShaderSourceDefs(
|
|
3404
|
+
# _shaders.vertPhongLighting, srcDefs)
|
|
3405
|
+
# fragSrc = gltools.embedShaderSourceDefs(
|
|
3406
|
+
# _shaders.fragPhongLighting, srcDefs)
|
|
3407
|
+
|
|
3408
|
+
# # build a shader program
|
|
3409
|
+
# prog = gltools.createProgram()
|
|
3410
|
+
# vertexShader = gltools.compileShader(
|
|
3411
|
+
# vertSrc, GL.GL_VERTEX_SHADER)
|
|
3412
|
+
# fragmentShader = gltools.compileShader(
|
|
3413
|
+
# fragSrc, GL.GL_FRAGMENT_SHADER)
|
|
3414
|
+
|
|
3415
|
+
# gltools.attachShader(prog, vertexShader)
|
|
3416
|
+
# gltools.attachShader(prog, fragmentShader)
|
|
3417
|
+
# gltools.linkProgram(prog)
|
|
3418
|
+
# gltools.detachShader(prog, vertexShader)
|
|
3419
|
+
# gltools.detachShader(prog, fragmentShader)
|
|
3420
|
+
# gltools.deleteShader(vertexShader)
|
|
3421
|
+
# gltools.deleteShader(fragmentShader)
|
|
3422
|
+
|
|
3423
|
+
# # set the flag
|
|
3424
|
+
# self._shaders['stim3d_phong'][flag] = prog
|
|
3281
3425
|
|
|
3282
3426
|
def _setupFrameBuffer(self):
|
|
3427
|
+
"""Setup the framebuffer object for this window.
|
|
3428
|
+
|
|
3429
|
+
Returns
|
|
3430
|
+
-------
|
|
3431
|
+
bool
|
|
3432
|
+
`True` if the framebuffer was successfully setup, `False` otherwise.
|
|
3433
|
+
If `False`, the framebuffer was not complete. Make sure that your
|
|
3434
|
+
driver supports the necessary formats.
|
|
3283
3435
|
|
|
3436
|
+
"""
|
|
3284
3437
|
# Setup framebuffer
|
|
3285
3438
|
self.frameBuffer = GL.GLuint()
|
|
3286
|
-
GL.
|
|
3287
|
-
GL.
|
|
3439
|
+
GL.glGenFramebuffers(1, ctypes.byref(self.frameBuffer))
|
|
3440
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
|
|
3288
3441
|
|
|
3289
3442
|
# Create texture to render to
|
|
3290
3443
|
self.frameTexture = GL.GLuint()
|
|
3291
3444
|
GL.glGenTextures(1, ctypes.byref(self.frameTexture))
|
|
3292
3445
|
GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture)
|
|
3293
|
-
GL.glTexParameteri(
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3446
|
+
GL.glTexParameteri(
|
|
3447
|
+
GL.GL_TEXTURE_2D,
|
|
3448
|
+
GL.GL_TEXTURE_MAG_FILTER,
|
|
3449
|
+
GL.GL_LINEAR)
|
|
3450
|
+
GL.glTexParameteri(
|
|
3451
|
+
GL.GL_TEXTURE_2D,
|
|
3452
|
+
GL.GL_TEXTURE_MIN_FILTER,
|
|
3453
|
+
GL.GL_LINEAR)
|
|
3454
|
+
GL.glTexImage2D(
|
|
3455
|
+
GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F,
|
|
3456
|
+
int(self.size[0]), int(self.size[1]), 0,
|
|
3457
|
+
GL.GL_RGBA, GL.GL_FLOAT, None)
|
|
3302
3458
|
# attach texture to the frame buffer
|
|
3303
|
-
GL.
|
|
3304
|
-
|
|
3305
|
-
|
|
3459
|
+
GL.glFramebufferTexture2D(
|
|
3460
|
+
GL.GL_FRAMEBUFFER,
|
|
3461
|
+
GL.GL_COLOR_ATTACHMENT0,
|
|
3462
|
+
GL.GL_TEXTURE_2D,
|
|
3463
|
+
self.frameTexture, 0)
|
|
3306
3464
|
|
|
3307
3465
|
# add a stencil buffer
|
|
3308
3466
|
self._stencilTexture = GL.GLuint()
|
|
3309
|
-
GL.
|
|
3467
|
+
GL.glGenRenderbuffers(1, ctypes.byref(
|
|
3310
3468
|
self._stencilTexture)) # like glGenTextures
|
|
3311
|
-
GL.
|
|
3312
|
-
GL.
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3469
|
+
GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self._stencilTexture)
|
|
3470
|
+
GL.glRenderbufferStorage(
|
|
3471
|
+
GL.GL_RENDERBUFFER,
|
|
3472
|
+
GL.GL_DEPTH24_STENCIL8,
|
|
3473
|
+
int(self.size[0]), int(self.size[1]))
|
|
3474
|
+
GL.glFramebufferRenderbuffer(
|
|
3475
|
+
GL.GL_FRAMEBUFFER,
|
|
3476
|
+
GL.GL_DEPTH_ATTACHMENT,
|
|
3477
|
+
GL.GL_RENDERBUFFER,
|
|
3478
|
+
self._stencilTexture)
|
|
3479
|
+
GL.glFramebufferRenderbuffer(
|
|
3480
|
+
GL.GL_FRAMEBUFFER,
|
|
3481
|
+
GL.GL_STENCIL_ATTACHMENT,
|
|
3482
|
+
GL.GL_RENDERBUFFER,
|
|
3483
|
+
self._stencilTexture)
|
|
3484
|
+
|
|
3485
|
+
# check the framebuffer status
|
|
3486
|
+
status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
|
|
3487
|
+
if status != GL.GL_FRAMEBUFFER_COMPLETE:
|
|
3326
3488
|
logging.error("Error in framebuffer activation")
|
|
3327
3489
|
# UNBIND THE FRAME BUFFER OBJECT THAT WE HAD CREATED
|
|
3328
|
-
GL.
|
|
3490
|
+
GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
|
|
3491
|
+
|
|
3329
3492
|
return False
|
|
3493
|
+
|
|
3330
3494
|
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
3495
|
+
|
|
3331
3496
|
# clear the buffers (otherwise the texture memory can contain
|
|
3332
3497
|
# junk from other app)
|
|
3333
3498
|
GL.glClear(GL.GL_COLOR_BUFFER_BIT)
|
|
3334
3499
|
GL.glClear(GL.GL_STENCIL_BUFFER_BIT)
|
|
3335
3500
|
GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
|
|
3501
|
+
|
|
3336
3502
|
return True
|
|
3337
3503
|
|
|
3338
3504
|
@property
|
|
@@ -3656,22 +3822,29 @@ class Window():
|
|
|
3656
3822
|
|
|
3657
3823
|
(in this case a copy operation without any warping)
|
|
3658
3824
|
"""
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3825
|
+
if self.USE_LEGACY_GL:
|
|
3826
|
+
GL.glBegin(GL.GL_QUADS)
|
|
3827
|
+
GL.glTexCoord2f(0.0, 0.0)
|
|
3828
|
+
GL.glVertex2f(-1.0, -1.0)
|
|
3829
|
+
GL.glTexCoord2f(0.0, 1.0)
|
|
3830
|
+
GL.glVertex2f(-1.0, 1.0)
|
|
3831
|
+
GL.glTexCoord2f(1.0, 1.0)
|
|
3832
|
+
GL.glVertex2f(1.0, 1.0)
|
|
3833
|
+
GL.glTexCoord2f(1.0, 0.0)
|
|
3834
|
+
GL.glVertex2f(1.0, -1.0)
|
|
3835
|
+
GL.glEnd()
|
|
3836
|
+
else:
|
|
3837
|
+
gltools.setUniformSampler2D(self._progFBOtoFrame, b'texture', 0)
|
|
3838
|
+
gltools.drawClientArrays({
|
|
3839
|
+
'gl_Vertex': self._fboVerts,
|
|
3840
|
+
'gl_MultiTexCoord0': self._fboTexCoords},
|
|
3841
|
+
'GL_QUADS')
|
|
3669
3842
|
|
|
3670
3843
|
def _prepareFBOrender(self):
|
|
3671
|
-
|
|
3844
|
+
gltools.useProgram(self._progFBOtoFrame)
|
|
3672
3845
|
|
|
3673
3846
|
def _finishFBOrender(self):
|
|
3674
|
-
|
|
3847
|
+
gltools.useProgram(None)
|
|
3675
3848
|
|
|
3676
3849
|
def _afterFBOrender(self):
|
|
3677
3850
|
pass
|