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.

Files changed (863) hide show
  1. psychopy/CHANGELOG.txt +4 -4
  2. psychopy/GIT_SHA +1 -1
  3. psychopy/LICENSE.txt +1 -1
  4. psychopy/VERSION +1 -1
  5. psychopy/__init__.py +10 -7
  6. psychopy/alerts/__init__.py +1 -1
  7. psychopy/alerts/_alerts.py +53 -17
  8. psychopy/alerts/_errorHandler.py +3 -4
  9. psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
  10. psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
  11. psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
  12. psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
  13. psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
  14. psychopy/alerts/alerttools.py +0 -16
  15. psychopy/app/Resources/betasplash.png +0 -0
  16. psychopy/app/Resources/betasplash@2x.png +0 -0
  17. psychopy/app/Resources/classic/case.png +0 -0
  18. psychopy/app/Resources/classic/case@2x.png +0 -0
  19. psychopy/app/Resources/classic/fileaudio.png +0 -0
  20. psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
  21. psychopy/app/Resources/classic/filecss.png +0 -0
  22. psychopy/app/Resources/classic/filecss@2x.png +0 -0
  23. psychopy/app/Resources/classic/filecsv.png +0 -0
  24. psychopy/app/Resources/classic/filecsv@2x.png +0 -0
  25. psychopy/app/Resources/classic/filedesign.png +0 -0
  26. psychopy/app/Resources/classic/filedesign@2x.png +0 -0
  27. psychopy/app/Resources/classic/filefont.png +0 -0
  28. psychopy/app/Resources/classic/filefont@2x.png +0 -0
  29. psychopy/app/Resources/classic/filegit.png +0 -0
  30. psychopy/app/Resources/classic/filegit@2x.png +0 -0
  31. psychopy/app/Resources/classic/filehtml.png +0 -0
  32. psychopy/app/Resources/classic/filehtml@2x.png +0 -0
  33. psychopy/app/Resources/classic/fileimage.png +0 -0
  34. psychopy/app/Resources/classic/fileimage@2x.png +0 -0
  35. psychopy/app/Resources/classic/fileinfo.png +0 -0
  36. psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
  37. psychopy/app/Resources/classic/filejs.png +0 -0
  38. psychopy/app/Resources/classic/filejs@2x.png +0 -0
  39. psychopy/app/Resources/classic/filejson.png +0 -0
  40. psychopy/app/Resources/classic/filejson@2x.png +0 -0
  41. psychopy/app/Resources/classic/filepkg.png +0 -0
  42. psychopy/app/Resources/classic/filepkg@2x.png +0 -0
  43. psychopy/app/Resources/classic/filepsyexp.png +0 -0
  44. psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
  45. psychopy/app/Resources/classic/filepy.png +0 -0
  46. psychopy/app/Resources/classic/filepy@2x.png +0 -0
  47. psychopy/app/Resources/classic/filetxt.png +0 -0
  48. psychopy/app/Resources/classic/filetxt@2x.png +0 -0
  49. psychopy/app/Resources/classic/fileunknown.png +0 -0
  50. psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
  51. psychopy/app/Resources/classic/filevideo.png +0 -0
  52. psychopy/app/Resources/classic/filevideo@2x.png +0 -0
  53. psychopy/app/Resources/classic/find.png +0 -0
  54. psychopy/app/Resources/classic/find@2x.png +0 -0
  55. psychopy/app/Resources/classic/loop.png +0 -0
  56. psychopy/app/Resources/classic/loop@2x.png +0 -0
  57. psychopy/app/Resources/classic/regex.png +0 -0
  58. psychopy/app/Resources/classic/regex@2x.png +0 -0
  59. psychopy/app/Resources/dark/case.png +0 -0
  60. psychopy/app/Resources/dark/case@2x.png +0 -0
  61. psychopy/app/Resources/dark/fileaudio.png +0 -0
  62. psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
  63. psychopy/app/Resources/dark/filecss.png +0 -0
  64. psychopy/app/Resources/dark/filecss@2x.png +0 -0
  65. psychopy/app/Resources/dark/filecsv.png +0 -0
  66. psychopy/app/Resources/dark/filecsv@2x.png +0 -0
  67. psychopy/app/Resources/dark/filedesign.png +0 -0
  68. psychopy/app/Resources/dark/filedesign@2x.png +0 -0
  69. psychopy/app/Resources/dark/filefont.png +0 -0
  70. psychopy/app/Resources/dark/filefont@2x.png +0 -0
  71. psychopy/app/Resources/dark/filegit.png +0 -0
  72. psychopy/app/Resources/dark/filegit@2x.png +0 -0
  73. psychopy/app/Resources/dark/filehtml.png +0 -0
  74. psychopy/app/Resources/dark/filehtml@2x.png +0 -0
  75. psychopy/app/Resources/dark/fileimage.png +0 -0
  76. psychopy/app/Resources/dark/fileimage@2x.png +0 -0
  77. psychopy/app/Resources/dark/fileinfo.png +0 -0
  78. psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
  79. psychopy/app/Resources/dark/filejs.png +0 -0
  80. psychopy/app/Resources/dark/filejs@2x.png +0 -0
  81. psychopy/app/Resources/dark/filejson.png +0 -0
  82. psychopy/app/Resources/dark/filejson@2x.png +0 -0
  83. psychopy/app/Resources/dark/filepkg.png +0 -0
  84. psychopy/app/Resources/dark/filepkg@2x.png +0 -0
  85. psychopy/app/Resources/dark/filepsyexp.png +0 -0
  86. psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
  87. psychopy/app/Resources/dark/filepy.png +0 -0
  88. psychopy/app/Resources/dark/filepy@2x.png +0 -0
  89. psychopy/app/Resources/dark/filetxt.png +0 -0
  90. psychopy/app/Resources/dark/filetxt@2x.png +0 -0
  91. psychopy/app/Resources/dark/fileunknown.png +0 -0
  92. psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
  93. psychopy/app/Resources/dark/filevideo.png +0 -0
  94. psychopy/app/Resources/dark/filevideo@2x.png +0 -0
  95. psychopy/app/Resources/dark/find.png +0 -0
  96. psychopy/app/Resources/dark/find@2x.png +0 -0
  97. psychopy/app/Resources/dark/loop.png +0 -0
  98. psychopy/app/Resources/dark/loop@2x.png +0 -0
  99. psychopy/app/Resources/dark/regex.png +0 -0
  100. psychopy/app/Resources/dark/regex@2x.png +0 -0
  101. psychopy/app/Resources/light/case.png +0 -0
  102. psychopy/app/Resources/light/case@2x.png +0 -0
  103. psychopy/app/Resources/light/fileaudio.png +0 -0
  104. psychopy/app/Resources/light/fileaudio@2x.png +0 -0
  105. psychopy/app/Resources/light/filecss.png +0 -0
  106. psychopy/app/Resources/light/filecss@2x.png +0 -0
  107. psychopy/app/Resources/light/filecsv.png +0 -0
  108. psychopy/app/Resources/light/filecsv@2x.png +0 -0
  109. psychopy/app/Resources/light/filedesign.png +0 -0
  110. psychopy/app/Resources/light/filedesign@2x.png +0 -0
  111. psychopy/app/Resources/light/filefont.png +0 -0
  112. psychopy/app/Resources/light/filefont@2x.png +0 -0
  113. psychopy/app/Resources/light/filegit.png +0 -0
  114. psychopy/app/Resources/light/filegit@2x.png +0 -0
  115. psychopy/app/Resources/light/filehtml.png +0 -0
  116. psychopy/app/Resources/light/filehtml@2x.png +0 -0
  117. psychopy/app/Resources/light/fileimage.png +0 -0
  118. psychopy/app/Resources/light/fileimage@2x.png +0 -0
  119. psychopy/app/Resources/light/fileinfo.png +0 -0
  120. psychopy/app/Resources/light/fileinfo@2x.png +0 -0
  121. psychopy/app/Resources/light/filejs.png +0 -0
  122. psychopy/app/Resources/light/filejs@2x.png +0 -0
  123. psychopy/app/Resources/light/filejson.png +0 -0
  124. psychopy/app/Resources/light/filejson@2x.png +0 -0
  125. psychopy/app/Resources/light/filepkg.png +0 -0
  126. psychopy/app/Resources/light/filepkg@2x.png +0 -0
  127. psychopy/app/Resources/light/filepsyexp.png +0 -0
  128. psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
  129. psychopy/app/Resources/light/filepy.png +0 -0
  130. psychopy/app/Resources/light/filepy@2x.png +0 -0
  131. psychopy/app/Resources/light/filetxt.png +0 -0
  132. psychopy/app/Resources/light/filetxt@2x.png +0 -0
  133. psychopy/app/Resources/light/fileunknown.png +0 -0
  134. psychopy/app/Resources/light/fileunknown@2x.png +0 -0
  135. psychopy/app/Resources/light/filevideo.png +0 -0
  136. psychopy/app/Resources/light/filevideo@2x.png +0 -0
  137. psychopy/app/Resources/light/find.png +0 -0
  138. psychopy/app/Resources/light/find@2x.png +0 -0
  139. psychopy/app/Resources/light/loop.png +0 -0
  140. psychopy/app/Resources/light/loop@2x.png +0 -0
  141. psychopy/app/Resources/light/regex.png +0 -0
  142. psychopy/app/Resources/light/regex@2x.png +0 -0
  143. psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
  144. psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
  145. psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
  146. psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
  147. psychopy/app/Resources/splash.png +0 -0
  148. psychopy/app/Resources/splash@2x.png +0 -0
  149. psychopy/app/__init__.py +49 -8
  150. psychopy/app/__main__.py +3 -0
  151. psychopy/app/_psychopyApp.py +134 -125
  152. psychopy/app/builder/builder.py +42 -22
  153. psychopy/app/builder/dialogs/__init__.py +44 -11
  154. psychopy/app/builder/dialogs/dlgsCode.py +1 -1
  155. psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
  156. psychopy/app/builder/dialogs/findDlg.py +106 -20
  157. psychopy/app/builder/dialogs/paramCtrls.py +42 -1
  158. psychopy/app/builder/validators.py +1 -1
  159. psychopy/app/coder/codeEditorBase.py +8 -8
  160. psychopy/app/coder/coder.py +32 -29
  161. psychopy/app/coder/fileBrowser.py +68 -22
  162. psychopy/app/coder/folding.py +1 -1
  163. psychopy/app/coder/psychoParser.py +1 -1
  164. psychopy/app/coder/repl.py +1 -1
  165. psychopy/app/coder/sourceTree.py +1 -1
  166. psychopy/app/connections/__init__.py +1 -1
  167. psychopy/app/connections/news.py +1 -1
  168. psychopy/app/connections/sendusage.py +1 -1
  169. psychopy/app/connections/updates.py +1 -1
  170. psychopy/app/console.py +1 -1
  171. psychopy/app/errorDlg.py +1 -1
  172. psychopy/app/frametracker.py +1 -1
  173. psychopy/app/idle.py +1 -1
  174. psychopy/app/jobs.py +5 -2
  175. psychopy/app/linuxconfig/__init__.py +1 -1
  176. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  177. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
  178. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  179. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  180. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  181. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
  182. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  183. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  184. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  185. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  186. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
  187. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  188. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
  189. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  190. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
  191. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  192. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
  193. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  194. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
  195. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  196. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  197. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
  198. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  199. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
  200. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  201. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
  202. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  203. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  204. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
  205. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  206. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
  207. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  208. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  209. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
  210. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  211. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  212. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  213. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  214. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
  215. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  216. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  217. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  218. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
  219. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  220. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
  221. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  222. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
  223. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  224. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
  225. psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
  226. psychopy/app/pavlovia_ui/__init__.py +1 -1
  227. psychopy/app/pavlovia_ui/_base.py +1 -1
  228. psychopy/app/pavlovia_ui/functions.py +1 -1
  229. psychopy/app/pavlovia_ui/menu.py +1 -1
  230. psychopy/app/pavlovia_ui/project.py +1 -1
  231. psychopy/app/pavlovia_ui/search.py +1 -1
  232. psychopy/app/pavlovia_ui/sync.py +1 -1
  233. psychopy/app/pavlovia_ui/user.py +1 -1
  234. psychopy/app/plugin_manager/dialog.py +34 -96
  235. psychopy/app/plugin_manager/packages.py +10 -14
  236. psychopy/app/plugin_manager/plugins.py +64 -4
  237. psychopy/app/preferencesDlg.py +12 -37
  238. psychopy/app/psychopyApp.py +130 -44
  239. psychopy/app/ribbon.py +1 -0
  240. psychopy/app/runner/runner.py +19 -7
  241. psychopy/app/runner/scriptProcess.py +11 -6
  242. psychopy/app/stdout/stdOutRich.py +9 -2
  243. psychopy/app/themes/fonts.py +1 -1
  244. psychopy/app/themes/icons.py +2 -38
  245. psychopy/app/ui/__init__.py +1 -1
  246. psychopy/app/utils.py +3 -3
  247. psychopy/assets/default.mp3 +0 -0
  248. psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
  249. psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  250. psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
  251. psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
  252. psychopy/assets/voicekeyThresholdStim.wav +0 -0
  253. psychopy/clock.py +4 -1
  254. psychopy/colors.py +12 -5
  255. psychopy/core.py +1 -1
  256. psychopy/data/base.py +1 -1
  257. psychopy/data/experiment.py +151 -46
  258. psychopy/data/routine.py +27 -1
  259. psychopy/data/staircase.py +2 -1
  260. psychopy/data/trial.py +62 -14
  261. psychopy/data/utils.py +2 -2
  262. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
  263. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
  264. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
  265. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
  266. psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
  267. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  268. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  269. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  270. psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
  271. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
  272. psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
  273. psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
  274. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
  275. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
  276. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
  277. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
  278. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
  279. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
  280. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
  281. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
  282. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
  283. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
  284. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
  285. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
  286. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
  287. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
  288. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  289. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
  290. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
  291. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
  292. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
  293. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
  294. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
  295. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
  296. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
  297. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
  298. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
  299. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
  300. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
  301. psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
  302. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
  303. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
  304. psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
  305. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
  306. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
  307. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
  308. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
  309. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
  310. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
  311. psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
  312. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
  313. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
  314. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
  315. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
  316. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
  317. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
  318. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
  319. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
  320. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
  321. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
  322. psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
  323. psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
  324. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
  325. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
  326. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
  327. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
  328. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
  329. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
  330. psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
  331. psychopy/devices/__init__.py +1 -1
  332. psychopy/event.py +1 -1
  333. psychopy/exceptions.py +1 -1
  334. psychopy/experiment/__init__.py +1 -1
  335. psychopy/experiment/_experiment.py +30 -9
  336. psychopy/experiment/components/__init__.py +1 -6
  337. psychopy/experiment/components/_base.py +44 -19
  338. psychopy/experiment/components/aperture/__init__.py +1 -1
  339. psychopy/experiment/components/brush/__init__.py +2 -2
  340. psychopy/experiment/components/button/__init__.py +24 -28
  341. psychopy/experiment/components/camera/__init__.py +38 -39
  342. psychopy/experiment/components/code/__init__.py +1 -1
  343. psychopy/experiment/components/dots/__init__.py +1 -1
  344. psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
  345. psychopy/experiment/components/form/__init__.py +3 -3
  346. psychopy/experiment/components/grating/__init__.py +1 -1
  347. psychopy/experiment/components/image/__init__.py +1 -1
  348. psychopy/experiment/components/joyButtons/__init__.py +2 -2
  349. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
  350. psychopy/experiment/components/joystick/__init__.py +3 -3
  351. psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
  352. psychopy/experiment/components/keyboard/__init__.py +98 -122
  353. psychopy/experiment/components/microphone/__init__.py +54 -98
  354. psychopy/experiment/components/mouse/__init__.py +92 -93
  355. psychopy/experiment/components/movie/__init__.py +28 -50
  356. psychopy/experiment/components/parallelOut/__init__.py +3 -3
  357. psychopy/experiment/components/polygon/__init__.py +2 -3
  358. psychopy/experiment/components/roi/__init__.py +2 -2
  359. psychopy/experiment/components/routineSettings/__init__.py +2 -0
  360. psychopy/experiment/components/serialOut/__init__.py +7 -7
  361. psychopy/experiment/components/settings/__init__.py +317 -313
  362. psychopy/experiment/components/settings/eyetracking.py +108 -0
  363. psychopy/experiment/components/slider/__init__.py +5 -5
  364. psychopy/experiment/components/sound/__init__.py +168 -78
  365. psychopy/experiment/components/soundsensor/__init__.py +361 -0
  366. psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
  367. psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
  368. psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
  369. psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
  370. psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
  371. psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
  372. psychopy/experiment/components/static/__init__.py +59 -33
  373. psychopy/experiment/components/text/__init__.py +2 -6
  374. psychopy/experiment/components/textbox/__init__.py +3 -7
  375. psychopy/experiment/components/unknown/__init__.py +2 -0
  376. psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
  377. psychopy/experiment/exports.py +1 -1
  378. psychopy/experiment/flow.py +2 -2
  379. psychopy/experiment/localization.py +1 -1
  380. psychopy/experiment/loops.py +43 -10
  381. psychopy/experiment/params.py +6 -4
  382. psychopy/experiment/plugins.py +8 -1
  383. psychopy/experiment/py2js.py +1 -1
  384. psychopy/experiment/py2js_transpiler.py +1 -1
  385. psychopy/experiment/routines/__init__.py +1 -1
  386. psychopy/experiment/routines/_base.py +23 -24
  387. psychopy/experiment/routines/audioValidator/__init__.py +343 -0
  388. psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
  389. psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
  390. psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
  391. psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
  392. psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
  393. psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
  394. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
  395. psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
  396. psychopy/experiment/routines/unknown/__init__.py +2 -0
  397. psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
  398. psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
  399. psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
  400. psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
  401. psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
  402. psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
  403. psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
  404. psychopy/experiment/utils.py +1 -1
  405. psychopy/gui/__init__.py +1 -1
  406. psychopy/gui/qtgui.py +15 -6
  407. psychopy/gui/wxgui.py +1 -1
  408. psychopy/hardware/__init__.py +0 -1
  409. psychopy/hardware/base.py +147 -16
  410. psychopy/hardware/bbtk/__init__.py +10 -16
  411. psychopy/hardware/brainproducts.py +7 -13
  412. psychopy/hardware/button.py +21 -2
  413. psychopy/hardware/buttonbox/__init__.py +1 -1
  414. psychopy/hardware/camera/__init__.py +18 -5
  415. psychopy/hardware/cedrus.py +5 -16
  416. psychopy/hardware/crs/__init__.py +1 -1
  417. psychopy/hardware/crs/bits.py +36 -33
  418. psychopy/hardware/crs/colorcal.py +8 -11
  419. psychopy/hardware/crs/optical.py +7 -10
  420. psychopy/hardware/crs/shaders.py +18 -5
  421. psychopy/hardware/emotiv.py +1 -1
  422. psychopy/hardware/emulator.py +11 -5
  423. psychopy/hardware/exceptions.py +86 -0
  424. psychopy/hardware/forp.py +18 -23
  425. psychopy/hardware/gammasci.py +8 -3
  426. psychopy/hardware/iolab.py +8 -19
  427. psychopy/hardware/joystick/__init__.py +865 -266
  428. psychopy/hardware/joystick/_base.py +251 -0
  429. psychopy/hardware/joystick/backend_glfw.py +306 -0
  430. psychopy/hardware/joystick/backend_pyglet.py +309 -0
  431. psychopy/hardware/joystick/mappings.py +287 -0
  432. psychopy/hardware/keyboard.py +4 -2
  433. psychopy/hardware/labhackers.py +1 -1
  434. psychopy/hardware/labjacks.py +9 -13
  435. psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
  436. psychopy/hardware/listener.py +9 -8
  437. psychopy/hardware/manager.py +24 -35
  438. psychopy/hardware/microphone.py +535 -155
  439. psychopy/hardware/minolta.py +14 -4
  440. psychopy/hardware/mouse/__init__.py +1 -1
  441. psychopy/hardware/photometer/__init__.py +2 -2
  442. psychopy/hardware/pr.py +14 -4
  443. psychopy/hardware/qmix.py +18 -27
  444. psychopy/hardware/serialdevice.py +43 -12
  445. psychopy/hardware/soundsensor.py +473 -0
  446. psychopy/hardware/spatial/__init__.py +231 -0
  447. psychopy/hardware/speaker.py +298 -36
  448. psychopy/hardware/triggerbox/__init__.py +1 -1
  449. psychopy/hardware/triggerbox/base.py +1 -1
  450. psychopy/hardware/triggerbox/parallel.py +1 -1
  451. psychopy/info.py +1 -1
  452. psychopy/iohub/devices/eyetracker/__init__.py +10 -18
  453. psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
  454. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
  455. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
  456. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
  457. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
  458. psychopy/iohub/devices/mouse/linux2.py +2 -1
  459. psychopy/layout.py +1 -1
  460. psychopy/liaison.py +91 -39
  461. psychopy/locale_setup.py +11 -1
  462. psychopy/localization/__init__.py +1 -1
  463. psychopy/localization/_localization.py +1 -1
  464. psychopy/localization/messages.pot +2 -2
  465. psychopy/logging.py +14 -12
  466. psychopy/microphone.py +4 -3
  467. psychopy/misc.py +1 -1
  468. psychopy/monitors/MonitorCenter.py +3 -3
  469. psychopy/monitors/__init__.py +1 -1
  470. psychopy/monitors/calibData.py +1 -1
  471. psychopy/monitors/calibTools.py +3 -2
  472. psychopy/platform_specific/__init__.py +1 -1
  473. psychopy/platform_specific/darwin.py +1 -1
  474. psychopy/platform_specific/linux.py +1 -1
  475. psychopy/platform_specific/win32.py +1 -1
  476. psychopy/plugins/__init__.py +26 -17
  477. psychopy/plugins/util.py +65 -0
  478. psychopy/preferences/Darwin.spec +11 -3
  479. psychopy/preferences/FreeBSD.spec +11 -3
  480. psychopy/preferences/Linux.spec +11 -3
  481. psychopy/preferences/Windows.spec +11 -3
  482. psychopy/preferences/__init__.py +1 -1
  483. psychopy/preferences/baseNoArch.spec +11 -3
  484. psychopy/preferences/hints.py +78 -61
  485. psychopy/preferences/preferences.py +82 -13
  486. psychopy/projects/__init__.py +1 -1
  487. psychopy/projects/pavlovia.py +29 -13
  488. psychopy/scripts/psyexpCompile.py +1 -1
  489. psychopy/session.py +81 -8
  490. psychopy/sound/__init__.py +25 -10
  491. psychopy/sound/_base.py +134 -34
  492. psychopy/sound/audioclip.py +38 -15
  493. psychopy/sound/audiodevice.py +1 -1
  494. psychopy/sound/backend_ptb.py +53 -321
  495. psychopy/sound/backend_pygame.py +7 -3
  496. psychopy/sound/backend_pyo.py +53 -22
  497. psychopy/sound/backend_pysound.py +10 -27
  498. psychopy/sound/backend_sounddevice.py +33 -21
  499. psychopy/sound/exceptions.py +1 -1
  500. psychopy/sound/microphone.py +83 -5
  501. psychopy/sound/transcribe.py +3 -3
  502. psychopy/tests/data/test_basic_run.py +1 -0
  503. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  504. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  505. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  506. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  507. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  508. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  509. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  510. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  511. psychopy/tests/test_alerts/test_alerttools.py +2 -1
  512. psychopy/tests/test_app/test_command_line.py +65 -0
  513. psychopy/tests/test_data/test_TrialHandler2.py +18 -7
  514. psychopy/tests/test_demos/test_builder_demos.py +1 -1
  515. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
  516. psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
  517. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  518. psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
  519. psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
  520. psychopy/tests/test_experiment/test_loops.py +12 -4
  521. psychopy/tests/test_experiment/test_params.py +17 -4
  522. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
  523. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  524. psychopy/tests/test_liaison/test_Liaison.py +4 -4
  525. psychopy/tests/test_misc/test_clock.py +2 -0
  526. psychopy/tests/test_misc/test_color.py +2 -0
  527. psychopy/tests/test_misc/test_event.py +1 -0
  528. psychopy/tests/test_plugins/__init__.py +0 -0
  529. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  530. psychopy/tests/test_sound/test_sound.py +111 -40
  531. psychopy/tests/test_tools/test_colorspacetools.py +24 -23
  532. psychopy/tests/test_tools/test_mathtools.py +9 -9
  533. psychopy/tests/test_tools/test_viewtools.py +101 -0
  534. psychopy/tests/test_validators/__init__.py +0 -0
  535. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  536. psychopy/tests/test_visual/test_all_stimuli.py +2 -2
  537. psychopy/tests/test_visual/test_basevisual.py +37 -7
  538. psychopy/tests/test_visual/test_button.py +2 -2
  539. psychopy/tests/test_visual/test_circle.py +10 -2
  540. psychopy/tests/test_visual/test_dots.py +1 -1
  541. psychopy/tests/test_visual/test_form.py +13 -13
  542. psychopy/tests/test_visual/test_gamma.py +3 -3
  543. psychopy/tests/test_visual/test_image.py +2 -2
  544. psychopy/tests/test_visual/test_progress.py +2 -2
  545. psychopy/tests/test_visual/test_roi.py +8 -2
  546. psychopy/tests/test_visual/test_shape.py +2 -2
  547. psychopy/tests/test_visual/test_slider.py +2 -2
  548. psychopy/tests/test_visual/test_target.py +2 -2
  549. psychopy/tests/test_visual/test_textbox.py +6 -8
  550. psychopy/tests/test_visual/test_winScalePos.py +6 -5
  551. psychopy/tests/test_visual/test_window.py +17 -0
  552. psychopy/tests/utils.py +51 -1
  553. psychopy/tools/__init__.py +1 -1
  554. psychopy/tools/arraytools.py +2 -2
  555. psychopy/tools/attributetools.py +52 -1
  556. psychopy/tools/audiotools.py +4 -1
  557. psychopy/tools/colorspacetools.py +6 -4
  558. psychopy/tools/coordinatetools.py +1 -1
  559. psychopy/tools/fileerrortools.py +21 -9
  560. psychopy/tools/filetools.py +2 -2
  561. psychopy/tools/fontmanager.py +47 -28
  562. psychopy/tools/gltools.py +2967 -559
  563. psychopy/tools/imagetools.py +1 -1
  564. psychopy/tools/mathtools.py +997 -127
  565. psychopy/tools/monitorunittools.py +7 -1
  566. psychopy/tools/movietools.py +1 -2
  567. psychopy/tools/pkgtools.py +157 -127
  568. psychopy/tools/plottools.py +1 -1
  569. psychopy/tools/rifttools.py +1 -1
  570. psychopy/tools/stereotools.py +1 -1
  571. psychopy/tools/stimulustools.py +172 -2
  572. psychopy/tools/stringtools.py +22 -2
  573. psychopy/tools/systemtools.py +1 -1
  574. psychopy/tools/typetools.py +1 -1
  575. psychopy/tools/unittools.py +1 -1
  576. psychopy/tools/versionchooser.py +3 -1
  577. psychopy/tools/viewtools.py +54 -70
  578. psychopy/tools/wizard.py +2 -2
  579. psychopy/validation/__init__.py +6 -0
  580. psychopy/validation/audio.py +74 -0
  581. psychopy/validation/visual.py +115 -0
  582. psychopy/visual/__init__.py +1 -4
  583. psychopy/visual/aperture.py +9 -6
  584. psychopy/visual/backends/__init__.py +1 -1
  585. psychopy/visual/backends/_base.py +1 -1
  586. psychopy/visual/backends/gamma.py +1 -1
  587. psychopy/visual/backends/glfwbackend.py +8 -12
  588. psychopy/visual/backends/pygamebackend.py +1 -1
  589. psychopy/visual/backends/pygletbackend.py +32 -11
  590. psychopy/visual/basevisual.py +93 -13
  591. psychopy/visual/brush.py +1 -1
  592. psychopy/visual/bufferimage.py +90 -10
  593. psychopy/visual/button.py +1 -1
  594. psychopy/visual/circle.py +12 -20
  595. psychopy/visual/custommouse.py +1 -1
  596. psychopy/visual/dot.py +80 -14
  597. psychopy/visual/elementarray.py +84 -10
  598. psychopy/visual/filters.py +1 -1
  599. psychopy/visual/form.py +43 -28
  600. psychopy/visual/grating.py +105 -25
  601. psychopy/visual/helpers.py +4 -2
  602. psychopy/visual/image.py +98 -20
  603. psychopy/visual/line.py +15 -25
  604. psychopy/visual/movie.py +1 -1
  605. psychopy/visual/movie2.py +4 -3
  606. psychopy/visual/movie3.py +4 -3
  607. psychopy/visual/movies/__init__.py +1 -1
  608. psychopy/visual/movies/frame.py +1 -1
  609. psychopy/visual/movies/metadata.py +1 -1
  610. psychopy/visual/movies/players/__init__.py +1 -1
  611. psychopy/visual/movies/players/_base.py +1 -1
  612. psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
  613. psychopy/visual/nnlvs.py +9 -6
  614. psychopy/visual/noise.py +4 -16
  615. psychopy/visual/patch.py +4 -3
  616. psychopy/visual/pie.py +3 -14
  617. psychopy/visual/polygon.py +21 -28
  618. psychopy/visual/radial.py +4 -18
  619. psychopy/visual/ratingscale.py +4 -3
  620. psychopy/visual/rect.py +16 -25
  621. psychopy/visual/rift.py +8 -2
  622. psychopy/visual/secondorder.py +4 -16
  623. psychopy/visual/shaders.py +620 -286
  624. psychopy/visual/shape.py +281 -90
  625. psychopy/visual/simpleimage.py +1 -1
  626. psychopy/visual/slider.py +78 -25
  627. psychopy/visual/stim3d.py +5 -608
  628. psychopy/visual/text.py +13 -3
  629. psychopy/visual/textbox2/textbox2.py +188 -56
  630. psychopy/visual/vlcmoviestim.py +1 -1
  631. psychopy/visual/window.py +374 -201
  632. psychopy/web.py +1 -1
  633. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/METADATA +13 -12
  634. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/RECORD +647 -624
  635. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/WHEEL +1 -1
  636. psychopy/.DS_Store +0 -0
  637. psychopy/__init__.py.orig +0 -65
  638. psychopy/app/.DS_Store +0 -0
  639. psychopy/app/Resources/.DS_Store +0 -0
  640. psychopy/app/Resources/classic/filecsv16.png +0 -0
  641. psychopy/app/Resources/classic/fileimage16.png +0 -0
  642. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  643. psychopy/app/Resources/dark/filecsv16.png +0 -0
  644. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  645. psychopy/app/Resources/dark/fileimage16.png +0 -0
  646. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  647. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  648. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  649. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  650. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  651. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  652. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  653. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  654. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  655. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  656. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  657. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  658. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  659. psychopy/app/Resources/light/filecsv16.png +0 -0
  660. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  661. psychopy/app/Resources/light/fileimage16.png +0 -0
  662. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  663. psychopy/app/Resources/light/fileunknown16.png +0 -0
  664. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  665. psychopy/app/Resources/psychopySplash.png +0 -0
  666. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  667. psychopy/app/builder/builder.py.orig +0 -3932
  668. psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
  669. psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
  670. psychopy/app/colorpicker/__init__.py.orig +0 -411
  671. psychopy/app/locale/ar_001/.DS_Store +0 -0
  672. psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
  673. psychopy/core.py.orig +0 -169
  674. psychopy/demos/builder/.DS_Store +0 -0
  675. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
  676. psychopy/demos/builder/Experiments/.DS_Store +0 -0
  677. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  678. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
  679. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
  680. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  681. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  682. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  683. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  684. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  685. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  686. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  687. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  688. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  689. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  690. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  691. psychopy/demos/builder/Tools/.DS_Store +0 -0
  692. psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
  693. psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
  694. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
  695. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
  696. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
  697. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
  698. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
  699. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
  700. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
  701. psychopy/demos/coder/.DS_Store +0 -0
  702. psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
  703. psychopy/demos/coder/iohub/.iohpid +0 -1
  704. psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
  705. psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
  706. psychopy/demos/coder/stimuli/.DS_Store +0 -0
  707. psychopy/experiment/_experiment.py.orig +0 -1032
  708. psychopy/experiment/components/.DS_Store +0 -0
  709. psychopy/experiment/components/_base.py.orig +0 -823
  710. psychopy/experiment/components/form/.DS_Store +0 -0
  711. psychopy/experiment/components/microphone/__init__.py.orig +0 -490
  712. psychopy/experiment/components/settings/__init__.py.orig +0 -1337
  713. psychopy/experiment/components/textbox/__init__.py.orig +0 -310
  714. psychopy/experiment/components/webcam/.DS_Store +0 -0
  715. psychopy/experiment/components/webcam/light/.DS_Store +0 -0
  716. psychopy/experiment/loops.py.orig +0 -829
  717. psychopy/experiment/params.py.orig +0 -408
  718. psychopy/experiment/routine.py.orig +0 -503
  719. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  720. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  721. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  722. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  723. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  724. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  725. psychopy/hardware/.DS_Store +0 -0
  726. psychopy/hardware/brainproducts.py.orig +0 -680
  727. psychopy/hardware/iolab.py.orig +0 -238
  728. psychopy/iohub/datastore/__init__.py.orig +0 -443
  729. psychopy/iohub/datastore/util.py.orig +0 -692
  730. psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
  731. psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
  732. psychopy/preferences/.DS_Store +0 -0
  733. psychopy/projects/pavlovia.py.orig +0 -1295
  734. psychopy/tests/.DS_Store +0 -0
  735. psychopy/tests/data/.DS_Store +0 -0
  736. psychopy/tests/data/TestCircle_fill_local.png +0 -0
  737. psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
  738. psychopy/tests/data/aperture1_norm_local.png +0 -0
  739. psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
  740. psychopy/tests/data/beatandrcos_height_local.png +0 -0
  741. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  742. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  743. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  744. psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
  745. psychopy/tests/data/blend_add_height_local.png +0 -0
  746. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  747. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  748. psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
  749. psychopy/tests/data/blend_add_norm_local.png +0 -0
  750. psychopy/tests/data/blend_add_stencil_local.png +0 -0
  751. psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
  752. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  753. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  754. psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
  755. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  756. psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
  757. psychopy/tests/data/circleHex_height_local.png +0 -0
  758. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  759. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  760. psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
  761. psychopy/tests/data/circleHex_norm_local.png +0 -0
  762. psychopy/tests/data/circleHex_stencil_local.png +0 -0
  763. psychopy/tests/data/color_comparison_local.png +0 -0
  764. psychopy/tests/data/correctScript/.DS_Store +0 -0
  765. psychopy/tests/data/dots_height_local.png +0 -0
  766. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  767. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  768. psychopy/tests/data/dots_normNoShade_local.png +0 -0
  769. psychopy/tests/data/dots_norm_local.png +0 -0
  770. psychopy/tests/data/dots_stencil_local.png +0 -0
  771. psychopy/tests/data/elarray1_height_local.png +0 -0
  772. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  773. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  774. psychopy/tests/data/elarray1_norm_local.png +0 -0
  775. psychopy/tests/data/elarray1_stencil_local.png +0 -0
  776. psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
  777. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  778. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  779. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  780. psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
  781. psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
  782. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  783. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  784. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  785. psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
  786. psychopy/tests/data/gabor1_height_local.png +0 -0
  787. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  788. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  789. psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
  790. psychopy/tests/data/gabor1_norm_local.png +0 -0
  791. psychopy/tests/data/gabor1_stencil_local.png +0 -0
  792. psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
  793. psychopy/tests/data/imageAndGauss_height_local.png +0 -0
  794. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  795. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  796. psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
  797. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  798. psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
  799. psychopy/tests/data/movFrame1_stencil_local.png +0 -0
  800. psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
  801. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  802. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  803. psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
  804. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  805. psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
  806. psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
  807. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  808. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  809. psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
  810. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  811. psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
  812. psychopy/tests/data/numpyImage_height_local.png +0 -0
  813. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  814. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  815. psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
  816. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  817. psychopy/tests/data/numpyImage_stencil_local.png +0 -0
  818. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  819. psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
  820. psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
  821. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  822. psychopy/tests/data/shape2_1_stencil_local.png +0 -0
  823. psychopy/tests/data/text1_height_local.png +0 -0
  824. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  825. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  826. psychopy/tests/data/text1_norm_local.png +0 -0
  827. psychopy/tests/data/text1_stencil_local.png +0 -0
  828. psychopy/tests/data/wedge1_height_local.png +0 -0
  829. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  830. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  831. psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
  832. psychopy/tests/data/wedge1_norm_local.png +0 -0
  833. psychopy/tests/data/wedge1_stencil_local.png +0 -0
  834. psychopy/tests/test_app/.DS_Store +0 -0
  835. psychopy/tests/test_app/test_builder/.DS_Store +0 -0
  836. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
  837. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
  838. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
  839. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
  840. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
  841. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
  842. psychopy/tests/test_data/.DS_Store +0 -0
  843. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
  844. psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
  845. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
  846. psychopy/tests/test_visual/test_image.py.orig +0 -219
  847. psychopy/visual/basevisual.py.orig +0 -1723
  848. psychopy/visual/form.py.orig +0 -1181
  849. psychopy/visual/text.py.orig +0 -752
  850. psychopy/visual/textbox2/textbox2.py.orig +0 -1315
  851. psychopy/visual/windowwarp.py.orig +0 -463
  852. /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
  853. /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
  854. /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
  855. /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
  856. /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
  857. /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
  858. /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
  859. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  860. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  861. /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
  862. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/entry_points.txt +0 -0
  863. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/licenses/LICENSE +0 -0
@@ -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-2024 Open Science Tools Ltd.
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.glCreateShaderObjectARB(shaderType)
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.glShaderSourceARB(shader,
29
- 1,
30
- cast(byref(prog), POINTER(POINTER(c_char))),
31
- byref(length))
32
- GL.glCompileShaderARB(shader)
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.glCreateProgramObjectARB()
47
+ self.handle = GL.glCreateProgram()
43
48
 
44
49
  if vertexSource:
45
50
  vertexShader = compileShader(
46
- vertexSource, GL.GL_VERTEX_SHADER_ARB
51
+ vertexSource, GL.GL_VERTEX_SHADER
47
52
  )
48
- GL.glAttachObjectARB(self.handle, vertexShader)
53
+ GL.glAttachShader(self.handle, vertexShader)
49
54
  if fragmentSource:
50
55
  fragmentShader = compileShader(
51
- fragmentSource, GL.GL_FRAGMENT_SHADER_ARB
56
+ fragmentSource, GL.GL_FRAGMENT_SHADER
52
57
  )
53
- GL.glAttachObjectARB(self.handle, fragmentShader)
58
+ GL.glAttachShader(self.handle, fragmentShader)
54
59
 
55
- GL.glValidateProgramARB(self.handle)
56
- GL.glLinkProgramARB(self.handle)
60
+ GL.glValidateProgram(self.handle)
61
+ GL.glLinkProgram(self.handle)
57
62
 
58
63
  if vertexShader:
59
- GL.glDeleteObjectARB(vertexShader)
64
+ GL.glDeleteShader(vertexShader)
60
65
  if fragmentShader:
61
- GL.glDeleteObjectARB(fragmentShader)
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.createProgramObjectARB()
125
+ program = gltools.createProgram()
121
126
 
122
127
  vertexShader = fragmentShader = None
123
128
  if vertexSource:
124
- vertexShader = gltools.compileShaderObjectARB(
125
- vertexSource, GL.GL_VERTEX_SHADER_ARB)
126
- gltools.attachObjectARB(program, vertexShader)
129
+ vertexShader = gltools.compileShader(
130
+ vertexSource, GL.GL_VERTEX_SHADER)
131
+ gltools.attachShader(program, vertexShader)
127
132
  if fragmentSource:
128
- fragmentShader = gltools.compileShaderObjectARB(
129
- fragmentSource, GL.GL_FRAGMENT_SHADER_ARB)
130
- gltools.attachObjectARB(program, fragmentShader)
133
+ fragmentShader = gltools.compileShader(
134
+ fragmentSource, GL.GL_FRAGMENT_SHADER)
135
+ gltools.attachShader(program, fragmentShader)
131
136
 
132
- gltools.linkProgramObjectARB(program)
137
+ gltools.linkProgram(program)
133
138
  # gltools.validateProgramARB(program)
134
139
 
135
140
  if vertexShader:
136
- gltools.detachObjectARB(program, vertexShader)
137
- gltools.deleteObjectARB(vertexShader)
141
+ gltools.detachShader(program, vertexShader)
142
+ gltools.deleteObject(vertexShader)
138
143
  if fragmentShader:
139
- gltools.detachObjectARB(program, fragmentShader)
140
- gltools.deleteObjectARB(fragmentShader)
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
- # for stimuli with no texture (e.g. shapes)
173
- fragSignedColor = '''
174
- void main() {
175
- gl_FragColor.rgb = ((gl_Color.rgb*2.0-1.0)+1.0)/2.0;
176
- gl_FragColor.a = gl_Color.a;
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
- fragSignedColorTexMask1D_adding = '''
243
- uniform sampler2D texture;
244
- uniform sampler1D mask;
245
- void main() {
246
- vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
247
- vec4 maskFrag = texture1D(mask,gl_TexCoord[1].s);
248
- gl_FragColor.a = gl_Color.a * maskFrag.a*textureFrag.a;
249
- gl_FragColor.rgb = textureFrag.rgb * (gl_Color.rgb*2.0-1.0)/2.0;
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
- # imageStim is providing its texture unsigned
253
- fragImageStim = '''
254
- uniform sampler2D texture;
255
- uniform sampler2D mask;
256
- void main() {
257
- vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
258
- vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
259
- gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
260
- gl_FragColor.rgb = ((textureFrag.rgb*2.0-1.0)*(gl_Color.rgb*2.0-1.0)+1.0)/2.0;
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
- # imageStim is providing its texture unsigned
264
- fragImageStim_adding = '''
265
- uniform sampler2D texture;
266
- uniform sampler2D mask;
267
- void main() {
268
- vec4 textureFrag = texture2D(texture,gl_TexCoord[0].st);
269
- vec4 maskFrag = texture2D(mask,gl_TexCoord[1].st);
270
- gl_FragColor.a = gl_Color.a*maskFrag.a*textureFrag.a;
271
- gl_FragColor.rgb = (textureFrag.rgb*2.0-1.0)*(gl_Color.rgb*2.0-1.0)/2.0;
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
- # in every case our vertex shader is simple (we don't transform coords)
275
- vertSimple = """
276
- void main() {
277
- gl_FrontColor = gl_Color;
278
- gl_TexCoord[0] = gl_MultiTexCoord0;
279
- gl_TexCoord[1] = gl_MultiTexCoord1;
280
- gl_TexCoord[2] = gl_MultiTexCoord2;
281
- gl_Position = ftransform();
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
- vertPhongLighting = """
286
- // Vertex shader for the Phong Shading Model
287
- //
288
- // This code is based of the tutorial here:
289
- // https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
290
- //
291
- // Only supports directional and point light sources for now. Spotlights will be
292
- // added later on.
293
- //
294
- #version 110
295
- varying vec3 N;
296
- varying vec3 v;
297
- varying vec4 frontColor;
298
-
299
- void main(void)
300
- {
301
- v = vec3(gl_ModelViewMatrix * gl_Vertex);
302
- N = normalize(gl_NormalMatrix * gl_Normal);
303
-
304
- gl_TexCoord[0] = gl_MultiTexCoord0;
305
- gl_TexCoord[1] = gl_MultiTexCoord1;
306
- gl_Position = ftransform();
307
- frontColor = gl_Color;
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
- fragPhongLighting = """
313
- // Fragment shader for the Phong Shading Model
314
- //
315
- // This code is based of the tutorial here:
316
- // https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php
317
- //
318
- // Use `embedShaderSourceDefs` from gltools to enable the code path for diffuse
319
- // texture maps by setting DIFFUSE to 1. The number of lights can be specified
320
- // by setting MAX_LIGHTS, by default, the maximum should be 8. However, build
321
- // your shader for the exact number of lights required.
322
- //
323
- // Only supports directional and point light sources for now. Spotlights will be
324
- // added later on.
325
- //
326
- #version 110
327
- varying vec3 N;
328
- varying vec3 v;
329
- varying vec4 frontColor;
330
-
331
- #ifdef DIFFUSE_TEXTURE
332
- uniform sampler2D diffTexture;
333
- #endif
334
-
335
- // Calculate lighting attenuation using the same formula OpenGL uses
336
- float calcAttenuation(float kConst, float kLinear, float kQuad, float dist) {
337
- return 1.0 / (kConst + kLinear * dist + kQuad * dist * dist);
338
- }
339
-
340
- void main (void)
341
- {
342
- #ifdef DIFFUSE_TEXTURE
343
- vec4 diffTexColor = texture2D(diffTexture, gl_TexCoord[0].st);
344
- #endif
345
-
346
- #if MAX_LIGHTS > 0
347
- vec3 N = normalize(N);
348
- vec4 finalColor = vec4(0.0);
349
- // loop over available lights
350
- for (int i=0; i < MAX_LIGHTS; i++)
351
- {
352
- vec3 L;
353
- float attenuation = 1.0; // default factor, no attenuation
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
- // check if directional, compute attenuation if a point source
356
- if (gl_LightSource[i].position.w == 0.0)
357
- {
358
- // off at infinity, only use direction
359
- L = normalize(gl_LightSource[i].position.xyz);
360
- // attenuation is 1.0 (no attenuation for directional sources)
361
- }
362
- else
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 = normalize(gl_LightSource[i].position.xyz - v);
365
- attenuation = calcAttenuation(
366
- gl_LightSource[i].constantAttenuation,
367
- gl_LightSource[i].linearAttenuation,
368
- gl_LightSource[i].quadraticAttenuation,
369
- length(gl_LightSource[i].position.xyz - v));
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
- vec3 E = normalize(-v);
373
- vec3 R = normalize(-reflect(L, N));
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
- finalColor += (ambient + emission) + attenuation * (diffuse + specular);
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
- gl_FragColor = finalColor; // use texture alpha
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
- texCoord = gl_Vertex;
421
- gl_Position = ftransform().xyww;
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
- gl_FragColor = texture(SkyTexture, texCoord);
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 texture;
436
- void main() {
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(texture, uv);
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( gl_Color.rgb, (r+g+b)/2.);
775
+ gl_FragColor = vec4(uColor.rgb, (r + g + b) / 2.);
445
776
  }
446
777
  '''
447
- fragTextBox2alpha = '''
448
- uniform sampler2D texture;
449
- void main() {
450
- vec4 current = texture2D(texture,gl_TexCoord[0].st);
451
- gl_FragColor = vec4( gl_Color.rgb, current.a);
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
  '''