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/shaders.py
CHANGED
|
@@ -2,16 +2,20 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""shaders programs for either pyglet or pygame
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import pyglet
|
|
11
12
|
import pyglet.gl as GL
|
|
12
13
|
import psychopy.tools.gltools as gltools
|
|
13
14
|
from ctypes import c_int, c_char_p, c_char, cast, POINTER, byref
|
|
14
15
|
|
|
16
|
+
# for backwards compatibilit with older pyglet and GL versions
|
|
17
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
18
|
+
|
|
15
19
|
|
|
16
20
|
class Shader:
|
|
17
21
|
def __init__(self, vertexSource=None, fragmentSource=None):
|
|
@@ -19,17 +23,18 @@ class Shader:
|
|
|
19
23
|
def compileShader(source, shaderType):
|
|
20
24
|
"""Compile shader source of given type (only needed by compileProgram)
|
|
21
25
|
"""
|
|
22
|
-
shader = GL.
|
|
26
|
+
shader = GL.glCreateShader(shaderType)
|
|
23
27
|
# if Py3 then we need to convert our (unicode) str into bytes for C
|
|
24
28
|
if type(source) != bytes:
|
|
25
29
|
source = source.encode()
|
|
26
30
|
prog = c_char_p(source)
|
|
27
31
|
length = c_int(-1)
|
|
28
|
-
GL.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
GL.glShaderSource(
|
|
33
|
+
shader,
|
|
34
|
+
1,
|
|
35
|
+
cast(byref(prog), POINTER(POINTER(c_char))),
|
|
36
|
+
byref(length))
|
|
37
|
+
GL.glCompileShader(shader)
|
|
33
38
|
|
|
34
39
|
# check for errors
|
|
35
40
|
status = c_int()
|
|
@@ -39,26 +44,26 @@ class Shader:
|
|
|
39
44
|
raise ValueError('Shader compilation failed')
|
|
40
45
|
return shader
|
|
41
46
|
|
|
42
|
-
self.handle = GL.
|
|
47
|
+
self.handle = GL.glCreateProgram()
|
|
43
48
|
|
|
44
49
|
if vertexSource:
|
|
45
50
|
vertexShader = compileShader(
|
|
46
|
-
vertexSource, GL.
|
|
51
|
+
vertexSource, GL.GL_VERTEX_SHADER
|
|
47
52
|
)
|
|
48
|
-
GL.
|
|
53
|
+
GL.glAttachShader(self.handle, vertexShader)
|
|
49
54
|
if fragmentSource:
|
|
50
55
|
fragmentShader = compileShader(
|
|
51
|
-
fragmentSource, GL.
|
|
56
|
+
fragmentSource, GL.GL_FRAGMENT_SHADER
|
|
52
57
|
)
|
|
53
|
-
GL.
|
|
58
|
+
GL.glAttachShader(self.handle, fragmentShader)
|
|
54
59
|
|
|
55
|
-
GL.
|
|
56
|
-
GL.
|
|
60
|
+
GL.glValidateProgram(self.handle)
|
|
61
|
+
GL.glLinkProgram(self.handle)
|
|
57
62
|
|
|
58
63
|
if vertexShader:
|
|
59
|
-
GL.
|
|
64
|
+
GL.glDeleteShader(vertexShader)
|
|
60
65
|
if fragmentShader:
|
|
61
|
-
GL.
|
|
66
|
+
GL.glDeleteShader(fragmentShader)
|
|
62
67
|
|
|
63
68
|
def bind(self):
|
|
64
69
|
GL.glUseProgram(self.handle)
|
|
@@ -117,27 +122,27 @@ def compileProgram(vertexSource=None, fragmentSource=None):
|
|
|
117
122
|
Program object handle.
|
|
118
123
|
|
|
119
124
|
"""
|
|
120
|
-
program = gltools.
|
|
125
|
+
program = gltools.createProgram()
|
|
121
126
|
|
|
122
127
|
vertexShader = fragmentShader = None
|
|
123
128
|
if vertexSource:
|
|
124
|
-
vertexShader = gltools.
|
|
125
|
-
vertexSource, GL.
|
|
126
|
-
gltools.
|
|
129
|
+
vertexShader = gltools.compileShader(
|
|
130
|
+
vertexSource, GL.GL_VERTEX_SHADER)
|
|
131
|
+
gltools.attachShader(program, vertexShader)
|
|
127
132
|
if fragmentSource:
|
|
128
|
-
fragmentShader = gltools.
|
|
129
|
-
fragmentSource, GL.
|
|
130
|
-
gltools.
|
|
133
|
+
fragmentShader = gltools.compileShader(
|
|
134
|
+
fragmentSource, GL.GL_FRAGMENT_SHADER)
|
|
135
|
+
gltools.attachShader(program, fragmentShader)
|
|
131
136
|
|
|
132
|
-
gltools.
|
|
137
|
+
gltools.linkProgram(program)
|
|
133
138
|
# gltools.validateProgramARB(program)
|
|
134
139
|
|
|
135
140
|
if vertexShader:
|
|
136
|
-
gltools.
|
|
137
|
-
gltools.
|
|
141
|
+
gltools.detachShader(program, vertexShader)
|
|
142
|
+
gltools.deleteObject(vertexShader)
|
|
138
143
|
if fragmentShader:
|
|
139
|
-
gltools.
|
|
140
|
-
gltools.
|
|
144
|
+
gltools.detachShader(program, fragmentShader)
|
|
145
|
+
gltools.deleteObject(fragmentShader)
|
|
141
146
|
|
|
142
147
|
return program
|
|
143
148
|
|
|
@@ -148,7 +153,7 @@ during frag shader. Otherwise we need to convert to 0:1. This means that
|
|
|
148
153
|
some shaders differ for FBO use if they're performing any signed math.
|
|
149
154
|
"""
|
|
150
155
|
|
|
151
|
-
fragFBOtoFrame =
|
|
156
|
+
fragFBOtoFrame = """
|
|
152
157
|
uniform sampler2D texture;
|
|
153
158
|
|
|
154
159
|
float rand(vec2 seed){
|
|
@@ -167,287 +172,616 @@ fragFBOtoFrame = '''
|
|
|
167
172
|
gl_FragColor.rgb = vec3 (0, 0, rand(gl_TexCoord[0].st));
|
|
168
173
|
}
|
|
169
174
|
}
|
|
170
|
-
|
|
175
|
+
"""
|
|
171
176
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
fragSignedColor_adding = '''
|
|
180
|
-
void main() {
|
|
181
|
-
gl_FragColor.rgb = (gl_Color.rgb*2.0-1.0)/2.0;
|
|
182
|
-
gl_FragColor.a = gl_Color.a;
|
|
183
|
-
}
|
|
184
|
-
'''
|
|
185
|
-
# for stimuli with just a colored texture
|
|
186
|
-
fragSignedColorTex = '''
|
|
187
|
-
uniform sampler2D texture;
|
|
188
|
-
void main() {
|
|
189
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
190
|
-
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
191
|
-
gl_FragColor.a = gl_Color.a*textureFrag.a;
|
|
192
|
-
}
|
|
193
|
-
'''
|
|
194
|
-
fragSignedColorTex_adding = '''
|
|
195
|
-
uniform sampler2D texture;
|
|
196
|
-
void main() {
|
|
197
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
198
|
-
gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
|
|
199
|
-
gl_FragColor.a = gl_Color.a * textureFrag.a;
|
|
200
|
-
}
|
|
201
|
-
'''
|
|
202
|
-
# the shader for pyglet fonts doesn't use multitextures - just one texture
|
|
203
|
-
fragSignedColorTexFont = '''
|
|
204
|
-
uniform sampler2D texture;
|
|
205
|
-
uniform vec3 rgb;
|
|
206
|
-
void main() {
|
|
207
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
208
|
-
gl_FragColor.rgb=rgb;
|
|
209
|
-
gl_FragColor.a = gl_Color.a*textureFrag.a;
|
|
210
|
-
}
|
|
211
|
-
'''
|
|
212
|
-
# for stimuli with a colored texture and a mask (gratings, etc.)
|
|
213
|
-
fragSignedColorTexMask = '''
|
|
214
|
-
uniform sampler2D texture, mask;
|
|
215
|
-
void main() {
|
|
216
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
217
|
-
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
218
|
-
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
219
|
-
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
220
|
-
}
|
|
221
|
-
'''
|
|
222
|
-
fragSignedColorTexMask_adding = '''
|
|
223
|
-
uniform sampler2D texture, mask;
|
|
224
|
-
void main() {
|
|
225
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
226
|
-
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
227
|
-
gl_FragColor.a = gl_Color.a * maskFrag.a * textureFrag.a;
|
|
228
|
-
gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
|
|
229
|
-
}
|
|
230
|
-
'''
|
|
231
|
-
# RadialStim uses a 1D mask with a 2D texture
|
|
232
|
-
fragSignedColorTexMask1D = '''
|
|
233
|
-
uniform sampler2D texture;
|
|
234
|
-
uniform sampler1D mask;
|
|
235
|
-
void main() {
|
|
236
|
-
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
237
|
-
vec4 maskFrag = texture1D(mask,gl_TexCoord[1].s);
|
|
238
|
-
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
239
|
-
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
240
|
-
}
|
|
177
|
+
if USE_LEGACY_GL:
|
|
178
|
+
# for stimuli with no texture (e.g. shapes)
|
|
179
|
+
fragSignedColor = '''
|
|
180
|
+
void main() {
|
|
181
|
+
gl_FragColor.rgb = ((gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
182
|
+
gl_FragColor.a = gl_Color.a;
|
|
183
|
+
}
|
|
241
184
|
'''
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
185
|
+
fragSignedColor_adding = '''
|
|
186
|
+
void main() {
|
|
187
|
+
gl_FragColor.rgb = (gl_Color.rgb*2.0-1.0)/2.0;
|
|
188
|
+
gl_FragColor.a = gl_Color.a;
|
|
189
|
+
}
|
|
190
|
+
'''
|
|
191
|
+
# for stimuli with just a colored texture
|
|
192
|
+
fragSignedColorTex = '''
|
|
193
|
+
uniform sampler2D texture;
|
|
194
|
+
void main() {
|
|
195
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
196
|
+
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
197
|
+
gl_FragColor.a = gl_Color.a*textureFrag.a;
|
|
198
|
+
}
|
|
199
|
+
'''
|
|
200
|
+
fragSignedColorTex_adding = '''
|
|
201
|
+
uniform sampler2D texture;
|
|
202
|
+
void main() {
|
|
203
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
204
|
+
gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
|
|
205
|
+
gl_FragColor.a = gl_Color.a * textureFrag.a;
|
|
206
|
+
}
|
|
207
|
+
'''
|
|
208
|
+
# the shader for pyglet fonts doesn't use multitextures - just one texture
|
|
209
|
+
fragSignedColorTexFont = '''
|
|
210
|
+
uniform sampler2D texture;
|
|
211
|
+
uniform vec3 rgb;
|
|
212
|
+
void main() {
|
|
213
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
214
|
+
gl_FragColor.rgb=rgb;
|
|
215
|
+
gl_FragColor.a = gl_Color.a*textureFrag.a;
|
|
216
|
+
}
|
|
217
|
+
'''
|
|
218
|
+
# for stimuli with a colored texture and a mask (gratings, etc.)
|
|
219
|
+
fragSignedColorTexMask = '''
|
|
220
|
+
uniform sampler2D texture, mask;
|
|
221
|
+
void main() {
|
|
222
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
223
|
+
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
224
|
+
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
225
|
+
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
226
|
+
}
|
|
227
|
+
'''
|
|
228
|
+
fragSignedColorTexMask_adding = '''
|
|
229
|
+
uniform sampler2D texture, mask;
|
|
230
|
+
void main() {
|
|
231
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
232
|
+
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
233
|
+
gl_FragColor.a = gl_Color.a * maskFrag.a * textureFrag.a;
|
|
234
|
+
gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
|
|
235
|
+
}
|
|
236
|
+
'''
|
|
237
|
+
# RadialStim uses a 1D mask with a 2D texture
|
|
238
|
+
fragSignedColorTexMask1D = '''
|
|
239
|
+
uniform sampler2D texture;
|
|
240
|
+
uniform sampler1D mask;
|
|
241
|
+
void main() {
|
|
242
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
243
|
+
vec4 maskFrag = texture1D(mask,gl_TexCoord[1].s);
|
|
244
|
+
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
245
|
+
gl_FragColor.rgb = (textureFrag.rgb* (gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
246
|
+
}
|
|
247
|
+
'''
|
|
248
|
+
fragSignedColorTexMask1D_adding = '''
|
|
249
|
+
uniform sampler2D texture;
|
|
250
|
+
uniform sampler1D mask;
|
|
251
|
+
void main() {
|
|
252
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
253
|
+
vec4 maskFrag = texture1D(mask,gl_TexCoord[1].s);
|
|
254
|
+
gl_FragColor.a = gl_Color.a * maskFrag.a*textureFrag.a;
|
|
255
|
+
gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
|
|
256
|
+
}
|
|
257
|
+
'''
|
|
258
|
+
# imageStim is providing its texture unsigned
|
|
259
|
+
fragImageStim = '''
|
|
260
|
+
uniform sampler2D texture;
|
|
261
|
+
uniform sampler2D mask;
|
|
262
|
+
void main() {
|
|
263
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
264
|
+
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
265
|
+
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
266
|
+
gl_FragColor.rgb = ((textureFrag.rgb*2.0-1.0)*(gl_Color.rgb*2.0-1.0)+1.0)/2.0;
|
|
267
|
+
}
|
|
268
|
+
'''
|
|
269
|
+
# imageStim is providing its texture unsigned
|
|
270
|
+
fragImageStim_adding = '''
|
|
271
|
+
uniform sampler2D texture;
|
|
272
|
+
uniform sampler2D mask;
|
|
273
|
+
void main() {
|
|
274
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
275
|
+
vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
|
|
276
|
+
gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
|
|
277
|
+
gl_FragColor.rgb = (textureFrag.rgb*2.0-1.0)*(gl_Color.rgb*2.0-1.0)/2.0;
|
|
278
|
+
}
|
|
279
|
+
'''
|
|
280
|
+
# in every case our vertex shader is simple (we don't transform coords)
|
|
281
|
+
vertSimple = """
|
|
282
|
+
void main() {
|
|
283
|
+
gl_FrontColor = gl_Color;
|
|
284
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
285
|
+
gl_TexCoord[1] = gl_MultiTexCoord1;
|
|
286
|
+
gl_TexCoord[2] = gl_MultiTexCoord2;
|
|
287
|
+
gl_Position = ftransform();
|
|
288
|
+
}
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
vertPhongLighting = """
|
|
292
|
+
// Vertex shader for the Phong Shading Model
|
|
293
|
+
//
|
|
294
|
+
// This code is based of the tutorial here:
|
|
295
|
+
// https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
|
|
296
|
+
//
|
|
297
|
+
// Only supports directional and point light sources for now. Spotlights will be
|
|
298
|
+
// added later on.
|
|
299
|
+
//
|
|
300
|
+
#version 110
|
|
301
|
+
varying vec3 N;
|
|
302
|
+
varying vec3 v;
|
|
303
|
+
varying vec4 frontColor;
|
|
304
|
+
|
|
305
|
+
void main(void)
|
|
306
|
+
{
|
|
307
|
+
v = vec3(gl_ModelViewMatrix * gl_Vertex);
|
|
308
|
+
N = normalize(gl_NormalMatrix * gl_Normal);
|
|
309
|
+
|
|
310
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
311
|
+
gl_TexCoord[1] = gl_MultiTexCoord1;
|
|
312
|
+
gl_Position = ftransform();
|
|
313
|
+
frontColor = gl_Color;
|
|
250
314
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
315
|
+
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
fragPhongLighting = """
|
|
319
|
+
// Fragment shader for the Phong Shading Model
|
|
320
|
+
//
|
|
321
|
+
// This code is based of the tutorial here:
|
|
322
|
+
// https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
|
|
323
|
+
//
|
|
324
|
+
// Use `embedShaderSourceDefs` from gltools to enable the code path for diffuse
|
|
325
|
+
// texture maps by setting DIFFUSE to 1. The number of lights can be specified
|
|
326
|
+
// by setting MAX_LIGHTS, by default, the maximum should be 8. However, build
|
|
327
|
+
// your shader for the exact number of lights required.
|
|
328
|
+
//
|
|
329
|
+
// Only supports directional and point light sources for now. Spotlights will be
|
|
330
|
+
// added later on.
|
|
331
|
+
//
|
|
332
|
+
#version 110
|
|
333
|
+
varying vec3 N;
|
|
334
|
+
varying vec3 v;
|
|
335
|
+
varying vec4 frontColor;
|
|
336
|
+
|
|
337
|
+
#ifdef DIFFUSE_TEXTURE
|
|
338
|
+
uniform sampler2D diffTexture;
|
|
339
|
+
#endif
|
|
340
|
+
|
|
341
|
+
// Calculate lighting attenuation using the same formula OpenGL uses
|
|
342
|
+
float calcAttenuation(float kConst, float kLinear, float kQuad, float dist) {
|
|
343
|
+
return 1.0 / (kConst + kLinear * dist + kQuad * dist * dist);
|
|
261
344
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
345
|
+
|
|
346
|
+
void main (void)
|
|
347
|
+
{
|
|
348
|
+
#ifdef DIFFUSE_TEXTURE
|
|
349
|
+
vec4 diffTexColor = texture2D(diffTexture, gl_TexCoord[0].st);
|
|
350
|
+
#endif
|
|
351
|
+
|
|
352
|
+
#if MAX_LIGHTS > 0
|
|
353
|
+
vec3 N = normalize(N);
|
|
354
|
+
vec4 finalColor = vec4(0.0);
|
|
355
|
+
// loop over available lights
|
|
356
|
+
for (int i=0; i < MAX_LIGHTS; i++)
|
|
357
|
+
{
|
|
358
|
+
vec3 L;
|
|
359
|
+
float attenuation = 1.0; // default factor, no attenuation
|
|
360
|
+
|
|
361
|
+
// check if directional, compute attenuation if a point source
|
|
362
|
+
if (gl_LightSource[i].position.w == 0.0)
|
|
363
|
+
{
|
|
364
|
+
// off at infinity, only use direction
|
|
365
|
+
L = normalize(gl_LightSource[i].position.xyz);
|
|
366
|
+
// attenuation is 1.0 (no attenuation for directional sources)
|
|
367
|
+
}
|
|
368
|
+
else
|
|
369
|
+
{
|
|
370
|
+
L = normalize(gl_LightSource[i].position.xyz - v);
|
|
371
|
+
attenuation = calcAttenuation(
|
|
372
|
+
gl_LightSource[i].constantAttenuation,
|
|
373
|
+
gl_LightSource[i].linearAttenuation,
|
|
374
|
+
gl_LightSource[i].quadraticAttenuation,
|
|
375
|
+
length(gl_LightSource[i].position.xyz - v));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
vec3 E = normalize(-v);
|
|
379
|
+
vec3 R = normalize(-reflect(L, N));
|
|
380
|
+
|
|
381
|
+
// combine scene ambient with object
|
|
382
|
+
vec4 ambient = gl_FrontMaterial.diffuse *
|
|
383
|
+
(gl_FrontLightProduct[i].ambient + gl_LightModel.ambient);
|
|
384
|
+
|
|
385
|
+
// calculate diffuse component
|
|
386
|
+
vec4 diffuse = gl_FrontLightProduct[i].diffuse * max(dot(N, L), 0.0);
|
|
387
|
+
#ifdef DIFFUSE_TEXTURE
|
|
388
|
+
// multiply in material texture colors if specified
|
|
389
|
+
diffuse *= diffTexColor;
|
|
390
|
+
ambient *= diffTexColor; // ambient should be modulated by diffuse color
|
|
391
|
+
#endif
|
|
392
|
+
vec3 halfwayVec = normalize(L + E);
|
|
393
|
+
vec4 specular = gl_FrontLightProduct[i].specular *
|
|
394
|
+
pow(max(dot(N, halfwayVec), 0.0), gl_FrontMaterial.shininess);
|
|
395
|
+
|
|
396
|
+
// clamp color values for specular and diffuse
|
|
397
|
+
ambient = clamp(ambient, 0.0, 1.0);
|
|
398
|
+
diffuse = clamp(diffuse, 0.0, 1.0);
|
|
399
|
+
specular = clamp(specular, 0.0, 1.0);
|
|
400
|
+
|
|
401
|
+
// falloff with distance from eye? might be something to consider for
|
|
402
|
+
// realism
|
|
403
|
+
vec4 emission = clamp(gl_FrontMaterial.emission, 0.0, 1.0);
|
|
404
|
+
|
|
405
|
+
finalColor += (ambient + emission) + attenuation * (diffuse + specular);
|
|
406
|
+
}
|
|
407
|
+
gl_FragColor = finalColor; // use texture alpha
|
|
408
|
+
#else
|
|
409
|
+
// no lights, only track ambient and emission component
|
|
410
|
+
vec4 emission = clamp(gl_FrontMaterial.emission, 0.0, 1.0);
|
|
411
|
+
vec4 ambient = gl_FrontLightProduct[0].ambient * gl_LightModel.ambient;
|
|
412
|
+
ambient = clamp(ambient, 0.0, 1.0);
|
|
413
|
+
#ifdef DIFFUSE_TEXTURE
|
|
414
|
+
gl_FragColor = (ambient + emission) * texture2D(diffTexture, gl_TexCoord[0].st);
|
|
415
|
+
#else
|
|
416
|
+
gl_FragColor = ambient + emission;
|
|
417
|
+
#endif
|
|
418
|
+
#endif
|
|
272
419
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
420
|
+
"""
|
|
421
|
+
|
|
422
|
+
vertSkyBox = """
|
|
423
|
+
varying vec3 texCoord;
|
|
424
|
+
void main(void)
|
|
425
|
+
{
|
|
426
|
+
texCoord = gl_Vertex;
|
|
427
|
+
gl_Position = ftransform().xyww;
|
|
428
|
+
}
|
|
429
|
+
"""
|
|
430
|
+
|
|
431
|
+
fragSkyBox = """
|
|
432
|
+
varying vec3 texCoord;
|
|
433
|
+
uniform samplerCube SkyTexture;
|
|
434
|
+
void main (void)
|
|
435
|
+
{
|
|
436
|
+
gl_FragColor = texture(SkyTexture, texCoord);
|
|
282
437
|
}
|
|
283
438
|
"""
|
|
284
439
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
{
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
440
|
+
fragTextBox2 = '''
|
|
441
|
+
uniform sampler2D texture;
|
|
442
|
+
void main() {
|
|
443
|
+
vec2 uv = gl_TexCoord[0].xy;
|
|
444
|
+
vec4 current = texture2D(texture, uv);
|
|
445
|
+
|
|
446
|
+
float r = current.r;
|
|
447
|
+
float g = current.g;
|
|
448
|
+
float b = current.b;
|
|
449
|
+
float a = current.a;
|
|
450
|
+
gl_FragColor = vec4( gl_Color.rgb, (r+g+b)/2.);
|
|
451
|
+
}
|
|
452
|
+
'''
|
|
453
|
+
fragTextBox2alpha = '''
|
|
454
|
+
uniform sampler2D texture;
|
|
455
|
+
void main() {
|
|
456
|
+
vec4 current = texture2D(texture,gl_TexCoord[0].st);
|
|
457
|
+
gl_FragColor = vec4( gl_Color.rgb, current.a);
|
|
458
|
+
}
|
|
459
|
+
'''
|
|
460
|
+
else:
|
|
461
|
+
# for stimuli with no texture (e.g. shapes)
|
|
462
|
+
fragSignedColor = """
|
|
463
|
+
uniform vec4 uColor;
|
|
464
|
+
void main() {
|
|
465
|
+
gl_FragColor.rgb = ((uColor.rgb * 2.0 - 1.0) + 1.0) / 2.0;
|
|
466
|
+
gl_FragColor.a = uColor.a;
|
|
467
|
+
}
|
|
468
|
+
"""
|
|
469
|
+
fragSignedColor_adding = """
|
|
470
|
+
uniform vec4 uColor;
|
|
471
|
+
void main() {
|
|
472
|
+
gl_FragColor.rgb = (uColor.rgb * 2.0 - 1.0) / 2.0;
|
|
473
|
+
gl_FragColor.a = uColor.a;
|
|
474
|
+
}
|
|
475
|
+
"""
|
|
476
|
+
# for stimuli with just a colored texture
|
|
477
|
+
fragSignedColorTex = """
|
|
478
|
+
uniform vec4 uColor;
|
|
479
|
+
uniform sampler2D uTexture;
|
|
480
|
+
void main() {
|
|
481
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
482
|
+
gl_FragColor.rgb = (textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) + 1.0) / 2.0;
|
|
483
|
+
gl_FragColor.a = uColor.a * textureFrag.a;
|
|
484
|
+
}
|
|
485
|
+
"""
|
|
486
|
+
fragSignedColorTex_adding = """
|
|
487
|
+
uniform vec4 uColor;
|
|
488
|
+
uniform sampler2D uTexture;
|
|
489
|
+
void main() {
|
|
490
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
491
|
+
gl_FragColor.rgb = textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) / 2.0;
|
|
492
|
+
gl_FragColor.a = uColor.a * textureFrag.a;
|
|
493
|
+
}
|
|
494
|
+
"""
|
|
495
|
+
# the shader for pyglet fonts doesn't use multitextures - just one texture
|
|
496
|
+
# fragSignedColorTexFont = """
|
|
497
|
+
# uniform vec4 uColor;
|
|
498
|
+
# uniform sampler2D uTexture;
|
|
499
|
+
# void main() {
|
|
500
|
+
# vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
501
|
+
# gl_FragColor.rgb = uColor.rgb * gl_Color.rgb;
|
|
502
|
+
# gl_FragColor.a = textureFrag.a * gl_Color.a;
|
|
503
|
+
# }
|
|
504
|
+
# """
|
|
505
|
+
|
|
506
|
+
fragSignedColorTexFont = """
|
|
507
|
+
uniform sampler2D texture;
|
|
508
|
+
uniform vec3 rgb;
|
|
509
|
+
void main() {
|
|
510
|
+
vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
|
|
511
|
+
gl_FragColor.rgb=rgb;
|
|
512
|
+
gl_FragColor.a = gl_Color.a*textureFrag.a;
|
|
513
|
+
}
|
|
514
|
+
"""
|
|
311
515
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
#
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
516
|
+
# for stimuli with a colored texture and a mask (gratings, etc.)
|
|
517
|
+
fragSignedColorTexMask = """
|
|
518
|
+
uniform vec4 uColor;
|
|
519
|
+
uniform sampler2D uTexture, uMask;
|
|
520
|
+
void main() {
|
|
521
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
522
|
+
vec4 maskFrag = texture2D(uMask, gl_TexCoord[1].st);
|
|
523
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
524
|
+
gl_FragColor.rgb = (textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) + 1.0) / 2.0;
|
|
525
|
+
}
|
|
526
|
+
"""
|
|
527
|
+
fragSignedColorTexMask_adding = """
|
|
528
|
+
uniform vec4 uColor;
|
|
529
|
+
uniform sampler2D uTexture, uMask;
|
|
530
|
+
void main() {
|
|
531
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
532
|
+
vec4 maskFrag = texture2D(uMask, gl_TexCoord[1].st);
|
|
533
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
534
|
+
gl_FragColor.rgb = textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) / 2.0;
|
|
535
|
+
}
|
|
536
|
+
"""
|
|
537
|
+
# RadialStim uses a 1D mask with a 2D texture
|
|
538
|
+
fragSignedColorTexMask1D = """
|
|
539
|
+
uniform vec4 uColor;
|
|
540
|
+
uniform sampler2D uTexture;
|
|
541
|
+
uniform sampler1D uMask;
|
|
542
|
+
void main() {
|
|
543
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
544
|
+
vec4 maskFrag = texture1D(uMask, gl_TexCoord[1].s);
|
|
545
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
546
|
+
gl_FragColor.rgb = (textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) + 1.0) / 2.0;
|
|
547
|
+
}
|
|
548
|
+
"""
|
|
549
|
+
fragSignedColorTexMask1D_adding = """
|
|
550
|
+
uniform vec4 uColor;
|
|
551
|
+
uniform sampler2D uTexture;
|
|
552
|
+
uniform sampler1D uMask;
|
|
553
|
+
void main() {
|
|
554
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
555
|
+
vec4 maskFrag = texture1D(uMask, gl_TexCoord[1].s);
|
|
556
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
557
|
+
gl_FragColor.rgb = textureFrag.rgb * (uColor.rgb * 2.0 - 1.0) / 2.0;
|
|
558
|
+
}
|
|
559
|
+
"""
|
|
560
|
+
# imageStim is providing its texture unsigned
|
|
561
|
+
fragImageStim = """
|
|
562
|
+
uniform vec4 uColor;
|
|
563
|
+
uniform sampler2D uTexture;
|
|
564
|
+
uniform sampler2D uMask;
|
|
565
|
+
|
|
566
|
+
void main() {
|
|
567
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
568
|
+
vec4 maskFrag = texture2D(uMask, gl_TexCoord[1].st);
|
|
569
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
570
|
+
gl_FragColor.rgb = ((textureFrag.rgb * 2.0 - 1.0) * (uColor.rgb * 2.0 - 1.0) + 1.0) / 2.0;
|
|
571
|
+
}
|
|
572
|
+
"""
|
|
573
|
+
# imageStim is providing its texture unsigned
|
|
574
|
+
fragImageStim_adding = """
|
|
575
|
+
uniform vec4 uColor;
|
|
576
|
+
uniform sampler2D uTexture;
|
|
577
|
+
uniform sampler2D uMask;
|
|
578
|
+
|
|
579
|
+
void main() {
|
|
580
|
+
vec4 textureFrag = texture2D(uTexture, gl_TexCoord[0].st);
|
|
581
|
+
vec4 maskFrag = texture2D(uMask, gl_TexCoord[1].st);
|
|
582
|
+
gl_FragColor.a = uColor.a * maskFrag.a * textureFrag.a;
|
|
583
|
+
gl_FragColor.rgb = (textureFrag.rgb * 2.0 - 1.0) * (uColor.rgb * 2.0 - 1.0) / 2.0;
|
|
584
|
+
}
|
|
585
|
+
"""
|
|
586
|
+
|
|
587
|
+
# legacy vertex shader for pyglet text rendering and FBO blit
|
|
588
|
+
vertSimpleText = """
|
|
589
|
+
void main() {
|
|
590
|
+
gl_FrontColor = gl_Color;
|
|
591
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
592
|
+
gl_TexCoord[1] = gl_MultiTexCoord1;
|
|
593
|
+
gl_TexCoord[2] = gl_MultiTexCoord2;
|
|
594
|
+
gl_Position = ftransform();
|
|
595
|
+
}
|
|
596
|
+
"""
|
|
597
|
+
|
|
598
|
+
vertSimple = """
|
|
599
|
+
uniform vec4 uColor;
|
|
600
|
+
uniform mat4 uModelViewMatrix; // combined for 2D rendering
|
|
601
|
+
uniform mat4 uProjectionMatrix;
|
|
602
|
+
void main() {
|
|
603
|
+
gl_FrontColor = uColor;
|
|
604
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
605
|
+
gl_TexCoord[1] = gl_MultiTexCoord1;
|
|
606
|
+
gl_TexCoord[2] = gl_MultiTexCoord2;
|
|
607
|
+
gl_Position = uProjectionMatrix * uModelViewMatrix * gl_Vertex;
|
|
608
|
+
}
|
|
609
|
+
"""
|
|
610
|
+
|
|
611
|
+
vertPhongLighting = """
|
|
612
|
+
// Vertex shader for the Phong Shading Model
|
|
613
|
+
//
|
|
614
|
+
// This code is based of the tutorial here:
|
|
615
|
+
// https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
|
|
616
|
+
//
|
|
617
|
+
// Only supports directional and point light sources for now. Spotlights will be
|
|
618
|
+
// added later on.
|
|
619
|
+
//
|
|
620
|
+
#version 110
|
|
621
|
+
uniform mat4 uModelViewMatrix;
|
|
622
|
+
uniform mat4 uProjectionMatrix;
|
|
623
|
+
uniform mat4 uNormalMatrix;
|
|
624
|
+
varying vec3 N;
|
|
625
|
+
varying vec3 v;
|
|
626
|
+
varying vec4 frontColor;
|
|
627
|
+
|
|
628
|
+
void main(void)
|
|
629
|
+
{
|
|
630
|
+
v = vec3(uModelViewMatrix * gl_Vertex.xyz);
|
|
631
|
+
N = normalize(uNormalMatrix * gl_Normal);
|
|
354
632
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
633
|
+
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
634
|
+
gl_TexCoord[1] = gl_MultiTexCoord1;
|
|
635
|
+
gl_Position = uProjectionMatrix * uModelViewMatrix * gl_Vertex;
|
|
636
|
+
frontColor = gl_Color;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
"""
|
|
640
|
+
|
|
641
|
+
fragPhongLighting = """
|
|
642
|
+
// Fragment shader for the Phong Shading Model
|
|
643
|
+
//
|
|
644
|
+
// This code is based of the tutorial here:
|
|
645
|
+
// https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
|
|
646
|
+
//
|
|
647
|
+
// Use `embedShaderSourceDefs` from gltools to enable the code path for diffuse
|
|
648
|
+
// texture maps by setting DIFFUSE to 1. The number of lights can be specified
|
|
649
|
+
// by setting MAX_LIGHTS, by default, the maximum should be 8. However, build
|
|
650
|
+
// your shader for the exact number of lights required.
|
|
651
|
+
//
|
|
652
|
+
// Only supports directional and point light sources for now. Spotlights will be
|
|
653
|
+
// added later on.
|
|
654
|
+
//
|
|
655
|
+
#version 110
|
|
656
|
+
varying vec3 N;
|
|
657
|
+
varying vec3 v;
|
|
658
|
+
varying vec4 frontColor;
|
|
659
|
+
|
|
660
|
+
#ifdef DIFFUSE_TEXTURE
|
|
661
|
+
uniform sampler2D diffTexture;
|
|
662
|
+
#endif
|
|
663
|
+
|
|
664
|
+
// Calculate lighting attenuation using the same formula OpenGL uses
|
|
665
|
+
float calcAttenuation(float kConst, float kLinear, float kQuad, float dist) {
|
|
666
|
+
return 1.0 / (kConst + kLinear * dist + kQuad * dist * dist);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
void main (void)
|
|
670
|
+
{
|
|
671
|
+
#ifdef DIFFUSE_TEXTURE
|
|
672
|
+
vec4 diffTexColor = texture2D(diffTexture, gl_TexCoord[0].st);
|
|
673
|
+
#endif
|
|
674
|
+
|
|
675
|
+
#if MAX_LIGHTS > 0
|
|
676
|
+
vec3 N = normalize(N);
|
|
677
|
+
vec4 finalColor = vec4(0.0);
|
|
678
|
+
// loop over available lights
|
|
679
|
+
for (int i=0; i < MAX_LIGHTS; i++)
|
|
363
680
|
{
|
|
364
|
-
L
|
|
365
|
-
attenuation =
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
681
|
+
vec3 L;
|
|
682
|
+
float attenuation = 1.0; // default factor, no attenuation
|
|
683
|
+
|
|
684
|
+
// check if directional, compute attenuation if a point source
|
|
685
|
+
if (gl_LightSource[i].position.w == 0.0)
|
|
686
|
+
{
|
|
687
|
+
// off at infinity, only use direction
|
|
688
|
+
L = normalize(gl_LightSource[i].position.xyz);
|
|
689
|
+
// attenuation is 1.0 (no attenuation for directional sources)
|
|
690
|
+
}
|
|
691
|
+
else
|
|
692
|
+
{
|
|
693
|
+
L = normalize(gl_LightSource[i].position.xyz - v);
|
|
694
|
+
attenuation = calcAttenuation(
|
|
695
|
+
gl_LightSource[i].constantAttenuation,
|
|
696
|
+
gl_LightSource[i].linearAttenuation,
|
|
697
|
+
gl_LightSource[i].quadraticAttenuation,
|
|
698
|
+
length(gl_LightSource[i].position.xyz - v));
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
vec3 E = normalize(-v);
|
|
702
|
+
vec3 R = normalize(-reflect(L, N));
|
|
703
|
+
|
|
704
|
+
// combine scene ambient with object
|
|
705
|
+
vec4 ambient = gl_FrontMaterial.diffuse *
|
|
706
|
+
(gl_FrontLightProduct[i].ambient + gl_LightModel.ambient);
|
|
707
|
+
|
|
708
|
+
// calculate diffuse component
|
|
709
|
+
vec4 diffuse = gl_FrontLightProduct[i].diffuse * max(dot(N, L), 0.0);
|
|
710
|
+
#ifdef DIFFUSE_TEXTURE
|
|
711
|
+
// multiply in material texture colors if specified
|
|
712
|
+
diffuse *= diffTexColor;
|
|
713
|
+
ambient *= diffTexColor; // ambient should be modulated by diffuse color
|
|
714
|
+
#endif
|
|
715
|
+
vec3 halfwayVec = normalize(L + E);
|
|
716
|
+
vec4 specular = gl_FrontLightProduct[i].specular *
|
|
717
|
+
pow(max(dot(N, halfwayVec), 0.0), gl_FrontMaterial.shininess);
|
|
718
|
+
|
|
719
|
+
// clamp color values for specular and diffuse
|
|
720
|
+
ambient = clamp(ambient, 0.0, 1.0);
|
|
721
|
+
diffuse = clamp(diffuse, 0.0, 1.0);
|
|
722
|
+
specular = clamp(specular, 0.0, 1.0);
|
|
723
|
+
|
|
724
|
+
// falloff with distance from eye? might be something to consider for
|
|
725
|
+
// realism
|
|
726
|
+
vec4 emission = clamp(gl_FrontMaterial.emission, 0.0, 1.0);
|
|
727
|
+
|
|
728
|
+
finalColor += (ambient + emission) + attenuation * (diffuse + specular);
|
|
370
729
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
// combine scene ambient with object
|
|
376
|
-
vec4 ambient = gl_FrontMaterial.diffuse *
|
|
377
|
-
(gl_FrontLightProduct[i].ambient + gl_LightModel.ambient);
|
|
378
|
-
|
|
379
|
-
// calculate diffuse component
|
|
380
|
-
vec4 diffuse = gl_FrontLightProduct[i].diffuse * max(dot(N, L), 0.0);
|
|
381
|
-
#ifdef DIFFUSE_TEXTURE
|
|
382
|
-
// multiply in material texture colors if specified
|
|
383
|
-
diffuse *= diffTexColor;
|
|
384
|
-
ambient *= diffTexColor; // ambient should be modulated by diffuse color
|
|
385
|
-
#endif
|
|
386
|
-
vec3 halfwayVec = normalize(L + E);
|
|
387
|
-
vec4 specular = gl_FrontLightProduct[i].specular *
|
|
388
|
-
pow(max(dot(N, halfwayVec), 0.0), gl_FrontMaterial.shininess);
|
|
389
|
-
|
|
390
|
-
// clamp color values for specular and diffuse
|
|
391
|
-
ambient = clamp(ambient, 0.0, 1.0);
|
|
392
|
-
diffuse = clamp(diffuse, 0.0, 1.0);
|
|
393
|
-
specular = clamp(specular, 0.0, 1.0);
|
|
394
|
-
|
|
395
|
-
// falloff with distance from eye? might be something to consider for
|
|
396
|
-
// realism
|
|
730
|
+
gl_FragColor = finalColor; // use texture alpha
|
|
731
|
+
#else
|
|
732
|
+
// no lights, only track ambient and emission component
|
|
397
733
|
vec4 emission = clamp(gl_FrontMaterial.emission, 0.0, 1.0);
|
|
398
|
-
|
|
399
|
-
|
|
734
|
+
vec4 ambient = gl_FrontLightProduct[0].ambient * gl_LightModel.ambient;
|
|
735
|
+
ambient = clamp(ambient, 0.0, 1.0);
|
|
736
|
+
#ifdef DIFFUSE_TEXTURE
|
|
737
|
+
gl_FragColor = (ambient + emission) * texture2D(diffTexture, gl_TexCoord[0].st);
|
|
738
|
+
#else
|
|
739
|
+
gl_FragColor = ambient + emission;
|
|
740
|
+
#endif
|
|
741
|
+
#endif
|
|
400
742
|
}
|
|
401
|
-
|
|
402
|
-
#else
|
|
403
|
-
// no lights, only track ambient and emission component
|
|
404
|
-
vec4 emission = clamp(gl_FrontMaterial.emission, 0.0, 1.0);
|
|
405
|
-
vec4 ambient = gl_FrontLightProduct[0].ambient * gl_LightModel.ambient;
|
|
406
|
-
ambient = clamp(ambient, 0.0, 1.0);
|
|
407
|
-
#ifdef DIFFUSE_TEXTURE
|
|
408
|
-
gl_FragColor = (ambient + emission) * texture2D(diffTexture, gl_TexCoord[0].st);
|
|
409
|
-
#else
|
|
410
|
-
gl_FragColor = ambient + emission;
|
|
411
|
-
#endif
|
|
412
|
-
#endif
|
|
413
|
-
}
|
|
414
|
-
"""
|
|
743
|
+
"""
|
|
415
744
|
|
|
416
|
-
vertSkyBox = """
|
|
417
|
-
varying vec3 texCoord;
|
|
418
|
-
void main(void)
|
|
419
|
-
{
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
}
|
|
423
|
-
"""
|
|
745
|
+
vertSkyBox = """
|
|
746
|
+
varying vec3 texCoord;
|
|
747
|
+
void main(void)
|
|
748
|
+
{
|
|
749
|
+
texCoord = gl_Vertex;
|
|
750
|
+
gl_Position = ftransform().xyww;
|
|
751
|
+
}
|
|
752
|
+
"""
|
|
424
753
|
|
|
425
|
-
fragSkyBox = """
|
|
426
|
-
varying vec3 texCoord;
|
|
427
|
-
uniform samplerCube SkyTexture;
|
|
428
|
-
void main (void)
|
|
429
|
-
{
|
|
430
|
-
|
|
431
|
-
}
|
|
432
|
-
"""
|
|
754
|
+
fragSkyBox = """
|
|
755
|
+
varying vec3 texCoord;
|
|
756
|
+
uniform samplerCube SkyTexture;
|
|
757
|
+
void main (void)
|
|
758
|
+
{
|
|
759
|
+
gl_FragColor = texture(SkyTexture, texCoord);
|
|
760
|
+
}
|
|
761
|
+
"""
|
|
433
762
|
|
|
434
|
-
fragTextBox2 = '''
|
|
435
|
-
uniform sampler2D
|
|
436
|
-
|
|
763
|
+
fragTextBox2 = '''
|
|
764
|
+
uniform sampler2D uTexture;
|
|
765
|
+
uniform vec4 uColor;
|
|
766
|
+
void main()
|
|
767
|
+
{
|
|
437
768
|
vec2 uv = gl_TexCoord[0].xy;
|
|
438
|
-
vec4 current = texture2D(
|
|
769
|
+
vec4 current = texture2D(uTexture, uv);
|
|
439
770
|
|
|
440
771
|
float r = current.r;
|
|
441
772
|
float g = current.g;
|
|
442
773
|
float b = current.b;
|
|
443
774
|
float a = current.a;
|
|
444
|
-
gl_FragColor = vec4(
|
|
775
|
+
gl_FragColor = vec4(uColor.rgb, (r + g + b) / 2.);
|
|
445
776
|
}
|
|
446
777
|
'''
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
778
|
+
|
|
779
|
+
fragTextBox2alpha = '''
|
|
780
|
+
uniform sampler2D uTexture;
|
|
781
|
+
uniform vec4 uColor;
|
|
782
|
+
void main()
|
|
783
|
+
{
|
|
784
|
+
vec4 current = texture2D(uTexture, gl_TexCoord[0].st);
|
|
785
|
+
gl_FragColor = vec4(uColor.rgb, current.a);
|
|
452
786
|
}
|
|
453
787
|
'''
|