psychopy 2024.2.5__py3-none-any.whl → 2025.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of psychopy might be problematic. Click here for more details.

Files changed (860) 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 +2 -0
  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 +1 -1
  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 +16 -3
  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 +534 -154
  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/pupil_labs/neon/__init__.py +1 -0
  455. psychopy/iohub/devices/mouse/linux2.py +2 -1
  456. psychopy/layout.py +1 -1
  457. psychopy/liaison.py +91 -39
  458. psychopy/locale_setup.py +11 -1
  459. psychopy/localization/__init__.py +1 -1
  460. psychopy/localization/_localization.py +1 -1
  461. psychopy/localization/messages.pot +2 -2
  462. psychopy/logging.py +14 -12
  463. psychopy/microphone.py +4 -3
  464. psychopy/misc.py +1 -1
  465. psychopy/monitors/MonitorCenter.py +3 -3
  466. psychopy/monitors/__init__.py +1 -1
  467. psychopy/monitors/calibData.py +1 -1
  468. psychopy/monitors/calibTools.py +3 -2
  469. psychopy/platform_specific/__init__.py +1 -1
  470. psychopy/platform_specific/darwin.py +1 -1
  471. psychopy/platform_specific/linux.py +1 -1
  472. psychopy/platform_specific/win32.py +1 -1
  473. psychopy/plugins/__init__.py +26 -17
  474. psychopy/plugins/util.py +65 -0
  475. psychopy/preferences/Darwin.spec +11 -3
  476. psychopy/preferences/FreeBSD.spec +11 -3
  477. psychopy/preferences/Linux.spec +11 -3
  478. psychopy/preferences/Windows.spec +11 -3
  479. psychopy/preferences/__init__.py +1 -1
  480. psychopy/preferences/baseNoArch.spec +11 -3
  481. psychopy/preferences/hints.py +78 -61
  482. psychopy/preferences/preferences.py +82 -13
  483. psychopy/projects/__init__.py +1 -1
  484. psychopy/projects/pavlovia.py +29 -13
  485. psychopy/scripts/psyexpCompile.py +1 -1
  486. psychopy/session.py +81 -8
  487. psychopy/sound/__init__.py +25 -10
  488. psychopy/sound/_base.py +134 -34
  489. psychopy/sound/audioclip.py +38 -15
  490. psychopy/sound/audiodevice.py +1 -1
  491. psychopy/sound/backend_ptb.py +53 -321
  492. psychopy/sound/backend_pygame.py +7 -3
  493. psychopy/sound/backend_pyo.py +53 -22
  494. psychopy/sound/backend_pysound.py +10 -27
  495. psychopy/sound/backend_sounddevice.py +33 -21
  496. psychopy/sound/exceptions.py +1 -1
  497. psychopy/sound/microphone.py +83 -5
  498. psychopy/sound/transcribe.py +3 -3
  499. psychopy/tests/data/test_basic_run.py +1 -0
  500. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  501. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  502. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  503. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  504. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  505. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  506. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  507. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  508. psychopy/tests/test_alerts/test_alerttools.py +2 -1
  509. psychopy/tests/test_app/test_command_line.py +65 -0
  510. psychopy/tests/test_data/test_TrialHandler2.py +18 -7
  511. psychopy/tests/test_demos/test_builder_demos.py +1 -1
  512. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
  513. psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
  514. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  515. psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
  516. psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
  517. psychopy/tests/test_experiment/test_loops.py +12 -4
  518. psychopy/tests/test_experiment/test_params.py +17 -4
  519. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
  520. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  521. psychopy/tests/test_liaison/test_Liaison.py +4 -4
  522. psychopy/tests/test_misc/test_clock.py +2 -0
  523. psychopy/tests/test_misc/test_color.py +2 -0
  524. psychopy/tests/test_misc/test_event.py +1 -0
  525. psychopy/tests/test_plugins/__init__.py +0 -0
  526. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  527. psychopy/tests/test_sound/test_sound.py +111 -40
  528. psychopy/tests/test_tools/test_colorspacetools.py +24 -23
  529. psychopy/tests/test_tools/test_mathtools.py +9 -9
  530. psychopy/tests/test_tools/test_viewtools.py +101 -0
  531. psychopy/tests/test_validators/__init__.py +0 -0
  532. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  533. psychopy/tests/test_visual/test_all_stimuli.py +2 -2
  534. psychopy/tests/test_visual/test_basevisual.py +37 -7
  535. psychopy/tests/test_visual/test_button.py +2 -2
  536. psychopy/tests/test_visual/test_circle.py +10 -2
  537. psychopy/tests/test_visual/test_dots.py +1 -1
  538. psychopy/tests/test_visual/test_form.py +13 -13
  539. psychopy/tests/test_visual/test_gamma.py +3 -3
  540. psychopy/tests/test_visual/test_image.py +2 -2
  541. psychopy/tests/test_visual/test_progress.py +2 -2
  542. psychopy/tests/test_visual/test_roi.py +8 -2
  543. psychopy/tests/test_visual/test_shape.py +2 -2
  544. psychopy/tests/test_visual/test_slider.py +2 -2
  545. psychopy/tests/test_visual/test_target.py +2 -2
  546. psychopy/tests/test_visual/test_textbox.py +6 -8
  547. psychopy/tests/test_visual/test_winScalePos.py +6 -5
  548. psychopy/tests/test_visual/test_window.py +17 -0
  549. psychopy/tests/utils.py +51 -1
  550. psychopy/tools/__init__.py +1 -1
  551. psychopy/tools/arraytools.py +2 -2
  552. psychopy/tools/attributetools.py +52 -1
  553. psychopy/tools/audiotools.py +4 -1
  554. psychopy/tools/colorspacetools.py +6 -4
  555. psychopy/tools/coordinatetools.py +1 -1
  556. psychopy/tools/fileerrortools.py +21 -9
  557. psychopy/tools/filetools.py +2 -2
  558. psychopy/tools/fontmanager.py +47 -28
  559. psychopy/tools/gltools.py +2964 -558
  560. psychopy/tools/imagetools.py +1 -1
  561. psychopy/tools/mathtools.py +997 -127
  562. psychopy/tools/monitorunittools.py +7 -1
  563. psychopy/tools/movietools.py +1 -2
  564. psychopy/tools/pkgtools.py +157 -127
  565. psychopy/tools/plottools.py +1 -1
  566. psychopy/tools/rifttools.py +1 -1
  567. psychopy/tools/stereotools.py +1 -1
  568. psychopy/tools/stimulustools.py +172 -2
  569. psychopy/tools/stringtools.py +22 -2
  570. psychopy/tools/systemtools.py +1 -1
  571. psychopy/tools/typetools.py +1 -1
  572. psychopy/tools/unittools.py +1 -1
  573. psychopy/tools/versionchooser.py +3 -1
  574. psychopy/tools/viewtools.py +54 -70
  575. psychopy/tools/wizard.py +2 -2
  576. psychopy/validation/__init__.py +6 -0
  577. psychopy/validation/audio.py +74 -0
  578. psychopy/validation/visual.py +115 -0
  579. psychopy/visual/__init__.py +1 -4
  580. psychopy/visual/aperture.py +9 -6
  581. psychopy/visual/backends/__init__.py +1 -1
  582. psychopy/visual/backends/_base.py +1 -1
  583. psychopy/visual/backends/gamma.py +1 -1
  584. psychopy/visual/backends/glfwbackend.py +8 -12
  585. psychopy/visual/backends/pygamebackend.py +1 -1
  586. psychopy/visual/backends/pygletbackend.py +32 -11
  587. psychopy/visual/basevisual.py +93 -13
  588. psychopy/visual/brush.py +1 -1
  589. psychopy/visual/bufferimage.py +90 -10
  590. psychopy/visual/button.py +1 -1
  591. psychopy/visual/circle.py +12 -20
  592. psychopy/visual/custommouse.py +1 -1
  593. psychopy/visual/dot.py +80 -14
  594. psychopy/visual/elementarray.py +84 -10
  595. psychopy/visual/filters.py +1 -1
  596. psychopy/visual/form.py +43 -28
  597. psychopy/visual/grating.py +105 -25
  598. psychopy/visual/helpers.py +1 -1
  599. psychopy/visual/image.py +98 -20
  600. psychopy/visual/line.py +15 -25
  601. psychopy/visual/movie.py +1 -1
  602. psychopy/visual/movie2.py +4 -3
  603. psychopy/visual/movie3.py +4 -3
  604. psychopy/visual/movies/__init__.py +1 -1
  605. psychopy/visual/movies/frame.py +1 -1
  606. psychopy/visual/movies/metadata.py +1 -1
  607. psychopy/visual/movies/players/__init__.py +1 -1
  608. psychopy/visual/movies/players/_base.py +1 -1
  609. psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
  610. psychopy/visual/nnlvs.py +9 -6
  611. psychopy/visual/noise.py +4 -16
  612. psychopy/visual/patch.py +4 -3
  613. psychopy/visual/pie.py +3 -14
  614. psychopy/visual/polygon.py +21 -28
  615. psychopy/visual/radial.py +4 -18
  616. psychopy/visual/ratingscale.py +4 -3
  617. psychopy/visual/rect.py +16 -25
  618. psychopy/visual/rift.py +8 -2
  619. psychopy/visual/secondorder.py +4 -16
  620. psychopy/visual/shaders.py +620 -286
  621. psychopy/visual/shape.py +281 -90
  622. psychopy/visual/simpleimage.py +1 -1
  623. psychopy/visual/slider.py +78 -25
  624. psychopy/visual/stim3d.py +5 -608
  625. psychopy/visual/text.py +13 -3
  626. psychopy/visual/textbox2/textbox2.py +188 -56
  627. psychopy/visual/vlcmoviestim.py +1 -1
  628. psychopy/visual/window.py +373 -200
  629. psychopy/web.py +1 -1
  630. {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
  631. {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/RECORD +644 -621
  632. psychopy/.DS_Store +0 -0
  633. psychopy/__init__.py.orig +0 -65
  634. psychopy/app/.DS_Store +0 -0
  635. psychopy/app/Resources/.DS_Store +0 -0
  636. psychopy/app/Resources/classic/filecsv16.png +0 -0
  637. psychopy/app/Resources/classic/fileimage16.png +0 -0
  638. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  639. psychopy/app/Resources/dark/filecsv16.png +0 -0
  640. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  641. psychopy/app/Resources/dark/fileimage16.png +0 -0
  642. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  643. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  644. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  645. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  646. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  647. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  648. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  649. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  650. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  651. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  652. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  653. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  654. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  655. psychopy/app/Resources/light/filecsv16.png +0 -0
  656. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  657. psychopy/app/Resources/light/fileimage16.png +0 -0
  658. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  659. psychopy/app/Resources/light/fileunknown16.png +0 -0
  660. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  661. psychopy/app/Resources/psychopySplash.png +0 -0
  662. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  663. psychopy/app/builder/builder.py.orig +0 -3932
  664. psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
  665. psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
  666. psychopy/app/colorpicker/__init__.py.orig +0 -411
  667. psychopy/app/locale/ar_001/.DS_Store +0 -0
  668. psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
  669. psychopy/core.py.orig +0 -169
  670. psychopy/demos/builder/.DS_Store +0 -0
  671. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
  672. psychopy/demos/builder/Experiments/.DS_Store +0 -0
  673. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  674. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
  675. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
  676. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  677. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  678. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  679. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  680. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  681. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  682. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  683. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  684. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  685. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  686. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  687. psychopy/demos/builder/Tools/.DS_Store +0 -0
  688. psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
  689. psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
  690. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
  691. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
  692. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
  693. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
  694. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
  695. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
  696. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
  697. psychopy/demos/coder/.DS_Store +0 -0
  698. psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
  699. psychopy/demos/coder/iohub/.iohpid +0 -1
  700. psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
  701. psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
  702. psychopy/demos/coder/stimuli/.DS_Store +0 -0
  703. psychopy/experiment/_experiment.py.orig +0 -1032
  704. psychopy/experiment/components/.DS_Store +0 -0
  705. psychopy/experiment/components/_base.py.orig +0 -823
  706. psychopy/experiment/components/form/.DS_Store +0 -0
  707. psychopy/experiment/components/microphone/__init__.py.orig +0 -490
  708. psychopy/experiment/components/settings/__init__.py.orig +0 -1337
  709. psychopy/experiment/components/textbox/__init__.py.orig +0 -310
  710. psychopy/experiment/components/webcam/.DS_Store +0 -0
  711. psychopy/experiment/components/webcam/light/.DS_Store +0 -0
  712. psychopy/experiment/loops.py.orig +0 -829
  713. psychopy/experiment/params.py.orig +0 -408
  714. psychopy/experiment/routine.py.orig +0 -503
  715. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  716. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  717. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  718. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  719. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  720. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  721. psychopy/hardware/.DS_Store +0 -0
  722. psychopy/hardware/brainproducts.py.orig +0 -680
  723. psychopy/hardware/iolab.py.orig +0 -238
  724. psychopy/iohub/datastore/__init__.py.orig +0 -443
  725. psychopy/iohub/datastore/util.py.orig +0 -692
  726. psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
  727. psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
  728. psychopy/preferences/.DS_Store +0 -0
  729. psychopy/projects/pavlovia.py.orig +0 -1295
  730. psychopy/tests/.DS_Store +0 -0
  731. psychopy/tests/data/.DS_Store +0 -0
  732. psychopy/tests/data/TestCircle_fill_local.png +0 -0
  733. psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
  734. psychopy/tests/data/aperture1_norm_local.png +0 -0
  735. psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
  736. psychopy/tests/data/beatandrcos_height_local.png +0 -0
  737. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  738. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  739. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  740. psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
  741. psychopy/tests/data/blend_add_height_local.png +0 -0
  742. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  743. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  744. psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
  745. psychopy/tests/data/blend_add_norm_local.png +0 -0
  746. psychopy/tests/data/blend_add_stencil_local.png +0 -0
  747. psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
  748. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  749. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  750. psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
  751. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  752. psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
  753. psychopy/tests/data/circleHex_height_local.png +0 -0
  754. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  755. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  756. psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
  757. psychopy/tests/data/circleHex_norm_local.png +0 -0
  758. psychopy/tests/data/circleHex_stencil_local.png +0 -0
  759. psychopy/tests/data/color_comparison_local.png +0 -0
  760. psychopy/tests/data/correctScript/.DS_Store +0 -0
  761. psychopy/tests/data/dots_height_local.png +0 -0
  762. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  763. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  764. psychopy/tests/data/dots_normNoShade_local.png +0 -0
  765. psychopy/tests/data/dots_norm_local.png +0 -0
  766. psychopy/tests/data/dots_stencil_local.png +0 -0
  767. psychopy/tests/data/elarray1_height_local.png +0 -0
  768. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  769. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  770. psychopy/tests/data/elarray1_norm_local.png +0 -0
  771. psychopy/tests/data/elarray1_stencil_local.png +0 -0
  772. psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
  773. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  774. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  775. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  776. psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
  777. psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
  778. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  779. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  780. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  781. psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
  782. psychopy/tests/data/gabor1_height_local.png +0 -0
  783. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  784. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  785. psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
  786. psychopy/tests/data/gabor1_norm_local.png +0 -0
  787. psychopy/tests/data/gabor1_stencil_local.png +0 -0
  788. psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
  789. psychopy/tests/data/imageAndGauss_height_local.png +0 -0
  790. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  791. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  792. psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
  793. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  794. psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
  795. psychopy/tests/data/movFrame1_stencil_local.png +0 -0
  796. psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
  797. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  798. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  799. psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
  800. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  801. psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
  802. psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
  803. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  804. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  805. psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
  806. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  807. psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
  808. psychopy/tests/data/numpyImage_height_local.png +0 -0
  809. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  810. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  811. psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
  812. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  813. psychopy/tests/data/numpyImage_stencil_local.png +0 -0
  814. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  815. psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
  816. psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
  817. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  818. psychopy/tests/data/shape2_1_stencil_local.png +0 -0
  819. psychopy/tests/data/text1_height_local.png +0 -0
  820. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  821. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  822. psychopy/tests/data/text1_norm_local.png +0 -0
  823. psychopy/tests/data/text1_stencil_local.png +0 -0
  824. psychopy/tests/data/wedge1_height_local.png +0 -0
  825. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  826. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  827. psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
  828. psychopy/tests/data/wedge1_norm_local.png +0 -0
  829. psychopy/tests/data/wedge1_stencil_local.png +0 -0
  830. psychopy/tests/test_app/.DS_Store +0 -0
  831. psychopy/tests/test_app/test_builder/.DS_Store +0 -0
  832. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
  833. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
  834. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
  835. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
  836. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
  837. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
  838. psychopy/tests/test_data/.DS_Store +0 -0
  839. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
  840. psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
  841. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
  842. psychopy/tests/test_visual/test_image.py.orig +0 -219
  843. psychopy/visual/basevisual.py.orig +0 -1723
  844. psychopy/visual/form.py.orig +0 -1181
  845. psychopy/visual/text.py.orig +0 -752
  846. psychopy/visual/textbox2/textbox2.py.orig +0 -1315
  847. psychopy/visual/windowwarp.py.orig +0 -463
  848. /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
  849. /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
  850. /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
  851. /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
  852. /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
  853. /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
  854. /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
  855. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  856. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  857. /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
  858. {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
  859. {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
  860. {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
psychopy/visual/window.py CHANGED
@@ -4,12 +4,9 @@
4
4
  """A class representing a window for displaying one or more stimuli"""
5
5
 
6
6
  # Part of the PsychoPy library
7
- # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
7
+ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
8
8
  # Distributed under the terms of the GNU General Public License (GPL).
9
9
 
10
-
11
-
12
-
13
10
  import ctypes
14
11
  import os
15
12
  import sys
@@ -26,10 +23,12 @@ import math
26
23
  # from psychopy.clock import monotonicClock
27
24
 
28
25
  # try to find avbin (we'll overload pyglet's load_library tool and then
29
- # add some paths)
26
+ # add some paths
30
27
  from ..colors import Color, colorSpaces
31
28
  from .textbox2 import TextBox2
32
29
 
30
+ import pyglet
31
+
33
32
 
34
33
  haveAvbin = False
35
34
 
@@ -85,6 +84,7 @@ from psychopy.tools.arraytools import val2array
85
84
  from psychopy.tools.monitorunittools import convertToPix
86
85
  import psychopy.tools.viewtools as viewtools
87
86
  import psychopy.tools.gltools as gltools
87
+ import psychopy.tools.mathtools as mathtools
88
88
  from .text import TextStim
89
89
  from .grating import GratingStim
90
90
  from .helpers import setColor
@@ -154,6 +154,7 @@ class Window():
154
154
  project (we won't be fixing pygame-specific bugs).
155
155
 
156
156
  """
157
+ USE_LEGACY_GL = pyglet.version < '2.0'
157
158
  def __init__(self,
158
159
  size=(800, 600),
159
160
  pos=None,
@@ -403,16 +404,6 @@ class Window():
403
404
  self.dkl_rgb = self.monitor.getDKL_RGB()
404
405
  self.lms_rgb = self.monitor.getLMS_RGB()
405
406
 
406
- # Projection and view matrices, these can be lists if multiple views are
407
- # being used.
408
- # NB - attribute checks needed for Rift compatibility
409
- if not hasattr(self, '_viewMatrix'):
410
- self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
411
-
412
- if not hasattr(self, '_projectionMatrix'):
413
- self._projectionMatrix = viewtools.orthoProjectionMatrix(
414
- -1, 1, -1, 1, -1, 1, dtype=numpy.float32)
415
-
416
407
  # set screen color
417
408
  self.__dict__['colorSpace'] = colorSpace
418
409
  if rgb is not None:
@@ -548,6 +539,11 @@ class Window():
548
539
  # gl viewport and scissor
549
540
  self._viewport = self._scissor = None # set later
550
541
 
542
+ self._fboVerts = numpy.ascontiguousarray(
543
+ [[-1, -1], [-1, 1], [1, 1], [1, -1]], dtype=numpy.float32)
544
+ self._fboTexCoords = numpy.ascontiguousarray(
545
+ [[0, 0], [0, 1], [1, 1], [1, 0]], dtype=numpy.float32)
546
+
551
547
  # scene light sources
552
548
  self._lights = []
553
549
  self._useLights = False
@@ -622,6 +618,15 @@ class Window():
622
618
  self._showSplash = False
623
619
  self.resetViewport() # set viewport to full window size
624
620
 
621
+ # transformation
622
+ self._projectionMatrix = numpy.identity(4, dtype=numpy.float32)
623
+ self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
624
+
625
+ self._projectionMatrixNeedsUpdate = True
626
+ self._viewMatrixNeedsUpdate = True
627
+
628
+ self.setOrthographicView()
629
+
625
630
  # piloting indicator
626
631
  self._pilotingIndicator = None
627
632
  self._showPilotingIndicator = False
@@ -745,11 +750,87 @@ class Window():
745
750
  viewPos_norm = viewPos_pix / (self.size / 2.0)
746
751
  # Clip to +/- 1; should going out-of-window raise an exception?
747
752
  viewPos_norm = numpy.clip(viewPos_norm, a_min=-1., a_max=1.)
753
+ self._viewMatrixNeedsUpdate = True
748
754
  self.__dict__['_viewPosNorm'] = viewPos_norm
749
755
 
750
756
  def setViewPos(self, value, log=True):
751
757
  setAttribute(self, 'viewPos', value, log=log)
752
758
 
759
+ @attributeSetter
760
+ def viewOri(self, value):
761
+ """Set the rotation of the view in degrees.
762
+
763
+ The rotation is applied around the origin of the window, which is
764
+ defined by the viewPos attribute. The rotation is applied after scaling
765
+ but before translation.
766
+
767
+ """
768
+ self.__dict__['viewOri'] = value
769
+ self._viewMatrixNeedsUpdate = True
770
+
771
+ def setViewOri(self, value, log=True):
772
+ setAttribute(self, 'viewOri', value, log=log)
773
+
774
+ @attributeSetter
775
+ def viewScale(self, value):
776
+ """Set the scale factors for the view.
777
+
778
+ The scaling is applied around the origin of the window, which is defined
779
+ by the viewPos attribute. The scaling is applied before translation and
780
+ rotation.
781
+
782
+ """
783
+ self.__dict__['viewScale'] = value
784
+ self._viewMatrixNeedsUpdate = True
785
+
786
+ def setViewScale(self, value, log=True):
787
+ setAttribute(self, 'viewScale', value, log=log)
788
+
789
+ def _updateViewMatrix(self):
790
+ """Update the default orthographic view matrix based on the current
791
+ window settings.
792
+ """
793
+ if self._viewMatrixNeedsUpdate:
794
+ if self.viewScale is None:
795
+ sx, sy = [1.0, 1.0]
796
+ else:
797
+ sx, sy = self.viewScale
798
+
799
+ if self.viewOri is None:
800
+ viewOri = 0.0
801
+ else:
802
+ viewOri = self.viewOri
803
+
804
+ if self.viewPos is None:
805
+ tx, ty = [0.0, 0.0]
806
+ else:
807
+ tx, ty = self.viewPos
808
+
809
+ scaleMatrix = mathtools.scaleMatrix([sx, sy, 1.0])
810
+ rotateMatrix = mathtools.rotationMatrix(viewOri, axis='-z')
811
+ translateMatrix = mathtools.translationMatrix([tx, ty, 0.0])
812
+
813
+ # compute SRT matrix
814
+ self._viewMatrix[:, :] = mathtools.multMatrix([
815
+ translateMatrix,
816
+ rotateMatrix,
817
+ scaleMatrix])
818
+ self._viewMatrixNeedsUpdate = False
819
+
820
+ def _updateProjectionMatrix(self):
821
+ """Update the default projection matrix based on the current window
822
+ settings.
823
+ """
824
+ if self._projectionMatrixNeedsUpdate:
825
+ widthOver2 = self.size[0] / 2.0
826
+ heightOver2 = self.size[1] / 2.0
827
+ self._projectionMatrix[:, :] = viewtools.orthoProjectionMatrix(
828
+ -widthOver2, widthOver2, # -X, +X
829
+ -heightOver2, heightOver2, # -Y, +Y
830
+ -1.0, 1.0, # -Z, +Z
831
+ dtype=numpy.float32)
832
+ self._projectionMatrixNeedsUpdate = False
833
+
753
834
  @property
754
835
  def fullscr(self):
755
836
  """Return whether the window is in fullscreen mode."""
@@ -848,10 +929,10 @@ class Window():
848
929
 
849
930
  # if we are using an FBO, bind it
850
931
  if hasattr(self, 'frameBuffer'):
851
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT,
932
+ GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER,
852
933
  self.frameBuffer)
853
- GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
854
- GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
934
+ GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
935
+ GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0)
855
936
 
856
937
  # NB - check if we need these
857
938
  GL.glActiveTexture(GL.GL_TEXTURE0)
@@ -1190,6 +1271,10 @@ class Window():
1190
1271
  # handle dragging
1191
1272
  if getattr(thisStim, "draggable", False):
1192
1273
  thisStim.doDragging()
1274
+
1275
+ if getattr(thisStim, "clickable", False):
1276
+ thisStim.doPointerActions()
1277
+
1193
1278
  else:
1194
1279
  self.backend.setCurrent()
1195
1280
 
@@ -1200,11 +1285,13 @@ class Window():
1200
1285
  self.scissorTest = True
1201
1286
 
1202
1287
  # clear the projection and modelview matrix for FBO blit
1203
- GL.glMatrixMode(GL.GL_PROJECTION)
1204
- GL.glLoadIdentity()
1205
- GL.glOrtho(-1, 1, -1, 1, -1, 1)
1206
- GL.glMatrixMode(GL.GL_MODELVIEW)
1207
- GL.glLoadIdentity()
1288
+ # DEPRECATED: these are all removed from OpenGL 3.1
1289
+ if self.USE_LEGACY_GL:
1290
+ GL.glMatrixMode(GL.GL_PROJECTION)
1291
+ GL.glLoadIdentity()
1292
+ GL.glOrtho(-1, 1, -1, 1, -1, 1)
1293
+ GL.glMatrixMode(GL.GL_MODELVIEW)
1294
+ GL.glLoadIdentity()
1208
1295
 
1209
1296
  # disable lighting
1210
1297
  self.useLights = False
@@ -1239,7 +1326,7 @@ class Window():
1239
1326
  # need blit the framebuffer object to the actual back buffer
1240
1327
 
1241
1328
  # unbind the framebuffer as the render target
1242
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
1329
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1243
1330
  GL.glDisable(GL.GL_BLEND)
1244
1331
  stencilOn = self.stencilTest
1245
1332
  self.stencilTest = False
@@ -1252,7 +1339,9 @@ class Window():
1252
1339
  GL.glActiveTexture(GL.GL_TEXTURE0)
1253
1340
  GL.glEnable(GL.GL_TEXTURE_2D)
1254
1341
  GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture)
1255
- GL.glColor3f(1.0, 1.0, 1.0) # glColor multiplies with texture
1342
+ if self.USE_LEGACY_GL:
1343
+ GL.glColor3f(1.0, 1.0, 1.0) # glColor multiplies with texture
1344
+
1256
1345
  GL.glColorMask(True, True, True, True)
1257
1346
 
1258
1347
  self._renderFBO()
@@ -1267,10 +1356,10 @@ class Window():
1267
1356
 
1268
1357
  if self.useFBO and flipThisFrame:
1269
1358
  # set rendering back to the framebuffer object
1270
- GL.glBindFramebufferEXT(
1271
- GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
1272
- GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
1273
- GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
1359
+ GL.glBindFramebuffer(
1360
+ GL.GL_FRAMEBUFFER, self.frameBuffer)
1361
+ GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
1362
+ GL.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0)
1274
1363
  # set to no active rendering texture
1275
1364
  GL.glActiveTexture(GL.GL_TEXTURE0)
1276
1365
  GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
@@ -1278,56 +1367,67 @@ class Window():
1278
1367
  self.stencilTest = True
1279
1368
 
1280
1369
  # rescale, reposition, & rotate
1281
- GL.glMatrixMode(GL.GL_MODELVIEW)
1282
- GL.glLoadIdentity()
1283
- if self.viewScale is not None:
1284
- GL.glScalef(self.viewScale[0], self.viewScale[1], 1)
1285
- absScaleX = abs(self.viewScale[0])
1286
- absScaleY = abs(self.viewScale[1])
1287
- else:
1288
- absScaleX, absScaleY = 1, 1
1289
-
1290
- if self.viewPos is not None:
1291
- # here we must use normalised units in _viewPosNorm,
1292
- # see the corresponding attributeSetter above
1293
- normRfPosX = self._viewPosNorm[0] / absScaleX
1294
- normRfPosY = self._viewPosNorm[1] / absScaleY
1295
-
1296
- GL.glTranslatef(normRfPosX, normRfPosY, 0.0)
1297
-
1298
- if self.viewOri: # float
1299
- # the logic below for flip is partially correct, but does not
1300
- # handle a nonzero viewPos
1301
- flip = 1
1370
+ # DEPRECATED: these are all removed from OpenGL 3.1
1371
+ if self.USE_LEGACY_GL:
1372
+ GL.glMatrixMode(GL.GL_MODELVIEW)
1373
+ GL.glLoadIdentity()
1302
1374
  if self.viewScale is not None:
1303
- _f = self.viewScale[0] * self.viewScale[1]
1304
- if _f < 0:
1305
- flip = -1
1306
- GL.glRotatef(flip * self.viewOri, 0.0, 0.0, -1.0)
1375
+ # DEPRECATED: these are all removed from OpenGL 3.1
1376
+ GL.glScalef(self.viewScale[0], self.viewScale[1], 1)
1377
+
1378
+ absScaleX = abs(self.viewScale[0])
1379
+ absScaleY = abs(self.viewScale[1])
1380
+ else:
1381
+ absScaleX, absScaleY = 1, 1
1382
+
1383
+ if self.viewPos is not None:
1384
+ # here we must use normalised units in _viewPosNorm,
1385
+ # see the corresponding attributeSetter above
1386
+ normRfPosX = self._viewPosNorm[0] / absScaleX
1387
+ normRfPosY = self._viewPosNorm[1] / absScaleY
1388
+
1389
+ # DEPRECATED: these are all removed from OpenGL 3.1
1390
+ GL.glTranslatef(normRfPosX, normRfPosY, 0.0)
1391
+
1392
+ if self.viewOri: # float
1393
+ # the logic below for flip is partially correct, but does not
1394
+ # handle a nonzero viewPos
1395
+ flip = 1
1396
+ if self.viewScale is not None:
1397
+ _f = self.viewScale[0] * self.viewScale[1]
1398
+ if _f < 0:
1399
+ flip = -1
1400
+ # DEPERECATED: these are all removed from OpenGL 3.1
1401
+ GL.glRotatef(flip * self.viewOri, 0.0, 0.0, -1.0)
1307
1402
 
1308
1403
  # reset returned buffer for next frame
1309
1404
  self._endOfFlip(clearBuffer)
1310
1405
 
1311
1406
  # waitBlanking
1312
1407
  if self.waitBlanking and flipThisFrame:
1313
- GL.glBegin(GL.GL_POINTS)
1314
- GL.glColor4f(0, 0, 0, 0)
1315
- if sys.platform == 'win32' and self.glVendor.startswith('ati'):
1316
- pass
1317
- else:
1318
- # this corrupts text rendering on win with some ATI cards :-(
1319
- GL.glVertex2i(10, 10)
1320
- GL.glEnd()
1408
+ # DEPRECATED: these are all removed from OpenGL 3.1
1409
+ if self.USE_LEGACY_GL:
1410
+ GL.glBegin(GL.GL_POINTS)
1411
+ GL.glColor4f(0, 0, 0, 0)
1412
+ if sys.platform == 'win32' and self.glVendor.startswith('ati'):
1413
+ pass
1414
+ else:
1415
+ # this corrupts text rendering on win with some ATI cards :-(
1416
+ GL.glVertex2i(10, 10)
1417
+ pass
1418
+ GL.glEnd()
1321
1419
  GL.glFinish()
1322
1420
 
1323
1421
  # get timestamp
1324
1422
  self._frameTime = now = logging.defaultClock.getTime()
1325
1423
  self._frameTimes.append(self._frameTime)
1326
1424
 
1327
- # run other functions immediately after flip completes
1328
- for callEntry in self._toCall:
1329
- callEntry['function'](*callEntry['args'], **callEntry['kwargs'])
1330
- del self._toCall[:]
1425
+ # run scheduled functions immediately after flip completes
1426
+ n_items = len(self._toCall)
1427
+ for i in range(n_items):
1428
+ self._toCall[i]['function'](*self._toCall[i]['args'], **self._toCall[i]['kwargs'])
1429
+ # leave newly scheduled functions for next flip
1430
+ del self._toCall[:n_items]
1331
1431
 
1332
1432
  # do bookkeeping
1333
1433
  if self.recordFrameIntervals:
@@ -1753,22 +1853,24 @@ class Window():
1753
1853
  def useLights(self, value):
1754
1854
  self._useLights = value
1755
1855
 
1756
- # Setup legacy lights, new spec shader programs should access the
1757
- # `lights` attribute directly to setup lighting uniforms.
1758
- if self._useLights and self._lights:
1759
- GL.glEnable(GL.GL_LIGHTING)
1760
- # make sure specular lights are computed relative to eye position,
1761
- # this is more realistic than the default. Does not affect shaders.
1762
- GL.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE)
1763
-
1764
- # update light positions for current model matrix
1765
- for index, light in enumerate(self._lights):
1766
- enumLight = GL.GL_LIGHT0 + index
1767
- pos = numpy.ctypeslib.as_ctypes(light.pos)
1768
- GL.glLightfv(enumLight, GL.GL_POSITION, pos)
1769
- else:
1770
- # disable lights
1771
- GL.glDisable(GL.GL_LIGHTING)
1856
+ # DEPRECATED: this is not needed in modern OpenGL
1857
+
1858
+ # # Setup legacy lights, new spec shader programs should access the
1859
+ # # `lights` attribute directly to setup lighting uniforms.
1860
+ # if self._useLights and self._lights:
1861
+ # GL.glEnable(GL.GL_LIGHTING)
1862
+ # # make sure specular lights are computed relative to eye position,
1863
+ # # this is more realistic than the default. Does not affect shaders.
1864
+ # GL.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE)
1865
+
1866
+ # # update light positions for current model matrix
1867
+ # for index, light in enumerate(self._lights):
1868
+ # enumLight = GL.GL_LIGHT0 + index
1869
+ # pos = numpy.ctypeslib.as_ctypes(light.pos)
1870
+ # GL.glLightfv(enumLight, GL.GL_POSITION, pos)
1871
+ # else:
1872
+ # # disable lights
1873
+ # GL.glDisable(GL.GL_LIGHTING)
1772
1874
 
1773
1875
  def updateLights(self, index=None):
1774
1876
  """Explicitly update scene lights if they were modified.
@@ -1999,6 +2101,16 @@ class Window():
1999
2101
  def convergeOffset(self, value):
2000
2102
  self._convergeOffset = value / 100.0
2001
2103
 
2104
+ def _clearDepthBuffer(self):
2105
+ """Clear the depth buffer.
2106
+ """
2107
+ oldDepthMask = self.depthMask
2108
+ GL.glDepthMask(GL.GL_TRUE)
2109
+ GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
2110
+
2111
+ if oldDepthMask is False: # return to old state if needed
2112
+ GL.glDepthMask(GL.GL_FALSE)
2113
+
2002
2114
  def setOffAxisView(self, applyTransform=True, clearDepth=True):
2003
2115
  """Set an off-axis projection.
2004
2116
 
@@ -2155,6 +2267,35 @@ class Window():
2155
2267
  if applyTransform:
2156
2268
  self.applyEyeTransform(clearDepth=clearDepth)
2157
2269
 
2270
+ def setOrthographicView(self, applyTransform=True, clearDepth=True):
2271
+ """Set the projection and view matrix to render with orthographic view.
2272
+
2273
+ Orthographic projection is used to render 3D objects without perspective
2274
+ distortion. The scene origin is centered on the screen plane. The
2275
+ frustum is defined by the size of the window in pixels, with the origin
2276
+ at the center of the window. 2D stimuli are typically drawn using this
2277
+ projection.
2278
+
2279
+ Note that the values of :py:attr:`~Window.projectionMatrix` and
2280
+ :py:attr:`~Window.viewMatrix` will be replaced when calling this
2281
+ function.
2282
+
2283
+ Parameters
2284
+ ----------
2285
+ applyTransform : bool
2286
+ Apply transformations after computing them in immediate mode. Same
2287
+ as calling :py:attr:`~Window.applyEyeTransform()` afterwards if
2288
+ `False`.
2289
+ clearDepth : bool, optional
2290
+ Clear the depth buffer.
2291
+
2292
+ """
2293
+ self._updateProjectionMatrix()
2294
+ self._updateViewMatrix()
2295
+
2296
+ if applyTransform:
2297
+ self.applyEyeTransform(clearDepth=clearDepth)
2298
+
2158
2299
  def applyEyeTransform(self, clearDepth=True):
2159
2300
  """Apply the current view and projection matrices.
2160
2301
 
@@ -2164,7 +2305,8 @@ class Window():
2164
2305
  :py:attr:`~Window.flip()` is called.
2165
2306
 
2166
2307
  All transformations in ``GL_PROJECTION`` and ``GL_MODELVIEW`` matrix
2167
- stacks will be cleared (set to identity) prior to applying.
2308
+ stacks will be cleared (set to identity) prior to applying. After this
2309
+ is called, the current matrix mode will be set to ``GL_MODELVIEW``.
2168
2310
 
2169
2311
  Parameters
2170
2312
  ----------
@@ -2184,15 +2326,14 @@ class Window():
2184
2326
  # draw 3D objects here ...
2185
2327
 
2186
2328
  """
2187
- # apply the projection and view transformations
2188
- if hasattr(self, '_projectionMatrix'):
2329
+ if self.USE_LEGACY_GL:
2330
+ # apply the projection and view transformations
2189
2331
  GL.glMatrixMode(GL.GL_PROJECTION)
2190
2332
  GL.glLoadIdentity()
2191
2333
  projMat = self._projectionMatrix.ctypes.data_as(
2192
2334
  ctypes.POINTER(ctypes.c_float))
2193
2335
  GL.glMultTransposeMatrixf(projMat)
2194
2336
 
2195
- if hasattr(self, '_viewMatrix'):
2196
2337
  GL.glMatrixMode(GL.GL_MODELVIEW)
2197
2338
  GL.glLoadIdentity()
2198
2339
  viewMat = self._viewMatrix.ctypes.data_as(
@@ -2238,16 +2379,10 @@ class Window():
2238
2379
  win.flip()
2239
2380
 
2240
2381
  """
2241
- # should eventually have the same effect as calling _onResize(), so we
2242
- # need to add the retina mode stuff eventually
2243
- if hasattr(self, '_viewMatrix'):
2244
- self._viewMatrix = numpy.identity(4, dtype=numpy.float32)
2382
+ self.setOrthographicView(clearDepth)
2245
2383
 
2246
- if hasattr(self, '_projectionMatrix'):
2247
- self._projectionMatrix = viewtools.orthoProjectionMatrix(
2248
- -1, 1, -1, 1, -1, 1, dtype=numpy.float32)
2249
-
2250
- self.applyEyeTransform(clearDepth)
2384
+ if self.USE_LEGACY_GL:
2385
+ self.applyEyeTransform(clearDepth)
2251
2386
 
2252
2387
  def coordToRay(self, screenXY):
2253
2388
  """Convert a screen coordinate to a direction vector.
@@ -2431,12 +2566,12 @@ class Window():
2431
2566
  """
2432
2567
  # do the reading of the pixels
2433
2568
  if buffer == 'back' and self.useFBO:
2434
- GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
2569
+ GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
2435
2570
  elif buffer == 'back':
2436
2571
  GL.glReadBuffer(GL.GL_BACK)
2437
2572
  elif buffer == 'front':
2438
2573
  if self.useFBO:
2439
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
2574
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
2440
2575
  GL.glReadBuffer(GL.GL_FRONT)
2441
2576
  else:
2442
2577
  raise ValueError("Requested read from buffer '{}' but should be "
@@ -2463,7 +2598,7 @@ class Window():
2463
2598
 
2464
2599
  # rebind front buffer if needed
2465
2600
  if buffer == 'front' and self.useFBO:
2466
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
2601
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
2467
2602
 
2468
2603
  # if we want the color data without an alpha channel, we need to
2469
2604
  # convert the data to a numpy array and remove the alpha channel
@@ -2484,12 +2619,12 @@ class Window():
2484
2619
  # GL.glLoadIdentity()
2485
2620
  # do the reading of the pixels
2486
2621
  if buffer == 'back' and self.useFBO:
2487
- GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0_EXT)
2622
+ GL.glReadBuffer(GL.GL_COLOR_ATTACHMENT0)
2488
2623
  elif buffer == 'back':
2489
2624
  GL.glReadBuffer(GL.GL_BACK)
2490
2625
  elif buffer == 'front':
2491
2626
  if self.useFBO:
2492
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
2627
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
2493
2628
  GL.glReadBuffer(GL.GL_FRONT)
2494
2629
  else:
2495
2630
  raise ValueError("Requested read from buffer '{}' but should be "
@@ -2523,7 +2658,7 @@ class Window():
2523
2658
  im = im.convert('RGB')
2524
2659
 
2525
2660
  if self.useFBO and buffer == 'front':
2526
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
2661
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
2527
2662
  return im
2528
2663
 
2529
2664
  @property
@@ -3141,8 +3276,10 @@ class Window():
3141
3276
  thisScale = numpy.array([lw, lw] / self.size * retinaScale / 38.0)
3142
3277
  # actually set the scale as appropriate
3143
3278
  # allows undoing of a previous scaling procedure
3144
- thisScale = thisScale / numpy.asarray(prevScale)
3145
- GL.glScalef(thisScale[0], thisScale[1], 1.0)
3279
+ if self.USE_LEGACY_GL:
3280
+ thisScale = thisScale / numpy.asarray(prevScale)
3281
+ GL.glScalef(thisScale[0], thisScale[1], 1.0)
3282
+
3146
3283
  return thisScale
3147
3284
 
3148
3285
  def _checkMatchingSizes(self, requested, actual):
@@ -3167,21 +3304,23 @@ class Window():
3167
3304
  (0, 0, self.frameBufferSize[0], self.frameBufferSize[1])
3168
3305
  self.scissorTest = True
3169
3306
  self.stencilTest = False
3307
+ self.depthTest = False
3170
3308
 
3171
- GL.glMatrixMode(GL.GL_PROJECTION) # Reset the projection matrix
3172
- GL.glLoadIdentity()
3173
- GL.gluOrtho2D(-1, 1, -1, 1)
3309
+ if self.USE_LEGACY_GL:
3310
+ GL.glMatrixMode(GL.GL_PROJECTION) # Reset the projection matrix
3311
+ GL.glLoadIdentity()
3312
+ GL.gluOrtho2D(-1, 1, -1, 1)
3174
3313
 
3175
- GL.glMatrixMode(GL.GL_MODELVIEW) # Reset the modelview matrix
3176
- GL.glLoadIdentity()
3314
+ GL.glMatrixMode(GL.GL_MODELVIEW) # Reset the modelview matrix
3315
+ GL.glLoadIdentity()
3177
3316
 
3178
- self.depthTest = False
3179
- # GL.glEnable(GL.GL_DEPTH_TEST) # Enables Depth Testing
3180
- # GL.glDepthFunc(GL.GL_LESS) # The Type Of Depth Test To Do
3181
- GL.glEnable(GL.GL_BLEND)
3317
+ GL.glEnable(GL.GL_DEPTH_TEST) # Enables Depth Testing
3318
+ GL.glDepthFunc(GL.GL_LESS) # The Type Of Depth Test To Do
3319
+
3320
+ GL.glShadeModel(GL.GL_SMOOTH) # Color Shading (FLAT or SMOOTH)
3321
+ GL.glEnable(GL.GL_POINT_SMOOTH) # Enable Point Smoothing
3182
3322
 
3183
- GL.glShadeModel(GL.GL_SMOOTH) # Color Shading (FLAT or SMOOTH)
3184
- GL.glEnable(GL.GL_POINT_SMOOTH)
3323
+ GL.glEnable(GL.GL_BLEND)
3185
3324
 
3186
3325
  # check for GL_ARB_texture_float
3187
3326
  # (which is needed for shaders to be useful)
@@ -3212,8 +3351,13 @@ class Window():
3212
3351
  self.blendMode = 'avg'
3213
3352
 
3214
3353
  def _setupShaders(self):
3215
- self._progSignedTexFont = _shaders.compileProgram(
3216
- _shaders.vertSimple, _shaders.fragSignedColorTexFont)
3354
+ if self.USE_LEGACY_GL:
3355
+ self._progSignedTexFont = _shaders.compileProgram(
3356
+ _shaders.vertSimple, _shaders.fragSignedColorTexFont)
3357
+ else:
3358
+ self._progSignedTexFont = _shaders.compileProgram(
3359
+ _shaders.vertSimpleText, _shaders.fragSignedColorTexFont)
3360
+
3217
3361
  self._progFBOtoFrame = _shaders.compileProgram(
3218
3362
  _shaders.vertSimple, _shaders.fragFBOtoFrame)
3219
3363
  self._shaders = {}
@@ -3237,102 +3381,124 @@ class Window():
3237
3381
  _shaders.vertSimple, _shaders.fragImageStim)
3238
3382
  self._shaders['imageStim_adding'] = _shaders.compileProgram(
3239
3383
  _shaders.vertSimple, _shaders.fragImageStim_adding)
3240
- self._shaders['stim3d_phong'] = {}
3241
-
3242
- # Create shader flags, these are used as keys to pick the appropriate
3243
- # shader for the given material and lighting configuration.
3244
- shaderFlags = []
3245
- for i in range(0, 8 + 1):
3246
- for j in product((True, False), repeat=1):
3247
- shaderFlags.append((i, j[0]))
3248
-
3249
- # Compile shaders based on generated flags.
3250
- for flag in shaderFlags:
3251
- # Define GLSL preprocessor values to enable code paths for specific
3252
- # material properties.
3253
- srcDefs = {'MAX_LIGHTS': flag[0]}
3254
-
3255
- if flag[1]: # has diffuse texture map
3256
- srcDefs['DIFFUSE_TEXTURE'] = 1
3257
-
3258
- # embed #DEFINE statements in GLSL source code
3259
- vertSrc = gltools.embedShaderSourceDefs(
3260
- _shaders.vertPhongLighting, srcDefs)
3261
- fragSrc = gltools.embedShaderSourceDefs(
3262
- _shaders.fragPhongLighting, srcDefs)
3263
-
3264
- # build a shader program
3265
- prog = gltools.createProgramObjectARB()
3266
- vertexShader = gltools.compileShaderObjectARB(
3267
- vertSrc, GL.GL_VERTEX_SHADER_ARB)
3268
- fragmentShader = gltools.compileShaderObjectARB(
3269
- fragSrc, GL.GL_FRAGMENT_SHADER_ARB)
3270
-
3271
- gltools.attachObjectARB(prog, vertexShader)
3272
- gltools.attachObjectARB(prog, fragmentShader)
3273
- gltools.linkProgramObjectARB(prog)
3274
- gltools.detachObjectARB(prog, vertexShader)
3275
- gltools.detachObjectARB(prog, fragmentShader)
3276
- gltools.deleteObjectARB(vertexShader)
3277
- gltools.deleteObjectARB(fragmentShader)
3278
-
3279
- # set the flag
3280
- self._shaders['stim3d_phong'][flag] = prog
3384
+ # self._shaders['stim3d_phong'] = {}
3385
+
3386
+ # # Create shader flags, these are used as keys to pick the appropriate
3387
+ # # shader for the given material and lighting configuration.
3388
+ # shaderFlags = []
3389
+ # for i in range(0, 8 + 1):
3390
+ # for j in product((True, False), repeat=1):
3391
+ # shaderFlags.append((i, j[0]))
3392
+
3393
+ # # Compile shaders based on generated flags.
3394
+ # for flag in shaderFlags:
3395
+ # # Define GLSL preprocessor values to enable code paths for specific
3396
+ # # material properties.
3397
+ # srcDefs = {'MAX_LIGHTS': flag[0]}
3398
+
3399
+ # if flag[1]: # has diffuse texture map
3400
+ # srcDefs['DIFFUSE_TEXTURE'] = 1
3401
+
3402
+ # # embed #DEFINE statements in GLSL source code
3403
+ # vertSrc = gltools.embedShaderSourceDefs(
3404
+ # _shaders.vertPhongLighting, srcDefs)
3405
+ # fragSrc = gltools.embedShaderSourceDefs(
3406
+ # _shaders.fragPhongLighting, srcDefs)
3407
+
3408
+ # # build a shader program
3409
+ # prog = gltools.createProgram()
3410
+ # vertexShader = gltools.compileShader(
3411
+ # vertSrc, GL.GL_VERTEX_SHADER)
3412
+ # fragmentShader = gltools.compileShader(
3413
+ # fragSrc, GL.GL_FRAGMENT_SHADER)
3414
+
3415
+ # gltools.attachShader(prog, vertexShader)
3416
+ # gltools.attachShader(prog, fragmentShader)
3417
+ # gltools.linkProgram(prog)
3418
+ # gltools.detachShader(prog, vertexShader)
3419
+ # gltools.detachShader(prog, fragmentShader)
3420
+ # gltools.deleteShader(vertexShader)
3421
+ # gltools.deleteShader(fragmentShader)
3422
+
3423
+ # # set the flag
3424
+ # self._shaders['stim3d_phong'][flag] = prog
3281
3425
 
3282
3426
  def _setupFrameBuffer(self):
3427
+ """Setup the framebuffer object for this window.
3428
+
3429
+ Returns
3430
+ -------
3431
+ bool
3432
+ `True` if the framebuffer was successfully setup, `False` otherwise.
3433
+ If `False`, the framebuffer was not complete. Make sure that your
3434
+ driver supports the necessary formats.
3283
3435
 
3436
+ """
3284
3437
  # Setup framebuffer
3285
3438
  self.frameBuffer = GL.GLuint()
3286
- GL.glGenFramebuffersEXT(1, ctypes.byref(self.frameBuffer))
3287
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
3439
+ GL.glGenFramebuffers(1, ctypes.byref(self.frameBuffer))
3440
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
3288
3441
 
3289
3442
  # Create texture to render to
3290
3443
  self.frameTexture = GL.GLuint()
3291
3444
  GL.glGenTextures(1, ctypes.byref(self.frameTexture))
3292
3445
  GL.glBindTexture(GL.GL_TEXTURE_2D, self.frameTexture)
3293
- GL.glTexParameteri(GL.GL_TEXTURE_2D,
3294
- GL.GL_TEXTURE_MAG_FILTER,
3295
- GL.GL_LINEAR)
3296
- GL.glTexParameteri(GL.GL_TEXTURE_2D,
3297
- GL.GL_TEXTURE_MIN_FILTER,
3298
- GL.GL_LINEAR)
3299
- GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F_ARB,
3300
- int(self.size[0]), int(self.size[1]), 0,
3301
- GL.GL_RGBA, GL.GL_FLOAT, None)
3446
+ GL.glTexParameteri(
3447
+ GL.GL_TEXTURE_2D,
3448
+ GL.GL_TEXTURE_MAG_FILTER,
3449
+ GL.GL_LINEAR)
3450
+ GL.glTexParameteri(
3451
+ GL.GL_TEXTURE_2D,
3452
+ GL.GL_TEXTURE_MIN_FILTER,
3453
+ GL.GL_LINEAR)
3454
+ GL.glTexImage2D(
3455
+ GL.GL_TEXTURE_2D, 0, GL.GL_RGBA32F,
3456
+ int(self.size[0]), int(self.size[1]), 0,
3457
+ GL.GL_RGBA, GL.GL_FLOAT, None)
3302
3458
  # attach texture to the frame buffer
3303
- GL.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT,
3304
- GL.GL_COLOR_ATTACHMENT0_EXT,
3305
- GL.GL_TEXTURE_2D, self.frameTexture, 0)
3459
+ GL.glFramebufferTexture2D(
3460
+ GL.GL_FRAMEBUFFER,
3461
+ GL.GL_COLOR_ATTACHMENT0,
3462
+ GL.GL_TEXTURE_2D,
3463
+ self.frameTexture, 0)
3306
3464
 
3307
3465
  # add a stencil buffer
3308
3466
  self._stencilTexture = GL.GLuint()
3309
- GL.glGenRenderbuffersEXT(1, ctypes.byref(
3467
+ GL.glGenRenderbuffers(1, ctypes.byref(
3310
3468
  self._stencilTexture)) # like glGenTextures
3311
- GL.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, self._stencilTexture)
3312
- GL.glRenderbufferStorageEXT(GL.GL_RENDERBUFFER_EXT,
3313
- GL.GL_DEPTH24_STENCIL8_EXT,
3314
- int(self.size[0]), int(self.size[1]))
3315
- GL.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_EXT,
3316
- GL.GL_DEPTH_ATTACHMENT_EXT,
3317
- GL.GL_RENDERBUFFER_EXT,
3318
- self._stencilTexture)
3319
- GL.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_EXT,
3320
- GL.GL_STENCIL_ATTACHMENT_EXT,
3321
- GL.GL_RENDERBUFFER_EXT,
3322
- self._stencilTexture)
3323
-
3324
- status = GL.glCheckFramebufferStatusEXT(GL.GL_FRAMEBUFFER_EXT)
3325
- if status != GL.GL_FRAMEBUFFER_COMPLETE_EXT:
3469
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, self._stencilTexture)
3470
+ GL.glRenderbufferStorage(
3471
+ GL.GL_RENDERBUFFER,
3472
+ GL.GL_DEPTH24_STENCIL8,
3473
+ int(self.size[0]), int(self.size[1]))
3474
+ GL.glFramebufferRenderbuffer(
3475
+ GL.GL_FRAMEBUFFER,
3476
+ GL.GL_DEPTH_ATTACHMENT,
3477
+ GL.GL_RENDERBUFFER,
3478
+ self._stencilTexture)
3479
+ GL.glFramebufferRenderbuffer(
3480
+ GL.GL_FRAMEBUFFER,
3481
+ GL.GL_STENCIL_ATTACHMENT,
3482
+ GL.GL_RENDERBUFFER,
3483
+ self._stencilTexture)
3484
+
3485
+ # check the framebuffer status
3486
+ status = GL.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER)
3487
+ if status != GL.GL_FRAMEBUFFER_COMPLETE:
3326
3488
  logging.error("Error in framebuffer activation")
3327
3489
  # UNBIND THE FRAME BUFFER OBJECT THAT WE HAD CREATED
3328
- GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
3490
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
3491
+
3329
3492
  return False
3493
+
3330
3494
  GL.glDisable(GL.GL_TEXTURE_2D)
3495
+
3331
3496
  # clear the buffers (otherwise the texture memory can contain
3332
3497
  # junk from other app)
3333
3498
  GL.glClear(GL.GL_COLOR_BUFFER_BIT)
3334
3499
  GL.glClear(GL.GL_STENCIL_BUFFER_BIT)
3335
3500
  GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
3501
+
3336
3502
  return True
3337
3503
 
3338
3504
  @property
@@ -3656,22 +3822,29 @@ class Window():
3656
3822
 
3657
3823
  (in this case a copy operation without any warping)
3658
3824
  """
3659
- GL.glBegin(GL.GL_QUADS)
3660
- GL.glTexCoord2f(0.0, 0.0)
3661
- GL.glVertex2f(-1.0, -1.0)
3662
- GL.glTexCoord2f(0.0, 1.0)
3663
- GL.glVertex2f(-1.0, 1.0)
3664
- GL.glTexCoord2f(1.0, 1.0)
3665
- GL.glVertex2f(1.0, 1.0)
3666
- GL.glTexCoord2f(1.0, 0.0)
3667
- GL.glVertex2f(1.0, -1.0)
3668
- GL.glEnd()
3825
+ if self.USE_LEGACY_GL:
3826
+ GL.glBegin(GL.GL_QUADS)
3827
+ GL.glTexCoord2f(0.0, 0.0)
3828
+ GL.glVertex2f(-1.0, -1.0)
3829
+ GL.glTexCoord2f(0.0, 1.0)
3830
+ GL.glVertex2f(-1.0, 1.0)
3831
+ GL.glTexCoord2f(1.0, 1.0)
3832
+ GL.glVertex2f(1.0, 1.0)
3833
+ GL.glTexCoord2f(1.0, 0.0)
3834
+ GL.glVertex2f(1.0, -1.0)
3835
+ GL.glEnd()
3836
+ else:
3837
+ gltools.setUniformSampler2D(self._progFBOtoFrame, b'texture', 0)
3838
+ gltools.drawClientArrays({
3839
+ 'gl_Vertex': self._fboVerts,
3840
+ 'gl_MultiTexCoord0': self._fboTexCoords},
3841
+ 'GL_QUADS')
3669
3842
 
3670
3843
  def _prepareFBOrender(self):
3671
- GL.glUseProgram(self._progFBOtoFrame)
3844
+ gltools.useProgram(self._progFBOtoFrame)
3672
3845
 
3673
3846
  def _finishFBOrender(self):
3674
- GL.glUseProgram(0)
3847
+ gltools.useProgram(None)
3675
3848
 
3676
3849
  def _afterFBOrender(self):
3677
3850
  pass