psychopy 2024.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 (2950) hide show
  1. psychopy/CHANGELOG.txt +3571 -0
  2. psychopy/LICENSE.txt +11 -0
  3. psychopy/LICENSES.txt +55 -0
  4. psychopy/__init__.py +74 -0
  5. psychopy/alerts/__init__.py +65 -0
  6. psychopy/alerts/_alerts.py +184 -0
  7. psychopy/alerts/_errorHandler.py +51 -0
  8. psychopy/alerts/alertsCatalogue/1000.yaml +0 -0
  9. psychopy/alerts/alertsCatalogue/1100.yaml +0 -0
  10. psychopy/alerts/alertsCatalogue/1500.yaml +0 -0
  11. psychopy/alerts/alertsCatalogue/2000.yaml +0 -0
  12. psychopy/alerts/alertsCatalogue/2100.yaml +0 -0
  13. psychopy/alerts/alertsCatalogue/2110.yaml +0 -0
  14. psychopy/alerts/alertsCatalogue/2115.yaml +21 -0
  15. psychopy/alerts/alertsCatalogue/2120.yaml +22 -0
  16. psychopy/alerts/alertsCatalogue/2150.yaml +0 -0
  17. psychopy/alerts/alertsCatalogue/2155.yaml +21 -0
  18. psychopy/alerts/alertsCatalogue/2300.yaml +0 -0
  19. psychopy/alerts/alertsCatalogue/2500.yaml +0 -0
  20. psychopy/alerts/alertsCatalogue/3000.yaml +0 -0
  21. psychopy/alerts/alertsCatalogue/3100.yaml +0 -0
  22. psychopy/alerts/alertsCatalogue/3110.yaml +25 -0
  23. psychopy/alerts/alertsCatalogue/3115.yaml +24 -0
  24. psychopy/alerts/alertsCatalogue/3200.yaml +0 -0
  25. psychopy/alerts/alertsCatalogue/3400.yaml +0 -0
  26. psychopy/alerts/alertsCatalogue/4000.yaml +0 -0
  27. psychopy/alerts/alertsCatalogue/4051.yaml +19 -0
  28. psychopy/alerts/alertsCatalogue/4052.yaml +19 -0
  29. psychopy/alerts/alertsCatalogue/4100.yaml +0 -0
  30. psychopy/alerts/alertsCatalogue/4105.yaml +18 -0
  31. psychopy/alerts/alertsCatalogue/4115.yaml +21 -0
  32. psychopy/alerts/alertsCatalogue/4120.yaml +19 -0
  33. psychopy/alerts/alertsCatalogue/4125.yaml +23 -0
  34. psychopy/alerts/alertsCatalogue/4200.yaml +0 -0
  35. psychopy/alerts/alertsCatalogue/4205.yaml +19 -0
  36. psychopy/alerts/alertsCatalogue/4210.yaml +19 -0
  37. psychopy/alerts/alertsCatalogue/4305.yaml +21 -0
  38. psychopy/alerts/alertsCatalogue/4310.yaml +21 -0
  39. psychopy/alerts/alertsCatalogue/4315.yaml +21 -0
  40. psychopy/alerts/alertsCatalogue/4320.yaml +19 -0
  41. psychopy/alerts/alertsCatalogue/4325.yaml +23 -0
  42. psychopy/alerts/alertsCatalogue/4330.yaml +19 -0
  43. psychopy/alerts/alertsCatalogue/4335.yaml +19 -0
  44. psychopy/alerts/alertsCatalogue/4340.yaml +19 -0
  45. psychopy/alerts/alertsCatalogue/4405.yaml +24 -0
  46. psychopy/alerts/alertsCatalogue/4505.yaml +22 -0
  47. psychopy/alerts/alertsCatalogue/4510.yaml +25 -0
  48. psychopy/alerts/alertsCatalogue/4520.yaml +26 -0
  49. psychopy/alerts/alertsCatalogue/4530.yaml +23 -0
  50. psychopy/alerts/alertsCatalogue/4540.yaml +19 -0
  51. psychopy/alerts/alertsCatalogue/4545.yaml +22 -0
  52. psychopy/alerts/alertsCatalogue/4550.yaml +19 -0
  53. psychopy/alerts/alertsCatalogue/4605.yaml +22 -0
  54. psychopy/alerts/alertsCatalogue/4610.yaml +22 -0
  55. psychopy/alerts/alertsCatalogue/4615.yaml +19 -0
  56. psychopy/alerts/alertsCatalogue/4705.yaml +19 -0
  57. psychopy/alerts/alertsCatalogue/4710.yaml +19 -0
  58. psychopy/alerts/alertsCatalogue/5000.yaml +0 -0
  59. psychopy/alerts/alertsCatalogue/5055.yaml +25 -0
  60. psychopy/alerts/alertsCatalogue/6000.yaml +0 -0
  61. psychopy/alerts/alertsCatalogue/6105.yaml +18 -0
  62. psychopy/alerts/alertsCatalogue/7105.yaml +19 -0
  63. psychopy/alerts/alertsCatalogue/8105.yaml +21 -0
  64. psychopy/alerts/alertsCatalogue/8110.yaml +21 -0
  65. psychopy/alerts/alertsCatalogue/9998.yaml +19 -0
  66. psychopy/alerts/alertsCatalogue/9999.yaml +19 -0
  67. psychopy/alerts/alertsCatalogue/alertCategories.yaml +109 -0
  68. psychopy/alerts/alertsCatalogue/alertTemplate.yaml +19 -0
  69. psychopy/alerts/alertsCatalogue/alertmsg.py +144 -0
  70. psychopy/alerts/alertsCatalogue/generateAlertmsg.py +34 -0
  71. psychopy/alerts/alerttools.py +338 -0
  72. psychopy/app/Resources/Psychopy Window Favicon@16w.png +0 -0
  73. psychopy/app/Resources/Psychopy Window Favicon@32w.png +0 -0
  74. psychopy/app/Resources/README.md +12 -0
  75. psychopy/app/Resources/USB-C.png +0 -0
  76. psychopy/app/Resources/USB.png +0 -0
  77. psychopy/app/Resources/__init__.py +0 -0
  78. psychopy/app/Resources/builder.ico +0 -0
  79. psychopy/app/Resources/classic/FlowBottom_CompLeft.png +0 -0
  80. psychopy/app/Resources/classic/FlowBottom_CompRight.png +0 -0
  81. psychopy/app/Resources/classic/FlowTop_CompLeft.png +0 -0
  82. psychopy/app/Resources/classic/FlowTop_CompRight.png +0 -0
  83. psychopy/app/Resources/classic/README.txt +9 -0
  84. psychopy/app/Resources/classic/__init__.py +0 -0
  85. psychopy/app/Resources/classic/_layouts.ai +1138 -1
  86. psychopy/app/Resources/classic/add.png +0 -0
  87. psychopy/app/Resources/classic/add@2x.png +0 -0
  88. psychopy/app/Resources/classic/addExp32.png +0 -0
  89. psychopy/app/Resources/classic/alerts.png +0 -0
  90. psychopy/app/Resources/classic/beta.png +0 -0
  91. psychopy/app/Resources/classic/browser.png +0 -0
  92. psychopy/app/Resources/classic/browser@2x.png +0 -0
  93. psychopy/app/Resources/classic/bug16.png +0 -0
  94. psychopy/app/Resources/classic/circle_mask.png +0 -0
  95. psychopy/app/Resources/classic/circle_mask@2x.png +0 -0
  96. psychopy/app/Resources/classic/clear.png +0 -0
  97. psychopy/app/Resources/classic/clear@2x.png +0 -0
  98. psychopy/app/Resources/classic/coderclass16.png +0 -0
  99. psychopy/app/Resources/classic/coderfunc16.png +0 -0
  100. psychopy/app/Resources/classic/coderimport16.png +0 -0
  101. psychopy/app/Resources/classic/coderjs16.png +0 -0
  102. psychopy/app/Resources/classic/coderpython16.png +0 -0
  103. psychopy/app/Resources/classic/codervar16.png +0 -0
  104. psychopy/app/Resources/classic/cogwindow32.png +0 -0
  105. psychopy/app/Resources/classic/color32.png +0 -0
  106. psychopy/app/Resources/classic/compile32.png +0 -0
  107. psychopy/app/Resources/classic/compile_js.png +0 -0
  108. psychopy/app/Resources/classic/compile_js@2x.png +0 -0
  109. psychopy/app/Resources/classic/compile_py.png +0 -0
  110. psychopy/app/Resources/classic/compile_py@2x.png +0 -0
  111. psychopy/app/Resources/classic/copy16.png +0 -0
  112. psychopy/app/Resources/classic/currentFile.png +0 -0
  113. psychopy/app/Resources/classic/currentFile@2x.png +0 -0
  114. psychopy/app/Resources/classic/delete16.png +0 -0
  115. psychopy/app/Resources/classic/desktop.png +0 -0
  116. psychopy/app/Resources/classic/desktop@2x.png +0 -0
  117. psychopy/app/Resources/classic/dirup16.png +0 -0
  118. psychopy/app/Resources/classic/docclose16.png +0 -0
  119. psychopy/app/Resources/classic/download.png +0 -0
  120. psychopy/app/Resources/classic/edit.png +0 -0
  121. psychopy/app/Resources/classic/edit@2x.png +0 -0
  122. psychopy/app/Resources/classic/editbtn.png +0 -0
  123. psychopy/app/Resources/classic/editbtn16.png +0 -0
  124. psychopy/app/Resources/classic/editbtn16@2x.png +0 -0
  125. psychopy/app/Resources/classic/editbtn@2x.png +0 -0
  126. psychopy/app/Resources/classic/email.png +0 -0
  127. psychopy/app/Resources/classic/email@2x.png +0 -0
  128. psychopy/app/Resources/classic/experiment.png +0 -0
  129. psychopy/app/Resources/classic/experiment@2x.png +0 -0
  130. psychopy/app/Resources/classic/expsettings.png +0 -0
  131. psychopy/app/Resources/classic/expsettings@2x.png +0 -0
  132. psychopy/app/Resources/classic/file.png +0 -0
  133. psychopy/app/Resources/classic/file@2x.png +0 -0
  134. psychopy/app/Resources/classic/filecsv16.png +0 -0
  135. psychopy/app/Resources/classic/fileimage16.png +0 -0
  136. psychopy/app/Resources/classic/filenew.png +0 -0
  137. psychopy/app/Resources/classic/filenew32.png +0 -0
  138. psychopy/app/Resources/classic/filenew@2x.png +0 -0
  139. psychopy/app/Resources/classic/fileopen.png +0 -0
  140. psychopy/app/Resources/classic/fileopen32.png +0 -0
  141. psychopy/app/Resources/classic/fileopen@2x.png +0 -0
  142. psychopy/app/Resources/classic/filesave.png +0 -0
  143. psychopy/app/Resources/classic/filesave32.png +0 -0
  144. psychopy/app/Resources/classic/filesave@2x.png +0 -0
  145. psychopy/app/Resources/classic/filesaveas.png +0 -0
  146. psychopy/app/Resources/classic/filesaveas32.png +0 -0
  147. psychopy/app/Resources/classic/filesaveas@2x.png +0 -0
  148. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  149. psychopy/app/Resources/classic/filter.png +0 -0
  150. psychopy/app/Resources/classic/filter@2x.png +0 -0
  151. psychopy/app/Resources/classic/folder-open16.png +0 -0
  152. psychopy/app/Resources/classic/folder16.png +0 -0
  153. psychopy/app/Resources/classic/foldernew16.png +0 -0
  154. psychopy/app/Resources/classic/fork.png +0 -0
  155. psychopy/app/Resources/classic/fork@2x.png +0 -0
  156. psychopy/app/Resources/classic/github.png +0 -0
  157. psychopy/app/Resources/classic/github@2x.png +0 -0
  158. psychopy/app/Resources/classic/globe.png +0 -0
  159. psychopy/app/Resources/classic/globe@2x.png +0 -0
  160. psychopy/app/Resources/classic/globe_bug.png +0 -0
  161. psychopy/app/Resources/classic/globe_bug@2x.png +0 -0
  162. psychopy/app/Resources/classic/globe_greensync.png +0 -0
  163. psychopy/app/Resources/classic/globe_greensync@2x.png +0 -0
  164. psychopy/app/Resources/classic/globe_info.png +0 -0
  165. psychopy/app/Resources/classic/globe_info@2x.png +0 -0
  166. psychopy/app/Resources/classic/globe_magnifier.png +0 -0
  167. psychopy/app/Resources/classic/globe_magnifier@2x.png +0 -0
  168. psychopy/app/Resources/classic/globe_run.png +0 -0
  169. psychopy/app/Resources/classic/globe_run@2x.png +0 -0
  170. psychopy/app/Resources/classic/globe_user.png +0 -0
  171. psychopy/app/Resources/classic/globe_user@2x.png +0 -0
  172. psychopy/app/Resources/classic/goto16.png +0 -0
  173. psychopy/app/Resources/classic/greendot.png +0 -0
  174. psychopy/app/Resources/classic/greendot@2x.png +0 -0
  175. psychopy/app/Resources/classic/greenglobe.png +0 -0
  176. psychopy/app/Resources/classic/greenglobe@2x.png +0 -0
  177. psychopy/app/Resources/classic/greenglobe_bug.png +0 -0
  178. psychopy/app/Resources/classic/greenglobe_bug@2x.png +0 -0
  179. psychopy/app/Resources/classic/greenglobe_greensync.png +0 -0
  180. psychopy/app/Resources/classic/greenglobe_greensync@2x.png +0 -0
  181. psychopy/app/Resources/classic/greenglobe_info.png +0 -0
  182. psychopy/app/Resources/classic/greenglobe_info@2x.png +0 -0
  183. psychopy/app/Resources/classic/greenglobe_magnifier.png +0 -0
  184. psychopy/app/Resources/classic/greenglobe_magnifier@2x.png +0 -0
  185. psychopy/app/Resources/classic/greenglobe_run.png +0 -0
  186. psychopy/app/Resources/classic/greenglobe_run@2x.png +0 -0
  187. psychopy/app/Resources/classic/greenglobe_user.png +0 -0
  188. psychopy/app/Resources/classic/greenglobe_user@2x.png +0 -0
  189. psychopy/app/Resources/classic/greydot.png +0 -0
  190. psychopy/app/Resources/classic/greydot@2x.png +0 -0
  191. psychopy/app/Resources/classic/greytick.png +0 -0
  192. psychopy/app/Resources/classic/greytick@2x.png +0 -0
  193. psychopy/app/Resources/classic/invalid_img.png +0 -0
  194. psychopy/app/Resources/classic/jsPilot.png +0 -0
  195. psychopy/app/Resources/classic/jsPilot@2x.png +0 -0
  196. psychopy/app/Resources/classic/jsRun.png +0 -0
  197. psychopy/app/Resources/classic/jsRun@2x.png +0 -0
  198. psychopy/app/Resources/classic/libroot.png +0 -0
  199. psychopy/app/Resources/classic/libroot@2x.png +0 -0
  200. psychopy/app/Resources/classic/monitor16.png +0 -0
  201. psychopy/app/Resources/classic/monitors.png +0 -0
  202. psychopy/app/Resources/classic/monitors16.png +0 -0
  203. psychopy/app/Resources/classic/monitors32.png +0 -0
  204. psychopy/app/Resources/classic/monitors@2x.png +0 -0
  205. psychopy/app/Resources/classic/orangedot.png +0 -0
  206. psychopy/app/Resources/classic/orangedot@2x.png +0 -0
  207. psychopy/app/Resources/classic/pavlovia.png +0 -0
  208. psychopy/app/Resources/classic/pavlovia16.png +0 -0
  209. psychopy/app/Resources/classic/pavlovia16@2x.png +0 -0
  210. psychopy/app/Resources/classic/pavlovia@2x.png +0 -0
  211. psychopy/app/Resources/classic/pavsync.png +0 -0
  212. psychopy/app/Resources/classic/pavsync@2x.png +0 -0
  213. psychopy/app/Resources/classic/person_off.png +0 -0
  214. psychopy/app/Resources/classic/person_off@2x.png +0 -0
  215. psychopy/app/Resources/classic/person_on.png +0 -0
  216. psychopy/app/Resources/classic/person_on@2x.png +0 -0
  217. psychopy/app/Resources/classic/plugins32.png +0 -0
  218. psychopy/app/Resources/classic/plus.png +0 -0
  219. psychopy/app/Resources/classic/plus@2x.png +0 -0
  220. psychopy/app/Resources/classic/preferences-app.png +0 -0
  221. psychopy/app/Resources/classic/preferences-app48.png +0 -0
  222. psychopy/app/Resources/classic/preferences-app@2x.png +0 -0
  223. psychopy/app/Resources/classic/preferences-conn.png +0 -0
  224. psychopy/app/Resources/classic/preferences-conn48.png +0 -0
  225. psychopy/app/Resources/classic/preferences-conn@2x.png +0 -0
  226. psychopy/app/Resources/classic/preferences-debug.png +0 -0
  227. psychopy/app/Resources/classic/preferences-debug@2x.png +0 -0
  228. psychopy/app/Resources/classic/preferences-general.png +0 -0
  229. psychopy/app/Resources/classic/preferences-general48.png +0 -0
  230. psychopy/app/Resources/classic/preferences-general@2x.png +0 -0
  231. psychopy/app/Resources/classic/preferences-hardware.png +0 -0
  232. psychopy/app/Resources/classic/preferences-hardware48.png +0 -0
  233. psychopy/app/Resources/classic/preferences-hardware@2x.png +0 -0
  234. psychopy/app/Resources/classic/preferences-keyboard.png +0 -0
  235. psychopy/app/Resources/classic/preferences-keyboard48.png +0 -0
  236. psychopy/app/Resources/classic/preferences-keyboard@2x.png +0 -0
  237. psychopy/app/Resources/classic/preferences-pilot.png +0 -0
  238. psychopy/app/Resources/classic/preferences-pilot@2x.png +0 -0
  239. psychopy/app/Resources/classic/preferences32.png +0 -0
  240. psychopy/app/Resources/classic/pyPilot.png +0 -0
  241. psychopy/app/Resources/classic/pyPilot@2x.png +0 -0
  242. psychopy/app/Resources/classic/pyRun.png +0 -0
  243. psychopy/app/Resources/classic/pyRun@2x.png +0 -0
  244. psychopy/app/Resources/classic/reddot.png +0 -0
  245. psychopy/app/Resources/classic/reddot@2x.png +0 -0
  246. psychopy/app/Resources/classic/redglobe.png +0 -0
  247. psychopy/app/Resources/classic/redglobe@2x.png +0 -0
  248. psychopy/app/Resources/classic/redglobe_bug.png +0 -0
  249. psychopy/app/Resources/classic/redglobe_bug@2x.png +0 -0
  250. psychopy/app/Resources/classic/redglobe_greensync.png +0 -0
  251. psychopy/app/Resources/classic/redglobe_greensync@2x.png +0 -0
  252. psychopy/app/Resources/classic/redglobe_info.png +0 -0
  253. psychopy/app/Resources/classic/redglobe_info@2x.png +0 -0
  254. psychopy/app/Resources/classic/redglobe_magnifier.png +0 -0
  255. psychopy/app/Resources/classic/redglobe_magnifier@2x.png +0 -0
  256. psychopy/app/Resources/classic/redglobe_run.png +0 -0
  257. psychopy/app/Resources/classic/redglobe_run@2x.png +0 -0
  258. psychopy/app/Resources/classic/redglobe_user.png +0 -0
  259. psychopy/app/Resources/classic/redglobe_user@2x.png +0 -0
  260. psychopy/app/Resources/classic/redo.png +0 -0
  261. psychopy/app/Resources/classic/redo32.png +0 -0
  262. psychopy/app/Resources/classic/redo@2x.png +0 -0
  263. psychopy/app/Resources/classic/removeExp32.png +0 -0
  264. psychopy/app/Resources/classic/rename16.png +0 -0
  265. psychopy/app/Resources/classic/restart.png +0 -0
  266. psychopy/app/Resources/classic/restart@2x.png +0 -0
  267. psychopy/app/Resources/classic/run.png +0 -0
  268. psychopy/app/Resources/classic/run@2x.png +0 -0
  269. psychopy/app/Resources/classic/runner.png +0 -0
  270. psychopy/app/Resources/classic/runner@2x.png +0 -0
  271. psychopy/app/Resources/classic/runnerPilot.png +0 -0
  272. psychopy/app/Resources/classic/runnerPilot@2x.png +0 -0
  273. psychopy/app/Resources/classic/savebtn.png +0 -0
  274. psychopy/app/Resources/classic/savebtn16.png +0 -0
  275. psychopy/app/Resources/classic/savebtn16@2x.png +0 -0
  276. psychopy/app/Resources/classic/savebtn@2x.png +0 -0
  277. psychopy/app/Resources/classic/search.png +0 -0
  278. psychopy/app/Resources/classic/search@2x.png +0 -0
  279. psychopy/app/Resources/classic/showBuilder.png +0 -0
  280. psychopy/app/Resources/classic/showBuilder@2x.png +0 -0
  281. psychopy/app/Resources/classic/showCoder.png +0 -0
  282. psychopy/app/Resources/classic/showCoder@2x.png +0 -0
  283. psychopy/app/Resources/classic/showRunner.png +0 -0
  284. psychopy/app/Resources/classic/showRunner@2x.png +0 -0
  285. psychopy/app/Resources/classic/starred.png +0 -0
  286. psychopy/app/Resources/classic/starred@2x.png +0 -0
  287. psychopy/app/Resources/classic/start.png +0 -0
  288. psychopy/app/Resources/classic/start@2x.png +0 -0
  289. psychopy/app/Resources/classic/stdout.png +0 -0
  290. psychopy/app/Resources/classic/stop.png +0 -0
  291. psychopy/app/Resources/classic/stop32.png +0 -0
  292. psychopy/app/Resources/classic/stop@2x.png +0 -0
  293. psychopy/app/Resources/classic/switchCtrlBot.png +0 -0
  294. psychopy/app/Resources/classic/switchCtrlBot@2x.png +0 -0
  295. psychopy/app/Resources/classic/switchCtrlLeft.png +0 -0
  296. psychopy/app/Resources/classic/switchCtrlLeft@2x.png +0 -0
  297. psychopy/app/Resources/classic/switchCtrlRight.png +0 -0
  298. psychopy/app/Resources/classic/switchCtrlRight@2x.png +0 -0
  299. psychopy/app/Resources/classic/switchCtrlTop.png +0 -0
  300. psychopy/app/Resources/classic/switchCtrlTop@2x.png +0 -0
  301. psychopy/app/Resources/classic/tick.png +0 -0
  302. psychopy/app/Resources/classic/tick@2x.png +0 -0
  303. psychopy/app/Resources/classic/undo.png +0 -0
  304. psychopy/app/Resources/classic/undo32.png +0 -0
  305. psychopy/app/Resources/classic/undo@2x.png +0 -0
  306. psychopy/app/Resources/classic/unstarred.png +0 -0
  307. psychopy/app/Resources/classic/unstarred@2x.png +0 -0
  308. psychopy/app/Resources/classic/user_none.png +0 -0
  309. psychopy/app/Resources/classic/view-refresh16.png +0 -0
  310. psychopy/app/Resources/classic/viewbtn.png +0 -0
  311. psychopy/app/Resources/classic/viewbtn16.png +0 -0
  312. psychopy/app/Resources/classic/viewbtn16@2x.png +0 -0
  313. psychopy/app/Resources/classic/viewbtn@2x.png +0 -0
  314. psychopy/app/Resources/classic/windows16.png +0 -0
  315. psychopy/app/Resources/classic/windows16@2x.png +0 -0
  316. psychopy/app/Resources/click.png +0 -0
  317. psychopy/app/Resources/coder.ico +0 -0
  318. psychopy/app/Resources/creditCard.png +0 -0
  319. psychopy/app/Resources/dark/FlowBottom_CompLeft.png +0 -0
  320. psychopy/app/Resources/dark/FlowBottom_CompRight.png +0 -0
  321. psychopy/app/Resources/dark/FlowTop_CompLeft.png +0 -0
  322. psychopy/app/Resources/dark/FlowTop_CompRight.png +0 -0
  323. psychopy/app/Resources/dark/README.txt +3 -0
  324. psychopy/app/Resources/dark/__init__.py +0 -0
  325. psychopy/app/Resources/dark/add.png +0 -0
  326. psychopy/app/Resources/dark/add@2x.png +0 -0
  327. psychopy/app/Resources/dark/addExp32.png +0 -0
  328. psychopy/app/Resources/dark/addExp32@2x.png +0 -0
  329. psychopy/app/Resources/dark/alerts.png +0 -0
  330. psychopy/app/Resources/dark/alerts@2x.png +0 -0
  331. psychopy/app/Resources/dark/beta.png +0 -0
  332. psychopy/app/Resources/dark/beta@2x.png +0 -0
  333. psychopy/app/Resources/dark/browser.png +0 -0
  334. psychopy/app/Resources/dark/browser@2x.png +0 -0
  335. psychopy/app/Resources/dark/bug16.png +0 -0
  336. psychopy/app/Resources/dark/bug16@2x.png +0 -0
  337. psychopy/app/Resources/dark/circle_mask.png +0 -0
  338. psychopy/app/Resources/dark/circle_mask@2x.png +0 -0
  339. psychopy/app/Resources/dark/clear.png +0 -0
  340. psychopy/app/Resources/dark/clear@2x.png +0 -0
  341. psychopy/app/Resources/dark/coderclass16.png +0 -0
  342. psychopy/app/Resources/dark/coderclass16@2x.png +0 -0
  343. psychopy/app/Resources/dark/coderfunc16.png +0 -0
  344. psychopy/app/Resources/dark/coderfunc16@2x.png +0 -0
  345. psychopy/app/Resources/dark/coderimport16.png +0 -0
  346. psychopy/app/Resources/dark/coderimport16@2x.png +0 -0
  347. psychopy/app/Resources/dark/coderjs.png +0 -0
  348. psychopy/app/Resources/dark/coderjs@2x.png +0 -0
  349. psychopy/app/Resources/dark/coderpython.png +0 -0
  350. psychopy/app/Resources/dark/coderpython@2x.png +0 -0
  351. psychopy/app/Resources/dark/codervar16.png +0 -0
  352. psychopy/app/Resources/dark/codervar16@2x.png +0 -0
  353. psychopy/app/Resources/dark/cogwindow32.png +0 -0
  354. psychopy/app/Resources/dark/cogwindow32@2x.png +0 -0
  355. psychopy/app/Resources/dark/color32.png +0 -0
  356. psychopy/app/Resources/dark/color32@2x.png +0 -0
  357. psychopy/app/Resources/dark/compile_js.png +0 -0
  358. psychopy/app/Resources/dark/compile_js@2x.png +0 -0
  359. psychopy/app/Resources/dark/compile_py.png +0 -0
  360. psychopy/app/Resources/dark/compile_py@2x.png +0 -0
  361. psychopy/app/Resources/dark/copy16.png +0 -0
  362. psychopy/app/Resources/dark/copy16@2x.png +0 -0
  363. psychopy/app/Resources/dark/currentFile16.png +0 -0
  364. psychopy/app/Resources/dark/currentFile16@2x.png +0 -0
  365. psychopy/app/Resources/dark/delete16.png +0 -0
  366. psychopy/app/Resources/dark/delete16@2x.png +0 -0
  367. psychopy/app/Resources/dark/desktop.png +0 -0
  368. psychopy/app/Resources/dark/desktop@2x.png +0 -0
  369. psychopy/app/Resources/dark/dirup16.png +0 -0
  370. psychopy/app/Resources/dark/dirup16@2x.png +0 -0
  371. psychopy/app/Resources/dark/docclose16.png +0 -0
  372. psychopy/app/Resources/dark/docclose16@2x.png +0 -0
  373. psychopy/app/Resources/dark/download.png +0 -0
  374. psychopy/app/Resources/dark/download@2x.png +0 -0
  375. psychopy/app/Resources/dark/edit.png +0 -0
  376. psychopy/app/Resources/dark/edit@2x.png +0 -0
  377. psychopy/app/Resources/dark/editbtn16.png +0 -0
  378. psychopy/app/Resources/dark/editbtn16@2x.png +0 -0
  379. psychopy/app/Resources/dark/email.png +0 -0
  380. psychopy/app/Resources/dark/email@2x.png +0 -0
  381. psychopy/app/Resources/dark/experiment.png +0 -0
  382. psychopy/app/Resources/dark/experiment@2x.png +0 -0
  383. psychopy/app/Resources/dark/expsettings.png +0 -0
  384. psychopy/app/Resources/dark/expsettings@2x.png +0 -0
  385. psychopy/app/Resources/dark/file.png +0 -0
  386. psychopy/app/Resources/dark/file@16w.png +0 -0
  387. psychopy/app/Resources/dark/file@16w@2x.png +0 -0
  388. psychopy/app/Resources/dark/file@2x.png +0 -0
  389. psychopy/app/Resources/dark/filecsv16.png +0 -0
  390. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  391. psychopy/app/Resources/dark/fileimage16.png +0 -0
  392. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  393. psychopy/app/Resources/dark/filenew.png +0 -0
  394. psychopy/app/Resources/dark/filenew32.png +0 -0
  395. psychopy/app/Resources/dark/filenew32@2x.png +0 -0
  396. psychopy/app/Resources/dark/filenew@2x.png +0 -0
  397. psychopy/app/Resources/dark/fileopen.png +0 -0
  398. psychopy/app/Resources/dark/fileopen32.png +0 -0
  399. psychopy/app/Resources/dark/fileopen32@2x.png +0 -0
  400. psychopy/app/Resources/dark/fileopen@2x.png +0 -0
  401. psychopy/app/Resources/dark/filesave.png +0 -0
  402. psychopy/app/Resources/dark/filesave32.png +0 -0
  403. psychopy/app/Resources/dark/filesave32@2x.png +0 -0
  404. psychopy/app/Resources/dark/filesave@2x.png +0 -0
  405. psychopy/app/Resources/dark/filesaveas.png +0 -0
  406. psychopy/app/Resources/dark/filesaveas32.png +0 -0
  407. psychopy/app/Resources/dark/filesaveas32@2x.png +0 -0
  408. psychopy/app/Resources/dark/filesaveas@2x.png +0 -0
  409. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  410. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  411. psychopy/app/Resources/dark/filter.png +0 -0
  412. psychopy/app/Resources/dark/filter@2x.png +0 -0
  413. psychopy/app/Resources/dark/folder-open16.png +0 -0
  414. psychopy/app/Resources/dark/folder-open16@2x.png +0 -0
  415. psychopy/app/Resources/dark/folder16.png +0 -0
  416. psychopy/app/Resources/dark/folder16@2x.png +0 -0
  417. psychopy/app/Resources/dark/foldernew16.png +0 -0
  418. psychopy/app/Resources/dark/foldernew16@2x.png +0 -0
  419. psychopy/app/Resources/dark/fork.png +0 -0
  420. psychopy/app/Resources/dark/fork@2x.png +0 -0
  421. psychopy/app/Resources/dark/github.png +0 -0
  422. psychopy/app/Resources/dark/github@2x.png +0 -0
  423. psychopy/app/Resources/dark/globe.png +0 -0
  424. psychopy/app/Resources/dark/globe@2x.png +0 -0
  425. psychopy/app/Resources/dark/globe_bug.png +0 -0
  426. psychopy/app/Resources/dark/globe_bug@2x.png +0 -0
  427. psychopy/app/Resources/dark/globe_greensync.png +0 -0
  428. psychopy/app/Resources/dark/globe_greensync@2x.png +0 -0
  429. psychopy/app/Resources/dark/globe_info.png +0 -0
  430. psychopy/app/Resources/dark/globe_info@2x.png +0 -0
  431. psychopy/app/Resources/dark/globe_magnifier.png +0 -0
  432. psychopy/app/Resources/dark/globe_magnifier@2x.png +0 -0
  433. psychopy/app/Resources/dark/globe_run.png +0 -0
  434. psychopy/app/Resources/dark/globe_run@2x.png +0 -0
  435. psychopy/app/Resources/dark/globe_user.png +0 -0
  436. psychopy/app/Resources/dark/globe_user@2x.png +0 -0
  437. psychopy/app/Resources/dark/goto.png +0 -0
  438. psychopy/app/Resources/dark/goto@2x.png +0 -0
  439. psychopy/app/Resources/dark/greendot.png +0 -0
  440. psychopy/app/Resources/dark/greendot@2x.png +0 -0
  441. psychopy/app/Resources/dark/greenglobe.png +0 -0
  442. psychopy/app/Resources/dark/greenglobe@2x.png +0 -0
  443. psychopy/app/Resources/dark/greenglobe_bug.png +0 -0
  444. psychopy/app/Resources/dark/greenglobe_bug@2x.png +0 -0
  445. psychopy/app/Resources/dark/greenglobe_greensync.png +0 -0
  446. psychopy/app/Resources/dark/greenglobe_greensync@2x.png +0 -0
  447. psychopy/app/Resources/dark/greenglobe_info.png +0 -0
  448. psychopy/app/Resources/dark/greenglobe_info@2x.png +0 -0
  449. psychopy/app/Resources/dark/greenglobe_magnifier.png +0 -0
  450. psychopy/app/Resources/dark/greenglobe_magnifier@2x.png +0 -0
  451. psychopy/app/Resources/dark/greenglobe_run.png +0 -0
  452. psychopy/app/Resources/dark/greenglobe_run@2x.png +0 -0
  453. psychopy/app/Resources/dark/greenglobe_user.png +0 -0
  454. psychopy/app/Resources/dark/greenglobe_user@2x.png +0 -0
  455. psychopy/app/Resources/dark/greydot.png +0 -0
  456. psychopy/app/Resources/dark/greydot@2x.png +0 -0
  457. psychopy/app/Resources/dark/greytick.png +0 -0
  458. psychopy/app/Resources/dark/greytick@2x.png +0 -0
  459. psychopy/app/Resources/dark/invalid_img.png +0 -0
  460. psychopy/app/Resources/dark/jsPilot.png +0 -0
  461. psychopy/app/Resources/dark/jsPilot@2x.png +0 -0
  462. psychopy/app/Resources/dark/jsRun.png +0 -0
  463. psychopy/app/Resources/dark/jsRun@2x.png +0 -0
  464. psychopy/app/Resources/dark/libroot16.png +0 -0
  465. psychopy/app/Resources/dark/libroot16@2x.png +0 -0
  466. psychopy/app/Resources/dark/monitor16.png +0 -0
  467. psychopy/app/Resources/dark/monitor16@2x.png +0 -0
  468. psychopy/app/Resources/dark/monitors.png +0 -0
  469. psychopy/app/Resources/dark/monitors32.png +0 -0
  470. psychopy/app/Resources/dark/monitors32@2x.png +0 -0
  471. psychopy/app/Resources/dark/monitors@2x.png +0 -0
  472. psychopy/app/Resources/dark/orangedot.png +0 -0
  473. psychopy/app/Resources/dark/orangedot@2x.png +0 -0
  474. psychopy/app/Resources/dark/pavlovia.png +0 -0
  475. psychopy/app/Resources/dark/pavlovia16.png +0 -0
  476. psychopy/app/Resources/dark/pavlovia16@2x.png +0 -0
  477. psychopy/app/Resources/dark/pavlovia@2x.png +0 -0
  478. psychopy/app/Resources/dark/pavsync.png +0 -0
  479. psychopy/app/Resources/dark/pavsync@2x.png +0 -0
  480. psychopy/app/Resources/dark/person_off.png +0 -0
  481. psychopy/app/Resources/dark/person_off@2x.png +0 -0
  482. psychopy/app/Resources/dark/person_on.png +0 -0
  483. psychopy/app/Resources/dark/person_on@2x.png +0 -0
  484. psychopy/app/Resources/dark/plugins32.png +0 -0
  485. psychopy/app/Resources/dark/plugins32@2x.png +0 -0
  486. psychopy/app/Resources/dark/plus.png +0 -0
  487. psychopy/app/Resources/dark/plus@2x.png +0 -0
  488. psychopy/app/Resources/dark/preferences-app.png +0 -0
  489. psychopy/app/Resources/dark/preferences-app48.png +0 -0
  490. psychopy/app/Resources/dark/preferences-app48@2x.png +0 -0
  491. psychopy/app/Resources/dark/preferences-app@2x.png +0 -0
  492. psychopy/app/Resources/dark/preferences-conn.png +0 -0
  493. psychopy/app/Resources/dark/preferences-conn48.png +0 -0
  494. psychopy/app/Resources/dark/preferences-conn48@2x.png +0 -0
  495. psychopy/app/Resources/dark/preferences-conn@2x.png +0 -0
  496. psychopy/app/Resources/dark/preferences-debug.png +0 -0
  497. psychopy/app/Resources/dark/preferences-debug@2x.png +0 -0
  498. psychopy/app/Resources/dark/preferences-general.png +0 -0
  499. psychopy/app/Resources/dark/preferences-general48.png +0 -0
  500. psychopy/app/Resources/dark/preferences-general48@2x.png +0 -0
  501. psychopy/app/Resources/dark/preferences-general@2x.png +0 -0
  502. psychopy/app/Resources/dark/preferences-hardware.png +0 -0
  503. psychopy/app/Resources/dark/preferences-hardware48.png +0 -0
  504. psychopy/app/Resources/dark/preferences-hardware48@2x.png +0 -0
  505. psychopy/app/Resources/dark/preferences-hardware@2x.png +0 -0
  506. psychopy/app/Resources/dark/preferences-keyboard.png +0 -0
  507. psychopy/app/Resources/dark/preferences-keyboard48.png +0 -0
  508. psychopy/app/Resources/dark/preferences-keyboard48@2x.png +0 -0
  509. psychopy/app/Resources/dark/preferences-keyboard@2x.png +0 -0
  510. psychopy/app/Resources/dark/preferences-pilot.png +0 -0
  511. psychopy/app/Resources/dark/preferences-pilot@2x.png +0 -0
  512. psychopy/app/Resources/dark/preferences32.png +0 -0
  513. psychopy/app/Resources/dark/preferences32@2x.png +0 -0
  514. psychopy/app/Resources/dark/pyPilot.png +0 -0
  515. psychopy/app/Resources/dark/pyPilot@2x.png +0 -0
  516. psychopy/app/Resources/dark/pyRun.png +0 -0
  517. psychopy/app/Resources/dark/pyRun@2x.png +0 -0
  518. psychopy/app/Resources/dark/reddot.png +0 -0
  519. psychopy/app/Resources/dark/reddot@2x.png +0 -0
  520. psychopy/app/Resources/dark/redglobe.png +0 -0
  521. psychopy/app/Resources/dark/redglobe@2x.png +0 -0
  522. psychopy/app/Resources/dark/redglobe_bug.png +0 -0
  523. psychopy/app/Resources/dark/redglobe_bug@2x.png +0 -0
  524. psychopy/app/Resources/dark/redglobe_greensync.png +0 -0
  525. psychopy/app/Resources/dark/redglobe_greensync@2x.png +0 -0
  526. psychopy/app/Resources/dark/redglobe_info.png +0 -0
  527. psychopy/app/Resources/dark/redglobe_info@2x.png +0 -0
  528. psychopy/app/Resources/dark/redglobe_magnifier.png +0 -0
  529. psychopy/app/Resources/dark/redglobe_magnifier@2x.png +0 -0
  530. psychopy/app/Resources/dark/redglobe_run.png +0 -0
  531. psychopy/app/Resources/dark/redglobe_run@2x.png +0 -0
  532. psychopy/app/Resources/dark/redglobe_user.png +0 -0
  533. psychopy/app/Resources/dark/redglobe_user@2x.png +0 -0
  534. psychopy/app/Resources/dark/redo.png +0 -0
  535. psychopy/app/Resources/dark/redo32.png +0 -0
  536. psychopy/app/Resources/dark/redo32@2x.png +0 -0
  537. psychopy/app/Resources/dark/redo@2x.png +0 -0
  538. psychopy/app/Resources/dark/removeExp32.png +0 -0
  539. psychopy/app/Resources/dark/removeExp32@2x.png +0 -0
  540. psychopy/app/Resources/dark/rename16.png +0 -0
  541. psychopy/app/Resources/dark/rename16@2x.png +0 -0
  542. psychopy/app/Resources/dark/restart.png +0 -0
  543. psychopy/app/Resources/dark/restart@2x.png +0 -0
  544. psychopy/app/Resources/dark/runner.png +0 -0
  545. psychopy/app/Resources/dark/runner@2x.png +0 -0
  546. psychopy/app/Resources/dark/runnerPilot.png +0 -0
  547. psychopy/app/Resources/dark/runnerPilot@2x.png +0 -0
  548. psychopy/app/Resources/dark/savebtn16.png +0 -0
  549. psychopy/app/Resources/dark/savebtn16@2x.png +0 -0
  550. psychopy/app/Resources/dark/search.png +0 -0
  551. psychopy/app/Resources/dark/search@2x.png +0 -0
  552. psychopy/app/Resources/dark/showBuilder.png +0 -0
  553. psychopy/app/Resources/dark/showBuilder@2x.png +0 -0
  554. psychopy/app/Resources/dark/showCoder.png +0 -0
  555. psychopy/app/Resources/dark/showCoder@2x.png +0 -0
  556. psychopy/app/Resources/dark/showRunner.png +0 -0
  557. psychopy/app/Resources/dark/showRunner@2x.png +0 -0
  558. psychopy/app/Resources/dark/starred.png +0 -0
  559. psychopy/app/Resources/dark/starred@2x.png +0 -0
  560. psychopy/app/Resources/dark/start.png +0 -0
  561. psychopy/app/Resources/dark/start@2x.png +0 -0
  562. psychopy/app/Resources/dark/stdout.png +0 -0
  563. psychopy/app/Resources/dark/stdout@2x.png +0 -0
  564. psychopy/app/Resources/dark/stop.png +0 -0
  565. psychopy/app/Resources/dark/stop32.png +0 -0
  566. psychopy/app/Resources/dark/stop32@2x.png +0 -0
  567. psychopy/app/Resources/dark/stop@2x.png +0 -0
  568. psychopy/app/Resources/dark/switchCtrlBot.png +0 -0
  569. psychopy/app/Resources/dark/switchCtrlBot@2x.png +0 -0
  570. psychopy/app/Resources/dark/switchCtrlLeft.png +0 -0
  571. psychopy/app/Resources/dark/switchCtrlLeft@2x.png +0 -0
  572. psychopy/app/Resources/dark/switchCtrlRight.png +0 -0
  573. psychopy/app/Resources/dark/switchCtrlRight@2x.png +0 -0
  574. psychopy/app/Resources/dark/switchCtrlTop.png +0 -0
  575. psychopy/app/Resources/dark/switchCtrlTop@2x.png +0 -0
  576. psychopy/app/Resources/dark/tick.png +0 -0
  577. psychopy/app/Resources/dark/tick@2x.png +0 -0
  578. psychopy/app/Resources/dark/undo.png +0 -0
  579. psychopy/app/Resources/dark/undo32.png +0 -0
  580. psychopy/app/Resources/dark/undo32@2x.png +0 -0
  581. psychopy/app/Resources/dark/undo@2x.png +0 -0
  582. psychopy/app/Resources/dark/unstarred.png +0 -0
  583. psychopy/app/Resources/dark/unstarred@2x.png +0 -0
  584. psychopy/app/Resources/dark/user_none.png +0 -0
  585. psychopy/app/Resources/dark/view-refresh16.png +0 -0
  586. psychopy/app/Resources/dark/view-refresh16@2x.png +0 -0
  587. psychopy/app/Resources/dark/viewbtn16.png +0 -0
  588. psychopy/app/Resources/dark/viewbtn16@2x.png +0 -0
  589. psychopy/app/Resources/dark/windows16.png +0 -0
  590. psychopy/app/Resources/dark/windows16@2x.png +0 -0
  591. psychopy/app/Resources/default.mp3 +0 -0
  592. psychopy/app/Resources/default.mp4 +0 -0
  593. psychopy/app/Resources/default.png +0 -0
  594. psychopy/app/Resources/fonts/Arvo-Bold.ttf +0 -0
  595. psychopy/app/Resources/fonts/Arvo-BoldItalic.ttf +0 -0
  596. psychopy/app/Resources/fonts/Arvo-Italic.ttf +0 -0
  597. psychopy/app/Resources/fonts/Arvo-Regular.ttf +0 -0
  598. psychopy/app/Resources/fonts/DejaVuSerif.ttf +0 -0
  599. psychopy/app/Resources/fonts/IndieFlower-Regular.ttf +0 -0
  600. psychopy/app/Resources/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  601. psychopy/app/Resources/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  602. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  603. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  604. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  605. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  606. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  607. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  608. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  609. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  610. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  611. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  612. psychopy/app/Resources/instruct1.png +0 -0
  613. psychopy/app/Resources/instruct2.png +0 -0
  614. psychopy/app/Resources/light/FlowBottom_CompLeft.png +0 -0
  615. psychopy/app/Resources/light/FlowBottom_CompRight.png +0 -0
  616. psychopy/app/Resources/light/FlowTop_CompLeft.png +0 -0
  617. psychopy/app/Resources/light/FlowTop_CompRight.png +0 -0
  618. psychopy/app/Resources/light/README.txt +3 -0
  619. psychopy/app/Resources/light/__init__.py +0 -0
  620. psychopy/app/Resources/light/add.png +0 -0
  621. psychopy/app/Resources/light/add@2x.png +0 -0
  622. psychopy/app/Resources/light/addExp32.png +0 -0
  623. psychopy/app/Resources/light/addExp32@2x.png +0 -0
  624. psychopy/app/Resources/light/alerts.png +0 -0
  625. psychopy/app/Resources/light/alerts@2x.png +0 -0
  626. psychopy/app/Resources/light/beta.png +0 -0
  627. psychopy/app/Resources/light/beta@2x.png +0 -0
  628. psychopy/app/Resources/light/browser.png +0 -0
  629. psychopy/app/Resources/light/browser@2x.png +0 -0
  630. psychopy/app/Resources/light/bug16.png +0 -0
  631. psychopy/app/Resources/light/bug16@2x.png +0 -0
  632. psychopy/app/Resources/light/circle_mask.png +0 -0
  633. psychopy/app/Resources/light/circle_mask@2x.png +0 -0
  634. psychopy/app/Resources/light/clear.png +0 -0
  635. psychopy/app/Resources/light/clear@2x.png +0 -0
  636. psychopy/app/Resources/light/coderclass16.png +0 -0
  637. psychopy/app/Resources/light/coderclass16@2x.png +0 -0
  638. psychopy/app/Resources/light/coderfunc16.png +0 -0
  639. psychopy/app/Resources/light/coderfunc16@2x.png +0 -0
  640. psychopy/app/Resources/light/coderimport16.png +0 -0
  641. psychopy/app/Resources/light/coderimport16@2x.png +0 -0
  642. psychopy/app/Resources/light/coderjs.png +0 -0
  643. psychopy/app/Resources/light/coderjs@2x.png +0 -0
  644. psychopy/app/Resources/light/coderpython.png +0 -0
  645. psychopy/app/Resources/light/coderpython@2x.png +0 -0
  646. psychopy/app/Resources/light/codervar16.png +0 -0
  647. psychopy/app/Resources/light/codervar16@2x.png +0 -0
  648. psychopy/app/Resources/light/cogwindow32.png +0 -0
  649. psychopy/app/Resources/light/cogwindow32@2x.png +0 -0
  650. psychopy/app/Resources/light/color16.png +0 -0
  651. psychopy/app/Resources/light/color16@2x.png +0 -0
  652. psychopy/app/Resources/light/color32.png +0 -0
  653. psychopy/app/Resources/light/color32@2x.png +0 -0
  654. psychopy/app/Resources/light/compile_js.png +0 -0
  655. psychopy/app/Resources/light/compile_js@2x.png +0 -0
  656. psychopy/app/Resources/light/compile_py.png +0 -0
  657. psychopy/app/Resources/light/compile_py@2x.png +0 -0
  658. psychopy/app/Resources/light/copy16.png +0 -0
  659. psychopy/app/Resources/light/copy16@2x.png +0 -0
  660. psychopy/app/Resources/light/currentFile16.png +0 -0
  661. psychopy/app/Resources/light/currentFile16@2x.png +0 -0
  662. psychopy/app/Resources/light/delete16.png +0 -0
  663. psychopy/app/Resources/light/delete16@2x.png +0 -0
  664. psychopy/app/Resources/light/delete8.png +0 -0
  665. psychopy/app/Resources/light/desktop.png +0 -0
  666. psychopy/app/Resources/light/desktop@2x.png +0 -0
  667. psychopy/app/Resources/light/dirup16.png +0 -0
  668. psychopy/app/Resources/light/dirup16@2x.png +0 -0
  669. psychopy/app/Resources/light/docclose16.png +0 -0
  670. psychopy/app/Resources/light/docclose16@2x.png +0 -0
  671. psychopy/app/Resources/light/download.png +0 -0
  672. psychopy/app/Resources/light/download@2x.png +0 -0
  673. psychopy/app/Resources/light/edit.png +0 -0
  674. psychopy/app/Resources/light/edit@2x.png +0 -0
  675. psychopy/app/Resources/light/editbtn16.png +0 -0
  676. psychopy/app/Resources/light/editbtn16@2x.png +0 -0
  677. psychopy/app/Resources/light/email.png +0 -0
  678. psychopy/app/Resources/light/email@2x.png +0 -0
  679. psychopy/app/Resources/light/experiment.png +0 -0
  680. psychopy/app/Resources/light/experiment@2x.png +0 -0
  681. psychopy/app/Resources/light/expsettings.png +0 -0
  682. psychopy/app/Resources/light/expsettings@2x.png +0 -0
  683. psychopy/app/Resources/light/file.png +0 -0
  684. psychopy/app/Resources/light/file@2x.png +0 -0
  685. psychopy/app/Resources/light/filecsv16.png +0 -0
  686. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  687. psychopy/app/Resources/light/fileimage16.png +0 -0
  688. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  689. psychopy/app/Resources/light/filenew.png +0 -0
  690. psychopy/app/Resources/light/filenew32.png +0 -0
  691. psychopy/app/Resources/light/filenew32@2x.png +0 -0
  692. psychopy/app/Resources/light/filenew@2x.png +0 -0
  693. psychopy/app/Resources/light/fileopen.png +0 -0
  694. psychopy/app/Resources/light/fileopen32.png +0 -0
  695. psychopy/app/Resources/light/fileopen32@2x.png +0 -0
  696. psychopy/app/Resources/light/fileopen@2x.png +0 -0
  697. psychopy/app/Resources/light/filesave.png +0 -0
  698. psychopy/app/Resources/light/filesave32.png +0 -0
  699. psychopy/app/Resources/light/filesave32@2x.png +0 -0
  700. psychopy/app/Resources/light/filesave@2x.png +0 -0
  701. psychopy/app/Resources/light/filesaveas.png +0 -0
  702. psychopy/app/Resources/light/filesaveas32.png +0 -0
  703. psychopy/app/Resources/light/filesaveas32@2x.png +0 -0
  704. psychopy/app/Resources/light/filesaveas@2x.png +0 -0
  705. psychopy/app/Resources/light/fileunknown16.png +0 -0
  706. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  707. psychopy/app/Resources/light/filter.png +0 -0
  708. psychopy/app/Resources/light/filter@2x.png +0 -0
  709. psychopy/app/Resources/light/folder-open16.png +0 -0
  710. psychopy/app/Resources/light/folder-open16@2x.png +0 -0
  711. psychopy/app/Resources/light/folder16.png +0 -0
  712. psychopy/app/Resources/light/folder16@2x.png +0 -0
  713. psychopy/app/Resources/light/foldernew16.png +0 -0
  714. psychopy/app/Resources/light/foldernew16@2x.png +0 -0
  715. psychopy/app/Resources/light/fork.png +0 -0
  716. psychopy/app/Resources/light/fork@2x.png +0 -0
  717. psychopy/app/Resources/light/github.png +0 -0
  718. psychopy/app/Resources/light/github@2x.png +0 -0
  719. psychopy/app/Resources/light/globe.png +0 -0
  720. psychopy/app/Resources/light/globe@2x.png +0 -0
  721. psychopy/app/Resources/light/globe_bug.png +0 -0
  722. psychopy/app/Resources/light/globe_bug@2x.png +0 -0
  723. psychopy/app/Resources/light/globe_greensync.png +0 -0
  724. psychopy/app/Resources/light/globe_greensync@2x.png +0 -0
  725. psychopy/app/Resources/light/globe_info.png +0 -0
  726. psychopy/app/Resources/light/globe_info@2x.png +0 -0
  727. psychopy/app/Resources/light/globe_magnifier.png +0 -0
  728. psychopy/app/Resources/light/globe_magnifier@2x.png +0 -0
  729. psychopy/app/Resources/light/globe_run.png +0 -0
  730. psychopy/app/Resources/light/globe_run@2x.png +0 -0
  731. psychopy/app/Resources/light/globe_user.png +0 -0
  732. psychopy/app/Resources/light/globe_user@2x.png +0 -0
  733. psychopy/app/Resources/light/goto16.png +0 -0
  734. psychopy/app/Resources/light/goto16@2x.png +0 -0
  735. psychopy/app/Resources/light/greendot.png +0 -0
  736. psychopy/app/Resources/light/greendot@2x.png +0 -0
  737. psychopy/app/Resources/light/greenglobe.png +0 -0
  738. psychopy/app/Resources/light/greenglobe@2x.png +0 -0
  739. psychopy/app/Resources/light/greenglobe_bug.png +0 -0
  740. psychopy/app/Resources/light/greenglobe_bug@2x.png +0 -0
  741. psychopy/app/Resources/light/greenglobe_greensync.png +0 -0
  742. psychopy/app/Resources/light/greenglobe_greensync@2x.png +0 -0
  743. psychopy/app/Resources/light/greenglobe_info.png +0 -0
  744. psychopy/app/Resources/light/greenglobe_info@2x.png +0 -0
  745. psychopy/app/Resources/light/greenglobe_magnifier.png +0 -0
  746. psychopy/app/Resources/light/greenglobe_magnifier@2x.png +0 -0
  747. psychopy/app/Resources/light/greenglobe_run.png +0 -0
  748. psychopy/app/Resources/light/greenglobe_run@2x.png +0 -0
  749. psychopy/app/Resources/light/greenglobe_user.png +0 -0
  750. psychopy/app/Resources/light/greenglobe_user@2x.png +0 -0
  751. psychopy/app/Resources/light/greydot.png +0 -0
  752. psychopy/app/Resources/light/greydot@2x.png +0 -0
  753. psychopy/app/Resources/light/greytick.png +0 -0
  754. psychopy/app/Resources/light/greytick@2x.png +0 -0
  755. psychopy/app/Resources/light/invalid_img.png +0 -0
  756. psychopy/app/Resources/light/jsPilot.png +0 -0
  757. psychopy/app/Resources/light/jsPilot@2x.png +0 -0
  758. psychopy/app/Resources/light/jsRun.png +0 -0
  759. psychopy/app/Resources/light/jsRun@2x.png +0 -0
  760. psychopy/app/Resources/light/libroot16.png +0 -0
  761. psychopy/app/Resources/light/libroot16@2x.png +0 -0
  762. psychopy/app/Resources/light/monitor16.png +0 -0
  763. psychopy/app/Resources/light/monitor16@2x.png +0 -0
  764. psychopy/app/Resources/light/monitors.png +0 -0
  765. psychopy/app/Resources/light/monitors32.png +0 -0
  766. psychopy/app/Resources/light/monitors32@2x.png +0 -0
  767. psychopy/app/Resources/light/monitors@2x.png +0 -0
  768. psychopy/app/Resources/light/orangedot.png +0 -0
  769. psychopy/app/Resources/light/orangedot@2x.png +0 -0
  770. psychopy/app/Resources/light/pavlovia.png +0 -0
  771. psychopy/app/Resources/light/pavlovia16.png +0 -0
  772. psychopy/app/Resources/light/pavlovia16@2x.png +0 -0
  773. psychopy/app/Resources/light/pavlovia@2x.png +0 -0
  774. psychopy/app/Resources/light/pavsync.png +0 -0
  775. psychopy/app/Resources/light/pavsync@2x.png +0 -0
  776. psychopy/app/Resources/light/person_off.png +0 -0
  777. psychopy/app/Resources/light/person_off@2x.png +0 -0
  778. psychopy/app/Resources/light/person_on.png +0 -0
  779. psychopy/app/Resources/light/person_on@2x.png +0 -0
  780. psychopy/app/Resources/light/plugins32.png +0 -0
  781. psychopy/app/Resources/light/plugins32@2x.png +0 -0
  782. psychopy/app/Resources/light/plus.png +0 -0
  783. psychopy/app/Resources/light/plus@2x.png +0 -0
  784. psychopy/app/Resources/light/preferences-app.png +0 -0
  785. psychopy/app/Resources/light/preferences-app48.png +0 -0
  786. psychopy/app/Resources/light/preferences-app48@2x.png +0 -0
  787. psychopy/app/Resources/light/preferences-app@2x.png +0 -0
  788. psychopy/app/Resources/light/preferences-conn.png +0 -0
  789. psychopy/app/Resources/light/preferences-conn48.png +0 -0
  790. psychopy/app/Resources/light/preferences-conn48@2x.png +0 -0
  791. psychopy/app/Resources/light/preferences-conn@2x.png +0 -0
  792. psychopy/app/Resources/light/preferences-general.png +0 -0
  793. psychopy/app/Resources/light/preferences-general48.png +0 -0
  794. psychopy/app/Resources/light/preferences-general48@2x.png +0 -0
  795. psychopy/app/Resources/light/preferences-general@2x.png +0 -0
  796. psychopy/app/Resources/light/preferences-hardware.png +0 -0
  797. psychopy/app/Resources/light/preferences-hardware48.png +0 -0
  798. psychopy/app/Resources/light/preferences-hardware48@2x.png +0 -0
  799. psychopy/app/Resources/light/preferences-hardware@2x.png +0 -0
  800. psychopy/app/Resources/light/preferences-keyboard.png +0 -0
  801. psychopy/app/Resources/light/preferences-keyboard48.png +0 -0
  802. psychopy/app/Resources/light/preferences-keyboard48@2x.png +0 -0
  803. psychopy/app/Resources/light/preferences-keyboard@2x.png +0 -0
  804. psychopy/app/Resources/light/preferences-pilot.png +0 -0
  805. psychopy/app/Resources/light/preferences-pilot@2x.png +0 -0
  806. psychopy/app/Resources/light/preferences32.png +0 -0
  807. psychopy/app/Resources/light/preferences32@2x.png +0 -0
  808. psychopy/app/Resources/light/pyPilot.png +0 -0
  809. psychopy/app/Resources/light/pyPilot@2x.png +0 -0
  810. psychopy/app/Resources/light/pyRun.png +0 -0
  811. psychopy/app/Resources/light/pyRun@2x.png +0 -0
  812. psychopy/app/Resources/light/reddot.png +0 -0
  813. psychopy/app/Resources/light/reddot@2x.png +0 -0
  814. psychopy/app/Resources/light/redglobe.png +0 -0
  815. psychopy/app/Resources/light/redglobe@2x.png +0 -0
  816. psychopy/app/Resources/light/redglobe_bug.png +0 -0
  817. psychopy/app/Resources/light/redglobe_bug@2x.png +0 -0
  818. psychopy/app/Resources/light/redglobe_greensync.png +0 -0
  819. psychopy/app/Resources/light/redglobe_greensync@2x.png +0 -0
  820. psychopy/app/Resources/light/redglobe_info.png +0 -0
  821. psychopy/app/Resources/light/redglobe_info@2x.png +0 -0
  822. psychopy/app/Resources/light/redglobe_magnifier.png +0 -0
  823. psychopy/app/Resources/light/redglobe_magnifier@2x.png +0 -0
  824. psychopy/app/Resources/light/redglobe_run.png +0 -0
  825. psychopy/app/Resources/light/redglobe_run@2x.png +0 -0
  826. psychopy/app/Resources/light/redglobe_user.png +0 -0
  827. psychopy/app/Resources/light/redglobe_user@2x.png +0 -0
  828. psychopy/app/Resources/light/redo.png +0 -0
  829. psychopy/app/Resources/light/redo32.png +0 -0
  830. psychopy/app/Resources/light/redo32@2x.png +0 -0
  831. psychopy/app/Resources/light/redo@2x.png +0 -0
  832. psychopy/app/Resources/light/removeExp32.png +0 -0
  833. psychopy/app/Resources/light/removeExp32@2x.png +0 -0
  834. psychopy/app/Resources/light/rename16.png +0 -0
  835. psychopy/app/Resources/light/rename16@2x.png +0 -0
  836. psychopy/app/Resources/light/restart.png +0 -0
  837. psychopy/app/Resources/light/restart@2x.png +0 -0
  838. psychopy/app/Resources/light/runner.png +0 -0
  839. psychopy/app/Resources/light/runner@2x.png +0 -0
  840. psychopy/app/Resources/light/runnerPilot.png +0 -0
  841. psychopy/app/Resources/light/runnerPilot@2x.png +0 -0
  842. psychopy/app/Resources/light/savebtn16.png +0 -0
  843. psychopy/app/Resources/light/savebtn16@2x.png +0 -0
  844. psychopy/app/Resources/light/search.png +0 -0
  845. psychopy/app/Resources/light/search@2x.png +0 -0
  846. psychopy/app/Resources/light/showBuilder.png +0 -0
  847. psychopy/app/Resources/light/showBuilder@2x.png +0 -0
  848. psychopy/app/Resources/light/showCoder.png +0 -0
  849. psychopy/app/Resources/light/showCoder@2x.png +0 -0
  850. psychopy/app/Resources/light/showRunner.png +0 -0
  851. psychopy/app/Resources/light/showRunner@2x.png +0 -0
  852. psychopy/app/Resources/light/starred.png +0 -0
  853. psychopy/app/Resources/light/starred@2x.png +0 -0
  854. psychopy/app/Resources/light/start.png +0 -0
  855. psychopy/app/Resources/light/start@2x.png +0 -0
  856. psychopy/app/Resources/light/stdout.png +0 -0
  857. psychopy/app/Resources/light/stdout@2x.png +0 -0
  858. psychopy/app/Resources/light/stop.png +0 -0
  859. psychopy/app/Resources/light/stop32.png +0 -0
  860. psychopy/app/Resources/light/stop32@2x.png +0 -0
  861. psychopy/app/Resources/light/stop@2x.png +0 -0
  862. psychopy/app/Resources/light/switchCtrlBot.png +0 -0
  863. psychopy/app/Resources/light/switchCtrlBot@2x.png +0 -0
  864. psychopy/app/Resources/light/switchCtrlLeft.png +0 -0
  865. psychopy/app/Resources/light/switchCtrlLeft@2x.png +0 -0
  866. psychopy/app/Resources/light/switchCtrlRight.png +0 -0
  867. psychopy/app/Resources/light/switchCtrlRight@2x.png +0 -0
  868. psychopy/app/Resources/light/switchCtrlTop.png +0 -0
  869. psychopy/app/Resources/light/switchCtrlTop@2x.png +0 -0
  870. psychopy/app/Resources/light/tick.png +0 -0
  871. psychopy/app/Resources/light/tick@2x.png +0 -0
  872. psychopy/app/Resources/light/undo.png +0 -0
  873. psychopy/app/Resources/light/undo32.png +0 -0
  874. psychopy/app/Resources/light/undo32@2x.png +0 -0
  875. psychopy/app/Resources/light/undo@2x.png +0 -0
  876. psychopy/app/Resources/light/unstarred.png +0 -0
  877. psychopy/app/Resources/light/unstarred@2x.png +0 -0
  878. psychopy/app/Resources/light/user_none.png +0 -0
  879. psychopy/app/Resources/light/view-refresh16.png +0 -0
  880. psychopy/app/Resources/light/view-refresh16@2x.png +0 -0
  881. psychopy/app/Resources/light/viewbtn16.png +0 -0
  882. psychopy/app/Resources/light/viewbtn16@2x.png +0 -0
  883. psychopy/app/Resources/light/windows16.png +0 -0
  884. psychopy/app/Resources/light/windows16@2x.png +0 -0
  885. psychopy/app/Resources/moveComponentIcons.py +50 -0
  886. psychopy/app/Resources/next.png +0 -0
  887. psychopy/app/Resources/psychopy.desktop +13 -0
  888. psychopy/app/Resources/psychopy.icns +0 -0
  889. psychopy/app/Resources/psychopy.ico +0 -0
  890. psychopy/app/Resources/psychopy.png +0 -0
  891. psychopy/app/Resources/psychopy.xml +9 -0
  892. psychopy/app/Resources/psychopy@2x.png +0 -0
  893. psychopy/app/Resources/psychopySplash.png +0 -0
  894. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  895. psychopy/app/Resources/routine_templates/Basic.psyexp +345 -0
  896. psychopy/app/Resources/routine_templates/Misc.psyexp +229 -0
  897. psychopy/app/Resources/routine_templates/Online.psyexp +202 -0
  898. psychopy/app/Resources/routine_templates/Trials.psyexp +736 -0
  899. psychopy/app/Resources/routine_templates/readme.md +14 -0
  900. psychopy/app/Resources/runner.ico +0 -0
  901. psychopy/app/Resources/tips.txt +45 -0
  902. psychopy/app/Resources/tips_ar_001.txt +45 -0
  903. psychopy/app/Resources/tips_fr_FR.txt +45 -0
  904. psychopy/app/Resources/tips_ja_JP.txt +42 -0
  905. psychopy/app/Resources/tips_zh_CN.txt +45 -0
  906. psychopy/app/Resources/window.ico +0 -0
  907. psychopy/app/__init__.py +224 -0
  908. psychopy/app/_psychopyApp.py +1224 -0
  909. psychopy/app/appData.spec +58 -0
  910. psychopy/app/builder/__init__.py +5 -0
  911. psychopy/app/builder/builder.py +4658 -0
  912. psychopy/app/builder/dialogs/__init__.py +2014 -0
  913. psychopy/app/builder/dialogs/dlgsCode.py +610 -0
  914. psychopy/app/builder/dialogs/dlgsConditions.py +670 -0
  915. psychopy/app/builder/dialogs/findDlg.py +189 -0
  916. psychopy/app/builder/dialogs/paramCtrls.py +1213 -0
  917. psychopy/app/builder/localizedStrings.py +225 -0
  918. psychopy/app/builder/validators.py +581 -0
  919. psychopy/app/coder/__init__.py +8 -0
  920. psychopy/app/coder/codeEditorBase.py +460 -0
  921. psychopy/app/coder/coder.py +3086 -0
  922. psychopy/app/coder/fileBrowser.py +668 -0
  923. psychopy/app/coder/folding.py +128 -0
  924. psychopy/app/coder/psychoParser.py +139 -0
  925. psychopy/app/coder/repl.py +493 -0
  926. psychopy/app/coder/sourceTree.py +302 -0
  927. psychopy/app/colorpicker/__init__.py +594 -0
  928. psychopy/app/colorpicker/ui.py +336 -0
  929. psychopy/app/connections/__init__.py +10 -0
  930. psychopy/app/connections/news.py +104 -0
  931. psychopy/app/connections/sendusage.py +61 -0
  932. psychopy/app/connections/updates.py +642 -0
  933. psychopy/app/console.py +164 -0
  934. psychopy/app/dialogs.py +632 -0
  935. psychopy/app/errorDlg.py +238 -0
  936. psychopy/app/frametracker.py +8 -0
  937. psychopy/app/idle.py +143 -0
  938. psychopy/app/jobs.py +648 -0
  939. psychopy/app/linuxconfig/__init__.py +144 -0
  940. psychopy/app/linuxconfig/ui.py +88 -0
  941. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  942. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +9554 -0
  943. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  944. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +24 -0
  945. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  946. psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +24 -0
  947. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  948. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +9712 -0
  949. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  950. psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +25 -0
  951. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  952. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +25 -0
  953. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  954. psychopy/app/locale/en_US/LC_MESSAGE/messages.po +18 -0
  955. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  956. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +9100 -0
  957. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  958. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +9094 -0
  959. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  960. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +9100 -0
  961. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  962. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +9569 -0
  963. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  964. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +5806 -0
  965. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  966. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +24 -0
  967. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  968. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +9577 -0
  969. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  970. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +9549 -0
  971. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  972. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +9559 -0
  973. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  974. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +25 -0
  975. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  976. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +9560 -0
  977. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  978. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +11687 -0
  979. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  980. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +24 -0
  981. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  982. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +8757 -0
  983. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  984. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +25 -0
  985. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  986. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +25 -0
  987. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  988. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +25 -0
  989. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  990. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +24 -0
  991. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  992. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +25 -0
  993. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  994. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +24 -0
  995. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  996. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +8747 -0
  997. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  998. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +9545 -0
  999. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  1000. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +8268 -0
  1001. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  1002. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +8022 -0
  1003. psychopy/app/pavlovia_ui/__init__.py +22 -0
  1004. psychopy/app/pavlovia_ui/_base.py +237 -0
  1005. psychopy/app/pavlovia_ui/functions.py +176 -0
  1006. psychopy/app/pavlovia_ui/menu.py +140 -0
  1007. psychopy/app/pavlovia_ui/project.py +943 -0
  1008. psychopy/app/pavlovia_ui/search.py +445 -0
  1009. psychopy/app/pavlovia_ui/sync.py +137 -0
  1010. psychopy/app/pavlovia_ui/user.py +264 -0
  1011. psychopy/app/plugin_manager/__init__.py +5 -0
  1012. psychopy/app/plugin_manager/dialog.py +400 -0
  1013. psychopy/app/plugin_manager/output.py +132 -0
  1014. psychopy/app/plugin_manager/packages.py +502 -0
  1015. psychopy/app/plugin_manager/plugins.py +1315 -0
  1016. psychopy/app/plugin_manager/utils.py +115 -0
  1017. psychopy/app/preferencesDlg.py +790 -0
  1018. psychopy/app/psychopyApp.py +103 -0
  1019. psychopy/app/ribbon.py +907 -0
  1020. psychopy/app/runner/__init__.py +1 -0
  1021. psychopy/app/runner/runner.py +1262 -0
  1022. psychopy/app/runner/scriptProcess.py +353 -0
  1023. psychopy/app/stdout/__init__.py +1 -0
  1024. psychopy/app/stdout/stdOutRich.py +380 -0
  1025. psychopy/app/sysInfoDlg.py +242 -0
  1026. psychopy/app/themes/__init__.py +78 -0
  1027. psychopy/app/themes/colors.py +201 -0
  1028. psychopy/app/themes/css/contrast_black.css +112 -0
  1029. psychopy/app/themes/css/contrast_white.css +115 -0
  1030. psychopy/app/themes/css/dark.css +112 -0
  1031. psychopy/app/themes/css/light.css +115 -0
  1032. psychopy/app/themes/fonts.py +629 -0
  1033. psychopy/app/themes/handlers.py +321 -0
  1034. psychopy/app/themes/icons.py +250 -0
  1035. psychopy/app/themes/spec/Classic.json +154 -0
  1036. psychopy/app/themes/spec/ClassicDark.json +154 -0
  1037. psychopy/app/themes/spec/GitHub.json +154 -0
  1038. psychopy/app/themes/spec/HiVisDark.json +153 -0
  1039. psychopy/app/themes/spec/HiVisLight.json +154 -0
  1040. psychopy/app/themes/spec/MinimalDark.json +154 -0
  1041. psychopy/app/themes/spec/MinimalLight.json +153 -0
  1042. psychopy/app/themes/spec/PsychopyDark.json +231 -0
  1043. psychopy/app/themes/spec/PsychopyLight.json +236 -0
  1044. psychopy/app/themes/ui.py +74 -0
  1045. psychopy/app/ui/__init__.py +184 -0
  1046. psychopy/app/urls.py +31 -0
  1047. psychopy/app/utils.py +1680 -0
  1048. psychopy/app/viewer/__init__.py +0 -0
  1049. psychopy/clock.py +612 -0
  1050. psychopy/colors.py +1050 -0
  1051. psychopy/compatibility.py +95 -0
  1052. psychopy/constants.py +87 -0
  1053. psychopy/contrib/__init__.py +0 -0
  1054. psychopy/contrib/configobj/LICENSE +39 -0
  1055. psychopy/contrib/configobj/__init__.py +2453 -0
  1056. psychopy/contrib/configobj/_version.py +2 -0
  1057. psychopy/contrib/configobj/validate.py +1458 -0
  1058. psychopy/contrib/lazy_import.py +402 -0
  1059. psychopy/contrib/mseq.py +273 -0
  1060. psychopy/contrib/mseqSearch.py +183 -0
  1061. psychopy/contrib/psi.py +100 -0
  1062. psychopy/contrib/quest.py +484 -0
  1063. psychopy/contrib/tesselate.py +188 -0
  1064. psychopy/core.py +167 -0
  1065. psychopy/data/__init__.py +44 -0
  1066. psychopy/data/base.py +566 -0
  1067. psychopy/data/counterbalance.py +210 -0
  1068. psychopy/data/experiment.py +708 -0
  1069. psychopy/data/fit.py +248 -0
  1070. psychopy/data/shelf.py +237 -0
  1071. psychopy/data/staircase.py +2247 -0
  1072. psychopy/data/trial.py +1978 -0
  1073. psychopy/data/utils.py +783 -0
  1074. psychopy/demos/__init__.py +0 -0
  1075. psychopy/demos/builder/Design Templates/branchedExperiment/README.md +5 -0
  1076. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +239 -0
  1077. psychopy/demos/builder/Design Templates/branchedExperiment/trialTypes.xlsx +0 -0
  1078. psychopy/demos/builder/Design Templates/psychophysicsStaircase/README.md +20 -0
  1079. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +264 -0
  1080. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/README.md +14 -0
  1081. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +201 -0
  1082. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/stairDefinitions.xlsx +0 -0
  1083. psychopy/demos/builder/Design Templates/randomisedBlocks/README.md +18 -0
  1084. psychopy/demos/builder/Design Templates/randomisedBlocks/chooseBlock.xlsx +0 -0
  1085. psychopy/demos/builder/Design Templates/randomisedBlocks/facesBlock.xlsx +0 -0
  1086. psychopy/demos/builder/Design Templates/randomisedBlocks/housesBlock.xlsx +0 -0
  1087. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +131 -0
  1088. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face01.jpg +0 -0
  1089. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face02.jpg +0 -0
  1090. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face03.jpg +0 -0
  1091. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house01.jpg +0 -0
  1092. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house02.jpg +0 -0
  1093. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house03.jpg +0 -0
  1094. psychopy/demos/builder/Experiments/BART/README.md +30 -0
  1095. psychopy/demos/builder/Experiments/BART/assets/background.png +0 -0
  1096. psychopy/demos/builder/Experiments/BART/assets/bang.mp3 +0 -0
  1097. psychopy/demos/builder/Experiments/BART/assets/bang.wav +0 -0
  1098. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  1099. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  1100. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  1101. psychopy/demos/builder/Experiments/BART/bart.psyexp +931 -0
  1102. psychopy/demos/builder/Experiments/BART/spreadsheets/conditions.xlsx +0 -0
  1103. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +193 -0
  1104. psychopy/demos/builder/Experiments/BigFiveInventory/README.md +23 -0
  1105. psychopy/demos/builder/Experiments/BigFiveInventory/TIPI.xlsx +0 -0
  1106. psychopy/demos/builder/Experiments/BigFiveInventory/bigFiveItems.xlsx +0 -0
  1107. psychopy/demos/builder/Experiments/BigFiveInventory/demographics.xlsx +0 -0
  1108. psychopy/demos/builder/Experiments/BigFiveInventory/mini_IPIP.xlsx +0 -0
  1109. psychopy/demos/builder/Experiments/dragAndDrop/README.md +40 -0
  1110. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  1111. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +1221 -0
  1112. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +61 -0
  1113. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +91 -0
  1114. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  1115. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  1116. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  1117. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  1118. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  1119. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  1120. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  1121. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  1122. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  1123. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  1124. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  1125. psychopy/demos/builder/Experiments/goNoGo/conditions.xlsx +0 -0
  1126. psychopy/demos/builder/Experiments/goNoGo/gng.psyexp +449 -0
  1127. psychopy/demos/builder/Experiments/goNoGo/go.png +0 -0
  1128. psychopy/demos/builder/Experiments/goNoGo/nogo.png +0 -0
  1129. psychopy/demos/builder/Experiments/goNoGo/readme.md +14 -0
  1130. psychopy/demos/builder/Experiments/mentalRotation/F.png +0 -0
  1131. psychopy/demos/builder/Experiments/mentalRotation/FR.png +0 -0
  1132. psychopy/demos/builder/Experiments/mentalRotation/MentalRot.csv +33 -0
  1133. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +605 -0
  1134. psychopy/demos/builder/Experiments/mentalRotation/README.md +23 -0
  1135. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +478 -0
  1136. psychopy/demos/builder/Experiments/navon/README.md +26 -0
  1137. psychopy/demos/builder/Experiments/navon/bigHsmallH.png +0 -0
  1138. psychopy/demos/builder/Experiments/navon/bigHsmallS.png +0 -0
  1139. psychopy/demos/builder/Experiments/navon/bigSsmallH.png +0 -0
  1140. psychopy/demos/builder/Experiments/navon/bigSsmallS.png +0 -0
  1141. psychopy/demos/builder/Experiments/navon/mask.png +0 -0
  1142. psychopy/demos/builder/Experiments/navon/stimuli.pptx +0 -0
  1143. psychopy/demos/builder/Experiments/navon/trialTypes.xlsx +0 -0
  1144. psychopy/demos/builder/Experiments/sternberg/README.md +14 -0
  1145. psychopy/demos/builder/Experiments/sternberg/mainTrials.xlsx +0 -0
  1146. psychopy/demos/builder/Experiments/sternberg/pracTrials.xlsx +0 -0
  1147. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +611 -0
  1148. psychopy/demos/builder/Experiments/stroop/README.md +15 -0
  1149. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +225 -0
  1150. psychopy/demos/builder/Experiments/stroop/trialTypes.csv +7 -0
  1151. psychopy/demos/builder/Experiments/stroopExtended/README.md +14 -0
  1152. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +243 -0
  1153. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +243 -0
  1154. psychopy/demos/builder/Experiments/stroopExtended/trialTypes.xlsx +0 -0
  1155. psychopy/demos/builder/Experiments/stroopExtended/trialTypesReverse.xlsx +0 -0
  1156. psychopy/demos/builder/Experiments/stroopVoice/README.md +27 -0
  1157. psychopy/demos/builder/Experiments/stroopVoice/conditions.xlsx +0 -0
  1158. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +366 -0
  1159. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +298 -0
  1160. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +341 -0
  1161. psychopy/demos/builder/Feature Demos/gratings/readme.md +8 -0
  1162. psychopy/demos/builder/Feature Demos/noise/face.jpg +0 -0
  1163. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +424 -0
  1164. psychopy/demos/builder/Feature Demos/noise/readme.md +3 -0
  1165. psychopy/demos/builder/Feature Demos/panorama/panImg.jpg +0 -0
  1166. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +142 -0
  1167. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +423 -0
  1168. psychopy/demos/builder/Feature Demos/progress/readme.md +1 -0
  1169. psychopy/demos/builder/Feature Demos/sliders/README.md +8 -0
  1170. psychopy/demos/builder/Feature Demos/sliders/fruitConditions.xlsx +0 -0
  1171. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +938 -0
  1172. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +621 -0
  1173. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +404 -0
  1174. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +641 -0
  1175. psychopy/demos/builder/Hardware/EGI_netstation/README.md +17 -0
  1176. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +254 -0
  1177. psychopy/demos/builder/Hardware/EGI_netstation/trialTypesEEG.csv +7 -0
  1178. psychopy/demos/builder/Hardware/Eyetracking_visual_search/readme.md +19 -0
  1179. psychopy/demos/builder/Hardware/Eyetracking_visual_search/trials_params.xlsx +0 -0
  1180. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +691 -0
  1181. psychopy/demos/builder/Hardware/camera/camera.psyexp +263 -0
  1182. psychopy/demos/builder/Hardware/camera/readme.md +6 -0
  1183. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +354 -0
  1184. psychopy/demos/builder/Hardware/eyetracking/readme.md +7 -0
  1185. psychopy/demos/builder/Hardware/eyetracking_custom_cal/Bullseye_grey.mov +0 -0
  1186. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +349 -0
  1187. psychopy/demos/builder/Hardware/eyetracking_custom_cal/readme.md +7 -0
  1188. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +202 -0
  1189. psychopy/demos/builder/Hardware/fMRI/readme.md +7 -0
  1190. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +349 -0
  1191. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +304 -0
  1192. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +451 -0
  1193. psychopy/demos/builder/Hardware/microphone/phrases.xlsx +0 -0
  1194. psychopy/demos/builder/Hardware/microphone/readme.md +9 -0
  1195. psychopy/demos/builder/Hardware/pump/README.md +19 -0
  1196. psychopy/demos/builder/Hardware/pump/pump.psyexp +382 -0
  1197. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +288 -0
  1198. psychopy/demos/builder/Helper Tools/achorVSalignment/readme.md +5 -0
  1199. psychopy/demos/builder/Helper Tools/clockFace/README.md +3 -0
  1200. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +160 -0
  1201. psychopy/demos/builder/Helper Tools/colors/README.md +5 -0
  1202. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -0
  1203. psychopy/demos/builder/Helper Tools/drawPolygon/README.md +5 -0
  1204. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +591 -0
  1205. psychopy/demos/builder/Helper Tools/keyNameFinder/README.md +14 -0
  1206. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +169 -0
  1207. psychopy/demos/builder/Helper Tools/spatialUnits/README.md +6 -0
  1208. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +157 -0
  1209. psychopy/demos/builder/README.txt +43 -0
  1210. psychopy/demos/builder/__init__.py +0 -0
  1211. psychopy/demos/coder/__init__.py +0 -0
  1212. psychopy/demos/coder/basic/hello_world.py +37 -0
  1213. psychopy/demos/coder/csvFromPsydat.py +29 -0
  1214. psychopy/demos/coder/experiment control/JND_staircase_analysis.py +85 -0
  1215. psychopy/demos/coder/experiment control/JND_staircase_exp.py +110 -0
  1216. psychopy/demos/coder/experiment control/TrialHandler.py +64 -0
  1217. psychopy/demos/coder/experiment control/TrialHandler2.py +42 -0
  1218. psychopy/demos/coder/experiment control/__init__.py +0 -0
  1219. psychopy/demos/coder/experiment control/autoDraw_autoLog.py +50 -0
  1220. psychopy/demos/coder/experiment control/experimentHandler.py +57 -0
  1221. psychopy/demos/coder/experiment control/fMRI_launchScan.py +74 -0
  1222. psychopy/demos/coder/experiment control/gammaMotionAnalysis.py +68 -0
  1223. psychopy/demos/coder/experiment control/gammaMotionNull.py +169 -0
  1224. psychopy/demos/coder/experiment control/logFiles.py +55 -0
  1225. psychopy/demos/coder/experiment control/piloting.py +65 -0
  1226. psychopy/demos/coder/experiment control/runtimeInfo.py +79 -0
  1227. psychopy/demos/coder/hardware/CRS_BitsBox.py +75 -0
  1228. psychopy/demos/coder/hardware/CRS_BitsPlusPlus.py +73 -0
  1229. psychopy/demos/coder/hardware/RiftHeadTrackingExample.py +95 -0
  1230. psychopy/demos/coder/hardware/RiftMinimal.py +44 -0
  1231. psychopy/demos/coder/hardware/VSHD_Distortion.py +49 -0
  1232. psychopy/demos/coder/hardware/__init__.py +0 -0
  1233. psychopy/demos/coder/hardware/camera.py +90 -0
  1234. psychopy/demos/coder/hardware/cedrusRB730.py +38 -0
  1235. psychopy/demos/coder/hardware/crsBitsAdvancedDemo.py +780 -0
  1236. psychopy/demos/coder/hardware/egi_netstation.py +45 -0
  1237. psychopy/demos/coder/hardware/ioLab_bbox.py +62 -0
  1238. psychopy/demos/coder/hardware/labjack_u3.py +61 -0
  1239. psychopy/demos/coder/hardware/monitorDemo.py +28 -0
  1240. psychopy/demos/coder/hardware/parallelPortOutput.py +49 -0
  1241. psychopy/demos/coder/hardware/qmixPump.py +79 -0
  1242. psychopy/demos/coder/hardware/testSoundLatency.py +127 -0
  1243. psychopy/demos/coder/input/GUI.py +52 -0
  1244. psychopy/demos/coder/input/__init__.py +0 -0
  1245. psychopy/demos/coder/input/customMouse.py +51 -0
  1246. psychopy/demos/coder/input/joystick_universal.py +84 -0
  1247. psychopy/demos/coder/input/keyNameFinder.py +39 -0
  1248. psychopy/demos/coder/input/mic.png +0 -0
  1249. psychopy/demos/coder/input/mouse.py +66 -0
  1250. psychopy/demos/coder/iohub/delaytest.py +231 -0
  1251. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/canal.jpg +0 -0
  1252. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/fall.jpg +0 -0
  1253. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/lake.jpg +0 -0
  1254. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/party.jpg +0 -0
  1255. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/swimming.jpg +0 -0
  1256. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByConditionVariables.py +67 -0
  1257. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByMessages.py +34 -0
  1258. psychopy/demos/coder/iohub/eyetracking/gcCursor/run.py +323 -0
  1259. psychopy/demos/coder/iohub/eyetracking/gcCursor/trial_conditions.xlsx +0 -0
  1260. psychopy/demos/coder/iohub/eyetracking/simple.py +147 -0
  1261. psychopy/demos/coder/iohub/eyetracking/validation.py +251 -0
  1262. psychopy/demos/coder/iohub/iodatastore/saveEventReport.py +56 -0
  1263. psychopy/demos/coder/iohub/keyboard.py +189 -0
  1264. psychopy/demos/coder/iohub/keyboardreactiontime.py +88 -0
  1265. psychopy/demos/coder/iohub/launchHub.py +160 -0
  1266. psychopy/demos/coder/iohub/mouse.py +112 -0
  1267. psychopy/demos/coder/iohub/mouse_multi_window.py +124 -0
  1268. psychopy/demos/coder/iohub/serial/_parseserial.py +53 -0
  1269. psychopy/demos/coder/iohub/serial/customparser.py +84 -0
  1270. psychopy/demos/coder/iohub/serial/pstbox.py +166 -0
  1271. psychopy/demos/coder/iohub/wintab/_wintabgraphics.py +281 -0
  1272. psychopy/demos/coder/iohub/wintab/pen_demo.py +260 -0
  1273. psychopy/demos/coder/misc/encrypt_data.py +48 -0
  1274. psychopy/demos/coder/misc/makeMovie.py +28 -0
  1275. psychopy/demos/coder/misc/rigidBodyTransform.py +76 -0
  1276. psychopy/demos/coder/stimuli/Campaign.ttf +0 -0
  1277. psychopy/demos/coder/stimuli/MovieStim.py +65 -0
  1278. psychopy/demos/coder/stimuli/__init__.py +0 -0
  1279. psychopy/demos/coder/stimuli/aperture.py +37 -0
  1280. psychopy/demos/coder/stimuli/beach.jpg +0 -0
  1281. psychopy/demos/coder/stimuli/bufferImageStim.py +78 -0
  1282. psychopy/demos/coder/stimuli/clockface.py +43 -0
  1283. psychopy/demos/coder/stimuli/colorPalette.py +134 -0
  1284. psychopy/demos/coder/stimuli/compare_text_timing.py +193 -0
  1285. psychopy/demos/coder/stimuli/counterphase.py +43 -0
  1286. psychopy/demos/coder/stimuli/customTextures.py +57 -0
  1287. psychopy/demos/coder/stimuli/dot_gabors.py +35 -0
  1288. psychopy/demos/coder/stimuli/dots.py +35 -0
  1289. psychopy/demos/coder/stimuli/elementArrays.py +92 -0
  1290. psychopy/demos/coder/stimuli/embeddedOpenGL.py +35 -0
  1291. psychopy/demos/coder/stimuli/face.jpg +0 -0
  1292. psychopy/demos/coder/stimuli/face_jpg.py +48 -0
  1293. psychopy/demos/coder/stimuli/gabor.py +30 -0
  1294. psychopy/demos/coder/stimuli/imagesAndPatches.py +51 -0
  1295. psychopy/demos/coder/stimuli/jwpIntro.mp4 +0 -0
  1296. psychopy/demos/coder/stimuli/kanizsa.py +41 -0
  1297. psychopy/demos/coder/stimuli/maskReveal.py +63 -0
  1298. psychopy/demos/coder/stimuli/plaid.py +43 -0
  1299. psychopy/demos/coder/stimuli/ratingScale.py +183 -0
  1300. psychopy/demos/coder/stimuli/rotatingFlashingWedge.py +37 -0
  1301. psychopy/demos/coder/stimuli/screensAndWindows.py +58 -0
  1302. psychopy/demos/coder/stimuli/secondOrderGratings.py +66 -0
  1303. psychopy/demos/coder/stimuli/shapeContains.py +50 -0
  1304. psychopy/demos/coder/stimuli/shapes.py +63 -0
  1305. psychopy/demos/coder/stimuli/soundStimuli.py +49 -0
  1306. psychopy/demos/coder/stimuli/starField.py +48 -0
  1307. psychopy/demos/coder/stimuli/stim3d.py +107 -0
  1308. psychopy/demos/coder/stimuli/textBoxStim/textbox_glyph_placement.py +93 -0
  1309. psychopy/demos/coder/stimuli/textBoxStim/textbox_simple.py +71 -0
  1310. psychopy/demos/coder/stimuli/textStimuli.py +106 -0
  1311. psychopy/demos/coder/stimuli/textbox_editable.py +64 -0
  1312. psychopy/demos/coder/stimuli/variousVisualStims.py +47 -0
  1313. psychopy/demos/coder/stimuli/visual_noise.py +31 -0
  1314. psychopy/demos/coder/sysInfo.py +56 -0
  1315. psychopy/demos/coder/timing/__init__.py +0 -0
  1316. psychopy/demos/coder/timing/callOnFlip.py +39 -0
  1317. psychopy/demos/coder/timing/clocksAndTimers.py +46 -0
  1318. psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +323 -0
  1319. psychopy/demos/coder/timing/timeByFrames.py +74 -0
  1320. psychopy/demos/coder/timing/timeByFramesEx.py +107 -0
  1321. psychopy/demos/coder/understanding psychopy/colors.py +70 -0
  1322. psychopy/demos/coder/understanding psychopy/fontLayout.py +69 -0
  1323. psychopy/demos/demo_migration.py +214 -0
  1324. psychopy/demos/modernizeDemos.py +16 -0
  1325. psychopy/demos/test_demo_migration.py +155 -0
  1326. psychopy/devices/__init__.py +8 -0
  1327. psychopy/event.py +1333 -0
  1328. psychopy/exceptions.py +59 -0
  1329. psychopy/experiment/__init__.py +51 -0
  1330. psychopy/experiment/_experiment.py +1392 -0
  1331. psychopy/experiment/blankTemplate.xltx +0 -0
  1332. psychopy/experiment/components/__init__.py +411 -0
  1333. psychopy/experiment/components/_base.py +1351 -0
  1334. psychopy/experiment/components/aperture/__init__.py +149 -0
  1335. psychopy/experiment/components/aperture/classic/aperture.png +0 -0
  1336. psychopy/experiment/components/aperture/classic/aperture@2x.png +0 -0
  1337. psychopy/experiment/components/aperture/dark/aperture.png +0 -0
  1338. psychopy/experiment/components/aperture/dark/aperture@2x.png +0 -0
  1339. psychopy/experiment/components/aperture/light/aperture.png +0 -0
  1340. psychopy/experiment/components/aperture/light/aperture@2x.png +0 -0
  1341. psychopy/experiment/components/brush/__init__.py +163 -0
  1342. psychopy/experiment/components/brush/classic/brush.png +0 -0
  1343. psychopy/experiment/components/brush/classic/brush@2x.png +0 -0
  1344. psychopy/experiment/components/brush/dark/brush.png +0 -0
  1345. psychopy/experiment/components/brush/dark/brush@2x.png +0 -0
  1346. psychopy/experiment/components/brush/light/brush.png +0 -0
  1347. psychopy/experiment/components/brush/light/brush@2x.png +0 -0
  1348. psychopy/experiment/components/button/__init__.py +489 -0
  1349. psychopy/experiment/components/button/classic/button.png +0 -0
  1350. psychopy/experiment/components/button/classic/button@2x.png +0 -0
  1351. psychopy/experiment/components/button/dark/button.png +0 -0
  1352. psychopy/experiment/components/button/dark/button@2x.png +0 -0
  1353. psychopy/experiment/components/button/light/button.png +0 -0
  1354. psychopy/experiment/components/button/light/button@2x.png +0 -0
  1355. psychopy/experiment/components/buttonBox/__init__.py +316 -0
  1356. psychopy/experiment/components/buttonBox/classic/buttonBox.png +0 -0
  1357. psychopy/experiment/components/buttonBox/classic/buttonBox@2x.png +0 -0
  1358. psychopy/experiment/components/buttonBox/dark/buttonBox.png +0 -0
  1359. psychopy/experiment/components/buttonBox/dark/buttonBox@2x.png +0 -0
  1360. psychopy/experiment/components/buttonBox/light/buttonBox.png +0 -0
  1361. psychopy/experiment/components/buttonBox/light/buttonBox@2x.png +0 -0
  1362. psychopy/experiment/components/camera/__init__.py +591 -0
  1363. psychopy/experiment/components/camera/classic/webcam.png +0 -0
  1364. psychopy/experiment/components/camera/classic/webcam@2x.png +0 -0
  1365. psychopy/experiment/components/camera/dark/webcam.png +0 -0
  1366. psychopy/experiment/components/camera/dark/webcam@2x.png +0 -0
  1367. psychopy/experiment/components/camera/light/webcam.png +0 -0
  1368. psychopy/experiment/components/camera/light/webcam@2x.png +0 -0
  1369. psychopy/experiment/components/code/__init__.py +266 -0
  1370. psychopy/experiment/components/code/classic/code.png +0 -0
  1371. psychopy/experiment/components/code/classic/code@2x.png +0 -0
  1372. psychopy/experiment/components/code/dark/code.png +0 -0
  1373. psychopy/experiment/components/code/dark/code@2x.png +0 -0
  1374. psychopy/experiment/components/code/light/code.png +0 -0
  1375. psychopy/experiment/components/code/light/code@2x.png +0 -0
  1376. psychopy/experiment/components/dots/__init__.py +199 -0
  1377. psychopy/experiment/components/dots/classic/dots.png +0 -0
  1378. psychopy/experiment/components/dots/classic/dots@2x.png +0 -0
  1379. psychopy/experiment/components/dots/dark/dots.png +0 -0
  1380. psychopy/experiment/components/dots/dark/dots@2x.png +0 -0
  1381. psychopy/experiment/components/dots/dots.xcf +0 -0
  1382. psychopy/experiment/components/dots/light/dots.png +0 -0
  1383. psychopy/experiment/components/dots/light/dots@2x.png +0 -0
  1384. psychopy/experiment/components/eyetracker_record/__init__.py +128 -0
  1385. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record.png +0 -0
  1386. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record@2x.png +0 -0
  1387. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record.png +0 -0
  1388. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record@2x.png +0 -0
  1389. psychopy/experiment/components/eyetracker_record/light/eyetracker_record.png +0 -0
  1390. psychopy/experiment/components/eyetracker_record/light/eyetracker_record@2x.png +0 -0
  1391. psychopy/experiment/components/form/__init__.py +223 -0
  1392. psychopy/experiment/components/form/classic/form.png +0 -0
  1393. psychopy/experiment/components/form/classic/form@2x.png +0 -0
  1394. psychopy/experiment/components/form/dark/form.png +0 -0
  1395. psychopy/experiment/components/form/dark/form@2x.png +0 -0
  1396. psychopy/experiment/components/form/formItems.xltx +0 -0
  1397. psychopy/experiment/components/form/light/form.png +0 -0
  1398. psychopy/experiment/components/form/light/form@2x.png +0 -0
  1399. psychopy/experiment/components/grating/__init__.py +192 -0
  1400. psychopy/experiment/components/grating/classic/grating.png +0 -0
  1401. psychopy/experiment/components/grating/classic/grating@2x.png +0 -0
  1402. psychopy/experiment/components/grating/dark/grating.png +0 -0
  1403. psychopy/experiment/components/grating/dark/grating@2x.png +0 -0
  1404. psychopy/experiment/components/grating/light/grating.png +0 -0
  1405. psychopy/experiment/components/grating/light/grating@2x.png +0 -0
  1406. psychopy/experiment/components/image/__init__.py +184 -0
  1407. psychopy/experiment/components/image/classic/image.png +0 -0
  1408. psychopy/experiment/components/image/classic/image@2x.png +0 -0
  1409. psychopy/experiment/components/image/dark/image.png +0 -0
  1410. psychopy/experiment/components/image/dark/image@2x.png +0 -0
  1411. psychopy/experiment/components/image/light/image.png +0 -0
  1412. psychopy/experiment/components/image/light/image@2x.png +0 -0
  1413. psychopy/experiment/components/joyButtons/__init__.py +453 -0
  1414. psychopy/experiment/components/joyButtons/classic/joyButtons.png +0 -0
  1415. psychopy/experiment/components/joyButtons/classic/joybuttons@2x.png +0 -0
  1416. psychopy/experiment/components/joyButtons/dark/joyButtons.png +0 -0
  1417. psychopy/experiment/components/joyButtons/dark/joyButtons@2x.png +0 -0
  1418. psychopy/experiment/components/joyButtons/light/joyButtons.png +0 -0
  1419. psychopy/experiment/components/joyButtons/light/joyButtons@2x.png +0 -0
  1420. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +34 -0
  1421. psychopy/experiment/components/joystick/__init__.py +572 -0
  1422. psychopy/experiment/components/joystick/classic/joystick.png +0 -0
  1423. psychopy/experiment/components/joystick/classic/joystick@2x.png +0 -0
  1424. psychopy/experiment/components/joystick/dark/joystick.png +0 -0
  1425. psychopy/experiment/components/joystick/dark/joystick@2x.png +0 -0
  1426. psychopy/experiment/components/joystick/light/joystick.png +0 -0
  1427. psychopy/experiment/components/joystick/light/joystick@2x.png +0 -0
  1428. psychopy/experiment/components/joystick/virtualJoystick.py +40 -0
  1429. psychopy/experiment/components/keyboard/__init__.py +587 -0
  1430. psychopy/experiment/components/keyboard/classic/keyboard.png +0 -0
  1431. psychopy/experiment/components/keyboard/classic/keyboard@2x.png +0 -0
  1432. psychopy/experiment/components/keyboard/dark/keyboard.png +0 -0
  1433. psychopy/experiment/components/keyboard/dark/keyboard@2x.png +0 -0
  1434. psychopy/experiment/components/keyboard/light/keyboard.png +0 -0
  1435. psychopy/experiment/components/keyboard/light/keyboard@2x.png +0 -0
  1436. psychopy/experiment/components/keyboard.xcf +0 -0
  1437. psychopy/experiment/components/microphone/__init__.py +664 -0
  1438. psychopy/experiment/components/microphone/classic/microphone.png +0 -0
  1439. psychopy/experiment/components/microphone/classic/microphone@2x.png +0 -0
  1440. psychopy/experiment/components/microphone/dark/microphone.png +0 -0
  1441. psychopy/experiment/components/microphone/dark/microphone@2x.png +0 -0
  1442. psychopy/experiment/components/microphone/light/microphone.png +0 -0
  1443. psychopy/experiment/components/microphone/light/microphone@2x.png +0 -0
  1444. psychopy/experiment/components/mouse/__init__.py +747 -0
  1445. psychopy/experiment/components/mouse/classic/mouse.png +0 -0
  1446. psychopy/experiment/components/mouse/classic/mouse@2x.png +0 -0
  1447. psychopy/experiment/components/mouse/dark/mouse.png +0 -0
  1448. psychopy/experiment/components/mouse/dark/mouse@2x.png +0 -0
  1449. psychopy/experiment/components/mouse/light/mouse.png +0 -0
  1450. psychopy/experiment/components/mouse/light/mouse@2x.png +0 -0
  1451. psychopy/experiment/components/movie/__init__.py +367 -0
  1452. psychopy/experiment/components/movie/classic/movie.png +0 -0
  1453. psychopy/experiment/components/movie/classic/movie@2x.png +0 -0
  1454. psychopy/experiment/components/movie/dark/movie.png +0 -0
  1455. psychopy/experiment/components/movie/dark/movie@2x.png +0 -0
  1456. psychopy/experiment/components/movie/light/movie.png +0 -0
  1457. psychopy/experiment/components/movie/light/movie@2x.png +0 -0
  1458. psychopy/experiment/components/panorama/__init__.py +456 -0
  1459. psychopy/experiment/components/panorama/classic/panorama.png +0 -0
  1460. psychopy/experiment/components/panorama/classic/panorama@2x.png +0 -0
  1461. psychopy/experiment/components/panorama/dark/panorama.png +0 -0
  1462. psychopy/experiment/components/panorama/dark/panorama@2x.png +0 -0
  1463. psychopy/experiment/components/panorama/light/panorama.png +0 -0
  1464. psychopy/experiment/components/panorama/light/panorama@2x.png +0 -0
  1465. psychopy/experiment/components/parallelOut/__init__.py +178 -0
  1466. psychopy/experiment/components/parallelOut/classic/parallel.png +0 -0
  1467. psychopy/experiment/components/parallelOut/classic/parallel@2x.png +0 -0
  1468. psychopy/experiment/components/parallelOut/dark/parallel.png +0 -0
  1469. psychopy/experiment/components/parallelOut/dark/parallel@2x.png +0 -0
  1470. psychopy/experiment/components/parallelOut/light/parallel.png +0 -0
  1471. psychopy/experiment/components/parallelOut/light/parallel@2x.png +0 -0
  1472. psychopy/experiment/components/patch/__init__.py +121 -0
  1473. psychopy/experiment/components/patch/classic/patch.png +0 -0
  1474. psychopy/experiment/components/patch/dark/patch.png +0 -0
  1475. psychopy/experiment/components/patch/dark/patch@2x.png +0 -0
  1476. psychopy/experiment/components/patch/light/patch.png +0 -0
  1477. psychopy/experiment/components/patch/light/patch@2x.png +0 -0
  1478. psychopy/experiment/components/polygon/__init__.py +303 -0
  1479. psychopy/experiment/components/polygon/classic/polygon.png +0 -0
  1480. psychopy/experiment/components/polygon/classic/polygon@2x.png +0 -0
  1481. psychopy/experiment/components/polygon/dark/polygon.png +0 -0
  1482. psychopy/experiment/components/polygon/dark/polygon@2x.png +0 -0
  1483. psychopy/experiment/components/polygon/light/polygon.png +0 -0
  1484. psychopy/experiment/components/polygon/light/polygon@2x.png +0 -0
  1485. psychopy/experiment/components/progress/__init__.py +130 -0
  1486. psychopy/experiment/components/progress/classic/progress.png +0 -0
  1487. psychopy/experiment/components/progress/classic/progress@2x.png +0 -0
  1488. psychopy/experiment/components/progress/dark/progress.png +0 -0
  1489. psychopy/experiment/components/progress/dark/progress@2x.png +0 -0
  1490. psychopy/experiment/components/progress/light/progress.png +0 -0
  1491. psychopy/experiment/components/progress/light/progress@2x.png +0 -0
  1492. psychopy/experiment/components/ratingScale/__init__.py +337 -0
  1493. psychopy/experiment/components/ratingScale/classic/ratingscale.png +0 -0
  1494. psychopy/experiment/components/ratingScale/classic/ratingscale@2x.png +0 -0
  1495. psychopy/experiment/components/ratingScale/dark/ratingScale@2x.png +0 -0
  1496. psychopy/experiment/components/ratingScale/dark/ratingscale.png +0 -0
  1497. psychopy/experiment/components/ratingScale/light/ratingScale@2x.png +0 -0
  1498. psychopy/experiment/components/ratingScale/light/ratingscale.png +0 -0
  1499. psychopy/experiment/components/resourceManager/__init__.py +176 -0
  1500. psychopy/experiment/components/resourceManager/classic/resource_manager.png +0 -0
  1501. psychopy/experiment/components/resourceManager/classic/resource_manager@2x.png +0 -0
  1502. psychopy/experiment/components/resourceManager/dark/resource_manager.png +0 -0
  1503. psychopy/experiment/components/resourceManager/dark/resource_manager@2x.png +0 -0
  1504. psychopy/experiment/components/resourceManager/light/resource_manager.png +0 -0
  1505. psychopy/experiment/components/resourceManager/light/resource_manager@2x.png +0 -0
  1506. psychopy/experiment/components/roi/__init__.py +311 -0
  1507. psychopy/experiment/components/roi/classic/eyetracker_roi.png +0 -0
  1508. psychopy/experiment/components/roi/classic/eyetracker_roi@2x.png +0 -0
  1509. psychopy/experiment/components/roi/dark/eyetracker_roi.png +0 -0
  1510. psychopy/experiment/components/roi/dark/eyetracker_roi@2X.png +0 -0
  1511. psychopy/experiment/components/roi/light/eyetracker_roi.png +0 -0
  1512. psychopy/experiment/components/roi/light/eyetracker_roi@2X.png +0 -0
  1513. psychopy/experiment/components/routineSettings/__init__.py +338 -0
  1514. psychopy/experiment/components/routineSettings/classic/routineSettings.png +0 -0
  1515. psychopy/experiment/components/routineSettings/classic/routineSettings@2x.png +0 -0
  1516. psychopy/experiment/components/routineSettings/dark/routineSettings.png +0 -0
  1517. psychopy/experiment/components/routineSettings/dark/routineSettings@2x.png +0 -0
  1518. psychopy/experiment/components/routineSettings/light/routineSettings.png +0 -0
  1519. psychopy/experiment/components/routineSettings/light/routineSettings@2x.png +0 -0
  1520. psychopy/experiment/components/serialOut/__init__.py +205 -0
  1521. psychopy/experiment/components/serialOut/classic/serial.png +0 -0
  1522. psychopy/experiment/components/serialOut/classic/serial@2x.png +0 -0
  1523. psychopy/experiment/components/serialOut/dark/serial.png +0 -0
  1524. psychopy/experiment/components/serialOut/dark/serial@2x.png +0 -0
  1525. psychopy/experiment/components/serialOut/light/serial.png +0 -0
  1526. psychopy/experiment/components/serialOut/light/serial@2x.png +0 -0
  1527. psychopy/experiment/components/settings/JS_htmlHeader.tmpl +23 -0
  1528. psychopy/experiment/components/settings/JS_setupExp.tmpl +28 -0
  1529. psychopy/experiment/components/settings/__init__.py +2155 -0
  1530. psychopy/experiment/components/settings/classic/settings.png +0 -0
  1531. psychopy/experiment/components/settings/classic/settings@2x.png +0 -0
  1532. psychopy/experiment/components/settings/dark/settings.png +0 -0
  1533. psychopy/experiment/components/settings/dark/settings@2x.png +0 -0
  1534. psychopy/experiment/components/settings/light/settings.png +0 -0
  1535. psychopy/experiment/components/settings/light/settings@2x.png +0 -0
  1536. psychopy/experiment/components/slider/__init__.py +410 -0
  1537. psychopy/experiment/components/slider/classic/slider.png +0 -0
  1538. psychopy/experiment/components/slider/classic/slider@2x.png +0 -0
  1539. psychopy/experiment/components/slider/dark/slider.png +0 -0
  1540. psychopy/experiment/components/slider/dark/slider@2x.png +0 -0
  1541. psychopy/experiment/components/slider/light/slider.png +0 -0
  1542. psychopy/experiment/components/slider/light/slider@2x.png +0 -0
  1543. psychopy/experiment/components/sound/__init__.py +307 -0
  1544. psychopy/experiment/components/sound/classic/sound.png +0 -0
  1545. psychopy/experiment/components/sound/classic/sound@2x.png +0 -0
  1546. psychopy/experiment/components/sound/dark/sound.png +0 -0
  1547. psychopy/experiment/components/sound/dark/sound@2x.png +0 -0
  1548. psychopy/experiment/components/sound/light/sound.png +0 -0
  1549. psychopy/experiment/components/sound/light/sound@2x.png +0 -0
  1550. psychopy/experiment/components/static/__init__.py +267 -0
  1551. psychopy/experiment/components/static/classic/static.png +0 -0
  1552. psychopy/experiment/components/static/classic/static@2x.png +0 -0
  1553. psychopy/experiment/components/static/dark/static.png +0 -0
  1554. psychopy/experiment/components/static/dark/static@2x.png +0 -0
  1555. psychopy/experiment/components/static/light/static.png +0 -0
  1556. psychopy/experiment/components/static/light/static@2x.png +0 -0
  1557. psychopy/experiment/components/text/__init__.py +169 -0
  1558. psychopy/experiment/components/text/classic/text.png +0 -0
  1559. psychopy/experiment/components/text/classic/text@2x.png +0 -0
  1560. psychopy/experiment/components/text/dark/text.png +0 -0
  1561. psychopy/experiment/components/text/dark/text@2x.png +0 -0
  1562. psychopy/experiment/components/text/light/text.png +0 -0
  1563. psychopy/experiment/components/text/light/text@2x.png +0 -0
  1564. psychopy/experiment/components/textbox/__init__.py +330 -0
  1565. psychopy/experiment/components/textbox/classic/textbox.png +0 -0
  1566. psychopy/experiment/components/textbox/classic/textbox@2x.png +0 -0
  1567. psychopy/experiment/components/textbox/dark/textbox.png +0 -0
  1568. psychopy/experiment/components/textbox/dark/textbox@2x.png +0 -0
  1569. psychopy/experiment/components/textbox/light/textbox.png +0 -0
  1570. psychopy/experiment/components/textbox/light/textbox@2x.png +0 -0
  1571. psychopy/experiment/components/unknown/__init__.py +86 -0
  1572. psychopy/experiment/components/unknown/classic/unknown.png +0 -0
  1573. psychopy/experiment/components/unknown/classic/unknown@2x.png +0 -0
  1574. psychopy/experiment/components/unknown/dark/unknown.png +0 -0
  1575. psychopy/experiment/components/unknown/dark/unknown@2x.png +0 -0
  1576. psychopy/experiment/components/unknown/light/unknown.png +0 -0
  1577. psychopy/experiment/components/unknown/light/unknown@2x.png +0 -0
  1578. psychopy/experiment/components/unknownPlugin/__init__.py +84 -0
  1579. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin.png +0 -0
  1580. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin@2x.png +0 -0
  1581. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin.png +0 -0
  1582. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin@2x.png +0 -0
  1583. psychopy/experiment/components/unknownPlugin/light/unknownPlugin.png +0 -0
  1584. psychopy/experiment/components/unknownPlugin/light/unknownPlugin@2x.png +0 -0
  1585. psychopy/experiment/components/utils.py +0 -0
  1586. psychopy/experiment/components/variable/__init__.py +184 -0
  1587. psychopy/experiment/components/variable/classic/variable.png +0 -0
  1588. psychopy/experiment/components/variable/classic/variable@2x.png +0 -0
  1589. psychopy/experiment/components/variable/dark/variable.png +0 -0
  1590. psychopy/experiment/components/variable/dark/variable@2x.png +0 -0
  1591. psychopy/experiment/components/variable/light/variable.png +0 -0
  1592. psychopy/experiment/components/variable/light/variable@2x.png +0 -0
  1593. psychopy/experiment/experiment.xsd +223 -0
  1594. psychopy/experiment/exports.py +388 -0
  1595. psychopy/experiment/flow.py +531 -0
  1596. psychopy/experiment/localization.py +11 -0
  1597. psychopy/experiment/loopTemplate.xltx +0 -0
  1598. psychopy/experiment/loops.py +952 -0
  1599. psychopy/experiment/params.py +437 -0
  1600. psychopy/experiment/plugins.py +115 -0
  1601. psychopy/experiment/py2js.py +183 -0
  1602. psychopy/experiment/py2js_transpiler.py +606 -0
  1603. psychopy/experiment/questPlusTemplate.xltx +0 -0
  1604. psychopy/experiment/questTemplate.xltx +0 -0
  1605. psychopy/experiment/routines/__init__.py +108 -0
  1606. psychopy/experiment/routines/_base.py +907 -0
  1607. psychopy/experiment/routines/counterbalance/__init__.py +315 -0
  1608. psychopy/experiment/routines/counterbalance/classic/counterbalance.png +0 -0
  1609. psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png +0 -0
  1610. psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx +0 -0
  1611. psychopy/experiment/routines/counterbalance/dark/counterbalance.png +0 -0
  1612. psychopy/experiment/routines/counterbalance/dark/counterbalance@2x.png +0 -0
  1613. psychopy/experiment/routines/counterbalance/light/counterbalance.png +0 -0
  1614. psychopy/experiment/routines/counterbalance/light/counterbalance@2x.png +0 -0
  1615. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +275 -0
  1616. psychopy/experiment/routines/eyetracker_calibrate/classic/eyetracker_calib.png +0 -0
  1617. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib.png +0 -0
  1618. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib@2x.png +0 -0
  1619. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib.png +0 -0
  1620. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib@2x.png +0 -0
  1621. psychopy/experiment/routines/eyetracker_validate/__init__.py +354 -0
  1622. psychopy/experiment/routines/eyetracker_validate/classic/eyetracker_valid.png +0 -0
  1623. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid.png +0 -0
  1624. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid@2x.png +0 -0
  1625. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid.png +0 -0
  1626. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid@2x.png +0 -0
  1627. psychopy/experiment/routines/pavlovia_survey/__init__.py +236 -0
  1628. psychopy/experiment/routines/pavlovia_survey/classic/survey.png +0 -0
  1629. psychopy/experiment/routines/pavlovia_survey/classic/survey@2x.png +0 -0
  1630. psychopy/experiment/routines/pavlovia_survey/dark/survey.png +0 -0
  1631. psychopy/experiment/routines/pavlovia_survey/dark/survey@2x.png +0 -0
  1632. psychopy/experiment/routines/pavlovia_survey/light/survey.png +0 -0
  1633. psychopy/experiment/routines/pavlovia_survey/light/survey@2x.png +0 -0
  1634. psychopy/experiment/routines/photodiodeValidator/__init__.py +429 -0
  1635. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  1636. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  1637. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  1638. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  1639. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  1640. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  1641. psychopy/experiment/routines/unknown/__init__.py +28 -0
  1642. psychopy/experiment/routines/unknown/classic/eyetracker_record.png +0 -0
  1643. psychopy/experiment/routines/unknown/classic/unknown.png +0 -0
  1644. psychopy/experiment/routines/unknown/dark/eyetracker_record.png +0 -0
  1645. psychopy/experiment/routines/unknown/dark/eyetracker_record@2x.png +0 -0
  1646. psychopy/experiment/routines/unknown/dark/unknown.png +0 -0
  1647. psychopy/experiment/routines/unknown/dark/unknown@2x.png +0 -0
  1648. psychopy/experiment/routines/unknown/light/eyetracker_record.png +0 -0
  1649. psychopy/experiment/routines/unknown/light/eyetracker_record@2x.png +0 -0
  1650. psychopy/experiment/routines/unknown/light/unknown.png +0 -0
  1651. psychopy/experiment/routines/unknown/light/unknown@2x.png +0 -0
  1652. psychopy/experiment/routines/utils.py +0 -0
  1653. psychopy/experiment/staircaseTemplate.xltx +0 -0
  1654. psychopy/experiment/utils.py +44 -0
  1655. psychopy/filters.py +11 -0
  1656. psychopy/gamma.py +9 -0
  1657. psychopy/gui/__init__.py +47 -0
  1658. psychopy/gui/qtgui.py +866 -0
  1659. psychopy/gui/util.py +78 -0
  1660. psychopy/gui/wxgui.py +414 -0
  1661. psychopy/hardware/__init__.py +216 -0
  1662. psychopy/hardware/base.py +323 -0
  1663. psychopy/hardware/bbtk/__init__.py +30 -0
  1664. psychopy/hardware/brainproducts.py +31 -0
  1665. psychopy/hardware/button.py +205 -0
  1666. psychopy/hardware/buttonbox/__init__.py +122 -0
  1667. psychopy/hardware/camera/__init__.py +2809 -0
  1668. psychopy/hardware/cedrus.py +36 -0
  1669. psychopy/hardware/crs/__init__.py +46 -0
  1670. psychopy/hardware/crs/bits.py +34 -0
  1671. psychopy/hardware/crs/colorcal.py +30 -0
  1672. psychopy/hardware/crs/optical.py +46 -0
  1673. psychopy/hardware/crs/shaders.py +21 -0
  1674. psychopy/hardware/emotiv.py +33 -0
  1675. psychopy/hardware/emulator.py +37 -0
  1676. psychopy/hardware/eyetracker.py +208 -0
  1677. psychopy/hardware/forp.py +42 -0
  1678. psychopy/hardware/gammasci.py +32 -0
  1679. psychopy/hardware/iolab.py +35 -0
  1680. psychopy/hardware/joystick/__init__.py +597 -0
  1681. psychopy/hardware/keyboard.py +880 -0
  1682. psychopy/hardware/knownDevices.json +52 -0
  1683. psychopy/hardware/labhackers.py +27 -0
  1684. psychopy/hardware/labjacks.py +30 -0
  1685. psychopy/hardware/listener.py +323 -0
  1686. psychopy/hardware/manager.py +963 -0
  1687. psychopy/hardware/microphone.py +1074 -0
  1688. psychopy/hardware/minolta.py +30 -0
  1689. psychopy/hardware/mouse/__init__.py +885 -0
  1690. psychopy/hardware/photodiode.py +639 -0
  1691. psychopy/hardware/photometer/__init__.py +176 -0
  1692. psychopy/hardware/pr.py +30 -0
  1693. psychopy/hardware/qmix.py +41 -0
  1694. psychopy/hardware/serialdevice.py +342 -0
  1695. psychopy/hardware/speaker.py +54 -0
  1696. psychopy/hardware/triggerbox/__init__.py +56 -0
  1697. psychopy/hardware/triggerbox/base.py +170 -0
  1698. psychopy/hardware/triggerbox/parallel.py +362 -0
  1699. psychopy/info.py +790 -0
  1700. psychopy/iohub/__init__.py +45 -0
  1701. psychopy/iohub/client/__init__.py +1454 -0
  1702. psychopy/iohub/client/connect.py +260 -0
  1703. psychopy/iohub/client/eyetracker/__init__.py +4 -0
  1704. psychopy/iohub/client/eyetracker/validation/__init__.py +8 -0
  1705. psychopy/iohub/client/eyetracker/validation/posgrid.py +274 -0
  1706. psychopy/iohub/client/eyetracker/validation/procedure.py +1292 -0
  1707. psychopy/iohub/client/eyetracker/validation/trigger.py +240 -0
  1708. psychopy/iohub/client/keyboard.py +508 -0
  1709. psychopy/iohub/client/wintab.py +378 -0
  1710. psychopy/iohub/constants.py +1176 -0
  1711. psychopy/iohub/datastore/__init__.py +439 -0
  1712. psychopy/iohub/datastore/default_datastore.yaml +8 -0
  1713. psychopy/iohub/datastore/util.py +868 -0
  1714. psychopy/iohub/default_config.yaml +17 -0
  1715. psychopy/iohub/devices/__init__.py +960 -0
  1716. psychopy/iohub/devices/computer.py +607 -0
  1717. psychopy/iohub/devices/default_device.yaml +15 -0
  1718. psychopy/iohub/devices/deviceConfigValidation.py +517 -0
  1719. psychopy/iohub/devices/display/__init__.py +755 -0
  1720. psychopy/iohub/devices/display/default_display.yaml +118 -0
  1721. psychopy/iohub/devices/display/supported_config_settings.yaml +69 -0
  1722. psychopy/iohub/devices/eventfilters.py +3572 -0
  1723. psychopy/iohub/devices/experiment/__init__.py +316 -0
  1724. psychopy/iohub/devices/experiment/default_experiment.yaml +63 -0
  1725. psychopy/iohub/devices/experiment/supported_config_settings.yaml +22 -0
  1726. psychopy/iohub/devices/eyetracker/__init__.py +436 -0
  1727. psychopy/iohub/devices/eyetracker/calibration/__init__.py +1 -0
  1728. psychopy/iohub/devices/eyetracker/calibration/procedure.py +409 -0
  1729. psychopy/iohub/devices/eyetracker/default_eyetracker.yaml +18 -0
  1730. psychopy/iohub/devices/eyetracker/eye_events.py +1751 -0
  1731. psychopy/iohub/devices/eyetracker/filters/__init__.py +4 -0
  1732. psychopy/iohub/devices/eyetracker/filters/parser.py +913 -0
  1733. psychopy/iohub/devices/eyetracker/hw/__init__.py +4 -0
  1734. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +17 -0
  1735. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +28 -0
  1736. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/calibration.py +18 -0
  1737. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +21 -0
  1738. psychopy/iohub/devices/eyetracker/hw/mouse/__init__.py +8 -0
  1739. psychopy/iohub/devices/eyetracker/hw/mouse/calibration.py +10 -0
  1740. psychopy/iohub/devices/eyetracker/hw/mouse/default_eyetracker.yaml +102 -0
  1741. psychopy/iohub/devices/eyetracker/hw/mouse/eyetracker.py +444 -0
  1742. psychopy/iohub/devices/eyetracker/hw/mouse/supported_config_settings.yaml +110 -0
  1743. psychopy/iohub/devices/eyetracker/hw/pupil_labs/__init__.py +4 -0
  1744. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +26 -0
  1745. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/eyetracker.py +18 -0
  1746. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/__init__.py +29 -0
  1747. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/bisector.py +20 -0
  1748. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/constants.py +19 -0
  1749. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/data_parse.py +22 -0
  1750. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/eyetracker.py +18 -0
  1751. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/pupil_remote.py +18 -0
  1752. psychopy/iohub/devices/eyetracker/hw/sr_research/__init__.py +4 -0
  1753. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/__init__.py +28 -0
  1754. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/calibration.py +22 -0
  1755. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/eyetracker.py +38 -0
  1756. psychopy/iohub/devices/eyetracker/hw/tobii/__init__.py +29 -0
  1757. psychopy/iohub/devices/eyetracker/hw/tobii/calibration.py +19 -0
  1758. psychopy/iohub/devices/eyetracker/hw/tobii/eyetracker.py +17 -0
  1759. psychopy/iohub/devices/eyetracker/hw/tobii/tobiiwrapper.py +19 -0
  1760. psychopy/iohub/devices/eyetracker/supported_config_settings.yaml +44 -0
  1761. psychopy/iohub/devices/keyboard/__init__.py +309 -0
  1762. psychopy/iohub/devices/keyboard/darwin.py +428 -0
  1763. psychopy/iohub/devices/keyboard/darwinkey.py +94 -0
  1764. psychopy/iohub/devices/keyboard/default_keyboard.yaml +94 -0
  1765. psychopy/iohub/devices/keyboard/linux2.py +102 -0
  1766. psychopy/iohub/devices/keyboard/supported_config_settings.yaml +39 -0
  1767. psychopy/iohub/devices/keyboard/win32.py +356 -0
  1768. psychopy/iohub/devices/mouse/__init__.py +709 -0
  1769. psychopy/iohub/devices/mouse/darwin.py +414 -0
  1770. psychopy/iohub/devices/mouse/default_mouse.yaml +92 -0
  1771. psychopy/iohub/devices/mouse/linux2.py +167 -0
  1772. psychopy/iohub/devices/mouse/supported_config_settings.yaml +39 -0
  1773. psychopy/iohub/devices/mouse/win32.py +279 -0
  1774. psychopy/iohub/devices/pyXHook.py +619 -0
  1775. psychopy/iohub/devices/serial/__init__.py +779 -0
  1776. psychopy/iohub/devices/serial/default_pstbox.yaml +108 -0
  1777. psychopy/iohub/devices/serial/default_serial.yaml +108 -0
  1778. psychopy/iohub/devices/serial/supported_config_settings.yaml +85 -0
  1779. psychopy/iohub/devices/serial/supported_config_settings_pstbox.yaml +85 -0
  1780. psychopy/iohub/devices/supported_config_settings.yaml +36 -0
  1781. psychopy/iohub/devices/wintab/__init__.py +580 -0
  1782. psychopy/iohub/devices/wintab/default_wintab.yaml +89 -0
  1783. psychopy/iohub/devices/wintab/supported_config_settings.yaml +42 -0
  1784. psychopy/iohub/devices/wintab/win32.py +722 -0
  1785. psychopy/iohub/devices/xlib.py +6795 -0
  1786. psychopy/iohub/errors.py +61 -0
  1787. psychopy/iohub/lazy_import.py +582 -0
  1788. psychopy/iohub/net.py +349 -0
  1789. psychopy/iohub/server.py +1075 -0
  1790. psychopy/iohub/start_iohub_process.py +118 -0
  1791. psychopy/iohub/util/__init__.py +841 -0
  1792. psychopy/iohub/util/visualangle.py +126 -0
  1793. psychopy/layout.py +916 -0
  1794. psychopy/liaison.py +419 -0
  1795. psychopy/locale_setup.py +31 -0
  1796. psychopy/localization/__init__.py +22 -0
  1797. psychopy/localization/_localization.py +155 -0
  1798. psychopy/localization/generateTranslationTemplate.py +139 -0
  1799. psychopy/localization/mappings.txt +170 -0
  1800. psychopy/localization/messages.pot +7516 -0
  1801. psychopy/localization/readme.txt +68 -0
  1802. psychopy/logging.py +406 -0
  1803. psychopy/microphone.py +54 -0
  1804. psychopy/misc.py +40 -0
  1805. psychopy/monitors/MonitorCenter.py +1254 -0
  1806. psychopy/monitors/__init__.py +30 -0
  1807. psychopy/monitors/calibData.py +78 -0
  1808. psychopy/monitors/calibTools.py +1300 -0
  1809. psychopy/monitors/getLumSeries.py +50 -0
  1810. psychopy/monitors/psychopy-icon.svg +395 -0
  1811. psychopy/monitors/psychopy.ico +0 -0
  1812. psychopy/parallel/__init__.py +206 -0
  1813. psychopy/parallel/_dlportio.py +150 -0
  1814. psychopy/parallel/_inpout.py +120 -0
  1815. psychopy/parallel/_linux.py +105 -0
  1816. psychopy/piloting.py +61 -0
  1817. psychopy/platform_specific/__init__.py +48 -0
  1818. psychopy/platform_specific/darwin.py +328 -0
  1819. psychopy/platform_specific/linux.py +79 -0
  1820. psychopy/platform_specific/posix.py +16 -0
  1821. psychopy/platform_specific/win32.py +99 -0
  1822. psychopy/plugins/__init__.py +1354 -0
  1823. psychopy/preferences/Darwin.spec +282 -0
  1824. psychopy/preferences/FreeBSD.spec +282 -0
  1825. psychopy/preferences/Linux.spec +282 -0
  1826. psychopy/preferences/Windows.spec +282 -0
  1827. psychopy/preferences/__init__.py +20 -0
  1828. psychopy/preferences/baseNoArch.spec +278 -0
  1829. psychopy/preferences/generateHints.py +91 -0
  1830. psychopy/preferences/generateSpec.py +80 -0
  1831. psychopy/preferences/hints.py +329 -0
  1832. psychopy/preferences/preferences.py +332 -0
  1833. psychopy/projects/__init__.py +11 -0
  1834. psychopy/projects/gitignore.py +45 -0
  1835. psychopy/projects/pavlovia.py +1566 -0
  1836. psychopy/projects/sshkeys.py +107 -0
  1837. psychopy/psychojs.zip +0 -0
  1838. psychopy/pylintrc +69 -0
  1839. psychopy/scripts/__init__.py +0 -0
  1840. psychopy/scripts/psyexpCompile.py +233 -0
  1841. psychopy/session.py +1450 -0
  1842. psychopy/sound/__init__.py +279 -0
  1843. psychopy/sound/_base.py +282 -0
  1844. psychopy/sound/audioclip.py +851 -0
  1845. psychopy/sound/audiodevice.py +857 -0
  1846. psychopy/sound/backend_ptb.py +660 -0
  1847. psychopy/sound/backend_pygame.py +309 -0
  1848. psychopy/sound/backend_pyo.py +33 -0
  1849. psychopy/sound/backend_pysound.py +341 -0
  1850. psychopy/sound/backend_sounddevice.py +32 -0
  1851. psychopy/sound/exceptions.py +115 -0
  1852. psychopy/sound/microphone.py +274 -0
  1853. psychopy/sound/transcribe.py +1248 -0
  1854. psychopy/tests/.DS_Store +0 -0
  1855. psychopy/tests/README.md +344 -0
  1856. psychopy/tests/__init__.py +47 -0
  1857. psychopy/tests/data/Electronic_Chime-KevanGC-495939803.wav +0 -0
  1858. psychopy/tests/data/TestCircle_w128h128_bottom_left.png +0 -0
  1859. psychopy/tests/data/TestCircle_w128h128_bottom_right.png +0 -0
  1860. psychopy/tests/data/TestCircle_w128h128_center_center.png +0 -0
  1861. psychopy/tests/data/TestCircle_w128h128_top_left.png +0 -0
  1862. psychopy/tests/data/TestCircle_w128h128_top_right.png +0 -0
  1863. psychopy/tests/data/TestCircle_w128h64_bottom_left.png +0 -0
  1864. psychopy/tests/data/TestCircle_w128h64_bottom_right.png +0 -0
  1865. psychopy/tests/data/TestCircle_w128h64_center_center.png +0 -0
  1866. psychopy/tests/data/TestCircle_w128h64_top_left.png +0 -0
  1867. psychopy/tests/data/TestCircle_w128h64_top_right.png +0 -0
  1868. psychopy/tests/data/TestCircle_w64h128_bottom_left.png +0 -0
  1869. psychopy/tests/data/TestCircle_w64h128_bottom_right.png +0 -0
  1870. psychopy/tests/data/TestCircle_w64h128_center_center.png +0 -0
  1871. psychopy/tests/data/TestCircle_w64h128_top_left.png +0 -0
  1872. psychopy/tests/data/TestCircle_w64h128_top_right.png +0 -0
  1873. psychopy/tests/data/TestCircle_w64h64_bottom_left.png +0 -0
  1874. psychopy/tests/data/TestCircle_w64h64_bottom_right.png +0 -0
  1875. psychopy/tests/data/TestCircle_w64h64_center_center.png +0 -0
  1876. psychopy/tests/data/TestCircle_w64h64_top_left.png +0 -0
  1877. psychopy/tests/data/TestCircle_w64h64_top_right.png +0 -0
  1878. psychopy/tests/data/TestForm_scrolling_nq10_s0.5.png +0 -0
  1879. psychopy/tests/data/TestForm_scrolling_nq10_s0.png +0 -0
  1880. psychopy/tests/data/TestForm_scrolling_nq10_s1.png +0 -0
  1881. psychopy/tests/data/TestForm_scrolling_nq1_s0.5.png +0 -0
  1882. psychopy/tests/data/TestForm_scrolling_nq1_s0.png +0 -0
  1883. psychopy/tests/data/TestForm_scrolling_nq1_s1.png +0 -0
  1884. psychopy/tests/data/TestForm_scrolling_nq3_s0.5.png +0 -0
  1885. psychopy/tests/data/TestForm_scrolling_nq3_s0.png +0 -0
  1886. psychopy/tests/data/TestForm_scrolling_nq3_s1.png +0 -0
  1887. psychopy/tests/data/TestImage_w128h128_bottom_left.png +0 -0
  1888. psychopy/tests/data/TestImage_w128h128_bottom_right.png +0 -0
  1889. psychopy/tests/data/TestImage_w128h128_center_center.png +0 -0
  1890. psychopy/tests/data/TestImage_w128h128_top_left.png +0 -0
  1891. psychopy/tests/data/TestImage_w128h128_top_right.png +0 -0
  1892. psychopy/tests/data/TestImage_w128h64_bottom_left.png +0 -0
  1893. psychopy/tests/data/TestImage_w128h64_bottom_right.png +0 -0
  1894. psychopy/tests/data/TestImage_w128h64_center_center.png +0 -0
  1895. psychopy/tests/data/TestImage_w128h64_top_left.png +0 -0
  1896. psychopy/tests/data/TestImage_w128h64_top_right.png +0 -0
  1897. psychopy/tests/data/TestImage_w64h128_bottom_left.png +0 -0
  1898. psychopy/tests/data/TestImage_w64h128_bottom_right.png +0 -0
  1899. psychopy/tests/data/TestImage_w64h128_center_center.png +0 -0
  1900. psychopy/tests/data/TestImage_w64h128_top_left.png +0 -0
  1901. psychopy/tests/data/TestImage_w64h128_top_right.png +0 -0
  1902. psychopy/tests/data/TestImage_w64h64_bottom_left.png +0 -0
  1903. psychopy/tests/data/TestImage_w64h64_bottom_right.png +0 -0
  1904. psychopy/tests/data/TestImage_w64h64_center_center.png +0 -0
  1905. psychopy/tests/data/TestImage_w64h64_top_left.png +0 -0
  1906. psychopy/tests/data/TestImage_w64h64_top_right.png +0 -0
  1907. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.3.png +0 -0
  1908. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.6.png +0 -0
  1909. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.3.png +0 -0
  1910. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.6.png +0 -0
  1911. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.3.png +0 -0
  1912. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.6.png +0 -0
  1913. psychopy/tests/data/TestProgress_testValue_minmax_0.png +0 -0
  1914. psychopy/tests/data/TestProgress_testValue_minmax_1.png +0 -0
  1915. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.3.png +0 -0
  1916. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.6.png +0 -0
  1917. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.3.png +0 -0
  1918. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.6.png +0 -0
  1919. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.3.png +0 -0
  1920. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.6.png +0 -0
  1921. psychopy/tests/data/TestProgress_w128h128_bottom_left.png +0 -0
  1922. psychopy/tests/data/TestProgress_w128h128_bottom_right.png +0 -0
  1923. psychopy/tests/data/TestProgress_w128h128_center_center.png +0 -0
  1924. psychopy/tests/data/TestProgress_w128h128_top_left.png +0 -0
  1925. psychopy/tests/data/TestProgress_w128h128_top_right.png +0 -0
  1926. psychopy/tests/data/TestProgress_w128h64_bottom_left.png +0 -0
  1927. psychopy/tests/data/TestProgress_w128h64_bottom_right.png +0 -0
  1928. psychopy/tests/data/TestProgress_w128h64_center_center.png +0 -0
  1929. psychopy/tests/data/TestProgress_w128h64_top_left.png +0 -0
  1930. psychopy/tests/data/TestProgress_w128h64_top_right.png +0 -0
  1931. psychopy/tests/data/TestProgress_w64h128_bottom_left.png +0 -0
  1932. psychopy/tests/data/TestProgress_w64h128_bottom_right.png +0 -0
  1933. psychopy/tests/data/TestProgress_w64h128_center_center.png +0 -0
  1934. psychopy/tests/data/TestProgress_w64h128_top_left.png +0 -0
  1935. psychopy/tests/data/TestProgress_w64h128_top_right.png +0 -0
  1936. psychopy/tests/data/TestProgress_w64h64_bottom_left.png +0 -0
  1937. psychopy/tests/data/TestProgress_w64h64_bottom_right.png +0 -0
  1938. psychopy/tests/data/TestProgress_w64h64_center_center.png +0 -0
  1939. psychopy/tests/data/TestProgress_w64h64_top_left.png +0 -0
  1940. psychopy/tests/data/TestProgress_w64h64_top_right.png +0 -0
  1941. psychopy/tests/data/TestROI_w128h128_bottom_left.png +0 -0
  1942. psychopy/tests/data/TestROI_w128h128_bottom_right.png +0 -0
  1943. psychopy/tests/data/TestROI_w128h128_center_center.png +0 -0
  1944. psychopy/tests/data/TestROI_w128h128_top_left.png +0 -0
  1945. psychopy/tests/data/TestROI_w128h128_top_right.png +0 -0
  1946. psychopy/tests/data/TestROI_w128h64_bottom_left.png +0 -0
  1947. psychopy/tests/data/TestROI_w128h64_bottom_right.png +0 -0
  1948. psychopy/tests/data/TestROI_w128h64_center_center.png +0 -0
  1949. psychopy/tests/data/TestROI_w128h64_top_left.png +0 -0
  1950. psychopy/tests/data/TestROI_w128h64_top_right.png +0 -0
  1951. psychopy/tests/data/TestROI_w64h128_bottom_left.png +0 -0
  1952. psychopy/tests/data/TestROI_w64h128_bottom_right.png +0 -0
  1953. psychopy/tests/data/TestROI_w64h128_center_center.png +0 -0
  1954. psychopy/tests/data/TestROI_w64h128_top_left.png +0 -0
  1955. psychopy/tests/data/TestROI_w64h128_top_right.png +0 -0
  1956. psychopy/tests/data/TestROI_w64h64_bottom_left.png +0 -0
  1957. psychopy/tests/data/TestROI_w64h64_bottom_right.png +0 -0
  1958. psychopy/tests/data/TestROI_w64h64_center_center.png +0 -0
  1959. psychopy/tests/data/TestROI_w64h64_top_left.png +0 -0
  1960. psychopy/tests/data/TestROI_w64h64_top_right.png +0 -0
  1961. psychopy/tests/data/TestSession_exp1.png +0 -0
  1962. psychopy/tests/data/TestSession_exp2.png +0 -0
  1963. psychopy/tests/data/TestShape_w128h128_bottom_left.png +0 -0
  1964. psychopy/tests/data/TestShape_w128h128_bottom_right.png +0 -0
  1965. psychopy/tests/data/TestShape_w128h128_center_center.png +0 -0
  1966. psychopy/tests/data/TestShape_w128h128_top_left.png +0 -0
  1967. psychopy/tests/data/TestShape_w128h128_top_right.png +0 -0
  1968. psychopy/tests/data/TestShape_w128h64_bottom_left.png +0 -0
  1969. psychopy/tests/data/TestShape_w128h64_bottom_right.png +0 -0
  1970. psychopy/tests/data/TestShape_w128h64_center_center.png +0 -0
  1971. psychopy/tests/data/TestShape_w128h64_top_left.png +0 -0
  1972. psychopy/tests/data/TestShape_w128h64_top_right.png +0 -0
  1973. psychopy/tests/data/TestShape_w64h128_bottom_left.png +0 -0
  1974. psychopy/tests/data/TestShape_w64h128_bottom_right.png +0 -0
  1975. psychopy/tests/data/TestShape_w64h128_center_center.png +0 -0
  1976. psychopy/tests/data/TestShape_w64h128_top_left.png +0 -0
  1977. psychopy/tests/data/TestShape_w64h128_top_right.png +0 -0
  1978. psychopy/tests/data/TestShape_w64h64_bottom_left.png +0 -0
  1979. psychopy/tests/data/TestShape_w64h64_bottom_right.png +0 -0
  1980. psychopy/tests/data/TestShape_w64h64_center_center.png +0 -0
  1981. psychopy/tests/data/TestShape_w64h64_top_left.png +0 -0
  1982. psychopy/tests/data/TestShape_w64h64_top_right.png +0 -0
  1983. psychopy/tests/data/TestTarget_w128h128_bottom_left.png +0 -0
  1984. psychopy/tests/data/TestTarget_w128h128_bottom_right.png +0 -0
  1985. psychopy/tests/data/TestTarget_w128h128_center_center.png +0 -0
  1986. psychopy/tests/data/TestTarget_w128h128_top_left.png +0 -0
  1987. psychopy/tests/data/TestTarget_w128h128_top_right.png +0 -0
  1988. psychopy/tests/data/TestTarget_w128h64_bottom_left.png +0 -0
  1989. psychopy/tests/data/TestTarget_w128h64_bottom_right.png +0 -0
  1990. psychopy/tests/data/TestTarget_w128h64_center_center.png +0 -0
  1991. psychopy/tests/data/TestTarget_w128h64_top_left.png +0 -0
  1992. psychopy/tests/data/TestTarget_w128h64_top_right.png +0 -0
  1993. psychopy/tests/data/TestTarget_w64h128_bottom_left.png +0 -0
  1994. psychopy/tests/data/TestTarget_w64h128_bottom_right.png +0 -0
  1995. psychopy/tests/data/TestTarget_w64h128_center_center.png +0 -0
  1996. psychopy/tests/data/TestTarget_w64h128_top_left.png +0 -0
  1997. psychopy/tests/data/TestTarget_w64h128_top_right.png +0 -0
  1998. psychopy/tests/data/TestTarget_w64h64_bottom_left.png +0 -0
  1999. psychopy/tests/data/TestTarget_w64h64_bottom_right.png +0 -0
  2000. psychopy/tests/data/TestTarget_w64h64_center_center.png +0 -0
  2001. psychopy/tests/data/TestTarget_w64h64_top_left.png +0 -0
  2002. psychopy/tests/data/TestTarget_w64h64_top_right.png +0 -0
  2003. psychopy/tests/data/TestTextbox_testLetterSpacing_0p6.png +0 -0
  2004. psychopy/tests/data/TestTextbox_testLetterSpacing_0p8.png +0 -0
  2005. psychopy/tests/data/TestTextbox_testLetterSpacing_1.png +0 -0
  2006. psychopy/tests/data/TestTextbox_testLetterSpacing_1p2.png +0 -0
  2007. psychopy/tests/data/TestTextbox_testLetterSpacing_1p4.png +0 -0
  2008. psychopy/tests/data/TestTextbox_testLetterSpacing_1p6.png +0 -0
  2009. psychopy/tests/data/TestTextbox_testLetterSpacing_1p8.png +0 -0
  2010. psychopy/tests/data/TestTextbox_testLetterSpacing_2p0.png +0 -0
  2011. psychopy/tests/data/TestTextbox_testLetterSpacing_None.png +0 -0
  2012. psychopy/tests/data/Test_textbox_testSpeechpoint_-3ovr8_0ovr8.png +0 -0
  2013. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_-3ovr8.png +0 -0
  2014. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_3ovr8.png +0 -0
  2015. psychopy/tests/data/Test_textbox_testSpeechpoint_3ovr8_0ovr8.png +0 -0
  2016. psychopy/tests/data/Test_textbox_w128h128_bottom_left.png +0 -0
  2017. psychopy/tests/data/Test_textbox_w128h128_bottom_right.png +0 -0
  2018. psychopy/tests/data/Test_textbox_w128h128_center_center.png +0 -0
  2019. psychopy/tests/data/Test_textbox_w128h128_top_left.png +0 -0
  2020. psychopy/tests/data/Test_textbox_w128h128_top_right.png +0 -0
  2021. psychopy/tests/data/Test_textbox_w128h64_bottom_left.png +0 -0
  2022. psychopy/tests/data/Test_textbox_w128h64_bottom_right.png +0 -0
  2023. psychopy/tests/data/Test_textbox_w128h64_center_center.png +0 -0
  2024. psychopy/tests/data/Test_textbox_w128h64_top_left.png +0 -0
  2025. psychopy/tests/data/Test_textbox_w128h64_top_right.png +0 -0
  2026. psychopy/tests/data/Test_textbox_w64h128_bottom_left.png +0 -0
  2027. psychopy/tests/data/Test_textbox_w64h128_bottom_right.png +0 -0
  2028. psychopy/tests/data/Test_textbox_w64h128_center_center.png +0 -0
  2029. psychopy/tests/data/Test_textbox_w64h128_top_left.png +0 -0
  2030. psychopy/tests/data/Test_textbox_w64h128_top_right.png +0 -0
  2031. psychopy/tests/data/Test_textbox_w64h64_bottom_left.png +0 -0
  2032. psychopy/tests/data/Test_textbox_w64h64_bottom_right.png +0 -0
  2033. psychopy/tests/data/Test_textbox_w64h64_center_center.png +0 -0
  2034. psychopy/tests/data/Test_textbox_w64h64_top_left.png +0 -0
  2035. psychopy/tests/data/Test_textbox_w64h64_top_right.png +0 -0
  2036. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_left.png +0 -0
  2037. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_right.png +0 -0
  2038. psychopy/tests/data/Test_uax14_textbox_w128h128_center_center.png +0 -0
  2039. psychopy/tests/data/Test_uax14_textbox_w128h128_top_left.png +0 -0
  2040. psychopy/tests/data/Test_uax14_textbox_w128h128_top_right.png +0 -0
  2041. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_left.png +0 -0
  2042. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_right.png +0 -0
  2043. psychopy/tests/data/Test_uax14_textbox_w128h64_center_center.png +0 -0
  2044. psychopy/tests/data/Test_uax14_textbox_w128h64_top_left.png +0 -0
  2045. psychopy/tests/data/Test_uax14_textbox_w128h64_top_right.png +0 -0
  2046. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_left.png +0 -0
  2047. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_right.png +0 -0
  2048. psychopy/tests/data/Test_uax14_textbox_w64h128_center_center.png +0 -0
  2049. psychopy/tests/data/Test_uax14_textbox_w64h128_top_left.png +0 -0
  2050. psychopy/tests/data/Test_uax14_textbox_w64h128_top_right.png +0 -0
  2051. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_left.png +0 -0
  2052. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_right.png +0 -0
  2053. psychopy/tests/data/Test_uax14_textbox_w64h64_center_center.png +0 -0
  2054. psychopy/tests/data/Test_uax14_textbox_w64h64_top_left.png +0 -0
  2055. psychopy/tests/data/Test_uax14_textbox_w64h64_top_right.png +0 -0
  2056. psychopy/tests/data/TextComponent_disabled.psyexp +63 -0
  2057. psychopy/tests/data/TextComponent_not_disabled.psyexp +63 -0
  2058. psychopy/tests/data/aperture1_deg.png +0 -0
  2059. psychopy/tests/data/aperture1_degFlat.png +0 -0
  2060. psychopy/tests/data/aperture1_degFlatPos.png +0 -0
  2061. psychopy/tests/data/aperture1_norm.png +0 -0
  2062. psychopy/tests/data/aperture1_normHexbackground.png +0 -0
  2063. psychopy/tests/data/aperture1_normNoShade.png +0 -0
  2064. psychopy/tests/data/aperture1_pix.png +0 -0
  2065. psychopy/tests/data/aperture1_stencil.png +0 -0
  2066. psychopy/tests/data/aperture2_deg.png +0 -0
  2067. psychopy/tests/data/aperture2_degFlat.png +0 -0
  2068. psychopy/tests/data/aperture2_degFlatPos.png +0 -0
  2069. psychopy/tests/data/aperture2_norm.png +0 -0
  2070. psychopy/tests/data/aperture2_normHexbackground.png +0 -0
  2071. psychopy/tests/data/aperture2_normNoShade.png +0 -0
  2072. psychopy/tests/data/aperture2_pix.png +0 -0
  2073. psychopy/tests/data/aperture2_stencil.png +0 -0
  2074. psychopy/tests/data/beatandrcos_cm.png +0 -0
  2075. psychopy/tests/data/beatandrcos_deg.png +0 -0
  2076. psychopy/tests/data/beatandrcos_degFlat.png +0 -0
  2077. psychopy/tests/data/beatandrcos_degFlatPos.png +0 -0
  2078. psychopy/tests/data/beatandrcos_height.png +0 -0
  2079. psychopy/tests/data/beatandrcos_norm.png +0 -0
  2080. psychopy/tests/data/beatandrcos_normAddBlend.png +0 -0
  2081. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  2082. psychopy/tests/data/beatandrcos_normHexbackground.png +0 -0
  2083. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  2084. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  2085. psychopy/tests/data/beatandrcos_pix.png +0 -0
  2086. psychopy/tests/data/beatandrcos_stencil.png +0 -0
  2087. psychopy/tests/data/blend_add_cm.png +0 -0
  2088. psychopy/tests/data/blend_add_deg.png +0 -0
  2089. psychopy/tests/data/blend_add_degFlat.png +0 -0
  2090. psychopy/tests/data/blend_add_degFlatPos.png +0 -0
  2091. psychopy/tests/data/blend_add_height.png +0 -0
  2092. psychopy/tests/data/blend_add_norm.png +0 -0
  2093. psychopy/tests/data/blend_add_normAddBlend.png +0 -0
  2094. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  2095. psychopy/tests/data/blend_add_normHexbackground.png +0 -0
  2096. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  2097. psychopy/tests/data/blend_add_normNoShade.png +0 -0
  2098. psychopy/tests/data/blend_add_norm_local.png +0 -0
  2099. psychopy/tests/data/blend_add_pix.png +0 -0
  2100. psychopy/tests/data/blend_add_stencil.png +0 -0
  2101. psychopy/tests/data/broken2020_2_5_resources/broken_resources.psyexp +84 -0
  2102. psychopy/tests/data/broken2020_2_5_resources/psychopy72.png +0 -0
  2103. psychopy/tests/data/bufferimg_gabor_cm.png +0 -0
  2104. psychopy/tests/data/bufferimg_gabor_deg.png +0 -0
  2105. psychopy/tests/data/bufferimg_gabor_degFlat.png +0 -0
  2106. psychopy/tests/data/bufferimg_gabor_degFlatPos.png +0 -0
  2107. psychopy/tests/data/bufferimg_gabor_height.png +0 -0
  2108. psychopy/tests/data/bufferimg_gabor_norm.png +0 -0
  2109. psychopy/tests/data/bufferimg_gabor_normAddBlend.png +0 -0
  2110. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  2111. psychopy/tests/data/bufferimg_gabor_normHexbackground.png +0 -0
  2112. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  2113. psychopy/tests/data/bufferimg_gabor_normNoShade.png +0 -0
  2114. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  2115. psychopy/tests/data/bufferimg_gabor_pix.png +0 -0
  2116. psychopy/tests/data/bufferimg_gabor_stencil.png +0 -0
  2117. psychopy/tests/data/circleHex_cm.png +0 -0
  2118. psychopy/tests/data/circleHex_deg.png +0 -0
  2119. psychopy/tests/data/circleHex_degFlat.png +0 -0
  2120. psychopy/tests/data/circleHex_degFlatPos.png +0 -0
  2121. psychopy/tests/data/circleHex_height.png +0 -0
  2122. psychopy/tests/data/circleHex_norm.png +0 -0
  2123. psychopy/tests/data/circleHex_normAddBlend.png +0 -0
  2124. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  2125. psychopy/tests/data/circleHex_normHexbackground.png +0 -0
  2126. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  2127. psychopy/tests/data/circleHex_normNoShade.png +0 -0
  2128. psychopy/tests/data/circleHex_norm_local.png +0 -0
  2129. psychopy/tests/data/circleHex_pix.png +0 -0
  2130. psychopy/tests/data/circleHex_stencil.png +0 -0
  2131. psychopy/tests/data/corrFullRandom.csv +16 -0
  2132. psychopy/tests/data/corrFullRandom.tsv +6 -0
  2133. psychopy/tests/data/corrFullRandomTH2.csv +16 -0
  2134. psychopy/tests/data/corrMultiKeyExpWide.csv +3 -0
  2135. psychopy/tests/data/corrMultiKeyTrials.csv +8 -0
  2136. psychopy/tests/data/corrMultiKeyTrials.xlsx +0 -0
  2137. psychopy/tests/data/corrRandom.csv +16 -0
  2138. psychopy/tests/data/corrRandom.tsv +6 -0
  2139. psychopy/tests/data/corrRandomTH2.csv +16 -0
  2140. psychopy/tests/data/corrXlsx.xlsx +0 -0
  2141. psychopy/tests/data/correctScript/js/correctCodeComponent.js +181 -0
  2142. psychopy/tests/data/correctScript/js/correctImageComponent.js +204 -0
  2143. psychopy/tests/data/correctScript/js/correctKeyboardComponent.js +225 -0
  2144. psychopy/tests/data/correctScript/js/correctMouseComponent.js +221 -0
  2145. psychopy/tests/data/correctScript/js/correctMovieComponent.js +210 -0
  2146. psychopy/tests/data/correctScript/js/correctPolygonComponent.js +205 -0
  2147. psychopy/tests/data/correctScript/js/correctSliderComponent.js +209 -0
  2148. psychopy/tests/data/correctScript/js/correctSoundComponent.js +205 -0
  2149. psychopy/tests/data/correctScript/js/correctTextComponent.js +207 -0
  2150. psychopy/tests/data/correctScript/python/correctApertureComponent.py +157 -0
  2151. psychopy/tests/data/correctScript/python/correctCodeComponent.py +135 -0
  2152. psychopy/tests/data/correctScript/python/correctDotsComponent.py +161 -0
  2153. psychopy/tests/data/correctScript/python/correctEnvGratingComponent.py +167 -0
  2154. psychopy/tests/data/correctScript/python/correctFormComponent.py +150 -0
  2155. psychopy/tests/data/correctScript/python/correctGratingComponent.py +158 -0
  2156. psychopy/tests/data/correctScript/python/correctImageComponent.py +160 -0
  2157. psychopy/tests/data/correctScript/python/correctJoyButtonsComponent.py +204 -0
  2158. psychopy/tests/data/correctScript/python/correctJoystickComponent.py +214 -0
  2159. psychopy/tests/data/correctScript/python/correctKeyboardComponent.py +169 -0
  2160. psychopy/tests/data/correctScript/python/correctMicrophoneComponent.py +163 -0
  2161. psychopy/tests/data/correctScript/python/correctMouseComponent.py +174 -0
  2162. psychopy/tests/data/correctScript/python/correctMovieComponent.py +160 -0
  2163. psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +169 -0
  2164. psychopy/tests/data/correctScript/python/correctParallelOutComponent.py +156 -0
  2165. psychopy/tests/data/correctScript/python/correctPatchComponent.py +159 -0
  2166. psychopy/tests/data/correctScript/python/correctPolygonComponent.py +159 -0
  2167. psychopy/tests/data/correctScript/python/correctQmixPumpComponent.py +174 -0
  2168. psychopy/tests/data/correctScript/python/correctRatingScaleComponent.py +152 -0
  2169. psychopy/tests/data/correctScript/python/correctSliderComponent.py +159 -0
  2170. psychopy/tests/data/correctScript/python/correctSoundComponent.py +157 -0
  2171. psychopy/tests/data/correctScript/python/correctStaticComponent.py +176 -0
  2172. psychopy/tests/data/correctScript/python/correctTextComponent.py +159 -0
  2173. psychopy/tests/data/correctScript/python/correctVariableComponent.py +139 -0
  2174. psychopy/tests/data/correctScript/python/correctcedrusButtonBoxComponent.py +199 -0
  2175. psychopy/tests/data/correctScript/python/correctioLabsButtonBoxComponent.py +187 -0
  2176. psychopy/tests/data/dataTest.xlsx +0 -0
  2177. psychopy/tests/data/dots_cm.png +0 -0
  2178. psychopy/tests/data/dots_deg.png +0 -0
  2179. psychopy/tests/data/dots_degFlat.png +0 -0
  2180. psychopy/tests/data/dots_degFlatPos.png +0 -0
  2181. psychopy/tests/data/dots_height.png +0 -0
  2182. psychopy/tests/data/dots_norm.png +0 -0
  2183. psychopy/tests/data/dots_normAddBlend.png +0 -0
  2184. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  2185. psychopy/tests/data/dots_normHexbackground.png +0 -0
  2186. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  2187. psychopy/tests/data/dots_normNoShade.png +0 -0
  2188. psychopy/tests/data/dots_norm_local.png +0 -0
  2189. psychopy/tests/data/dots_pix.png +0 -0
  2190. psychopy/tests/data/dots_stencil.png +0 -0
  2191. psychopy/tests/data/elarray1_cm.png +0 -0
  2192. psychopy/tests/data/elarray1_deg.png +0 -0
  2193. psychopy/tests/data/elarray1_degFlat.png +0 -0
  2194. psychopy/tests/data/elarray1_degFlatPos.png +0 -0
  2195. psychopy/tests/data/elarray1_height.png +0 -0
  2196. psychopy/tests/data/elarray1_norm.png +0 -0
  2197. psychopy/tests/data/elarray1_normAddBlend.png +0 -0
  2198. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  2199. psychopy/tests/data/elarray1_normHexbackground.png +0 -0
  2200. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  2201. psychopy/tests/data/elarray1_norm_local.png +0 -0
  2202. psychopy/tests/data/elarray1_pix.png +0 -0
  2203. psychopy/tests/data/elarray1_stencil.png +0 -0
  2204. psychopy/tests/data/envelopeandrcos_cm.png +0 -0
  2205. psychopy/tests/data/envelopeandrcos_deg.png +0 -0
  2206. psychopy/tests/data/envelopeandrcos_degFlat.png +0 -0
  2207. psychopy/tests/data/envelopeandrcos_degFlatPos.png +0 -0
  2208. psychopy/tests/data/envelopeandrcos_height.png +0 -0
  2209. psychopy/tests/data/envelopeandrcos_norm.png +0 -0
  2210. psychopy/tests/data/envelopeandrcos_normAddBlend.png +0 -0
  2211. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  2212. psychopy/tests/data/envelopeandrcos_normHexbackground.png +0 -0
  2213. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  2214. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  2215. psychopy/tests/data/envelopeandrcos_pix.png +0 -0
  2216. psychopy/tests/data/envelopeandrcos_stencil.png +0 -0
  2217. psychopy/tests/data/envelopepowerandrcos_cm.png +0 -0
  2218. psychopy/tests/data/envelopepowerandrcos_deg.png +0 -0
  2219. psychopy/tests/data/envelopepowerandrcos_degFlat.png +0 -0
  2220. psychopy/tests/data/envelopepowerandrcos_degFlatPos.png +0 -0
  2221. psychopy/tests/data/envelopepowerandrcos_height.png +0 -0
  2222. psychopy/tests/data/envelopepowerandrcos_norm.png +0 -0
  2223. psychopy/tests/data/envelopepowerandrcos_normAddBlend.png +0 -0
  2224. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  2225. psychopy/tests/data/envelopepowerandrcos_normHexbackground.png +0 -0
  2226. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  2227. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  2228. psychopy/tests/data/envelopepowerandrcos_pix.png +0 -0
  2229. psychopy/tests/data/envelopepowerandrcos_stencil.png +0 -0
  2230. psychopy/tests/data/filltext.png +0 -0
  2231. psychopy/tests/data/form_font_demographics.png +0 -0
  2232. psychopy/tests/data/form_font_demographics.xlsx +0 -0
  2233. psychopy/tests/data/form_font_languages.png +0 -0
  2234. psychopy/tests/data/form_font_languages.xlsx +0 -0
  2235. psychopy/tests/data/form_font_nonstandard.png +0 -0
  2236. psychopy/tests/data/futureParams.psyexp +150 -0
  2237. psychopy/tests/data/gabor1_cm.png +0 -0
  2238. psychopy/tests/data/gabor1_deg.png +0 -0
  2239. psychopy/tests/data/gabor1_degFlat.png +0 -0
  2240. psychopy/tests/data/gabor1_degFlatPos.png +0 -0
  2241. psychopy/tests/data/gabor1_height.png +0 -0
  2242. psychopy/tests/data/gabor1_norm.png +0 -0
  2243. psychopy/tests/data/gabor1_normAddBlend.png +0 -0
  2244. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  2245. psychopy/tests/data/gabor1_normHexbackground.png +0 -0
  2246. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  2247. psychopy/tests/data/gabor1_normNoShade.png +0 -0
  2248. psychopy/tests/data/gabor1_norm_local.png +0 -0
  2249. psychopy/tests/data/gabor1_pix.png +0 -0
  2250. psychopy/tests/data/gabor1_stencil.png +0 -0
  2251. psychopy/tests/data/gabor2_cm.png +0 -0
  2252. psychopy/tests/data/gabor2_deg.png +0 -0
  2253. psychopy/tests/data/gabor2_degFlat.png +0 -0
  2254. psychopy/tests/data/gabor2_degFlatPos.png +0 -0
  2255. psychopy/tests/data/gabor2_height.png +0 -0
  2256. psychopy/tests/data/gabor2_norm.png +0 -0
  2257. psychopy/tests/data/gabor2_normAddBlend.png +0 -0
  2258. psychopy/tests/data/gabor2_normHexbackground.png +0 -0
  2259. psychopy/tests/data/gabor2_normNoShade.png +0 -0
  2260. psychopy/tests/data/gabor2_pix.png +0 -0
  2261. psychopy/tests/data/gabor2_stencil.png +0 -0
  2262. psychopy/tests/data/ghost_stroop.psyexp +131 -0
  2263. psychopy/tests/data/ghost_trialTypes.xlsx +0 -0
  2264. psychopy/tests/data/green_48000.flac.dist +0 -0
  2265. psychopy/tests/data/greyscale.jpg +0 -0
  2266. psychopy/tests/data/greyscale2.png +0 -0
  2267. psychopy/tests/data/greyscale2_cm.png +0 -0
  2268. psychopy/tests/data/greyscale2_deg.png +0 -0
  2269. psychopy/tests/data/greyscale2_degFlat.png +0 -0
  2270. psychopy/tests/data/greyscale2_degFlatPos.png +0 -0
  2271. psychopy/tests/data/greyscale2_height.png +0 -0
  2272. psychopy/tests/data/greyscale2_norm.png +0 -0
  2273. psychopy/tests/data/greyscale2_normAddBlend.png +0 -0
  2274. psychopy/tests/data/greyscale2_normHexbackground.png +0 -0
  2275. psychopy/tests/data/greyscale2_normNoShade.png +0 -0
  2276. psychopy/tests/data/greyscale2_pix.png +0 -0
  2277. psychopy/tests/data/greyscale2_stencil.png +0 -0
  2278. psychopy/tests/data/greyscaleLowContr_cm.png +0 -0
  2279. psychopy/tests/data/greyscaleLowContr_deg.png +0 -0
  2280. psychopy/tests/data/greyscaleLowContr_degFlat.png +0 -0
  2281. psychopy/tests/data/greyscaleLowContr_degFlatPos.png +0 -0
  2282. psychopy/tests/data/greyscaleLowContr_height.png +0 -0
  2283. psychopy/tests/data/greyscaleLowContr_norm.png +0 -0
  2284. psychopy/tests/data/greyscaleLowContr_normAddBlend.png +0 -0
  2285. psychopy/tests/data/greyscaleLowContr_normHexbackground.png +0 -0
  2286. psychopy/tests/data/greyscaleLowContr_normNoShade.png +0 -0
  2287. psychopy/tests/data/greyscaleLowContr_pix.png +0 -0
  2288. psychopy/tests/data/greyscaleLowContr_stencil.png +0 -0
  2289. psychopy/tests/data/greyscale_cm.png +0 -0
  2290. psychopy/tests/data/greyscale_deg.png +0 -0
  2291. psychopy/tests/data/greyscale_degFlat.png +0 -0
  2292. psychopy/tests/data/greyscale_degFlatPos.png +0 -0
  2293. psychopy/tests/data/greyscale_height.png +0 -0
  2294. psychopy/tests/data/greyscale_norm.png +0 -0
  2295. psychopy/tests/data/greyscale_normAddBlend.png +0 -0
  2296. psychopy/tests/data/greyscale_normHexbackground.png +0 -0
  2297. psychopy/tests/data/greyscale_normNoShade.png +0 -0
  2298. psychopy/tests/data/greyscale_pix.png +0 -0
  2299. psychopy/tests/data/greyscale_stencil.png +0 -0
  2300. psychopy/tests/data/imageAndGauss_cm.png +0 -0
  2301. psychopy/tests/data/imageAndGauss_deg.png +0 -0
  2302. psychopy/tests/data/imageAndGauss_degFlat.png +0 -0
  2303. psychopy/tests/data/imageAndGauss_degFlatPos.png +0 -0
  2304. psychopy/tests/data/imageAndGauss_height.png +0 -0
  2305. psychopy/tests/data/imageAndGauss_norm.png +0 -0
  2306. psychopy/tests/data/imageAndGauss_normAddBlend.png +0 -0
  2307. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  2308. psychopy/tests/data/imageAndGauss_normHexbackground.png +0 -0
  2309. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  2310. psychopy/tests/data/imageAndGauss_normNoShade.png +0 -0
  2311. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  2312. psychopy/tests/data/imageAndGauss_pix.png +0 -0
  2313. psychopy/tests/data/imageAndGauss_stencil.png +0 -0
  2314. psychopy/tests/data/movFrame1_cm.png +0 -0
  2315. psychopy/tests/data/movFrame1_deg.png +0 -0
  2316. psychopy/tests/data/movFrame1_degFlat.png +0 -0
  2317. psychopy/tests/data/movFrame1_degFlatPos.png +0 -0
  2318. psychopy/tests/data/movFrame1_height.png +0 -0
  2319. psychopy/tests/data/movFrame1_norm.png +0 -0
  2320. psychopy/tests/data/movFrame1_normAddBlend.png +0 -0
  2321. psychopy/tests/data/movFrame1_normHexbackground.png +0 -0
  2322. psychopy/tests/data/movFrame1_normNoShade.png +0 -0
  2323. psychopy/tests/data/movFrame1_pix.png +0 -0
  2324. psychopy/tests/data/movFrame1_stencil.png +0 -0
  2325. psychopy/tests/data/multiKeypressExperiment.psydat +357 -0
  2326. psychopy/tests/data/multiKeypressTrialhandler.psydat +252 -0
  2327. psychopy/tests/data/multiStairConds.xlsx +0 -0
  2328. psychopy/tests/data/multiStairQuestPlus.xlsx +0 -0
  2329. psychopy/tests/data/newstyle.psydat +6155 -0
  2330. psychopy/tests/data/noiseAndRcos_cm.png +0 -0
  2331. psychopy/tests/data/noiseAndRcos_deg.png +0 -0
  2332. psychopy/tests/data/noiseAndRcos_degFlat.png +0 -0
  2333. psychopy/tests/data/noiseAndRcos_degFlatPos.png +0 -0
  2334. psychopy/tests/data/noiseAndRcos_height.png +0 -0
  2335. psychopy/tests/data/noiseAndRcos_norm.png +0 -0
  2336. psychopy/tests/data/noiseAndRcos_normAddBlend.png +0 -0
  2337. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  2338. psychopy/tests/data/noiseAndRcos_normHexbackground.png +0 -0
  2339. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  2340. psychopy/tests/data/noiseAndRcos_normNoShade.png +0 -0
  2341. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  2342. psychopy/tests/data/noiseAndRcos_pix.png +0 -0
  2343. psychopy/tests/data/noiseAndRcos_stencil.png +0 -0
  2344. psychopy/tests/data/noiseFiltersAndRcos_cm.png +0 -0
  2345. psychopy/tests/data/noiseFiltersAndRcos_deg.png +0 -0
  2346. psychopy/tests/data/noiseFiltersAndRcos_degFlat.png +0 -0
  2347. psychopy/tests/data/noiseFiltersAndRcos_degFlatPos.png +0 -0
  2348. psychopy/tests/data/noiseFiltersAndRcos_height.png +0 -0
  2349. psychopy/tests/data/noiseFiltersAndRcos_norm.png +0 -0
  2350. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend.png +0 -0
  2351. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  2352. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground.png +0 -0
  2353. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  2354. psychopy/tests/data/noiseFiltersAndRcos_normNoShade.png +0 -0
  2355. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  2356. psychopy/tests/data/noiseFiltersAndRcos_pix.png +0 -0
  2357. psychopy/tests/data/noiseFiltersAndRcos_stencil.png +0 -0
  2358. psychopy/tests/data/numpyImage_cm.png +0 -0
  2359. psychopy/tests/data/numpyImage_deg.png +0 -0
  2360. psychopy/tests/data/numpyImage_degFlat.png +0 -0
  2361. psychopy/tests/data/numpyImage_degFlatPos.png +0 -0
  2362. psychopy/tests/data/numpyImage_height.png +0 -0
  2363. psychopy/tests/data/numpyImage_norm.png +0 -0
  2364. psychopy/tests/data/numpyImage_normAddBlend.png +0 -0
  2365. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  2366. psychopy/tests/data/numpyImage_normHexbackground.png +0 -0
  2367. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  2368. psychopy/tests/data/numpyImage_normNoShade.png +0 -0
  2369. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  2370. psychopy/tests/data/numpyImage_pix.png +0 -0
  2371. psychopy/tests/data/numpyImage_stencil.png +0 -0
  2372. psychopy/tests/data/numpyLowContr_cm.png +0 -0
  2373. psychopy/tests/data/numpyLowContr_deg.png +0 -0
  2374. psychopy/tests/data/numpyLowContr_degFlat.png +0 -0
  2375. psychopy/tests/data/numpyLowContr_degFlatPos.png +0 -0
  2376. psychopy/tests/data/numpyLowContr_height.png +0 -0
  2377. psychopy/tests/data/numpyLowContr_norm.png +0 -0
  2378. psychopy/tests/data/numpyLowContr_normAddBlend.png +0 -0
  2379. psychopy/tests/data/numpyLowContr_normHexbackground.png +0 -0
  2380. psychopy/tests/data/numpyLowContr_normNoShade.png +0 -0
  2381. psychopy/tests/data/numpyLowContr_pix.png +0 -0
  2382. psychopy/tests/data/numpyLowContr_stencil.png +0 -0
  2383. psychopy/tests/data/oldstyle.psydat +1534 -0
  2384. psychopy/tests/data/oldstyle_stair.psydat +263 -0
  2385. psychopy/tests/data/ratingscale1_cm.png +0 -0
  2386. psychopy/tests/data/ratingscale1_deg.png +0 -0
  2387. psychopy/tests/data/ratingscale1_degFlat.png +0 -0
  2388. psychopy/tests/data/ratingscale1_degFlatPos.png +0 -0
  2389. psychopy/tests/data/ratingscale1_height.png +0 -0
  2390. psychopy/tests/data/ratingscale1_norm.png +0 -0
  2391. psychopy/tests/data/ratingscale1_normAddBlend.png +0 -0
  2392. psychopy/tests/data/ratingscale1_normHexbackground.png +0 -0
  2393. psychopy/tests/data/ratingscale1_normNoShade.png +0 -0
  2394. psychopy/tests/data/ratingscale1_pix.png +0 -0
  2395. psychopy/tests/data/ratingscale1_stencil.png +0 -0
  2396. psychopy/tests/data/red_16000.flac.dist +0 -0
  2397. psychopy/tests/data/retroListParam.psyexp +82 -0
  2398. psychopy/tests/data/right_to_left_unidcode.xlsx +0 -0
  2399. psychopy/tests/data/sample.meshwarp.data +11522 -0
  2400. psychopy/tests/data/shape2_1_cm.png +0 -0
  2401. psychopy/tests/data/shape2_1_deg.png +0 -0
  2402. psychopy/tests/data/shape2_1_degFlat.png +0 -0
  2403. psychopy/tests/data/shape2_1_degFlatPos.png +0 -0
  2404. psychopy/tests/data/shape2_1_height.png +0 -0
  2405. psychopy/tests/data/shape2_1_norm.png +0 -0
  2406. psychopy/tests/data/shape2_1_normAddBlend.png +0 -0
  2407. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  2408. psychopy/tests/data/shape2_1_normHexbackground.png +0 -0
  2409. psychopy/tests/data/shape2_1_normNoShade.png +0 -0
  2410. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  2411. psychopy/tests/data/shape2_1_pix.png +0 -0
  2412. psychopy/tests/data/shape2_1_stencil.png +0 -0
  2413. psychopy/tests/data/shape2_2_cm.png +0 -0
  2414. psychopy/tests/data/shape2_2_deg.png +0 -0
  2415. psychopy/tests/data/shape2_2_degFlat.png +0 -0
  2416. psychopy/tests/data/shape2_2_degFlatPos.png +0 -0
  2417. psychopy/tests/data/shape2_2_height.png +0 -0
  2418. psychopy/tests/data/shape2_2_norm.png +0 -0
  2419. psychopy/tests/data/shape2_2_normAddBlend.png +0 -0
  2420. psychopy/tests/data/shape2_2_normHexbackground.png +0 -0
  2421. psychopy/tests/data/shape2_2_normNoShade.png +0 -0
  2422. psychopy/tests/data/shape2_2_pix.png +0 -0
  2423. psychopy/tests/data/shape2_2_stencil.png +0 -0
  2424. psychopy/tests/data/simpleimage1_cm.png +0 -0
  2425. psychopy/tests/data/simpleimage1_deg.png +0 -0
  2426. psychopy/tests/data/simpleimage1_degFlat.png +0 -0
  2427. psychopy/tests/data/simpleimage1_degFlatPos.png +0 -0
  2428. psychopy/tests/data/simpleimage1_height.png +0 -0
  2429. psychopy/tests/data/simpleimage1_norm.png +0 -0
  2430. psychopy/tests/data/simpleimage1_normAddBlend.png +0 -0
  2431. psychopy/tests/data/simpleimage1_normHexbackground.png +0 -0
  2432. psychopy/tests/data/simpleimage1_normNoShade.png +0 -0
  2433. psychopy/tests/data/simpleimage1_pix.png +0 -0
  2434. psychopy/tests/data/simpleimage1_stencil.png +0 -0
  2435. psychopy/tests/data/test001EntryImporting.psyexp +66 -0
  2436. psychopy/tests/data/testMovie.mp4 +0 -0
  2437. psychopy/tests/data/test_circle_radius_.1height.png +0 -0
  2438. psychopy/tests/data/test_circle_radius_.2height.png +0 -0
  2439. psychopy/tests/data/test_circle_radius_10pix.png +0 -0
  2440. psychopy/tests/data/test_circle_radius_20pix.png +0 -0
  2441. psychopy/tests/data/test_form_combinations_choice_bigItem.png +0 -0
  2442. psychopy/tests/data/test_form_combinations_choice_bigItemOverflow.png +0 -0
  2443. psychopy/tests/data/test_form_combinations_choice_bigResp.png +0 -0
  2444. psychopy/tests/data/test_form_combinations_choice_bigRespOverflow.png +0 -0
  2445. psychopy/tests/data/test_form_combinations_description_bigItem.png +0 -0
  2446. psychopy/tests/data/test_form_combinations_description_bigItemOverflow.png +0 -0
  2447. psychopy/tests/data/test_form_combinations_description_bigResp.png +0 -0
  2448. psychopy/tests/data/test_form_combinations_description_bigRespOverflow.png +0 -0
  2449. psychopy/tests/data/test_form_combinations_free text_bigItem.png +0 -0
  2450. psychopy/tests/data/test_form_combinations_free text_bigItemOverflow.png +0 -0
  2451. psychopy/tests/data/test_form_combinations_free text_bigResp.png +0 -0
  2452. psychopy/tests/data/test_form_combinations_free text_bigRespOverflow.png +0 -0
  2453. psychopy/tests/data/test_form_combinations_heading_bigItem.png +0 -0
  2454. psychopy/tests/data/test_form_combinations_heading_bigItemOverflow.png +0 -0
  2455. psychopy/tests/data/test_form_combinations_heading_bigResp.png +0 -0
  2456. psychopy/tests/data/test_form_combinations_heading_bigRespOverflow.png +0 -0
  2457. psychopy/tests/data/test_form_combinations_radio_bigItem.png +0 -0
  2458. psychopy/tests/data/test_form_combinations_radio_bigItemOverflow.png +0 -0
  2459. psychopy/tests/data/test_form_combinations_radio_bigResp.png +0 -0
  2460. psychopy/tests/data/test_form_combinations_radio_bigRespOverflow.png +0 -0
  2461. psychopy/tests/data/test_form_combinations_rating_bigItem.png +0 -0
  2462. psychopy/tests/data/test_form_combinations_rating_bigItemOverflow.png +0 -0
  2463. psychopy/tests/data/test_form_combinations_rating_bigResp.png +0 -0
  2464. psychopy/tests/data/test_form_combinations_rating_bigRespOverflow.png +0 -0
  2465. psychopy/tests/data/test_form_combinations_slider_bigItem.png +0 -0
  2466. psychopy/tests/data/test_form_combinations_slider_bigItemOverflow.png +0 -0
  2467. psychopy/tests/data/test_form_combinations_slider_bigResp.png +0 -0
  2468. psychopy/tests/data/test_form_combinations_slider_bigRespOverflow.png +0 -0
  2469. psychopy/tests/data/test_get_resources/blue.png +0 -0
  2470. psychopy/tests/data/test_get_resources/groupA.csv +3 -0
  2471. psychopy/tests/data/test_get_resources/groupB.csv +3 -0
  2472. psychopy/tests/data/test_get_resources/groups.csv +3 -0
  2473. psychopy/tests/data/test_get_resources/handledbyrm_constrloop.psyexp +143 -0
  2474. psychopy/tests/data/test_get_resources/handledbyrm_noloop.psyexp +114 -0
  2475. psychopy/tests/data/test_get_resources/handledbyrm_recurloop.psyexp +138 -0
  2476. psychopy/tests/data/test_get_resources/handledbyrm_strloop.psyexp +126 -0
  2477. psychopy/tests/data/test_get_resources/handledbystatic_constrloop.psyexp +141 -0
  2478. psychopy/tests/data/test_get_resources/handledbystatic_noloop.psyexp +112 -0
  2479. psychopy/tests/data/test_get_resources/handledbystatic_recurloop.psyexp +136 -0
  2480. psychopy/tests/data/test_get_resources/handledbystatic_strloop.psyexp +124 -0
  2481. psychopy/tests/data/test_get_resources/unhandled_constrloop.psyexp +128 -0
  2482. psychopy/tests/data/test_get_resources/unhandled_noloop.psyexp +99 -0
  2483. psychopy/tests/data/test_get_resources/unhandled_recurloop.psyexp +123 -0
  2484. psychopy/tests/data/test_get_resources/unhandled_strloop.psyexp +111 -0
  2485. psychopy/tests/data/test_get_resources/white.png +0 -0
  2486. psychopy/tests/data/test_get_resources/yellow.png +0 -0
  2487. psychopy/tests/data/test_image_aspect_default_None.png +0 -0
  2488. psychopy/tests/data/test_image_aspect_default_xFull_yNone.png +0 -0
  2489. psychopy/tests/data/test_image_aspect_default_xNone_yFull.png +0 -0
  2490. psychopy/tests/data/test_image_aspect_default_xNone_yNone.png +0 -0
  2491. psychopy/tests/data/test_image_flip_anchor_horiz.png +0 -0
  2492. psychopy/tests/data/test_image_flip_anchor_vert.png +0 -0
  2493. psychopy/tests/data/test_loops/testLoopsBlocks.psyexp +161 -0
  2494. psychopy/tests/data/test_loops/testStaircase.psyexp +105 -0
  2495. psychopy/tests/data/test_loops/test_current_loop_attr.psyexp +185 -0
  2496. psychopy/tests/data/test_panorama/panoramaTestImage.png +0 -0
  2497. psychopy/tests/data/test_panorama/panoramaTestImage.svg +1 -0
  2498. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_-0.3.png +0 -0
  2499. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_0.3.png +0 -0
  2500. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_-0.3.png +0 -0
  2501. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_0.3.png +0 -0
  2502. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_-1.0.png +0 -0
  2503. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_1.0.png +0 -0
  2504. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_-0.3.png +0 -0
  2505. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_0.3.png +0 -0
  2506. psychopy/tests/data/test_resources.psyexp +491 -0
  2507. psychopy/tests/data/test_session/outside_root/externalExp.psyexp +116 -0
  2508. psychopy/tests/data/test_session/root/annotation/annotation.psyexp +161 -0
  2509. psychopy/tests/data/test_session/root/error/error.psyexp +93 -0
  2510. psychopy/tests/data/test_session/root/exp1/exp1.psyexp +133 -0
  2511. psychopy/tests/data/test_session/root/exp2/exp2.psyexp +133 -0
  2512. psychopy/tests/data/test_session/root/frameRate/frameRate.psyexp +114 -0
  2513. psychopy/tests/data/test_session/root/invUseVersion/invUseVersion.psyexp +133 -0
  2514. psychopy/tests/data/test_session/root/testClockFormat/testClockFormat.psyexp +122 -0
  2515. psychopy/tests/data/test_session/root/testCtrls/testCtrls.psyexp +115 -0
  2516. psychopy/tests/data/test_session/root/testEditExpInfo/testEditExpInfo.psyexp +135 -0
  2517. psychopy/tests/data/test_session/root/testNamedButtonBox/testNamedButtonBox.psyexp +145 -0
  2518. psychopy/tests/data/test_slider_horiz_accute_horiz.png +0 -0
  2519. psychopy/tests/data/test_slider_horiz_accute_vert.png +0 -0
  2520. psychopy/tests/data/test_slider_horiz_horiz.png +0 -0
  2521. psychopy/tests/data/test_slider_horiz_obtuse_horiz.png +0 -0
  2522. psychopy/tests/data/test_slider_horiz_obtuse_vert.png +0 -0
  2523. psychopy/tests/data/test_slider_horiz_vert.png +0 -0
  2524. psychopy/tests/data/test_slider_ticklabelloc_blanks.png +0 -0
  2525. psychopy/tests/data/test_slider_ticklabelloc_clustered.png +0 -0
  2526. psychopy/tests/data/test_slider_ticklabelloc_morelabels.png +0 -0
  2527. psychopy/tests/data/test_slider_ticklabelloc_morelabelsclustered.png +0 -0
  2528. psychopy/tests/data/test_slider_ticklabelloc_moreticks.png +0 -0
  2529. psychopy/tests/data/test_slider_ticklabelloc_moreticksclustered.png +0 -0
  2530. psychopy/tests/data/test_slider_ticklabelloc_nolabels.png +0 -0
  2531. psychopy/tests/data/test_slider_ticklabelloc_noticks.png +0 -0
  2532. psychopy/tests/data/test_slider_ticklabelloc_simple.png +0 -0
  2533. psychopy/tests/data/test_slider_triangle_horiz_False_flip_False.png +0 -0
  2534. psychopy/tests/data/test_slider_triangle_horiz_False_flip_True.png +0 -0
  2535. psychopy/tests/data/test_slider_triangle_horiz_True_flip_False.png +0 -0
  2536. psychopy/tests/data/test_slider_triangle_horiz_True_flip_True.png +0 -0
  2537. psychopy/tests/data/test_static_component_script.psyexp +76 -0
  2538. psychopy/tests/data/test_win_bg_large_256_default.png +0 -0
  2539. psychopy/tests/data/test_win_bg_large_500_default.png +0 -0
  2540. psychopy/tests/data/test_win_bg_small_200_default.png +0 -0
  2541. psychopy/tests/data/test_win_bg_small_256_default.png +0 -0
  2542. psychopy/tests/data/test_win_bg_tall_200_default.png +0 -0
  2543. psychopy/tests/data/test_win_bg_tall_256_default.png +0 -0
  2544. psychopy/tests/data/test_win_bg_tall_500_default.png +0 -0
  2545. psychopy/tests/data/test_win_bg_tall_fill_default.png +0 -0
  2546. psychopy/tests/data/test_win_bg_wide_200_default.png +0 -0
  2547. psychopy/tests/data/test_win_bg_wide_256_default.png +0 -0
  2548. psychopy/tests/data/test_win_bg_wide_500_default.png +0 -0
  2549. psychopy/tests/data/test_win_bg_wide_fill_default.png +0 -0
  2550. psychopy/tests/data/test_win_bgcolor_blue.png +0 -0
  2551. psychopy/tests/data/test_win_bgcolor_green.png +0 -0
  2552. psychopy/tests/data/test_win_bgcolor_red.png +0 -0
  2553. psychopy/tests/data/testimage.jpg +0 -0
  2554. psychopy/tests/data/testimagegray.jpg +0 -0
  2555. psychopy/tests/data/testpixels.png +0 -0
  2556. psychopy/tests/data/testwedges.png +0 -0
  2557. psychopy/tests/data/text1_cm.png +0 -0
  2558. psychopy/tests/data/text1_deg.png +0 -0
  2559. psychopy/tests/data/text1_degFlat.png +0 -0
  2560. psychopy/tests/data/text1_degFlatPos.png +0 -0
  2561. psychopy/tests/data/text1_height.png +0 -0
  2562. psychopy/tests/data/text1_norm.png +0 -0
  2563. psychopy/tests/data/text1_normAddBlend.png +0 -0
  2564. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  2565. psychopy/tests/data/text1_normHexbackground.png +0 -0
  2566. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  2567. psychopy/tests/data/text1_normNoShade.png +0 -0
  2568. psychopy/tests/data/text1_norm_local.png +0 -0
  2569. psychopy/tests/data/text1_pix.png +0 -0
  2570. psychopy/tests/data/text1_stencil.png +0 -0
  2571. psychopy/tests/data/text2_cm.png +0 -0
  2572. psychopy/tests/data/text2_deg.png +0 -0
  2573. psychopy/tests/data/text2_degFlat.png +0 -0
  2574. psychopy/tests/data/text2_degFlatPos.png +0 -0
  2575. psychopy/tests/data/text2_height.png +0 -0
  2576. psychopy/tests/data/text2_norm.png +0 -0
  2577. psychopy/tests/data/text2_normNoShade.png +0 -0
  2578. psychopy/tests/data/text2_pix.png +0 -0
  2579. psychopy/tests/data/text2_stencil.png +0 -0
  2580. psychopy/tests/data/textbox_charcolors_default_roygbiv.png +0 -0
  2581. psychopy/tests/data/textbox_charcolors_default_white_hello_black_there.png +0 -0
  2582. psychopy/tests/data/textbox_default_align_bottom_center.png +0 -0
  2583. psychopy/tests/data/textbox_default_align_bottom_left.png +0 -0
  2584. psychopy/tests/data/textbox_default_align_bottom_right.png +0 -0
  2585. psychopy/tests/data/textbox_default_align_center.png +0 -0
  2586. psychopy/tests/data/textbox_default_align_center_center.png +0 -0
  2587. psychopy/tests/data/textbox_default_align_center_left.png +0 -0
  2588. psychopy/tests/data/textbox_default_align_center_right.png +0 -0
  2589. psychopy/tests/data/textbox_default_align_centre.png +0 -0
  2590. psychopy/tests/data/textbox_default_align_centre_centre.png +0 -0
  2591. psychopy/tests/data/textbox_default_align_more_than_two_words.png +0 -0
  2592. psychopy/tests/data/textbox_default_align_someword.png +0 -0
  2593. psychopy/tests/data/textbox_default_align_top_center.png +0 -0
  2594. psychopy/tests/data/textbox_default_align_top_left.png +0 -0
  2595. psychopy/tests/data/textbox_default_align_top_right.png +0 -0
  2596. psychopy/tests/data/textbox_default_colors_WOB.png +0 -0
  2597. psychopy/tests/data/textbox_default_colors_exemplar1.png +0 -0
  2598. psychopy/tests/data/textbox_default_colors_exemplar2.png +0 -0
  2599. psychopy/tests/data/textbox_default_colors_exemplar3.png +0 -0
  2600. psychopy/tests/data/textbox_default_colors_tyke1.png +0 -0
  2601. psychopy/tests/data/textbox_default_colors_tyke2.png +0 -0
  2602. psychopy/tests/data/textbox_default_colors_tyke3.png +0 -0
  2603. psychopy/tests/data/textbox_default_cutoff_top.png +0 -0
  2604. psychopy/tests/data/textbox_default_exemplar_1.png +0 -0
  2605. psychopy/tests/data/textbox_default_exemplar_2.png +0 -0
  2606. psychopy/tests/data/textbox_default_exemplar_3.png +0 -0
  2607. psychopy/tests/data/textbox_default_exemplar_4.png +0 -0
  2608. psychopy/tests/data/textbox_default_tyke_1.png +0 -0
  2609. psychopy/tests/data/textbox_default_tyke_2.png +0 -0
  2610. psychopy/tests/data/textbox_typing_blank.png +0 -0
  2611. psychopy/tests/data/textbox_typing_longKoeran.png +0 -0
  2612. psychopy/tests/data/textbox_typing_longWord.png +0 -0
  2613. psychopy/tests/data/textbox_typing_navDel.png +0 -0
  2614. psychopy/tests/data/textbox_typing_navLR.png +0 -0
  2615. psychopy/tests/data/textbox_typing_newline.png +0 -0
  2616. psychopy/tests/data/textbox_typing_pangram.png +0 -0
  2617. psychopy/tests/data/textbox_uax14_align_bottom_center.png +0 -0
  2618. psychopy/tests/data/textbox_uax14_align_bottom_left.png +0 -0
  2619. psychopy/tests/data/textbox_uax14_align_bottom_right.png +0 -0
  2620. psychopy/tests/data/textbox_uax14_align_center.png +0 -0
  2621. psychopy/tests/data/textbox_uax14_align_center_center.png +0 -0
  2622. psychopy/tests/data/textbox_uax14_align_center_left.png +0 -0
  2623. psychopy/tests/data/textbox_uax14_align_center_right.png +0 -0
  2624. psychopy/tests/data/textbox_uax14_align_centre.png +0 -0
  2625. psychopy/tests/data/textbox_uax14_align_centre_centre.png +0 -0
  2626. psychopy/tests/data/textbox_uax14_align_more_than_two_words.png +0 -0
  2627. psychopy/tests/data/textbox_uax14_align_someword.png +0 -0
  2628. psychopy/tests/data/textbox_uax14_align_top_center.png +0 -0
  2629. psychopy/tests/data/textbox_uax14_align_top_left.png +0 -0
  2630. psychopy/tests/data/textbox_uax14_align_top_right.png +0 -0
  2631. psychopy/tests/data/textbox_uax14_colors_WOB.png +0 -0
  2632. psychopy/tests/data/textbox_uax14_colors_exemplar1.png +0 -0
  2633. psychopy/tests/data/textbox_uax14_colors_exemplar2.png +0 -0
  2634. psychopy/tests/data/textbox_uax14_colors_exemplar3.png +0 -0
  2635. psychopy/tests/data/textbox_uax14_colors_tyke1.png +0 -0
  2636. psychopy/tests/data/textbox_uax14_colors_tyke2.png +0 -0
  2637. psychopy/tests/data/textbox_uax14_colors_tyke3.png +0 -0
  2638. psychopy/tests/data/textbox_uax14_cutoff_top.png +0 -0
  2639. psychopy/tests/data/textbox_uax14_exemplar_1.png +0 -0
  2640. psychopy/tests/data/textbox_uax14_exemplar_2.png +0 -0
  2641. psychopy/tests/data/textbox_uax14_exemplar_3.png +0 -0
  2642. psychopy/tests/data/textbox_uax14_exemplar_4.png +0 -0
  2643. psychopy/tests/data/textbox_uax14_tyke_1.png +0 -0
  2644. psychopy/tests/data/textbox_uax14_tyke_2.png +0 -0
  2645. psychopy/tests/data/trialTypes.csv +1 -0
  2646. psychopy/tests/data/trialTypes.docx +0 -0
  2647. psychopy/tests/data/trialTypes.pkl +0 -0
  2648. psychopy/tests/data/trialTypes.tsv +7 -0
  2649. psychopy/tests/data/trialTypes.xls +0 -0
  2650. psychopy/tests/data/trialTypes.xlsx +0 -0
  2651. psychopy/tests/data/trialTypes_eu.csv +7 -0
  2652. psychopy/tests/data/trialsBlankCols.xlsx +0 -0
  2653. psychopy/tests/data/wedge1_cm.png +0 -0
  2654. psychopy/tests/data/wedge1_deg.png +0 -0
  2655. psychopy/tests/data/wedge1_degFlat.png +0 -0
  2656. psychopy/tests/data/wedge1_degFlatPos.png +0 -0
  2657. psychopy/tests/data/wedge1_height.png +0 -0
  2658. psychopy/tests/data/wedge1_norm.png +0 -0
  2659. psychopy/tests/data/wedge1_normAddBlend.png +0 -0
  2660. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  2661. psychopy/tests/data/wedge1_normHexbackground.png +0 -0
  2662. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  2663. psychopy/tests/data/wedge1_normNoShade.png +0 -0
  2664. psychopy/tests/data/wedge1_norm_local.png +0 -0
  2665. psychopy/tests/data/wedge1_pix.png +0 -0
  2666. psychopy/tests/data/wedge1_stencil.png +0 -0
  2667. psychopy/tests/data/wedge2_cm.png +0 -0
  2668. psychopy/tests/data/wedge2_deg.png +0 -0
  2669. psychopy/tests/data/wedge2_degFlat.png +0 -0
  2670. psychopy/tests/data/wedge2_degFlatPos.png +0 -0
  2671. psychopy/tests/data/wedge2_height.png +0 -0
  2672. psychopy/tests/data/wedge2_norm.png +0 -0
  2673. psychopy/tests/data/wedge2_normAddBlend.png +0 -0
  2674. psychopy/tests/data/wedge2_normHexbackground.png +0 -0
  2675. psychopy/tests/data/wedge2_normNoShade.png +0 -0
  2676. psychopy/tests/data/wedge2_pix.png +0 -0
  2677. psychopy/tests/data/wedge2_stencil.png +0 -0
  2678. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos-0.4_0.png +0 -0
  2679. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos0_0.png +0 -0
  2680. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos-0.4_0.png +0 -0
  2681. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos0_0.png +0 -0
  2682. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos-0.4_0.png +0 -0
  2683. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos0_0.png +0 -0
  2684. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos-0.4_0.png +0 -0
  2685. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos0_0.png +0 -0
  2686. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos-0.4_0.png +0 -0
  2687. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos0_0.png +0 -0
  2688. psychopy/tests/data/winScalePos_ori0_scale1_1_pos-0.4_0.png +0 -0
  2689. psychopy/tests/data/winScalePos_ori0_scale1_1_pos0_0.png +0 -0
  2690. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos-0.4_0.png +0 -0
  2691. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos0_0.png +0 -0
  2692. psychopy/tests/data/winScalePos_ori0_scale2_2_pos-0.4_0.png +0 -0
  2693. psychopy/tests/data/winScalePos_ori0_scale2_2_pos0_0.png +0 -0
  2694. psychopy/tests/data/winScalePos_ori45_scale-1_-1_pos0_0.png +0 -0
  2695. psychopy/tests/data/winScalePos_ori45_scale-1_1_pos0_0.png +0 -0
  2696. psychopy/tests/data/winScalePos_ori45_scale-2_-2_pos0_0.png +0 -0
  2697. psychopy/tests/data/winScalePos_ori45_scale-2_2_pos0_0.png +0 -0
  2698. psychopy/tests/data/winScalePos_ori45_scale1_-1_pos0_0.png +0 -0
  2699. psychopy/tests/data/winScalePos_ori45_scale1_1_pos0_0.png +0 -0
  2700. psychopy/tests/data/winScalePos_ori45_scale2_-2_pos0_0.png +0 -0
  2701. psychopy/tests/data/winScalePos_ori45_scale2_2_pos0_0.png +0 -0
  2702. psychopy/tests/doc/run_btn.png +0 -0
  2703. psychopy/tests/doc/test-suite-bugs.jpg +0 -0
  2704. psychopy/tests/doc/user-bugs.jpg +0 -0
  2705. psychopy/tests/dummy_xorg.conf +21 -0
  2706. psychopy/tests/run.py +50 -0
  2707. psychopy/tests/test_Installation.py +38 -0
  2708. psychopy/tests/test_alerts/test_alerts.py +37 -0
  2709. psychopy/tests/test_alerts/test_alerttools.py +131 -0
  2710. psychopy/tests/test_app/__init__.py +0 -0
  2711. psychopy/tests/test_app/conftest.py +41 -0
  2712. psychopy/tests/test_app/test_builder/__init__.py +0 -0
  2713. psychopy/tests/test_app/test_builder/test_BuilderFrame.py +151 -0
  2714. psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +135 -0
  2715. psychopy/tests/test_app/test_builder/test_ComponentDialogs.py +98 -0
  2716. psychopy/tests/test_app/test_runner/__init__.py +0 -0
  2717. psychopy/tests/test_app/test_runner/test_RunnerFrame.py +166 -0
  2718. psychopy/tests/test_app/test_speed.py +144 -0
  2719. psychopy/tests/test_app/test_themes/test_icons.py +79 -0
  2720. psychopy/tests/test_codecov.py +29 -0
  2721. psychopy/tests/test_colors/test_Color.py +41 -0
  2722. psychopy/tests/test_data/dataPrev.xlsx +0 -0
  2723. psychopy/tests/test_data/test_ExperimentHandler.py +171 -0
  2724. psychopy/tests/test_data/test_MultiStairHandler.py +174 -0
  2725. psychopy/tests/test_data/test_StairHandlers.py +1241 -0
  2726. psychopy/tests/test_data/test_TrialHandler.py +335 -0
  2727. psychopy/tests/test_data/test_TrialHandler2.py +408 -0
  2728. psychopy/tests/test_data/test_TrialHandlerExt.py +359 -0
  2729. psychopy/tests/test_data/test_fitFunctions.py +101 -0
  2730. psychopy/tests/test_data/test_utils.py +169 -0
  2731. psychopy/tests/test_data/test_xlsx.py +92 -0
  2732. psychopy/tests/test_demos/test_builder_demos.py +52 -0
  2733. psychopy/tests/test_experiment/__init__.py +0 -0
  2734. psychopy/tests/test_experiment/known_py_diffs.txt +47 -0
  2735. psychopy/tests/test_experiment/needs_wx/__init__.py +0 -0
  2736. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +13730 -0
  2737. psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +130 -0
  2738. psychopy/tests/test_experiment/needs_wx/test_Experiment.py +406 -0
  2739. psychopy/tests/test_experiment/needs_wx/test_components.py +170 -0
  2740. psychopy/tests/test_experiment/test_component_compile_js.py +59 -0
  2741. psychopy/tests/test_experiment/test_component_compile_python.py +165 -0
  2742. psychopy/tests/test_experiment/test_components/__init__.py +1 -0
  2743. psychopy/tests/test_experiment/test_components/test_ButtonBox.py +216 -0
  2744. psychopy/tests/test_experiment/test_components/test_Code.py +82 -0
  2745. psychopy/tests/test_experiment/test_components/test_Image.py +24 -0
  2746. psychopy/tests/test_experiment/test_components/test_Mouse.py +149 -0
  2747. psychopy/tests/test_experiment/test_components/test_Polygon.py +81 -0
  2748. psychopy/tests/test_experiment/test_components/test_ResourceManager.py +60 -0
  2749. psychopy/tests/test_experiment/test_components/test_Settings.py +82 -0
  2750. psychopy/tests/test_experiment/test_components/test_Static.py +60 -0
  2751. psychopy/tests/test_experiment/test_components/test_all_components.py +162 -0
  2752. psychopy/tests/test_experiment/test_components/test_base_components.py +323 -0
  2753. psychopy/tests/test_experiment/test_experiment.py +103 -0
  2754. psychopy/tests/test_experiment/test_loops.py +95 -0
  2755. psychopy/tests/test_experiment/test_params.py +350 -0
  2756. psychopy/tests/test_experiment/test_py2js.py +230 -0
  2757. psychopy/tests/test_experiment/test_routines/__init__.py +1 -0
  2758. psychopy/tests/test_experiment/test_routines/test_EyetrackerCalibrationRoutine.py +9 -0
  2759. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +9 -0
  2760. psychopy/tests/test_experiment/test_routines/test_all_routines.py +23 -0
  2761. psychopy/tests/test_experiment/test_routines/test_base_routine.py +154 -0
  2762. psychopy/tests/test_experiment/test_routines/test_standalone_routines.py +36 -0
  2763. psychopy/tests/test_gui/test_DlgFromDictQt.py +82 -0
  2764. psychopy/tests/test_gui/test_DlgFromDictWx.py +82 -0
  2765. psychopy/tests/test_hardware/__init__.py +0 -0
  2766. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +67 -0
  2767. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +110 -0
  2768. psychopy/tests/test_hardware/test_device_manager.py +36 -0
  2769. psychopy/tests/test_hardware/test_emulator.py +106 -0
  2770. psychopy/tests/test_hardware/test_gammasci.py +35 -0
  2771. psychopy/tests/test_hardware/test_keyboard.py +73 -0
  2772. psychopy/tests/test_hardware/test_keyboard_events.py +362 -0
  2773. psychopy/tests/test_hardware/test_ports.py +151 -0
  2774. psychopy/tests/test_iohub/__init__.py +1 -0
  2775. psychopy/tests/test_iohub/test_computer.py +124 -0
  2776. psychopy/tests/test_iohub/test_event_get_and_clear.py +94 -0
  2777. psychopy/tests/test_iohub/test_keyboard.py +91 -0
  2778. psychopy/tests/test_iohub/test_launch.py +19 -0
  2779. psychopy/tests/test_iohub/testutil.py +54 -0
  2780. psychopy/tests/test_liaison/test_Liaison.py +228 -0
  2781. psychopy/tests/test_misc/__init__.py +0 -0
  2782. psychopy/tests/test_misc/memory_usage.py +164 -0
  2783. psychopy/tests/test_misc/test_GammaFun.py +15 -0
  2784. psychopy/tests/test_misc/test_clock.py +61 -0
  2785. psychopy/tests/test_misc/test_color.py +203 -0
  2786. psychopy/tests/test_misc/test_core.py +446 -0
  2787. psychopy/tests/test_misc/test_event.py +307 -0
  2788. psychopy/tests/test_misc/test_info.py +18 -0
  2789. psychopy/tests/test_misc/test_layout.py +49 -0
  2790. psychopy/tests/test_misc/test_locale.py +38 -0
  2791. psychopy/tests/test_misc/test_web.py +22 -0
  2792. psychopy/tests/test_monitors/test_monitors.py +91 -0
  2793. psychopy/tests/test_preferences/__init__.py +0 -0
  2794. psychopy/tests/test_preferences/test_prefs.py +28 -0
  2795. psychopy/tests/test_session/test_Session.py +253 -0
  2796. psychopy/tests/test_sound/__init__.py +0 -0
  2797. psychopy/tests/test_sound/test_audioclip.py +331 -0
  2798. psychopy/tests/test_sound/test_hamming.py +45 -0
  2799. psychopy/tests/test_sound/test_microphone.py +217 -0
  2800. psychopy/tests/test_sound/test_sound.py +67 -0
  2801. psychopy/tests/test_sound/test_sound_pygame.py +67 -0
  2802. psychopy/tests/test_tools/test_animationtools.py +51 -0
  2803. psychopy/tests/test_tools/test_arraytools.py +130 -0
  2804. psychopy/tests/test_tools/test_attributetools.py +257 -0
  2805. psychopy/tests/test_tools/test_colorspacetools.py +149 -0
  2806. psychopy/tests/test_tools/test_environmenttools.py +52 -0
  2807. psychopy/tests/test_tools/test_fileerrortools.py +97 -0
  2808. psychopy/tests/test_tools/test_filetools.py +104 -0
  2809. psychopy/tests/test_tools/test_imagetools.py +57 -0
  2810. psychopy/tests/test_tools/test_mathtools.py +688 -0
  2811. psychopy/tests/test_tools/test_stringtools.py +143 -0
  2812. psychopy/tests/test_tools/test_versionchooser.py +178 -0
  2813. psychopy/tests/test_tools/test_viewtools.py +67 -0
  2814. psychopy/tests/test_visual/__init__.py +0 -0
  2815. psychopy/tests/test_visual/measure_parity.py +243 -0
  2816. psychopy/tests/test_visual/test_all_stimuli.py +752 -0
  2817. psychopy/tests/test_visual/test_basevisual.py +534 -0
  2818. psychopy/tests/test_visual/test_brush.py +68 -0
  2819. psychopy/tests/test_visual/test_button.py +15 -0
  2820. psychopy/tests/test_visual/test_circle.py +66 -0
  2821. psychopy/tests/test_visual/test_contains_overlaps.py +242 -0
  2822. psychopy/tests/test_visual/test_custommouse.py +47 -0
  2823. psychopy/tests/test_visual/test_dots.py +155 -0
  2824. psychopy/tests/test_visual/test_form.py +414 -0
  2825. psychopy/tests/test_visual/test_framepacking.py +41 -0
  2826. psychopy/tests/test_visual/test_gamma.py +152 -0
  2827. psychopy/tests/test_visual/test_glfw_backend.py +14 -0
  2828. psychopy/tests/test_visual/test_image.py +218 -0
  2829. psychopy/tests/test_visual/test_panorama.py +41 -0
  2830. psychopy/tests/test_visual/test_progress.py +96 -0
  2831. psychopy/tests/test_visual/test_projections.py +215 -0
  2832. psychopy/tests/test_visual/test_projections_interactive.py +163 -0
  2833. psychopy/tests/test_visual/test_ratingScale.py +299 -0
  2834. psychopy/tests/test_visual/test_roi.py +99 -0
  2835. psychopy/tests/test_visual/test_shape.py +23 -0
  2836. psychopy/tests/test_visual/test_slider.py +328 -0
  2837. psychopy/tests/test_visual/test_target.py +35 -0
  2838. psychopy/tests/test_visual/test_textbox.py +474 -0
  2839. psychopy/tests/test_visual/test_winFlipTiming.py +95 -0
  2840. psychopy/tests/test_visual/test_winScalePos.py +77 -0
  2841. psychopy/tests/test_visual/test_window.py +107 -0
  2842. psychopy/tests/utils.py +318 -0
  2843. psychopy/tools/LineBreak.txt +3597 -0
  2844. psychopy/tools/__init__.py +9 -0
  2845. psychopy/tools/animationtools.py +49 -0
  2846. psychopy/tools/apptools.py +32 -0
  2847. psychopy/tools/arraytools.py +514 -0
  2848. psychopy/tools/attributetools.py +205 -0
  2849. psychopy/tools/audiotools.py +358 -0
  2850. psychopy/tools/colorspacetools.py +715 -0
  2851. psychopy/tools/coordinatetools.py +104 -0
  2852. psychopy/tools/environmenttools.py +62 -0
  2853. psychopy/tools/fileerrortools.py +54 -0
  2854. psychopy/tools/filetools.py +406 -0
  2855. psychopy/tools/fontmanager.py +1041 -0
  2856. psychopy/tools/gltools.py +4959 -0
  2857. psychopy/tools/imagetools.py +65 -0
  2858. psychopy/tools/linebreak.py +322 -0
  2859. psychopy/tools/mathtools.py +4040 -0
  2860. psychopy/tools/monitorunittools.py +270 -0
  2861. psychopy/tools/movietools.py +1071 -0
  2862. psychopy/tools/pkgtools.py +601 -0
  2863. psychopy/tools/plottools.py +25 -0
  2864. psychopy/tools/rifttools.py +76 -0
  2865. psychopy/tools/stereotools.py +9 -0
  2866. psychopy/tools/stimulustools.py +28 -0
  2867. psychopy/tools/stringtools.py +421 -0
  2868. psychopy/tools/systemtools.py +1331 -0
  2869. psychopy/tools/typetools.py +52 -0
  2870. psychopy/tools/unittools.py +16 -0
  2871. psychopy/tools/versionchooser.py +602 -0
  2872. psychopy/tools/viewtools.py +1084 -0
  2873. psychopy/tools/wizard.py +804 -0
  2874. psychopy/visual/__init__.py +124 -0
  2875. psychopy/visual/aperture.py +330 -0
  2876. psychopy/visual/backends/__init__.py +77 -0
  2877. psychopy/visual/backends/_base.py +481 -0
  2878. psychopy/visual/backends/gamma.py +349 -0
  2879. psychopy/visual/backends/glfwbackend.py +28 -0
  2880. psychopy/visual/backends/pygamebackend.py +343 -0
  2881. psychopy/visual/backends/pygletbackend.py +920 -0
  2882. psychopy/visual/basevisual.py +1952 -0
  2883. psychopy/visual/brush.py +204 -0
  2884. psychopy/visual/bufferimage.py +231 -0
  2885. psychopy/visual/button.py +206 -0
  2886. psychopy/visual/circle.py +173 -0
  2887. psychopy/visual/custommouse.py +263 -0
  2888. psychopy/visual/dot.py +668 -0
  2889. psychopy/visual/dropdown.py +165 -0
  2890. psychopy/visual/elementarray.py +728 -0
  2891. psychopy/visual/filters.py +419 -0
  2892. psychopy/visual/form.py +1180 -0
  2893. psychopy/visual/globalVars.py +24 -0
  2894. psychopy/visual/grating.py +501 -0
  2895. psychopy/visual/helpers.py +334 -0
  2896. psychopy/visual/image.py +440 -0
  2897. psychopy/visual/line.py +238 -0
  2898. psychopy/visual/movie.py +12 -0
  2899. psychopy/visual/movie2.py +829 -0
  2900. psychopy/visual/movie3.py +599 -0
  2901. psychopy/visual/movies/__init__.py +850 -0
  2902. psychopy/visual/movies/frame.py +255 -0
  2903. psychopy/visual/movies/metadata.py +242 -0
  2904. psychopy/visual/movies/players/__init__.py +62 -0
  2905. psychopy/visual/movies/players/_base.py +364 -0
  2906. psychopy/visual/movies/players/ffpyplayer_player.py +1399 -0
  2907. psychopy/visual/nnlvs.py +827 -0
  2908. psychopy/visual/noise.py +34 -0
  2909. psychopy/visual/panorama.py +313 -0
  2910. psychopy/visual/patch.py +29 -0
  2911. psychopy/visual/pie.py +248 -0
  2912. psychopy/visual/polygon.py +229 -0
  2913. psychopy/visual/progress.py +313 -0
  2914. psychopy/visual/radial.py +33 -0
  2915. psychopy/visual/ratingscale.py +1424 -0
  2916. psychopy/visual/rect.py +204 -0
  2917. psychopy/visual/rift.py +2654 -0
  2918. psychopy/visual/roi.py +141 -0
  2919. psychopy/visual/secondorder.py +29 -0
  2920. psychopy/visual/shaders.py +453 -0
  2921. psychopy/visual/shape.py +701 -0
  2922. psychopy/visual/simpleimage.py +303 -0
  2923. psychopy/visual/slider.py +1169 -0
  2924. psychopy/visual/stim3d.py +2712 -0
  2925. psychopy/visual/target.py +278 -0
  2926. psychopy/visual/text.py +759 -0
  2927. psychopy/visual/textbox/__init__.py +1280 -0
  2928. psychopy/visual/textbox/fontmanager.py +574 -0
  2929. psychopy/visual/textbox/parsedtext.py +317 -0
  2930. psychopy/visual/textbox/textgrid.py +278 -0
  2931. psychopy/visual/textbox/textureatlas.py +248 -0
  2932. psychopy/visual/textbox2/__init__.py +4 -0
  2933. psychopy/visual/textbox2/textbox2.py +1817 -0
  2934. psychopy/visual/vlcmoviestim.py +1294 -0
  2935. psychopy/visual/window.py +3706 -0
  2936. psychopy/visual/windowframepack.py +86 -0
  2937. psychopy/visual/windowwarp.py +457 -0
  2938. psychopy/voicekey/__init__.py +684 -0
  2939. psychopy/voicekey/demo_vks.py +12 -0
  2940. psychopy/voicekey/labjack_vks.py +50 -0
  2941. psychopy/voicekey/parallel_vks.py +44 -0
  2942. psychopy/voicekey/signal.py +42 -0
  2943. psychopy/voicekey/vk_tools.py +280 -0
  2944. psychopy/web.py +286 -0
  2945. psychopy-2024.1.0.dist-info/METADATA +154 -0
  2946. psychopy-2024.1.0.dist-info/RECORD +2950 -0
  2947. psychopy-2024.1.0.dist-info/WHEEL +4 -0
  2948. psychopy-2024.1.0.dist-info/entry_points.txt +3 -0
  2949. psychopy-2024.1.0.dist-info/licenses/AUTHORS.md +138 -0
  2950. psychopy-2024.1.0.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,2712 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """Classes for 3D stimuli."""
5
+
6
+ # Part of the PsychoPy library
7
+ # Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2024 Open Science Tools Ltd.
8
+ # Distributed under the terms of the GNU General Public License (GPL).
9
+
10
+ from psychopy import logging
11
+ from psychopy.tools.attributetools import attributeSetter, setAttribute
12
+ from psychopy.visual.basevisual import WindowMixin, ColorMixin
13
+ from psychopy.visual.helpers import setColor
14
+ from psychopy.colors import Color, colorSpaces
15
+ import psychopy.tools.mathtools as mt
16
+ import psychopy.tools.gltools as gt
17
+ import psychopy.tools.arraytools as at
18
+ import psychopy.tools.viewtools as vt
19
+ import psychopy.visual.shaders as _shaders
20
+
21
+ import os
22
+ from io import StringIO
23
+ from PIL import Image
24
+
25
+ import numpy as np
26
+
27
+ import pyglet.gl as GL
28
+
29
+
30
+ class LightSource:
31
+ """Class for representing a light source in a scene. This is a
32
+ lazy-imported class, therefore import using full path
33
+ `from psychopy.visual.stim3d import LightSource` when inheriting from it.
34
+
35
+
36
+ Only point and directional lighting is supported by this object for now. The
37
+ ambient color of the light source contributes to the scene ambient color
38
+ defined by :py:attr:`~psychopy.visual.Window.ambientLight`.
39
+
40
+ Warnings
41
+ --------
42
+ This class is experimental and may result in undefined behavior.
43
+
44
+ """
45
+ def __init__(self,
46
+ win,
47
+ pos=(0., 0., 0.),
48
+ diffuseColor=(1., 1., 1.),
49
+ specularColor=(1., 1., 1.),
50
+ ambientColor=(0., 0., 0.),
51
+ colorSpace='rgb',
52
+ contrast=1.0,
53
+ lightType='point',
54
+ attenuation=(1, 0, 0)):
55
+ """
56
+ Parameters
57
+ ----------
58
+ win : `~psychopy.visual.Window`
59
+ Window associated with this light source.
60
+ pos : array_like
61
+ Position of the light source (x, y, z, w). If `w=1.0` the light will
62
+ be a point source and `x`, `y`, and `z` is the position in the
63
+ scene. If `w=0.0`, the light source will be directional and `x`,
64
+ `y`, and `z` will define the vector pointing to the direction the
65
+ light source is coming from. For instance, a vector of (0, 1, 0, 0)
66
+ will indicate that a light source is coming from above.
67
+ diffuseColor : array_like
68
+ Diffuse light color.
69
+ specularColor : array_like
70
+ Specular light color.
71
+ ambientColor : array_like
72
+ Ambient light color.
73
+ colorSpace : str or None
74
+ Colorspace for diffuse, specular, and ambient color components.
75
+ contrast : float
76
+ Contrast of the lighting color components. This acts as a 'gain'
77
+ factor which scales color values. Must be between 0.0 and 1.0.
78
+ attenuation : array_like
79
+ Values for the constant, linear, and quadratic terms of the lighting
80
+ attenuation formula. Default is (1, 0, 0) which results in no
81
+ attenuation.
82
+
83
+ """
84
+ self.win = win
85
+
86
+ self._pos = np.zeros((4,), np.float32)
87
+ self._diffuseColor = Color()
88
+ self._specularColor = Color()
89
+ self._ambientColor = Color()
90
+ self._lightType = None # set later
91
+
92
+ # internal RGB values post colorspace conversion
93
+ self._diffuseRGB = np.array((0., 0., 0., 1.), np.float32)
94
+ self._specularRGB = np.array((0., 0., 0., 1.), np.float32)
95
+ self._ambientRGB = np.array((0., 0., 0., 1.), np.float32)
96
+
97
+ self.contrast = contrast
98
+ self.colorSpace = colorSpace
99
+
100
+ # set the colors
101
+ self.diffuseColor = diffuseColor
102
+ self.specularColor = specularColor
103
+ self.ambientColor = ambientColor
104
+
105
+ self.lightType = lightType
106
+ self.pos = pos
107
+
108
+ # attenuation factors
109
+ self._kAttenuation = np.asarray(attenuation, np.float32)
110
+
111
+ # --------------------------------------------------------------------------
112
+ # Lighting
113
+ #
114
+ # Properties about the lighting position and type. This affects the shading
115
+ # of the material.
116
+ #
117
+
118
+ @property
119
+ def pos(self):
120
+ """Position of the light source in the scene in scene units."""
121
+ return self._pos[:3]
122
+
123
+ @pos.setter
124
+ def pos(self, value):
125
+ self._pos = np.zeros((4,), np.float32)
126
+ self._pos[:3] = value
127
+
128
+ if self._lightType == 'point': # if a point source then `w` == 1.0
129
+ self._pos[3] = 1.0
130
+
131
+ @property
132
+ def lightType(self):
133
+ """Type of light source, can be 'point' or 'directional'."""
134
+ return self._lightType
135
+
136
+ @lightType.setter
137
+ def lightType(self, value):
138
+ self._lightType = value
139
+
140
+ if self._lightType == 'point':
141
+ self._pos[3] = 1.0
142
+ elif self._lightType == 'directional':
143
+ self._pos[3] = 0.0
144
+ else:
145
+ raise ValueError(
146
+ "Unknown `lightType` specified, must be 'directional' or "
147
+ "'point'.")
148
+
149
+ @property
150
+ def attenuation(self):
151
+ """Values for the constant, linear, and quadratic terms of the lighting
152
+ attenuation formula.
153
+ """
154
+ return self._kAttenuation
155
+
156
+ @attenuation.setter
157
+ def attenuation(self, value):
158
+ self._kAttenuation = np.asarray(value, np.float32)
159
+
160
+ # --------------------------------------------------------------------------
161
+ # Lighting colors
162
+ #
163
+
164
+ @property
165
+ def colorSpace(self):
166
+ """The name of the color space currently being used (`str` or `None`).
167
+
168
+ For strings and hex values this is not needed. If `None` the default
169
+ `colorSpace` for the stimulus is used (defined during initialisation).
170
+
171
+ Please note that changing `colorSpace` does not change stimulus
172
+ parameters. Thus, you usually want to specify `colorSpace` before
173
+ setting the color.
174
+
175
+ """
176
+ if hasattr(self, '_colorSpace'):
177
+ return self._colorSpace
178
+ else:
179
+ return 'rgba'
180
+
181
+ @colorSpace.setter
182
+ def colorSpace(self, value):
183
+ if value in colorSpaces:
184
+ self._colorSpace = value
185
+ else:
186
+ logging.error(f"'{value}' is not a valid color space")
187
+
188
+ @property
189
+ def contrast(self):
190
+ """A value that is simply multiplied by the color (`float`).
191
+
192
+ This may be used to adjust the gain of the light source. This is applied
193
+ to all lighting color components.
194
+
195
+ Examples
196
+ --------
197
+ Basic usage::
198
+
199
+ stim.contrast = 1.0 # unchanged contrast
200
+ stim.contrast = 0.5 # decrease contrast
201
+ stim.contrast = 0.0 # uniform, no contrast
202
+ stim.contrast = -0.5 # slightly inverted
203
+ stim.contrast = -1.0 # totally inverted
204
+
205
+ Setting contrast outside range -1 to 1 is permitted, but may
206
+ produce strange results if color values exceeds the monitor limits.::
207
+
208
+ stim.contrast = 1.2 # increases contrast
209
+ stim.contrast = -1.2 # inverts with increased contrast
210
+
211
+ """
212
+ return self._diffuseColor.contrast
213
+
214
+ @contrast.setter
215
+ def contrast(self, value):
216
+ self._diffuseColor.contrast = value
217
+ self._specularColor.contrast = value
218
+ self._ambientColor.contrast = value
219
+
220
+ @property
221
+ def diffuseColor(self):
222
+ """Diffuse color for the light source (`psychopy.color.Color`,
223
+ `ArrayLike` or None).
224
+ """
225
+ return self._diffuseColor.render(self.colorSpace)
226
+
227
+ @diffuseColor.setter
228
+ def diffuseColor(self, value):
229
+ if isinstance(value, Color):
230
+ self._diffuseColor = value
231
+ else:
232
+ self._diffuseColor = Color(
233
+ value,
234
+ self.colorSpace,
235
+ contrast=self.contrast)
236
+
237
+ if not self._diffuseColor:
238
+ # If given an invalid color, set as transparent and log error
239
+ self._diffuseColor = Color()
240
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
241
+
242
+ # set the RGB values
243
+ self._diffuseRGB[:3] = self._diffuseColor.rgb1
244
+ self._diffuseRGB[3] = self._diffuseColor.opacity
245
+
246
+ def setDiffuseColor(self, color, colorSpace=None, operation='', log=None):
247
+ """Set the diffuse color for the light source. Use this function if you
248
+ wish to supress logging or apply operations on the color component.
249
+
250
+ Parameters
251
+ ----------
252
+ color : ArrayLike or `~psychopy.colors.Color`
253
+ Color to set as the diffuse component of the light source.
254
+ colorSpace : str or None
255
+ Colorspace to use. This is only used to set the color, the value of
256
+ `diffuseColor` after setting uses the color space of the object.
257
+ operation : str
258
+ Operation string.
259
+ log : bool or None
260
+ Enable logging.
261
+
262
+ """
263
+ setColor(
264
+ obj=self,
265
+ colorAttrib="diffuseColor",
266
+ color=color,
267
+ colorSpace=colorSpace or self.colorSpace,
268
+ operation=operation,
269
+ log=log)
270
+
271
+ @property
272
+ def specularColor(self):
273
+ """Specular color of the light source (`psychopy.color.Color`,
274
+ `ArrayLike` or None).
275
+ """
276
+ return self._specularColor.render(self.colorSpace)
277
+
278
+ @specularColor.setter
279
+ def specularColor(self, value):
280
+ if isinstance(value, Color):
281
+ self._specularColor = value
282
+ else:
283
+ self._specularColor = Color(
284
+ value,
285
+ self.colorSpace,
286
+ contrast=self.contrast)
287
+
288
+ if not self._specularColor:
289
+ # If given an invalid color, set as transparent and log error
290
+ self._specularColor = Color()
291
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
292
+
293
+ self._specularRGB[:3] = self._specularColor.rgb1
294
+ self._specularRGB[3] = self._specularColor.opacity
295
+
296
+ def setSpecularColor(self, color, colorSpace=None, operation='', log=None):
297
+ """Set the diffuse color for the light source. Use this function if you
298
+ wish to supress logging or apply operations on the color component.
299
+
300
+ Parameters
301
+ ----------
302
+ color : ArrayLike or `~psychopy.colors.Color`
303
+ Color to set as the specular component of the light source.
304
+ colorSpace : str or None
305
+ Colorspace to use. This is only used to set the color, the value of
306
+ `diffuseColor` after setting uses the color space of the object.
307
+ operation : str
308
+ Operation string.
309
+ log : bool or None
310
+ Enable logging.
311
+
312
+ """
313
+ setColor(
314
+ obj=self,
315
+ colorAttrib="specularColor",
316
+ color=color,
317
+ colorSpace=colorSpace or self.colorSpace,
318
+ operation=operation,
319
+ log=log)
320
+
321
+ @property
322
+ def ambientColor(self):
323
+ """Ambient color of the light source (`psychopy.color.Color`,
324
+ `ArrayLike` or None).
325
+
326
+ The ambient color component is used to simulate indirect lighting caused
327
+ by the light source. For instance, light bouncing off adjacent surfaces
328
+ or atmospheric scattering if the light source is a sun. This is
329
+ independent of the global ambient color.
330
+
331
+ """
332
+ return self._ambientColor.render(self.colorSpace)
333
+
334
+ @ambientColor.setter
335
+ def ambientColor(self, value):
336
+ if isinstance(value, Color):
337
+ self._ambientColor = value
338
+ else:
339
+ self._ambientColor = Color(
340
+ value,
341
+ self.colorSpace,
342
+ contrast=self.contrast)
343
+
344
+ if not self._ambientColor:
345
+ # If given an invalid color, set as transparent and log error
346
+ self._ambientColor = Color()
347
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
348
+
349
+ self._ambientRGB[:3] = self._ambientColor.rgb1
350
+ self._ambientRGB[3] = self._ambientColor.opacity
351
+
352
+ def setAmbientColor(self, color, colorSpace=None, operation='', log=None):
353
+ """Set the ambient color for the light source.
354
+
355
+ Use this function if you wish to supress logging or apply operations on
356
+ the color component.
357
+
358
+ Parameters
359
+ ----------
360
+ color : ArrayLike or `~psychopy.colors.Color`
361
+ Color to set as the ambient component of the light source.
362
+ colorSpace : str or None
363
+ Colorspace to use. This is only used to set the color, the value of
364
+ `ambientColor` after setting uses the color space of the object.
365
+ operation : str
366
+ Operation string.
367
+ log : bool or None
368
+ Enable logging.
369
+
370
+ """
371
+ setColor(
372
+ obj=self,
373
+ colorAttrib="ambientColor",
374
+ color=color,
375
+ colorSpace=colorSpace or self.colorSpace,
376
+ operation=operation,
377
+ log=log)
378
+
379
+ # --------------------------------------------------------------------------
380
+ # Lighting RGB colors
381
+ #
382
+ # These are the color values for the light which will be passed to the
383
+ # shader. We protect these values since we don't want the user changing the
384
+ # array type or size.
385
+ #
386
+
387
+ @property
388
+ def diffuseRGB(self):
389
+ """Diffuse RGB1 color of the material. This value is passed to OpenGL.
390
+ """
391
+ return self._diffuseRGB
392
+
393
+ @property
394
+ def specularRGB(self):
395
+ """Specular RGB1 color of the material. This value is passed to OpenGL.
396
+ """
397
+ return self._specularRGB
398
+
399
+ @property
400
+ def ambientRGB(self):
401
+ """Ambient RGB1 color of the material. This value is passed to OpenGL.
402
+ """
403
+ return self._ambientRGB
404
+
405
+
406
+ class SceneSkybox:
407
+ """Class to render scene skyboxes. This is a
408
+ lazy-imported class, therefore import using full path
409
+ `from psychopy.visual.stim3d import SceneSkybox` when inheriting from it.
410
+
411
+ A skybox provides background imagery to serve as a visual reference for the
412
+ scene. Background images are projected onto faces of a cube centered about
413
+ the viewpoint regardless of any viewpoint translations, giving the illusion
414
+ that the background is very far away. Usually, only one skybox can be
415
+ rendered per buffer each frame. Render targets must have a depth buffer
416
+ associated with them.
417
+
418
+ Background images are specified as a set of image paths passed to
419
+ `faceTextures`::
420
+
421
+ sky = SceneSkybox(
422
+ win, ('rt.jpg', 'lf.jpg', 'up.jpg', 'dn.jpg', 'bk.jpg', 'ft.jpg'))
423
+
424
+ The skybox is rendered by calling `draw()` after drawing all other 3D
425
+ stimuli.
426
+
427
+ Skyboxes are not affected by lighting, however, their colors can be
428
+ modulated by setting the window's `sceneAmbient` value. Skyboxes should be
429
+ drawn after all other 3D stimuli, but before any successive call that clears
430
+ the depth buffer (eg. `setPerspectiveView`, `resetEyeTransform`, etc.)
431
+
432
+
433
+ """
434
+ def __init__(self, win, tex=(), ori=0.0, axis=(0, 1, 0)):
435
+ """
436
+ Parameters
437
+ ----------
438
+ win : `~psychopy.visual.Window`
439
+ Window this skybox is associated with.
440
+ tex : list or tuple or TexCubeMap
441
+ List of files paths to images to use for each face. Images are
442
+ assigned to faces depending on their index within the list ([+X,
443
+ -X, +Y, -Y, +Z, -Z] or [right, left, top, bottom, back, front]). If
444
+ `None` is specified, the cube map may be specified later by setting
445
+ the `cubemap` attribute. Alternatively, you can specify a
446
+ `TexCubeMap` object to set the cube map directly.
447
+ ori : float
448
+ Rotation of the skybox about `axis` in degrees.
449
+ axis : array_like
450
+ Axis [ax, ay, az] to rotate about, default is (0, 1, 0).
451
+
452
+ """
453
+ self.win = win
454
+
455
+ self._ori = ori
456
+ self._axis = np.ascontiguousarray(axis, dtype=np.float32)
457
+
458
+ if tex:
459
+ if isinstance(tex, (list, tuple,)):
460
+ if len(tex) == 6:
461
+ imgFace = []
462
+ for img in tex:
463
+ im = Image.open(img)
464
+ im = im.convert("RGBA")
465
+ pixelData = np.array(im).ctypes
466
+ imgFace.append(pixelData)
467
+
468
+ width = imgFace[0].shape[1]
469
+ height = imgFace[0].shape[0]
470
+
471
+ self._skyCubemap = gt.createCubeMap(
472
+ width,
473
+ height,
474
+ internalFormat=GL.GL_RGBA,
475
+ pixelFormat=GL.GL_RGBA,
476
+ dataType=GL.GL_UNSIGNED_BYTE,
477
+ data=imgFace,
478
+ unpackAlignment=1,
479
+ texParams={
480
+ GL.GL_TEXTURE_MAG_FILTER: GL.GL_LINEAR,
481
+ GL.GL_TEXTURE_MIN_FILTER: GL.GL_LINEAR,
482
+ GL.GL_TEXTURE_WRAP_S: GL.GL_CLAMP_TO_EDGE,
483
+ GL.GL_TEXTURE_WRAP_T: GL.GL_CLAMP_TO_EDGE,
484
+ GL.GL_TEXTURE_WRAP_R: GL.GL_CLAMP_TO_EDGE})
485
+ else:
486
+ raise ValueError("Not enough textures specified, must be 6.")
487
+ elif isinstance(tex, gt.TexCubeMap):
488
+ self._skyCubemap = tex
489
+ else:
490
+ raise TypeError("Invalid type specified to `tex`.")
491
+ else:
492
+ self._skyCubemap = None
493
+
494
+ # create cube vertices and faces, discard texcoords and normals
495
+ vertices, _, _, faces = gt.createBox(1.0, True)
496
+
497
+ # upload to buffers
498
+ vertexVBO = gt.createVBO(vertices)
499
+
500
+ # create an index buffer with faces
501
+ indexBuffer = gt.createVBO(
502
+ faces.flatten(),
503
+ target=GL.GL_ELEMENT_ARRAY_BUFFER,
504
+ dataType=GL.GL_UNSIGNED_SHORT)
505
+
506
+ # create the VAO for drawing
507
+ self._vao = gt.createVAO(
508
+ {GL.GL_VERTEX_ARRAY: vertexVBO},
509
+ indexBuffer=indexBuffer,
510
+ legacy=True)
511
+
512
+ # shader for the skybox
513
+ self._shaderProg = _shaders.compileProgram(
514
+ _shaders.vertSkyBox, _shaders.fragSkyBox)
515
+
516
+ # store the skybox transformation matrix, this is not to be updated
517
+ # externally
518
+ self._skyboxViewMatrix = np.identity(4, dtype=np.float32)
519
+ self._prtSkyboxMatrix = at.array2pointer(self._skyboxViewMatrix)
520
+
521
+ @property
522
+ def skyCubeMap(self):
523
+ """Cubemap for the sky."""
524
+ return self._skyCubemap
525
+
526
+ @skyCubeMap.setter
527
+ def skyCubeMap(self, value):
528
+ self._skyCubemap = value
529
+
530
+ def draw(self, win=None):
531
+ """Draw the skybox.
532
+
533
+ This should be called last after drawing other 3D stimuli for
534
+ performance reasons.
535
+
536
+ Parameters
537
+ ----------
538
+ win : `~psychopy.visual.Window`, optional
539
+ Window to draw the skybox to. If `None`, the window set when
540
+ initializing this object will be used. The window must share a
541
+ context with the window which this objects was initialized with.
542
+
543
+ """
544
+ if self._skyCubemap is None: # nop if no cubemap is assigned
545
+ return
546
+
547
+ if win is None:
548
+ win = self.win
549
+ else:
550
+ win._makeCurrent()
551
+
552
+ # enable 3D drawing
553
+ win.draw3d = True
554
+
555
+ # do transformations
556
+ GL.glPushMatrix()
557
+ GL.glLoadIdentity()
558
+
559
+ # rotate the skybox if needed
560
+ if self._ori != 0.0:
561
+ GL.glRotatef(self._ori, *self._axis)
562
+
563
+ # get/set the rotation sub-matrix from the current view matrix
564
+ self._skyboxViewMatrix[:3, :3] = win.viewMatrix[:3, :3]
565
+ GL.glMultTransposeMatrixf(self._prtSkyboxMatrix)
566
+
567
+ # use the shader program
568
+ gt.useProgram(self._shaderProg)
569
+
570
+ # enable texture sampler
571
+ GL.glEnable(GL.GL_TEXTURE_2D)
572
+ GL.glActiveTexture(GL.GL_TEXTURE0)
573
+ GL.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, self._skyCubemap.name)
574
+
575
+ # draw the cube VAO
576
+ oldDepthFunc = win.depthFunc
577
+ win.depthFunc = 'lequal' # optimized for being drawn last
578
+ gt.drawVAO(self._vao, GL.GL_TRIANGLES)
579
+ win.depthFunc = oldDepthFunc
580
+ gt.useProgram(0)
581
+
582
+ # disable sampler
583
+ GL.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, 0)
584
+ GL.glDisable(GL.GL_TEXTURE_2D)
585
+
586
+ # return to previous transformation
587
+ GL.glPopMatrix()
588
+
589
+ # disable 3D drawing
590
+ win.draw3d = False
591
+
592
+
593
+ class BlinnPhongMaterial:
594
+ """Class representing a material using the Blinn-Phong lighting model.
595
+ This is a lazy-imported class, therefore import using full path
596
+ `from psychopy.visual.stim3d import BlinnPhongMaterial` when inheriting
597
+ from it.
598
+
599
+ This class stores material information to modify the appearance of drawn
600
+ primitives with respect to lighting, such as color (diffuse, specular,
601
+ ambient, and emission), shininess, and textures. Simple materials are
602
+ intended to work with features supported by the fixed-function OpenGL
603
+ pipeline. However, one may use shaders that implement the Blinn-Phong
604
+ shading model for per-pixel lighting.
605
+
606
+ If shaders are enabled, the colors of objects will appear different than
607
+ without. This is due to the lighting/material colors being computed on a
608
+ per-pixel basis, and the formulation of the lighting model. The Phong shader
609
+ determines the ambient color/intensity by adding up both the scene and light
610
+ ambient colors, then multiplies them by the diffuse color of the
611
+ material, as the ambient light's color should be a product of the surface
612
+ reflectance (albedo) and the light color (the ambient light needs to reflect
613
+ off something to be visible). Diffuse reflectance is Lambertian, where the
614
+ cosine angle between the incident light ray and surface normal determines
615
+ color. The size of specular highlights are related to the `shininess` factor
616
+ which ranges from 1.0 to 128.0. The greater this number, the tighter the
617
+ specular highlight making the surface appear smoother. If shaders are not
618
+ being used, specular highlights will be computed using the Phong lighting
619
+ model. The emission color is optional, it simply adds to the color of every
620
+ pixel much like ambient lighting does. Usually, you would not really want
621
+ this, but it can be used to add bias to the overall color of the shape.
622
+
623
+ If there are no lights in the scene, the diffuse color is simply multiplied
624
+ by the scene and material ambient color to give the final color.
625
+
626
+ Lights are attenuated (fall-off with distance) using the formula::
627
+
628
+ attenuationFactor = 1.0 / (k0 + k1 * distance + k2 * pow(distance, 2))
629
+
630
+ The coefficients for attenuation can be specified by setting `attenuation`
631
+ in the lighting object. Values `k0=1.0, k1=0.0, and k2=0.0` results in a
632
+ light that does not fall-off with distance.
633
+
634
+ Parameters
635
+ ----------
636
+ win : `~psychopy.visual.Window` or `None`
637
+ Window this material is associated with, required for shaders and some
638
+ color space conversions.
639
+ diffuseColor : array_like
640
+ Diffuse material color (r, g, b) with values between -1.0 and 1.0.
641
+ specularColor : array_like
642
+ Specular material color (r, g, b) with values between -1.0 and 1.0.
643
+ ambientColor : array_like
644
+ Ambient material color (r, g, b) with values between -1.0 and 1.0.
645
+ emissionColor : array_like
646
+ Emission material color (r, g, b) with values between -1.0 and 1.0.
647
+ shininess : float
648
+ Material shininess, usually ranges from 0.0 to 128.0.
649
+ colorSpace : str
650
+ Color space for `diffuseColor`, `specularColor`, `ambientColor`, and
651
+ `emissionColor`. This is no longer used.
652
+ opacity : float
653
+ Opacity of the material. Ranges from 0.0 to 1.0 where 1.0 is fully
654
+ opaque.
655
+ contrast : float
656
+ Contrast of the material colors.
657
+ diffuseTexture : TexImage2D
658
+ Optional 2D texture to apply to the material. Color values from the
659
+ texture are blended with the `diffuseColor` of the material. The target
660
+ primitives must have texture coordinates to specify how texels are
661
+ mapped to the surface.
662
+ face : str
663
+ Face to apply material to. Values are `front`, `back` or `both`.
664
+
665
+ Warnings
666
+ --------
667
+ This class is experimental and may result in undefined behavior.
668
+
669
+ """
670
+ def __init__(self,
671
+ win=None,
672
+ diffuseColor=(-1., -1., -1.),
673
+ specularColor=(-1., -1., -1.),
674
+ ambientColor=(-1., -1., -1.),
675
+ emissionColor=(-1., -1., -1.),
676
+ shininess=10.0,
677
+ colorSpace='rgb',
678
+ diffuseTexture=None,
679
+ opacity=1.0,
680
+ contrast=1.0,
681
+ face='front'):
682
+
683
+ self.win = win
684
+
685
+ self._diffuseColor = Color()
686
+ self._specularColor = Color()
687
+ self._ambientColor = Color()
688
+ self._emissionColor = Color()
689
+ self._shininess = float(shininess)
690
+ self._face = None # set later
691
+
692
+ # internal RGB values post colorspace conversion
693
+ self._diffuseRGB = np.array((0., 0., 0., 1.), np.float32)
694
+ self._specularRGB = np.array((0., 0., 0., 1.), np.float32)
695
+ self._ambientRGB = np.array((0., 0., 0., 1.), np.float32)
696
+ self._emissionRGB = np.array((0., 0., 0., 1.), np.float32)
697
+
698
+ # internal pointers to arrays, initialized below
699
+ self._ptrDiffuse = None
700
+ self._ptrSpecular = None
701
+ self._ptrAmbient = None
702
+ self._ptrEmission = None
703
+
704
+ self.diffuseColor = diffuseColor
705
+ self.specularColor = specularColor
706
+ self.ambientColor = ambientColor
707
+ self.emissionColor = emissionColor
708
+
709
+ self.colorSpace = colorSpace
710
+ self.opacity = opacity
711
+ self.contrast = contrast
712
+ self.face = face
713
+
714
+ self._diffuseTexture = diffuseTexture
715
+ self._normalTexture = None
716
+
717
+ self._useTextures = False # keeps track if textures are being used
718
+
719
+ # --------------------------------------------------------------------------
720
+ # Material colors and other properties
721
+ #
722
+ # These properties are used to set the color components of various material
723
+ # properties.
724
+ #
725
+
726
+ @property
727
+ def colorSpace(self):
728
+ """The name of the color space currently being used (`str` or `None`).
729
+
730
+ For strings and hex values this is not needed. If `None` the default
731
+ `colorSpace` for the stimulus is used (defined during initialisation).
732
+
733
+ Please note that changing `colorSpace` does not change stimulus
734
+ parameters. Thus, you usually want to specify `colorSpace` before
735
+ setting the color.
736
+
737
+ """
738
+ if hasattr(self, '_colorSpace'):
739
+ return self._colorSpace
740
+ else:
741
+ return 'rgba'
742
+
743
+ @colorSpace.setter
744
+ def colorSpace(self, value):
745
+ if value in colorSpaces:
746
+ self._colorSpace = value
747
+ else:
748
+ logging.error(f"'{value}' is not a valid color space")
749
+
750
+ @property
751
+ def contrast(self):
752
+ """A value that is simply multiplied by the color (`float`).
753
+
754
+ This may be used to adjust the lightness of the material. This is
755
+ applied to all material color components.
756
+
757
+ Examples
758
+ --------
759
+ Basic usage::
760
+
761
+ stim.contrast = 1.0 # unchanged contrast
762
+ stim.contrast = 0.5 # decrease contrast
763
+ stim.contrast = 0.0 # uniform, no contrast
764
+ stim.contrast = -0.5 # slightly inverted
765
+ stim.contrast = -1.0 # totally inverted
766
+
767
+ Setting contrast outside range -1 to 1 is permitted, but may
768
+ produce strange results if color values exceeds the monitor limits.::
769
+
770
+ stim.contrast = 1.2 # increases contrast
771
+ stim.contrast = -1.2 # inverts with increased contrast
772
+
773
+ """
774
+ return self._diffuseColor.contrast
775
+
776
+ @contrast.setter
777
+ def contrast(self, value):
778
+ self._diffuseColor.contrast = value
779
+ self._specularColor.contrast = value
780
+ self._ambientColor.contrast = value
781
+ self._emissionColor.contrast = value
782
+
783
+ @property
784
+ def shininess(self):
785
+ """Material shininess coefficient (`float`).
786
+
787
+ This is used to specify the 'tightness' of the specular highlights.
788
+ Values usually range between 0 and 128, but the range depends on the
789
+ specular highlight formula used by the shader.
790
+
791
+ """
792
+ return self._shininess
793
+
794
+ @shininess.setter
795
+ def shininess(self, value):
796
+ self._shininess = float(value)
797
+
798
+ @property
799
+ def face(self):
800
+ """Face to apply the material to (`str`). Possible values are one of
801
+ `'front'`, `'back'` or `'both'`.
802
+ """
803
+ return self._face
804
+
805
+ @face.setter
806
+ def face(self, value):
807
+ # which faces to apply the material
808
+ if value == 'front':
809
+ self._face = GL.GL_FRONT
810
+ elif value == 'back':
811
+ self._face = GL.GL_BACK
812
+ elif value == 'both':
813
+ self._face = GL.GL_FRONT_AND_BACK
814
+ else:
815
+ raise ValueError(
816
+ "Invalid value for `face` specified, must be 'front', 'back' "
817
+ "or 'both'.")
818
+
819
+ @property
820
+ def diffuseColor(self):
821
+ """Diffuse color `(r, g, b)` for the material (`psychopy.color.Color`,
822
+ `ArrayLike` or `None`).
823
+ """
824
+ return self._diffuseColor.render(self.colorSpace)
825
+
826
+ @diffuseColor.setter
827
+ def diffuseColor(self, value):
828
+ if isinstance(value, Color):
829
+ self._diffuseColor = value
830
+ else:
831
+ self._diffuseColor = Color(
832
+ value,
833
+ self.colorSpace,
834
+ contrast=self.contrast)
835
+
836
+ if not self._diffuseColor:
837
+ # If given an invalid color, set as transparent and log error
838
+ self._diffuseColor = Color()
839
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
840
+
841
+ # compute RGB values for the shader
842
+ self._diffuseRGB[:3] = self._diffuseColor.rgb1
843
+ self._diffuseRGB[3] = self._diffuseColor.opacity
844
+
845
+ # need to create a pointer for the shader
846
+ self._ptrDiffuse = np.ctypeslib.as_ctypes(self._diffuseRGB)
847
+
848
+ def setDiffuseColor(self, color, colorSpace=None, operation='', log=None):
849
+ """Set the diffuse color for the material.
850
+
851
+ Use this method if you wish to supress logging or apply operations on
852
+ the color component.
853
+
854
+ Parameters
855
+ ----------
856
+ color : ArrayLike or `~psychopy.colors.Color`
857
+ Color to set as the diffuse component of the material.
858
+ colorSpace : str or None
859
+ Colorspace to use. This is only used to set the color, the value of
860
+ `diffuseColor` after setting uses the color space of the object.
861
+ operation : str
862
+ Operation string.
863
+ log : bool or None
864
+ Enable logging.
865
+
866
+ """
867
+ setColor(
868
+ obj=self,
869
+ colorAttrib="diffuseColor",
870
+ color=color,
871
+ colorSpace=colorSpace or self.colorSpace,
872
+ operation=operation,
873
+ log=log)
874
+
875
+ @property
876
+ def specularColor(self):
877
+ """Specular color `(r, g, b)` of the material (`psychopy.color.Color`,
878
+ `ArrayLike` or `None`).
879
+ """
880
+ return self._specularColor.render(self.colorSpace)
881
+
882
+ @specularColor.setter
883
+ def specularColor(self, value):
884
+ if isinstance(value, Color):
885
+ self._specularColor = value
886
+ else:
887
+ self._specularColor = Color(
888
+ value,
889
+ self.colorSpace,
890
+ contrast=self.contrast)
891
+
892
+ if not self._specularColor:
893
+ # If given an invalid color, set as transparent and log error
894
+ self._specularColor = Color()
895
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
896
+
897
+ self._specularRGB[:3] = self._specularColor.rgb1
898
+ self._specularRGB[3] = self._specularColor.opacity
899
+
900
+ self._ptrSpecular = np.ctypeslib.as_ctypes(self._specularRGB)
901
+
902
+ def setSpecularColor(self, color, colorSpace=None, operation='', log=None):
903
+ """Set the diffuse color for the material. Use this function if you
904
+ wish to supress logging or apply operations on the color component.
905
+
906
+ Parameters
907
+ ----------
908
+ color : ArrayLike or `~psychopy.colors.Color`
909
+ Color to set as the specular component of the light source.
910
+ colorSpace : str or None
911
+ Colorspace to use. This is only used to set the color, the value of
912
+ `diffuseColor` after setting uses the color space of the object.
913
+ operation : str
914
+ Operation string.
915
+ log : bool or None
916
+ Enable logging.
917
+
918
+ """
919
+ setColor(
920
+ obj=self,
921
+ colorAttrib="specularColor",
922
+ color=color,
923
+ colorSpace=colorSpace or self.colorSpace,
924
+ operation=operation,
925
+ log=log)
926
+
927
+ @property
928
+ def ambientColor(self):
929
+ """Ambient color `(r, g, b)` of the material (`psychopy.color.Color`,
930
+ `ArrayLike` or `None`).
931
+ """
932
+ return self._ambientColor.render(self.colorSpace)
933
+
934
+ @ambientColor.setter
935
+ def ambientColor(self, value):
936
+ if isinstance(value, Color):
937
+ self._ambientColor = value
938
+ else:
939
+ self._ambientColor = Color(
940
+ value,
941
+ self.colorSpace,
942
+ contrast=self.contrast)
943
+
944
+ if not self._ambientColor:
945
+ # If given an invalid color, set as transparent and log error
946
+ self._ambientColor = Color()
947
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
948
+
949
+ self._ambientRGB[:3] = self._ambientColor.rgb1
950
+ self._ambientRGB[3] = self._ambientColor.opacity
951
+
952
+ self._ptrAmbient = np.ctypeslib.as_ctypes(self._ambientRGB)
953
+
954
+ def setAmbientColor(self, color, colorSpace=None, operation='', log=None):
955
+ """Set the ambient color for the material.
956
+
957
+ Use this function if you wish to supress logging or apply operations on
958
+ the color component.
959
+
960
+ Parameters
961
+ ----------
962
+ color : ArrayLike or `~psychopy.colors.Color`
963
+ Color to set as the ambient component of the light source.
964
+ colorSpace : str or None
965
+ Colorspace to use. This is only used to set the color, the value of
966
+ `ambientColor` after setting uses the color space of the object.
967
+ operation : str
968
+ Operation string.
969
+ log : bool or None
970
+ Enable logging.
971
+
972
+ """
973
+ setColor(
974
+ obj=self,
975
+ colorAttrib="ambientColor",
976
+ color=color,
977
+ colorSpace=colorSpace or self.colorSpace,
978
+ operation=operation,
979
+ log=log)
980
+
981
+ @property
982
+ def emissionColor(self):
983
+ """Emission color `(r, g, b)` of the material (`psychopy.color.Color`,
984
+ `ArrayLike` or `None`).
985
+ """
986
+ return self._emissionColor.render(self.colorSpace)
987
+
988
+ @emissionColor.setter
989
+ def emissionColor(self, value):
990
+ if isinstance(value, Color):
991
+ self._emissionColor = value
992
+ else:
993
+ self._emissionColor = Color(
994
+ value,
995
+ self.colorSpace,
996
+ contrast=self.contrast)
997
+
998
+ if not self._emissionColor:
999
+ # If given an invalid color, set as transparent and log error
1000
+ self._emissionColor = Color()
1001
+ logging.error(f"'{value}' is not a valid {self.colorSpace} color")
1002
+
1003
+ self._emissionRGB[:3] = self._emissionColor.rgb1
1004
+ self._emissionRGB[3] = self._emissionColor.opacity
1005
+
1006
+ self._ptrEmission = np.ctypeslib.as_ctypes(self._emissionRGB)
1007
+
1008
+ def setEmissionColor(self, color, colorSpace=None, operation='', log=None):
1009
+ """Set the emission color for the material.
1010
+
1011
+ Use this function if you wish to supress logging or apply operations on
1012
+ the color component.
1013
+
1014
+ Parameters
1015
+ ----------
1016
+ color : ArrayLike or `~psychopy.colors.Color`
1017
+ Color to set as the ambient component of the light source.
1018
+ colorSpace : str or None
1019
+ Colorspace to use. This is only used to set the color, the value of
1020
+ `ambientColor` after setting uses the color space of the object.
1021
+ operation : str
1022
+ Operation string.
1023
+ log : bool or None
1024
+ Enable logging.
1025
+
1026
+ """
1027
+ setColor(
1028
+ obj=self,
1029
+ colorAttrib="emissionColor",
1030
+ color=color,
1031
+ colorSpace=colorSpace or self.colorSpace,
1032
+ operation=operation,
1033
+ log=log)
1034
+
1035
+ # --------------------------------------------------------------------------
1036
+ # Material RGB colors
1037
+ #
1038
+ # These are the color values formatted for use in OpenGL.
1039
+ #
1040
+
1041
+ @property
1042
+ def diffuseRGB(self):
1043
+ """RGB values of the diffuse color of the material (`numpy.ndarray`).
1044
+ """
1045
+ return self._diffuseRGB[:3]
1046
+
1047
+ @property
1048
+ def specularRGB(self):
1049
+ """RGB values of the specular color of the material (`numpy.ndarray`).
1050
+ """
1051
+ return self._specularRGB[:3]
1052
+
1053
+ @property
1054
+ def ambientRGB(self):
1055
+ """RGB values of the ambient color of the material (`numpy.ndarray`).
1056
+ """
1057
+ return self._ambientRGB[:3]
1058
+
1059
+ @property
1060
+ def emissionRGB(self):
1061
+ """RGB values of the emission color of the material (`numpy.ndarray`).
1062
+ """
1063
+ return self._emissionRGB[:3]
1064
+
1065
+ # Texture setter -----------------------------------------------------------
1066
+
1067
+ @property
1068
+ def diffuseTexture(self):
1069
+ """Diffuse texture of the material (`psychopy.tools.gltools.TexImage2D`
1070
+ or `None`).
1071
+ """
1072
+ return self._diffuseTexture
1073
+
1074
+ @diffuseTexture.setter
1075
+ def diffuseTexture(self, value):
1076
+ self._diffuseTexture = value
1077
+
1078
+ # --------------------------------------------------------------------------
1079
+
1080
+ def begin(self, useTextures=True):
1081
+ """Use this material for successive rendering calls.
1082
+
1083
+ Parameters
1084
+ ----------
1085
+ useTextures : bool
1086
+ Enable textures.
1087
+
1088
+ """
1089
+ GL.glDisable(GL.GL_COLOR_MATERIAL) # disable color tracking
1090
+ face = self._face
1091
+
1092
+ # check if lighting is enabled, otherwise don't render lights
1093
+ nLights = len(self.win.lights) if self.win.useLights else 0
1094
+
1095
+ useTextures = useTextures and self.diffuseTexture is not None
1096
+ shaderKey = (nLights, useTextures)
1097
+ gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
1098
+
1099
+ # pass values to OpenGL
1100
+ GL.glMaterialfv(face, GL.GL_DIFFUSE, self._ptrDiffuse)
1101
+ GL.glMaterialfv(face, GL.GL_SPECULAR, self._ptrSpecular)
1102
+ GL.glMaterialfv(face, GL.GL_AMBIENT, self._ptrAmbient)
1103
+ GL.glMaterialfv(face, GL.GL_EMISSION, self._ptrEmission)
1104
+ GL.glMaterialf(face, GL.GL_SHININESS, self.shininess)
1105
+
1106
+ # setup textures
1107
+ if useTextures and self.diffuseTexture is not None:
1108
+ self._useTextures = True
1109
+ GL.glEnable(GL.GL_TEXTURE_2D)
1110
+ gt.bindTexture(self.diffuseTexture, 0)
1111
+
1112
+ def end(self, clear=True):
1113
+ """Stop using this material.
1114
+
1115
+ Must be called after `begin` before using another material or else later
1116
+ drawing operations may have undefined behavior.
1117
+
1118
+ Upon returning, `GL_COLOR_MATERIAL` is enabled so material colors will
1119
+ track the current `glColor`.
1120
+
1121
+ Parameters
1122
+ ----------
1123
+ clear : bool
1124
+ Overwrite material state settings with default values. This
1125
+ ensures material colors are set to OpenGL defaults. You can forgo
1126
+ clearing if successive materials are used which overwrite
1127
+ `glMaterialfv` values for `GL_DIFFUSE`, `GL_SPECULAR`, `GL_AMBIENT`,
1128
+ `GL_EMISSION`, and `GL_SHININESS`. This reduces a bit of overhead
1129
+ if there is no need to return to default values intermittently
1130
+ between successive material `begin` and `end` calls. Textures and
1131
+ shaders previously enabled will still be disabled.
1132
+
1133
+ """
1134
+ if clear:
1135
+ GL.glMaterialfv(
1136
+ self._face,
1137
+ GL.GL_DIFFUSE,
1138
+ (GL.GLfloat * 4)(0.8, 0.8, 0.8, 1.0))
1139
+ GL.glMaterialfv(
1140
+ self._face,
1141
+ GL.GL_SPECULAR,
1142
+ (GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0))
1143
+ GL.glMaterialfv(
1144
+ self._face,
1145
+ GL.GL_AMBIENT,
1146
+ (GL.GLfloat * 4)(0.2, 0.2, 0.2, 1.0))
1147
+ GL.glMaterialfv(
1148
+ self._face,
1149
+ GL.GL_EMISSION,
1150
+ (GL.GLfloat * 4)(0.0, 0.0, 0.0, 1.0))
1151
+ GL.glMaterialf(self._face, GL.GL_SHININESS, 0.0)
1152
+
1153
+ if self._useTextures:
1154
+ self._useTextures = False
1155
+ gt.unbindTexture(self.diffuseTexture)
1156
+ GL.glDisable(GL.GL_TEXTURE_2D)
1157
+
1158
+ gt.useProgram(0)
1159
+
1160
+ GL.glEnable(GL.GL_COLOR_MATERIAL)
1161
+
1162
+
1163
+ class RigidBodyPose:
1164
+ """Class for representing rigid body poses. This is a lazy-imported
1165
+ class, therefore import using full path
1166
+ `from psychopy.visual.stim3d import RigidBodyPose` when inheriting
1167
+ from it.
1168
+
1169
+ This class is an abstract representation of a rigid body pose, where the
1170
+ position of the body in a scene is represented by a vector/coordinate and
1171
+ the orientation with a quaternion. Pose can be manipulated and interacted
1172
+ with using class methods and attributes. Rigid body poses assume a
1173
+ right-handed coordinate system (-Z is forward and +Y is up).
1174
+
1175
+ Poses can be converted to 4x4 transformation matrices with `getModelMatrix`.
1176
+ One can use these matrices when rendering to transform the vertices of a
1177
+ model associated with the pose by passing them to OpenGL. Matrices are
1178
+ cached internally to avoid recomputing them if `pos` and `ori` attributes
1179
+ have not been updated.
1180
+
1181
+ Operators `*` and `~` can be used on `RigidBodyPose` objects to combine and
1182
+ invert poses. For instance, you can multiply (`*`) poses to get a new pose
1183
+ which is the combination of both orientations and translations by::
1184
+
1185
+ newPose = rb1 * rb2
1186
+
1187
+ Likewise, a pose can be inverted by using the `~` operator::
1188
+
1189
+ invPose = ~rb
1190
+
1191
+ Multiplying a pose by its inverse will result in an identity pose with no
1192
+ translation and default orientation where `pos=[0, 0, 0]` and
1193
+ `ori=[0, 0, 0, 1]`::
1194
+
1195
+ identityPose = ~rb * rb
1196
+
1197
+ Warnings
1198
+ --------
1199
+ This class is experimental and may result in undefined behavior.
1200
+
1201
+ """
1202
+ def __init__(self, pos=(0., 0., 0.), ori=(0., 0., 0., 1.)):
1203
+ """
1204
+ Parameters
1205
+ ----------
1206
+ pos : array_like
1207
+ Position vector `[x, y, z]` for the origin of the rigid body.
1208
+ ori : array_like
1209
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
1210
+ imaginary and `w` is real.
1211
+
1212
+ """
1213
+ self._pos = np.ascontiguousarray(pos, dtype=np.float32)
1214
+ self._ori = np.ascontiguousarray(ori, dtype=np.float32)
1215
+
1216
+ self._modelMatrix = mt.posOriToMatrix(
1217
+ self._pos, self._ori, dtype=np.float32)
1218
+
1219
+ # computed only if needed
1220
+ self._normalMatrix = np.zeros((4, 4), dtype=np.float32, order='C')
1221
+ self._invModelMatrix = np.zeros((4, 4), dtype=np.float32, order='C')
1222
+
1223
+ # additional useful vectors
1224
+ self._at = np.zeros((3,), dtype=np.float32, order='C')
1225
+ self._up = np.zeros((3,), dtype=np.float32, order='C')
1226
+
1227
+ # compute matrices only if `pos` and `ori` attributes have been updated
1228
+ self._matrixNeedsUpdate = False
1229
+ self._invMatrixNeedsUpdate = True
1230
+ self._normalMatrixNeedsUpdate = True
1231
+
1232
+ self.pos = pos
1233
+ self.ori = ori
1234
+
1235
+ self._bounds = None
1236
+
1237
+ def __repr__(self):
1238
+ return 'RigidBodyPose({}, {}), %s)'.format(self.pos, self.ori)
1239
+
1240
+ @property
1241
+ def bounds(self):
1242
+ """Bounding box associated with this pose."""
1243
+ return self._bounds
1244
+
1245
+ @bounds.setter
1246
+ def bounds(self, value):
1247
+ self._bounds = value
1248
+
1249
+ @property
1250
+ def pos(self):
1251
+ """Position vector (X, Y, Z)."""
1252
+ return self._pos
1253
+
1254
+ @pos.setter
1255
+ def pos(self, value):
1256
+ self._pos = np.ascontiguousarray(value, dtype=np.float32)
1257
+ self._normalMatrixNeedsUpdate = self._matrixNeedsUpdate = \
1258
+ self._invMatrixNeedsUpdate = True
1259
+
1260
+ @property
1261
+ def ori(self):
1262
+ """Orientation quaternion (X, Y, Z, W)."""
1263
+ return self._ori
1264
+
1265
+ @ori.setter
1266
+ def ori(self, value):
1267
+ self._ori = np.ascontiguousarray(value, dtype=np.float32)
1268
+ self._normalMatrixNeedsUpdate = self._matrixNeedsUpdate = \
1269
+ self._invMatrixNeedsUpdate = True
1270
+
1271
+ @property
1272
+ def posOri(self):
1273
+ """The position (x, y, z) and orientation (x, y, z, w)."""
1274
+ return self._pos, self._ori
1275
+
1276
+ @posOri.setter
1277
+ def posOri(self, value):
1278
+ self._pos = np.ascontiguousarray(value[0], dtype=np.float32)
1279
+ self._ori = np.ascontiguousarray(value[1], dtype=np.float32)
1280
+ self._matrixNeedsUpdate = self._invMatrixNeedsUpdate = \
1281
+ self._normalMatrixNeedsUpdate = True
1282
+
1283
+ @property
1284
+ def at(self):
1285
+ """Vector defining the forward direction (-Z) of this pose."""
1286
+ if self._matrixNeedsUpdate: # matrix needs update, this need to be too
1287
+ atDir = [0., 0., -1.]
1288
+ self._at = mt.applyQuat(self.ori, atDir, out=self._at)
1289
+
1290
+ return self._at
1291
+
1292
+ @property
1293
+ def up(self):
1294
+ """Vector defining the up direction (+Y) of this pose."""
1295
+ if self._matrixNeedsUpdate: # matrix needs update, this need to be too
1296
+ upDir = [0., 1., 0.]
1297
+ self._up = mt.applyQuat(self.ori, upDir, out=self._up)
1298
+
1299
+ return self._up
1300
+
1301
+ def __mul__(self, other):
1302
+ """Multiply two poses, combining them to get a new pose."""
1303
+ newOri = mt.multQuat(self._ori, other.ori)
1304
+ return RigidBodyPose(mt.transform(other.pos, newOri, self._pos), newOri)
1305
+
1306
+ def __imul__(self, other):
1307
+ """Inplace multiplication. Transforms this pose by another."""
1308
+ self._ori = mt.multQuat(self._ori, other.ori)
1309
+ self._pos = mt.transform(other.pos, self._ori, self._pos)
1310
+
1311
+ def copy(self):
1312
+ """Get a new `RigidBodyPose` object which copies the position and
1313
+ orientation of this one. Copies are independent and do not reference
1314
+ each others data.
1315
+
1316
+ Returns
1317
+ -------
1318
+ RigidBodyPose
1319
+ Copy of this pose.
1320
+
1321
+ """
1322
+ return RigidBodyPose(self._pos, self._ori)
1323
+
1324
+ def isEqual(self, other):
1325
+ """Check if poses have similar orientation and position.
1326
+
1327
+ Parameters
1328
+ ----------
1329
+ other : `RigidBodyPose`
1330
+ Other pose to compare.
1331
+
1332
+ Returns
1333
+ -------
1334
+ bool
1335
+ Returns `True` is poses are effectively equal.
1336
+
1337
+ """
1338
+ return np.isclose(self._pos, other.pos) and \
1339
+ np.isclose(self._ori, other.ori)
1340
+
1341
+ def setIdentity(self):
1342
+ """Clear rigid body transformations.
1343
+ """
1344
+ self._pos.fill(0.0)
1345
+ self._ori[:3] = 0.0
1346
+ self._ori[3] = 1.0
1347
+ self._matrixNeedsUpdate = self._normalMatrixNeedsUpdate = \
1348
+ self._invMatrixNeedsUpdate = True
1349
+
1350
+ def getOriAxisAngle(self, degrees=True):
1351
+ """Get the axis and angle of rotation for the rigid body. Converts the
1352
+ orientation defined by the `ori` quaternion to and axis-angle
1353
+ representation.
1354
+
1355
+ Parameters
1356
+ ----------
1357
+ degrees : bool, optional
1358
+ Specify ``True`` if `angle` is in degrees, or else it will be
1359
+ treated as radians. Default is ``True``.
1360
+
1361
+ Returns
1362
+ -------
1363
+ tuple
1364
+ Axis [rx, ry, rz] and angle.
1365
+
1366
+ """
1367
+ return mt.quatToAxisAngle(self._ori, degrees)
1368
+
1369
+ def setOriAxisAngle(self, axis, angle, degrees=True):
1370
+ """Set the orientation of the rigid body using an `axis` and
1371
+ `angle`. This sets the quaternion at `ori`.
1372
+
1373
+ Parameters
1374
+ ----------
1375
+ axis : array_like
1376
+ Axis of rotation [rx, ry, rz].
1377
+ angle : float
1378
+ Angle of rotation.
1379
+ degrees : bool, optional
1380
+ Specify ``True`` if `angle` is in degrees, or else it will be
1381
+ treated as radians. Default is ``True``.
1382
+
1383
+ """
1384
+ self.ori = mt.quatFromAxisAngle(axis, angle, degrees)
1385
+
1386
+ def getYawPitchRoll(self, degrees=True):
1387
+ """Get the yaw, pitch and roll angles for this pose relative to the -Z
1388
+ world axis.
1389
+
1390
+ Parameters
1391
+ ----------
1392
+ degrees : bool, optional
1393
+ Specify ``True`` if `angle` is in degrees, or else it will be
1394
+ treated as radians. Default is ``True``.
1395
+
1396
+ """
1397
+ return mt.quatYawPitchRoll(self._ori, degrees)
1398
+
1399
+ @property
1400
+ def modelMatrix(self):
1401
+ """Pose as a 4x4 model matrix (read-only)."""
1402
+ if not self._matrixNeedsUpdate:
1403
+ return self._modelMatrix
1404
+ else:
1405
+ return self.getModelMatrix()
1406
+
1407
+ @property
1408
+ def inverseModelMatrix(self):
1409
+ """Inverse of the pose as a 4x4 model matrix (read-only)."""
1410
+ if not self._invMatrixNeedsUpdate:
1411
+ return self._invModelMatrix
1412
+ else:
1413
+ return self.getModelMatrix(inverse=True)
1414
+
1415
+ @property
1416
+ def normalMatrix(self):
1417
+ """The normal transformation matrix."""
1418
+ if not self._normalMatrixNeedsUpdate:
1419
+ return self._normalMatrix
1420
+ else:
1421
+ return self.getNormalMatrix()
1422
+
1423
+ def getNormalMatrix(self, out=None):
1424
+ """Get the present normal matrix.
1425
+
1426
+ Parameters
1427
+ ----------
1428
+ out : ndarray or None
1429
+ Optional 4x4 array to write values to. Values written are computed
1430
+ using 32-bit float precision regardless of the data type of `out`.
1431
+
1432
+ Returns
1433
+ -------
1434
+ ndarray
1435
+ 4x4 normal transformation matrix.
1436
+
1437
+ """
1438
+ if not self._normalMatrixNeedsUpdate:
1439
+ return self._normalMatrix
1440
+
1441
+ self._normalMatrix[:, :] = np.linalg.inv(self.modelMatrix).T
1442
+
1443
+ if out is not None:
1444
+ out[:, :] = self._normalMatrix[:, :]
1445
+
1446
+ self._normalMatrixNeedsUpdate = False
1447
+
1448
+ return self._normalMatrix
1449
+
1450
+ def getModelMatrix(self, inverse=False, out=None):
1451
+ """Get the present rigid body transformation as a 4x4 matrix.
1452
+
1453
+ Matrices are computed only if the `pos` and `ori` attributes have been
1454
+ updated since the last call to `getModelMatrix`. The returned matrix is
1455
+ an `ndarray` and row-major.
1456
+
1457
+ Parameters
1458
+ ----------
1459
+ inverse : bool, optional
1460
+ Return the inverse of the model matrix.
1461
+ out : ndarray or None
1462
+ Optional 4x4 array to write values to. Values written are computed
1463
+ using 32-bit float precision regardless of the data type of `out`.
1464
+
1465
+ Returns
1466
+ -------
1467
+ ndarray
1468
+ 4x4 transformation matrix.
1469
+
1470
+ Examples
1471
+ --------
1472
+ Using a rigid body pose to transform something in OpenGL::
1473
+
1474
+ rb = RigidBodyPose((0, 0, -2)) # 2 meters away from origin
1475
+
1476
+ # Use `array2pointer` from `psychopy.tools.arraytools` to convert
1477
+ # array to something OpenGL accepts.
1478
+ mv = array2pointer(rb.modelMatrix)
1479
+
1480
+ # use the matrix to transform the scene
1481
+ glMatrixMode(GL_MODELVIEW)
1482
+ glPushMatrix()
1483
+ glLoadIdentity()
1484
+ glMultTransposeMatrixf(mv)
1485
+
1486
+ # draw the thing here ...
1487
+
1488
+ glPopMatrix()
1489
+
1490
+ """
1491
+ if self._matrixNeedsUpdate:
1492
+ self._modelMatrix = mt.posOriToMatrix(
1493
+ self._pos, self._ori, out=self._modelMatrix)
1494
+
1495
+ self._matrixNeedsUpdate = False
1496
+ self._normalMatrixNeedsUpdate = self._invMatrixNeedsUpdate = True
1497
+
1498
+ # only update and return the inverse matrix if requested
1499
+ if inverse:
1500
+ if self._invMatrixNeedsUpdate:
1501
+ self._invModelMatrix = mt.invertMatrix(
1502
+ self._modelMatrix, out=self._invModelMatrix)
1503
+ self._invMatrixNeedsUpdate = False
1504
+
1505
+ if out is not None:
1506
+ out[:, :] = self._invModelMatrix[:, :]
1507
+
1508
+ return self._invModelMatrix # return the inverse
1509
+
1510
+ if out is not None:
1511
+ out[:, :] = self._modelMatrix[:, :]
1512
+
1513
+ return self._modelMatrix
1514
+
1515
+ def getViewMatrix(self, inverse=False):
1516
+ """Convert this pose into a view matrix.
1517
+
1518
+ Creates a view matrix which transforms points into eye space using the
1519
+ current pose as the eye position in the scene. Furthermore, you can use
1520
+ view matrices for rendering shadows if light positions are defined
1521
+ as `RigidBodyPose` objects.
1522
+
1523
+ Parameters
1524
+ ----------
1525
+ inverse : bool
1526
+ Return the inverse of the view matrix. Default is `False`.
1527
+
1528
+ Returns
1529
+ -------
1530
+ ndarray
1531
+ 4x4 transformation matrix.
1532
+
1533
+ """
1534
+ axes = np.asarray([[0, 0, -1], [0, 1, 0]], dtype=np.float32)
1535
+
1536
+ rotMatrix = mt.quatToMatrix(self._ori, dtype=np.float32)
1537
+ transformedAxes = mt.applyMatrix(rotMatrix, axes, dtype=np.float32)
1538
+
1539
+ fwdVec = transformedAxes[0, :] + self._pos
1540
+ upVec = transformedAxes[1, :]
1541
+
1542
+ viewMatrix = vt.lookAt(self._pos, fwdVec, upVec, dtype=np.float32)
1543
+
1544
+ if inverse:
1545
+ viewMatrix = mt.invertMatrix(viewMatrix)
1546
+
1547
+ return viewMatrix
1548
+
1549
+ def transform(self, v, out=None):
1550
+ """Transform a vector using this pose.
1551
+
1552
+ Parameters
1553
+ ----------
1554
+ v : array_like
1555
+ Vector to transform [x, y, z].
1556
+ out : ndarray or None, optional
1557
+ Optional array to write values to. Must have the same shape as
1558
+ `v`.
1559
+
1560
+ Returns
1561
+ -------
1562
+ ndarray
1563
+ Transformed points.
1564
+
1565
+ """
1566
+ return mt.transform(self._pos, self._ori, points=v, out=out)
1567
+
1568
+ def transformNormal(self, n):
1569
+ """Rotate a normal vector with respect to this pose.
1570
+
1571
+ Rotates a normal vector `n` using the orientation quaternion at `ori`.
1572
+
1573
+ Parameters
1574
+ ----------
1575
+ n : array_like
1576
+ Normal to rotate (1-D with length 3).
1577
+
1578
+ Returns
1579
+ -------
1580
+ ndarray
1581
+ Rotated normal `n`.
1582
+
1583
+ """
1584
+ pout = np.zeros((3,), dtype=np.float32)
1585
+ pout[:] = n
1586
+ t = np.cross(self._ori[:3], n[:3]) * 2.0
1587
+ u = np.cross(self._ori[:3], t)
1588
+ t *= self._ori[3]
1589
+ pout[:3] += t
1590
+ pout[:3] += u
1591
+
1592
+ return pout
1593
+
1594
+ def __invert__(self):
1595
+ """Operator `~` to invert the pose. Returns a `RigidBodyPose` object."""
1596
+ return RigidBodyPose(
1597
+ -self._pos, mt.invertQuat(self._ori, dtype=np.float32))
1598
+
1599
+ def invert(self):
1600
+ """Invert this pose.
1601
+ """
1602
+ self._ori = mt.invertQuat(self._ori, dtype=np.float32)
1603
+ self._pos *= -1.0
1604
+
1605
+ def inverted(self):
1606
+ """Get a pose which is the inverse of this one.
1607
+
1608
+ Returns
1609
+ -------
1610
+ RigidBodyPose
1611
+ This pose inverted.
1612
+
1613
+ """
1614
+ return RigidBodyPose(
1615
+ -self._pos, mt.invertQuat(self._ori, dtype=np.float32))
1616
+
1617
+ def distanceTo(self, v):
1618
+ """Get the distance to a pose or point in scene units.
1619
+
1620
+ Parameters
1621
+ ----------
1622
+ v : RigidBodyPose or array_like
1623
+ Pose or point [x, y, z] to compute distance to.
1624
+
1625
+ Returns
1626
+ -------
1627
+ float
1628
+ Distance to `v` from this pose's origin.
1629
+
1630
+ """
1631
+ if hasattr(v, 'pos'): # v is pose-like object
1632
+ targetPos = v.pos
1633
+ else:
1634
+ targetPos = np.asarray(v[:3])
1635
+
1636
+ return np.sqrt(np.sum(np.square(targetPos - self.pos)))
1637
+
1638
+ def interp(self, end, s):
1639
+ """Interpolate between poses.
1640
+
1641
+ Linear interpolation is used on position (Lerp) while the orientation
1642
+ has spherical linear interpolation (Slerp) applied taking the shortest
1643
+ arc on the hypersphere.
1644
+
1645
+ Parameters
1646
+ ----------
1647
+ end : LibOVRPose
1648
+ End pose.
1649
+ s : float
1650
+ Interpolation factor between interval 0.0 and 1.0.
1651
+
1652
+ Returns
1653
+ -------
1654
+ RigidBodyPose
1655
+ Rigid body pose whose position and orientation is at `s` between
1656
+ this pose and `end`.
1657
+
1658
+ """
1659
+ if not (hasattr(end, 'pos') and hasattr(end, 'ori')):
1660
+ raise TypeError("Object for `end` does not have attributes "
1661
+ "`pos` and `ori`.")
1662
+
1663
+ interpPos = mt.lerp(self._pos, end.pos, s)
1664
+ interpOri = mt.slerp(self._ori, end.ori, s)
1665
+
1666
+ return RigidBodyPose(interpPos, interpOri)
1667
+
1668
+ def alignTo(self, alignTo):
1669
+ """Align this pose to another point or pose.
1670
+
1671
+ This sets the orientation of this pose to one which orients the forward
1672
+ axis towards `alignTo`.
1673
+
1674
+ Parameters
1675
+ ----------
1676
+ alignTo : array_like or LibOVRPose
1677
+ Position vector [x, y, z] or pose to align to.
1678
+
1679
+ """
1680
+ if hasattr(alignTo, 'pos'): # v is pose-like object
1681
+ targetPos = alignTo.pos
1682
+ else:
1683
+ targetPos = np.asarray(alignTo[:3])
1684
+
1685
+ fwd = np.asarray([0, 0, -1], dtype=np.float32)
1686
+ toTarget = targetPos - self._pos
1687
+ invPos = mt.applyQuat(
1688
+ mt.invertQuat(self._ori, dtype=np.float32),
1689
+ toTarget, dtype=np.float32)
1690
+ invPos = mt.normalize(invPos)
1691
+
1692
+ self.ori = mt.multQuat(
1693
+ self._ori, mt.alignTo(fwd, invPos, dtype=np.float32))
1694
+
1695
+
1696
+ class BoundingBox:
1697
+ """Class for representing object bounding boxes. This is a
1698
+ lazy-imported class, therefore import using full path
1699
+ `from psychopy.visual.stim3d import BoundingBox` when inheriting from it.
1700
+
1701
+
1702
+ A bounding box is a construct which represents a 3D rectangular volume about
1703
+ some pose, defined by its minimum and maximum extents in the reference frame
1704
+ of the pose. The axes of the bounding box are aligned to the axes of the
1705
+ world or the associated pose.
1706
+
1707
+ Bounding boxes are primarily used for visibility testing; to determine if
1708
+ the extents of an object associated with a pose (eg. the vertices of a
1709
+ model) falls completely outside of the viewing frustum. If so, the model can
1710
+ be culled during rendering to avoid wasting CPU/GPU resources on objects not
1711
+ visible to the viewer.
1712
+
1713
+ """
1714
+ def __init__(self, extents=None):
1715
+ self._extents = np.zeros((2, 3), np.float32)
1716
+ self._posCorners = np.zeros((8, 4), np.float32)
1717
+
1718
+ if extents is not None:
1719
+ self._extents[0, :] = extents[0]
1720
+ self._extents[1, :] = extents[1]
1721
+ else:
1722
+ self.clear()
1723
+
1724
+ self._computeCorners()
1725
+
1726
+ def _computeCorners(self):
1727
+ """Compute the corners of the bounding box.
1728
+
1729
+ These values are cached to speed up computations if extents hasn't been
1730
+ updated.
1731
+
1732
+ """
1733
+ for i in range(8):
1734
+ self._posCorners[i, 0] = \
1735
+ self._extents[1, 0] if (i & 1) else self._extents[0, 0]
1736
+ self._posCorners[i, 1] = \
1737
+ self._extents[1, 1] if (i & 2) else self._extents[0, 1]
1738
+ self._posCorners[i, 2] = \
1739
+ self._extents[1, 2] if (i & 4) else self._extents[0, 2]
1740
+ self._posCorners[i, 3] = 1.0
1741
+
1742
+ @property
1743
+ def isValid(self):
1744
+ """`True` if the bounding box is valid."""
1745
+ return np.all(self._extents[0, :] <= self._extents[1, :])
1746
+
1747
+ @property
1748
+ def extents(self):
1749
+ return self._extents
1750
+
1751
+ @extents.setter
1752
+ def extents(self, value):
1753
+ self._extents[0, :] = value[0]
1754
+ self._extents[1, :] = value[1]
1755
+ self._computeCorners()
1756
+
1757
+ def fit(self, verts):
1758
+ """Fit the bounding box to vertices."""
1759
+ np.amin(verts, axis=0, out=self._extents[0])
1760
+ np.amax(verts, axis=0, out=self._extents[1])
1761
+ self._computeCorners()
1762
+
1763
+ def clear(self):
1764
+ """Clear a bounding box, invalidating it."""
1765
+ self._extents[0, :] = np.finfo(np.float32).max
1766
+ self._extents[1, :] = np.finfo(np.float32).min
1767
+ self._computeCorners()
1768
+
1769
+
1770
+ class BaseRigidBodyStim(ColorMixin, WindowMixin):
1771
+ """Base class for rigid body 3D stimuli.
1772
+
1773
+ This class handles the pose of a rigid body 3D stimulus. Poses are
1774
+ represented by a `RigidBodyClass` object accessed via `thePose` attribute.
1775
+
1776
+ Any class the implements `pos` and `ori` attributes can be used in place of
1777
+ a `RigidBodyPose` instance for `thePose`. This common interface allows for
1778
+ custom classes which handle 3D transformations to be used for stimulus
1779
+ transformations (eg. `LibOVRPose` in PsychXR can be used instead of
1780
+ `RigidBodyPose` which supports more VR specific features).
1781
+
1782
+ Warnings
1783
+ --------
1784
+ This class is experimental and may result in undefined behavior.
1785
+
1786
+ """
1787
+ def __init__(self,
1788
+ win,
1789
+ pos=(0., 0., 0.),
1790
+ ori=(0., 0., 0., 1.),
1791
+ color=(0.0, 0.0, 0.0),
1792
+ colorSpace='rgb',
1793
+ contrast=1.0,
1794
+ opacity=1.0,
1795
+ name='',
1796
+ autoLog=True):
1797
+ """
1798
+ Parameters
1799
+ ----------
1800
+ win : `~psychopy.visual.Window`
1801
+ Window this stimulus is associated with. Stimuli cannot be shared
1802
+ across windows unless they share the same context.
1803
+ pos : array_like
1804
+ Position vector `[x, y, z]` for the origin of the rigid body.
1805
+ ori : array_like
1806
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
1807
+ imaginary and `w` is real.
1808
+
1809
+ """
1810
+ self.name = name
1811
+
1812
+ super(BaseRigidBodyStim, self).__init__()
1813
+
1814
+ self.win = win
1815
+ self.autoLog = autoLog
1816
+ self.colorSpace = colorSpace
1817
+ self.contrast = contrast
1818
+ self.opacity = opacity
1819
+ self.color = color
1820
+
1821
+ self._thePose = RigidBodyPose(pos, ori)
1822
+ self.material = None
1823
+
1824
+ self._vao = None
1825
+
1826
+ @property
1827
+ def thePose(self):
1828
+ """The pose of the rigid body. This is a class which has `pos` and `ori`
1829
+ attributes."""
1830
+ return self._thePose
1831
+
1832
+ @thePose.setter
1833
+ def thePose(self, value):
1834
+ if hasattr(value, 'pos') and hasattr(value, 'ori'):
1835
+ self._thePose = value
1836
+ else:
1837
+ raise AttributeError(
1838
+ 'Class set to `thePose` does not implement `pos` or `ori`.')
1839
+
1840
+ @property
1841
+ def pos(self):
1842
+ """Position vector (X, Y, Z)."""
1843
+ return self.thePose.pos
1844
+
1845
+ @pos.setter
1846
+ def pos(self, value):
1847
+ self.thePose.pos = value
1848
+
1849
+ def getPos(self):
1850
+ return self.thePose.pos
1851
+
1852
+ def setPos(self, pos):
1853
+ self.thePose.pos = pos
1854
+
1855
+ @property
1856
+ def ori(self):
1857
+ """Orientation quaternion (X, Y, Z, W)."""
1858
+ return self.thePose.ori
1859
+
1860
+ @ori.setter
1861
+ def ori(self, value):
1862
+ self.thePose.ori = value
1863
+
1864
+ def getOri(self):
1865
+ return self.thePose.ori
1866
+
1867
+ def setOri(self, ori):
1868
+ self.thePose.ori = ori
1869
+
1870
+ def getOriAxisAngle(self, degrees=True):
1871
+ """Get the axis and angle of rotation for the 3D stimulus. Converts the
1872
+ orientation defined by the `ori` quaternion to and axis-angle
1873
+ representation.
1874
+
1875
+ Parameters
1876
+ ----------
1877
+ degrees : bool, optional
1878
+ Specify ``True`` if `angle` is in degrees, or else it will be
1879
+ treated as radians. Default is ``True``.
1880
+
1881
+ Returns
1882
+ -------
1883
+ tuple
1884
+ Axis `[rx, ry, rz]` and angle.
1885
+
1886
+ """
1887
+ return self.thePose.getOriAxisAngle(degrees)
1888
+
1889
+ def setOriAxisAngle(self, axis, angle, degrees=True):
1890
+ """Set the orientation of the 3D stimulus using an `axis` and
1891
+ `angle`. This sets the quaternion at `ori`.
1892
+
1893
+ Parameters
1894
+ ----------
1895
+ axis : array_like
1896
+ Axis of rotation [rx, ry, rz].
1897
+ angle : float
1898
+ Angle of rotation.
1899
+ degrees : bool, optional
1900
+ Specify ``True`` if `angle` is in degrees, or else it will be
1901
+ treated as radians. Default is ``True``.
1902
+
1903
+ """
1904
+ self.thePose.setOriAxisAngle(axis, angle, degrees)
1905
+
1906
+ def _createVAO(self, vertices, textureCoords, normals, faces):
1907
+ """Create a vertex array object for handling vertex attribute data.
1908
+ """
1909
+ self.thePose.bounds = BoundingBox()
1910
+ self.thePose.bounds.fit(vertices)
1911
+
1912
+ # upload to buffers
1913
+ vertexVBO = gt.createVBO(vertices)
1914
+ texCoordVBO = gt.createVBO(textureCoords)
1915
+ normalsVBO = gt.createVBO(normals)
1916
+
1917
+ # create an index buffer with faces
1918
+ indexBuffer = gt.createVBO(
1919
+ faces.flatten(),
1920
+ target=GL.GL_ELEMENT_ARRAY_BUFFER,
1921
+ dataType=GL.GL_UNSIGNED_INT)
1922
+
1923
+ return gt.createVAO({GL.GL_VERTEX_ARRAY: vertexVBO,
1924
+ GL.GL_TEXTURE_COORD_ARRAY: texCoordVBO,
1925
+ GL.GL_NORMAL_ARRAY: normalsVBO},
1926
+ indexBuffer=indexBuffer, legacy=True)
1927
+
1928
+ def draw(self, win=None):
1929
+ """Draw the stimulus.
1930
+
1931
+ This should work for stimuli using a single VAO and material. More
1932
+ complex stimuli with multiple materials should override this method to
1933
+ correctly handle that case.
1934
+
1935
+ Parameters
1936
+ ----------
1937
+ win : `~psychopy.visual.Window`
1938
+ Window this stimulus is associated with. Stimuli cannot be shared
1939
+ across windows unless they share the same context.
1940
+
1941
+ """
1942
+ if win is None:
1943
+ win = self.win
1944
+ else:
1945
+ self._selectWindow(win)
1946
+
1947
+ # nop if there is no VAO to draw
1948
+ if self._vao is None:
1949
+ return
1950
+
1951
+ win.draw3d = True
1952
+
1953
+ # apply transformation to mesh
1954
+ GL.glPushMatrix()
1955
+ GL.glMultTransposeMatrixf(at.array2pointer(self.thePose.modelMatrix))
1956
+
1957
+ if self.material is not None: # has a material, use it
1958
+ useTexture = self.material.diffuseTexture is not None
1959
+ self.material.begin(useTexture)
1960
+ gt.drawVAO(self._vao, GL.GL_TRIANGLES)
1961
+ self.material.end()
1962
+ else: # doesn't have a material, use class colors
1963
+ r, g, b = self._foreColor.render('rgb')
1964
+ color = np.ctypeslib.as_ctypes(
1965
+ np.array((r, g, b, self.opacity), np.float32))
1966
+
1967
+ nLights = len(self.win.lights)
1968
+ shaderKey = (nLights, False)
1969
+ gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
1970
+
1971
+ # pass values to OpenGL as material
1972
+ GL.glColor4f(r, g, b, self.opacity)
1973
+ GL.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color)
1974
+ GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color)
1975
+
1976
+ gt.drawVAO(self._vao, GL.GL_TRIANGLES)
1977
+
1978
+ gt.useProgram(0)
1979
+
1980
+ GL.glPopMatrix()
1981
+
1982
+ win.draw3d = False
1983
+
1984
+ @attributeSetter
1985
+ def units(self, value):
1986
+ """
1987
+ None, 'norm', 'cm', 'deg', 'degFlat', 'degFlatPos', or 'pix'
1988
+
1989
+ If None then the current units of the
1990
+ :class:`~psychopy.visual.Window` will be used.
1991
+ See :ref:`units` for explanation of other options.
1992
+
1993
+ Note that when you change units, you don't change the stimulus
1994
+ parameters and it is likely to change appearance. Example::
1995
+
1996
+ # This stimulus is 20% wide and 50% tall with respect to window
1997
+ stim = visual.PatchStim(win, units='norm', size=(0.2, 0.5)
1998
+
1999
+ # This stimulus is 0.2 degrees wide and 0.5 degrees tall.
2000
+ stim.units = 'deg'
2001
+ """
2002
+ if value is not None and len(value):
2003
+ self.__dict__['units'] = value
2004
+ else:
2005
+ self.__dict__['units'] = self.win.units
2006
+
2007
+ def _updateList(self):
2008
+ """The user shouldn't need this method since it gets called
2009
+ after every call to .set()
2010
+ Chooses between using and not using shaders each call.
2011
+ """
2012
+ pass
2013
+
2014
+ def isVisible(self):
2015
+ """Check if the object is visible to the observer.
2016
+
2017
+ Test if a pose's bounding box or position falls outside of an eye's view
2018
+ frustum.
2019
+
2020
+ Poses can be assigned bounding boxes which enclose any 3D models
2021
+ associated with them. A model is not visible if all the corners of the
2022
+ bounding box fall outside the viewing frustum. Therefore any primitives
2023
+ (i.e. triangles) associated with the pose can be culled during rendering
2024
+ to reduce CPU/GPU workload.
2025
+
2026
+ Returns
2027
+ -------
2028
+ bool
2029
+ `True` if the object's bounding box is visible.
2030
+
2031
+ Examples
2032
+ --------
2033
+ You can avoid running draw commands if the object is not visible by
2034
+ doing a visibility test first::
2035
+
2036
+ if myStim.isVisible():
2037
+ myStim.draw()
2038
+
2039
+ """
2040
+ if self.thePose.bounds is None:
2041
+ return True
2042
+
2043
+ if not self.thePose.bounds.isValid:
2044
+ return True
2045
+
2046
+ # transformation matrix
2047
+ mvpMatrix = np.zeros((4, 4), dtype=np.float32)
2048
+ np.matmul(self.win.projectionMatrix, self.win.viewMatrix, out=mvpMatrix)
2049
+ np.matmul(mvpMatrix, self.thePose.modelMatrix, out=mvpMatrix)
2050
+
2051
+ # compute bounding box corners in current view
2052
+ corners = self.thePose.bounds._posCorners.dot(mvpMatrix.T)
2053
+
2054
+ # check if corners are completely off to one side of the frustum
2055
+ if not np.any(corners[:, 0] > -corners[:, 3]):
2056
+ return False
2057
+
2058
+ if not np.any(corners[:, 0] < corners[:, 3]):
2059
+ return False
2060
+
2061
+ if not np.any(corners[:, 1] > -corners[:, 3]):
2062
+ return False
2063
+
2064
+ if not np.any(corners[:, 1] < corners[:, 3]):
2065
+ return False
2066
+
2067
+ if not np.any(corners[:, 2] > -corners[:, 3]):
2068
+ return False
2069
+
2070
+ if not np.any(corners[:, 2] < corners[:, 3]):
2071
+ return False
2072
+
2073
+ return True
2074
+
2075
+ def getRayIntersectBounds(self, rayOrig, rayDir):
2076
+ """Get the point which a ray intersects the bounding box of this mesh.
2077
+
2078
+ Parameters
2079
+ ----------
2080
+ rayOrig : array_like
2081
+ Origin of the ray in space [x, y, z].
2082
+ rayDir : array_like
2083
+ Direction vector of the ray [x, y, z], should be normalized.
2084
+
2085
+ Returns
2086
+ -------
2087
+ tuple
2088
+ Coordinate in world space of the intersection and distance in scene
2089
+ units from `rayOrig`. Returns `None` if there is no intersection.
2090
+
2091
+ """
2092
+ if self.thePose.bounds is None:
2093
+ return None # nop
2094
+
2095
+ return mt.intersectRayOBB(rayOrig,
2096
+ rayDir,
2097
+ self.thePose.modelMatrix,
2098
+ self.thePose.bounds.extents,
2099
+ dtype=np.float32)
2100
+
2101
+
2102
+ class SphereStim(BaseRigidBodyStim):
2103
+ """Class for drawing a UV sphere. This is a
2104
+ lazy-imported class, therefore import using full path
2105
+ `from psychopy.visual.stim3d import SphereStim` when inheriting from it.
2106
+
2107
+
2108
+ The resolution of the sphere mesh can be controlled by setting `sectors`
2109
+ and `stacks` which controls the number of latitudinal and longitudinal
2110
+ subdivisions, respectively. The radius of the sphere is defined by setting
2111
+ `radius` expressed in scene units (meters if using a perspective
2112
+ projection).
2113
+
2114
+ Calling the `draw` method will render the sphere to the current buffer. The
2115
+ render target (FBO or back buffer) must have a depth buffer attached to it
2116
+ for the object to be rendered correctly. Shading is used if the current
2117
+ window has light sources defined and lighting is enabled (by setting
2118
+ `useLights=True` before drawing the stimulus).
2119
+
2120
+ Warnings
2121
+ --------
2122
+ This class is experimental and may result in undefined behavior.
2123
+
2124
+ Examples
2125
+ --------
2126
+ Creating a red sphere 1.5 meters away from the viewer with radius 0.25::
2127
+
2128
+ redSphere = SphereStim(win,
2129
+ pos=(0., 0., -1.5),
2130
+ radius=0.25,
2131
+ color=(1, 0, 0))
2132
+
2133
+ """
2134
+ def __init__(self,
2135
+ win,
2136
+ radius=0.5,
2137
+ subdiv=(32, 32),
2138
+ flipFaces=False,
2139
+ pos=(0., 0., 0.),
2140
+ ori=(0., 0., 0., 1.),
2141
+ color=(0., 0., 0.),
2142
+ colorSpace='rgb',
2143
+ contrast=1.0,
2144
+ opacity=1.0,
2145
+ useMaterial=None,
2146
+ name='',
2147
+ autoLog=True):
2148
+ """
2149
+ Parameters
2150
+ ----------
2151
+ win : `~psychopy.visual.Window`
2152
+ Window this stimulus is associated with. Stimuli cannot be shared
2153
+ across windows unless they share the same context.
2154
+ radius : float
2155
+ Radius of the sphere in scene units.
2156
+ subdiv : array_like
2157
+ Number of latitudinal and longitudinal subdivisions `(lat, long)`
2158
+ for the sphere mesh. The greater the number, the smoother the sphere
2159
+ will appear.
2160
+ flipFaces : bool, optional
2161
+ If `True`, normals and face windings will be set to point inward
2162
+ towards the center of the sphere. Texture coordinates will remain
2163
+ the same. Default is `False`.
2164
+ pos : array_like
2165
+ Position vector `[x, y, z]` for the origin of the rigid body.
2166
+ ori : array_like
2167
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
2168
+ imaginary and `w` is real. If you prefer specifying rotations in
2169
+ axis-angle format, call `setOriAxisAngle` after initialization.
2170
+ useMaterial : PhongMaterial, optional
2171
+ Material to use. The material can be configured by accessing the
2172
+ `material` attribute after initialization. If not material is
2173
+ specified, the diffuse and ambient color of the shape will be set
2174
+ by `color`.
2175
+ color : array_like
2176
+ Diffuse and ambient color of the stimulus if `useMaterial` is not
2177
+ specified. Values are with respect to `colorSpace`.
2178
+ colorSpace : str
2179
+ Colorspace of `color` to use.
2180
+ contrast : float
2181
+ Contrast of the stimulus, value modulates the `color`.
2182
+ opacity : float
2183
+ Opacity of the stimulus ranging from 0.0 to 1.0. Note that
2184
+ transparent objects look best when rendered from farthest to
2185
+ nearest.
2186
+ name : str
2187
+ Name of this object for logging purposes.
2188
+ autoLog : bool
2189
+ Enable automatic logging on attribute changes.
2190
+
2191
+ """
2192
+ super(SphereStim, self).__init__(win,
2193
+ pos=pos,
2194
+ ori=ori,
2195
+ color=color,
2196
+ colorSpace=colorSpace,
2197
+ contrast=contrast,
2198
+ opacity=opacity,
2199
+ name=name,
2200
+ autoLog=autoLog)
2201
+
2202
+ # create a vertex array object for drawing
2203
+ vertices, textureCoords, normals, faces = gt.createUVSphere(
2204
+ sectors=subdiv[0],
2205
+ stacks=subdiv[1],
2206
+ radius=radius,
2207
+ flipFaces=flipFaces)
2208
+ self._vao = self._createVAO(vertices, textureCoords, normals, faces)
2209
+
2210
+ self.material = useMaterial
2211
+
2212
+ self._radius = radius # for raypicking
2213
+
2214
+ self.extents = (vertices.min(axis=0), vertices.max(axis=0))
2215
+
2216
+ def getRayIntersectSphere(self, rayOrig, rayDir):
2217
+ """Get the point which a ray intersects the sphere.
2218
+
2219
+ Parameters
2220
+ ----------
2221
+ rayOrig : array_like
2222
+ Origin of the ray in space [x, y, z].
2223
+ rayDir : array_like
2224
+ Direction vector of the ray [x, y, z], should be normalized.
2225
+
2226
+ Returns
2227
+ -------
2228
+ tuple
2229
+ Coordinate in world space of the intersection and distance in scene
2230
+ units from `rayOrig`. Returns `None` if there is no intersection.
2231
+
2232
+ """
2233
+ return mt.intersectRaySphere(rayOrig,
2234
+ rayDir,
2235
+ self.thePose.pos,
2236
+ self._radius,
2237
+ dtype=np.float32)
2238
+
2239
+
2240
+ class BoxStim(BaseRigidBodyStim):
2241
+ """Class for drawing 3D boxes. This is a
2242
+ lazy-imported class, therefore import using full path
2243
+ `from psychopy.visual.stim3d import BoxStim` when inheriting from it.
2244
+
2245
+
2246
+ Draws a rectangular box with dimensions specified by `size` (length, width,
2247
+ height) in scene units.
2248
+
2249
+ Calling the `draw` method will render the box to the current buffer. The
2250
+ render target (FBO or back buffer) must have a depth buffer attached to it
2251
+ for the object to be rendered correctly. Shading is used if the current
2252
+ window has light sources defined and lighting is enabled (by setting
2253
+ `useLights=True` before drawing the stimulus).
2254
+
2255
+ Warnings
2256
+ --------
2257
+ This class is experimental and may result in undefined behavior.
2258
+
2259
+ """
2260
+ def __init__(self,
2261
+ win,
2262
+ size=(.5, .5, .5),
2263
+ flipFaces=False,
2264
+ pos=(0., 0., 0.),
2265
+ ori=(0., 0., 0., 1.),
2266
+ color=(0., 0., 0.),
2267
+ colorSpace='rgb',
2268
+ contrast=1.0,
2269
+ opacity=1.0,
2270
+ useMaterial=None,
2271
+ textureScale=None,
2272
+ name='',
2273
+ autoLog=True):
2274
+ """
2275
+ Parameters
2276
+ ----------
2277
+ win : `~psychopy.visual.Window`
2278
+ Window this stimulus is associated with. Stimuli cannot be shared
2279
+ across windows unless they share the same context.
2280
+ size : tuple or float
2281
+ Dimensions of the mesh. If a single value is specified, the box will
2282
+ be a cube. Provide a tuple of floats to specify the width, length,
2283
+ and height of the box (eg. `size=(0.2, 1.3, 2.1)`) in scene units.
2284
+ flipFaces : bool, optional
2285
+ If `True`, normals and face windings will be set to point inward
2286
+ towards the center of the box. Texture coordinates will remain the
2287
+ same. Default is `False`.
2288
+ pos : array_like
2289
+ Position vector `[x, y, z]` for the origin of the rigid body.
2290
+ ori : array_like
2291
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
2292
+ imaginary and `w` is real. If you prefer specifying rotations in
2293
+ axis-angle format, call `setOriAxisAngle` after initialization.
2294
+ useMaterial : PhongMaterial, optional
2295
+ Material to use. The material can be configured by accessing the
2296
+ `material` attribute after initialization. If not material is
2297
+ specified, the diffuse and ambient color of the shape will track the
2298
+ current color specified by `glColor`.
2299
+ color : array_like
2300
+ Diffuse and ambient color of the stimulus if `useMaterial` is not
2301
+ specified. Values are with respect to `colorSpace`.
2302
+ colorSpace : str
2303
+ Colorspace of `color` to use.
2304
+ contrast : float
2305
+ Contrast of the stimulus, value modulates the `color`.
2306
+ opacity : float
2307
+ Opacity of the stimulus ranging from 0.0 to 1.0. Note that
2308
+ transparent objects look best when rendered from farthest to
2309
+ nearest.
2310
+ textureScale : array_like or float, optional
2311
+ Scaling factors for texture coordinates (sx, sy). By default,
2312
+ a factor of 1 will have the entire texture cover the surface of the
2313
+ mesh. If a single number is provided, the texture will be scaled
2314
+ uniformly.
2315
+ name : str
2316
+ Name of this object for logging purposes.
2317
+ autoLog : bool
2318
+ Enable automatic logging on attribute changes.
2319
+
2320
+ """
2321
+ super(BoxStim, self).__init__(
2322
+ win,
2323
+ pos=pos,
2324
+ ori=ori,
2325
+ color=color,
2326
+ colorSpace=colorSpace,
2327
+ contrast=contrast,
2328
+ opacity=opacity,
2329
+ name=name,
2330
+ autoLog=autoLog)
2331
+
2332
+ # create a vertex array object for drawing
2333
+ vertices, texCoords, normals, faces = gt.createBox(size, flipFaces)
2334
+
2335
+ # scale the texture
2336
+ if textureScale is not None:
2337
+ if isinstance(textureScale, (int, float)):
2338
+ texCoords *= textureScale
2339
+ else:
2340
+ texCoords *= np.asarray(textureScale, dtype=np.float32)
2341
+
2342
+ self._vao = self._createVAO(vertices, texCoords, normals, faces)
2343
+
2344
+ self.setColor(color, colorSpace=self.colorSpace, log=False)
2345
+ self.material = useMaterial
2346
+
2347
+ self.extents = (vertices.min(axis=0), vertices.max(axis=0))
2348
+
2349
+
2350
+ class PlaneStim(BaseRigidBodyStim):
2351
+ """Class for drawing planes. This is a
2352
+ lazy-imported class, therefore import using full path
2353
+ `from psychopy.visual.stim3d import PlaneStim` when inheriting from it.
2354
+
2355
+
2356
+ Draws a plane with dimensions specified by `size` (length, width) in scene
2357
+ units.
2358
+
2359
+ Calling the `draw` method will render the plane to the current buffer. The
2360
+ render target (FBO or back buffer) must have a depth buffer attached to it
2361
+ for the object to be rendered correctly. Shading is used if the current
2362
+ window has light sources defined and lighting is enabled (by setting
2363
+ `useLights=True` before drawing the stimulus).
2364
+
2365
+ Warnings
2366
+ --------
2367
+ This class is experimental and may result in undefined behavior.
2368
+
2369
+ """
2370
+ def __init__(self,
2371
+ win,
2372
+ size=(.5, .5),
2373
+ pos=(0., 0., 0.),
2374
+ ori=(0., 0., 0., 1.),
2375
+ color=(0., 0., 0.),
2376
+ colorSpace='rgb',
2377
+ contrast=1.0,
2378
+ opacity=1.0,
2379
+ useMaterial=None,
2380
+ textureScale=None,
2381
+ name='',
2382
+ autoLog=True):
2383
+ """
2384
+ Parameters
2385
+ ----------
2386
+ win : `~psychopy.visual.Window`
2387
+ Window this stimulus is associated with. Stimuli cannot be shared
2388
+ across windows unless they share the same context.
2389
+ size : tuple or float
2390
+ Dimensions of the mesh. If a single value is specified, the plane
2391
+ will be a square. Provide a tuple of floats to specify the width and
2392
+ length of the plane (eg. `size=(0.2, 1.3)`).
2393
+ pos : array_like
2394
+ Position vector `[x, y, z]` for the origin of the rigid body.
2395
+ ori : array_like
2396
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
2397
+ imaginary and `w` is real. If you prefer specifying rotations in
2398
+ axis-angle format, call `setOriAxisAngle` after initialization. By
2399
+ default, the plane is oriented with normal facing the +Z axis of the
2400
+ scene.
2401
+ useMaterial : PhongMaterial, optional
2402
+ Material to use. The material can be configured by accessing the
2403
+ `material` attribute after initialization. If not material is
2404
+ specified, the diffuse and ambient color of the shape will track the
2405
+ current color specified by `glColor`.
2406
+ colorSpace : str
2407
+ Colorspace of `color` to use.
2408
+ contrast : float
2409
+ Contrast of the stimulus, value modulates the `color`.
2410
+ opacity : float
2411
+ Opacity of the stimulus ranging from 0.0 to 1.0. Note that
2412
+ transparent objects look best when rendered from farthest to
2413
+ nearest.
2414
+ textureScale : array_like or float, optional
2415
+ Scaling factors for texture coordinates (sx, sy). By default,
2416
+ a factor of 1 will have the entire texture cover the surface of the
2417
+ mesh. If a single number is provided, the texture will be scaled
2418
+ uniformly.
2419
+ name : str
2420
+ Name of this object for logging purposes.
2421
+ autoLog : bool
2422
+ Enable automatic logging on attribute changes.
2423
+
2424
+ """
2425
+ super(PlaneStim, self).__init__(
2426
+ win,
2427
+ pos=pos,
2428
+ ori=ori,
2429
+ color=color,
2430
+ colorSpace=colorSpace,
2431
+ contrast=contrast,
2432
+ opacity=opacity,
2433
+ name=name,
2434
+ autoLog=autoLog)
2435
+
2436
+ # create a vertex array object for drawing
2437
+ vertices, texCoords, normals, faces = gt.createPlane(size)
2438
+
2439
+ # scale the texture
2440
+ if textureScale is not None:
2441
+ if isinstance(textureScale, (int, float)):
2442
+ texCoords *= textureScale
2443
+ else:
2444
+ texCoords *= np.asarray(textureScale, dtype=np.float32)
2445
+
2446
+ self._vao = self._createVAO(vertices, texCoords, normals, faces)
2447
+
2448
+ self.setColor(color, colorSpace=self.colorSpace, log=False)
2449
+ self.material = useMaterial
2450
+
2451
+ self.extents = (vertices.min(axis=0), vertices.max(axis=0))
2452
+
2453
+
2454
+ class ObjMeshStim(BaseRigidBodyStim):
2455
+ """Class for loading and presenting 3D stimuli in the Wavefront OBJ format.
2456
+ This is a lazy-imported class, therefore import using full path
2457
+ `from psychopy.visual.stim3d import ObjMeshStim` when inheriting from it.
2458
+
2459
+
2460
+ Calling the `draw` method will render the mesh to the current buffer. The
2461
+ render target (FBO or back buffer) must have a depth buffer attached to it
2462
+ for the object to be rendered correctly. Shading is used if the current
2463
+ window has light sources defined and lighting is enabled (by setting
2464
+ `useLights=True` before drawing the stimulus).
2465
+
2466
+ Vertex positions, texture coordinates, and normals are loaded and packed
2467
+ into a single vertex buffer object (VBO). Vertex array objects (VAO) are
2468
+ created for each material with an index buffer referencing vertices assigned
2469
+ that material in the VBO. For maximum performance, keep the number of
2470
+ materials per object as low as possible, as switching between VAOs has some
2471
+ overhead.
2472
+
2473
+ Material attributes are read from the material library file (*.MTL)
2474
+ associated with the *.OBJ file. This file will be automatically searched for
2475
+ and read during loading. Afterwards you can edit material properties by
2476
+ accessing the data structure of the `materials` attribute.
2477
+
2478
+ Keep in mind that OBJ shapes are rigid bodies, the mesh itself cannot be
2479
+ deformed during runtime. However, meshes can be positioned and rotated as
2480
+ desired by manipulating the `RigidBodyPose` instance accessed through the
2481
+ `thePose` attribute.
2482
+
2483
+ Warnings
2484
+ --------
2485
+ Loading an *.OBJ file is a slow process, be sure to do this outside
2486
+ of any time-critical routines! This class is experimental and may result
2487
+ in undefined behavior.
2488
+
2489
+ Examples
2490
+ --------
2491
+ Loading an *.OBJ file from a disk location::
2492
+
2493
+ myObjStim = ObjMeshStim(win, '/path/to/file/model.obj')
2494
+
2495
+ """
2496
+ def __init__(self,
2497
+ win,
2498
+ objFile,
2499
+ pos=(0, 0, 0),
2500
+ ori=(0, 0, 0, 1),
2501
+ useMaterial=None,
2502
+ loadMtllib=True,
2503
+ color=(0.0, 0.0, 0.0),
2504
+ colorSpace='rgb',
2505
+ contrast=1.0,
2506
+ opacity=1.0,
2507
+ name='',
2508
+ autoLog=True):
2509
+ """
2510
+ Parameters
2511
+ ----------
2512
+ win : `~psychopy.visual.Window`
2513
+ Window this stimulus is associated with. Stimuli cannot be shared
2514
+ across windows unless they share the same context.
2515
+ size : tuple or float
2516
+ Dimensions of the mesh. If a single value is specified, the plane
2517
+ will be a square. Provide a tuple of floats to specify the width and
2518
+ length of the box (eg. `size=(0.2, 1.3)`).
2519
+ pos : array_like
2520
+ Position vector `[x, y, z]` for the origin of the rigid body.
2521
+ ori : array_like
2522
+ Orientation quaternion `[x, y, z, w]` where `x`, `y`, `z` are
2523
+ imaginary and `w` is real. If you prefer specifying rotations in
2524
+ axis-angle format, call `setOriAxisAngle` after initialization. By
2525
+ default, the plane is oriented with normal facing the +Z axis of the
2526
+ scene.
2527
+ useMaterial : PhongMaterial, optional
2528
+ Material to use for all sub-meshes. The material can be configured
2529
+ by accessing the `material` attribute after initialization. If no
2530
+ material is specified, `color` will modulate the diffuse and
2531
+ ambient colors for all meshes in the model. If `loadMtllib` is
2532
+ `True`, this value should be `None`.
2533
+ loadMtllib : bool
2534
+ Load materials from the MTL file associated with the mesh. This will
2535
+ override `useMaterial` if it is `None`. The value of `materials`
2536
+ after initialization will be a dictionary where keys are material
2537
+ names and values are materials. Any textures associated with the
2538
+ model will be loaded as per the material requirements.
2539
+
2540
+ """
2541
+ super(ObjMeshStim, self).__init__(
2542
+ win,
2543
+ pos=pos,
2544
+ ori=ori,
2545
+ color=color,
2546
+ colorSpace=colorSpace,
2547
+ contrast=contrast,
2548
+ opacity=opacity,
2549
+ name=name,
2550
+ autoLog=autoLog)
2551
+
2552
+ # load the OBJ file
2553
+ objModel = gt.loadObjFile(objFile)
2554
+
2555
+ # load materials from file if requested
2556
+ if loadMtllib and self.material is None:
2557
+ self.material = self._loadMtlLib(objModel.mtlFile)
2558
+ else:
2559
+ self.material = useMaterial
2560
+
2561
+ # load vertex data into an interleaved VBO
2562
+ buffers = np.ascontiguousarray(
2563
+ np.hstack((objModel.vertexPos,
2564
+ objModel.texCoords,
2565
+ objModel.normals)),
2566
+ dtype=np.float32)
2567
+
2568
+ # upload to buffer
2569
+ vertexAttr = gt.createVBO(buffers)
2570
+
2571
+ # load vertex data into VAOs
2572
+ self._vao = {} # dictionary for VAOs
2573
+ # for each material create a VAO
2574
+ # keys are material names, values are index buffers
2575
+ for material, faces in objModel.faces.items():
2576
+ # convert index buffer to VAO
2577
+ indexBuffer = \
2578
+ gt.createVBO(
2579
+ faces.flatten(), # flatten face index for element array
2580
+ target=GL.GL_ELEMENT_ARRAY_BUFFER,
2581
+ dataType=GL.GL_UNSIGNED_INT)
2582
+
2583
+ # see `setVertexAttribPointer` for more information about attribute
2584
+ # pointer indices
2585
+ self._vao[material] = gt.createVAO(
2586
+ {GL.GL_VERTEX_ARRAY: (vertexAttr, 3),
2587
+ GL.GL_TEXTURE_COORD_ARRAY: (vertexAttr, 2, 3),
2588
+ GL.GL_NORMAL_ARRAY: (vertexAttr, 3, 5, True)},
2589
+ indexBuffer=indexBuffer, legacy=True)
2590
+
2591
+ self.extents = objModel.extents
2592
+
2593
+ self.thePose.bounds = BoundingBox()
2594
+ self.thePose.bounds.fit(objModel.vertexPos)
2595
+
2596
+ def _loadMtlLib(self, mtlFile):
2597
+ """Load a material library associated with the OBJ file. This is usually
2598
+ called by the constructor for this class.
2599
+
2600
+ Parameters
2601
+ ----------
2602
+ mtlFile : str
2603
+ Path to MTL file.
2604
+
2605
+ """
2606
+ with open(mtlFile, 'r') as mtl:
2607
+ mtlBuffer = StringIO(mtl.read())
2608
+
2609
+ foundMaterials = {}
2610
+ foundTextures = {}
2611
+ thisMaterial = 0
2612
+ for line in mtlBuffer.readlines():
2613
+ line = line.strip()
2614
+ if line.startswith('newmtl '): # new material
2615
+ thisMaterial = line[7:]
2616
+ foundMaterials[thisMaterial] = BlinnPhongMaterial(self.win)
2617
+ elif line.startswith('Ns '): # specular exponent
2618
+ foundMaterials[thisMaterial].shininess = line[3:]
2619
+ elif line.startswith('Ks '): # specular color
2620
+ specularColor = np.asarray(list(map(float, line[3:].split(' '))))
2621
+ specularColor = 2.0 * specularColor - 1
2622
+ foundMaterials[thisMaterial].specularColor = specularColor
2623
+ elif line.startswith('Kd '): # diffuse color
2624
+ diffuseColor = np.asarray(list(map(float, line[3:].split(' '))))
2625
+ diffuseColor = 2.0 * diffuseColor - 1
2626
+ foundMaterials[thisMaterial].diffuseColor = diffuseColor
2627
+ elif line.startswith('Ka '): # ambient color
2628
+ ambientColor = np.asarray(list(map(float, line[3:].split(' '))))
2629
+ ambientColor = 2.0 * ambientColor - 1
2630
+ foundMaterials[thisMaterial].ambientColor = ambientColor
2631
+ elif line.startswith('map_Kd '): # diffuse color map
2632
+ # load a diffuse texture from file
2633
+ textureName = line[7:]
2634
+ if textureName not in foundTextures.keys():
2635
+ im = Image.open(
2636
+ os.path.join(os.path.split(mtlFile)[0], textureName))
2637
+ im = im.transpose(Image.FLIP_TOP_BOTTOM)
2638
+ im = im.convert("RGBA")
2639
+ pixelData = np.array(im).ctypes
2640
+ width = pixelData.shape[1]
2641
+ height = pixelData.shape[0]
2642
+ foundTextures[textureName] = gt.createTexImage2D(
2643
+ width,
2644
+ height,
2645
+ internalFormat=GL.GL_RGBA,
2646
+ pixelFormat=GL.GL_RGBA,
2647
+ dataType=GL.GL_UNSIGNED_BYTE,
2648
+ data=pixelData,
2649
+ unpackAlignment=1,
2650
+ texParams={GL.GL_TEXTURE_MAG_FILTER: GL.GL_LINEAR,
2651
+ GL.GL_TEXTURE_MIN_FILTER: GL.GL_LINEAR})
2652
+ foundMaterials[thisMaterial].diffuseTexture = \
2653
+ foundTextures[textureName]
2654
+
2655
+ return foundMaterials
2656
+
2657
+ def draw(self, win=None):
2658
+ """Draw the mesh.
2659
+
2660
+ Parameters
2661
+ ----------
2662
+ win : `~psychopy.visual.Window`
2663
+ Window this stimulus is associated with. Stimuli cannot be shared
2664
+ across windows unless they share the same context.
2665
+
2666
+ """
2667
+ if win is None:
2668
+ win = self.win
2669
+ else:
2670
+ self._selectWindow(win)
2671
+
2672
+ win.draw3d = True
2673
+
2674
+ GL.glPushMatrix()
2675
+ GL.glMultTransposeMatrixf(at.array2pointer(self.thePose.modelMatrix))
2676
+
2677
+ # iterate over materials, draw associated VAOs
2678
+ if self.material is not None:
2679
+ # if material is a dictionary
2680
+ if isinstance(self.material, dict):
2681
+ for materialName, materialDesc in self.material.items():
2682
+ materialDesc.begin()
2683
+ gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
2684
+ materialDesc.end()
2685
+ else:
2686
+ # material is a single item
2687
+ self.material.begin()
2688
+ for materialName, _ in self._vao.items():
2689
+ gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
2690
+ self.material.end()
2691
+ else:
2692
+ r, g, b = self._foreColor.render('rgb')
2693
+ color = np.ctypeslib.as_ctypes(
2694
+ np.array((r, g, b, self.opacity), np.float32))
2695
+
2696
+ nLights = len(self.win.lights)
2697
+ shaderKey = (nLights, False)
2698
+ gt.useProgram(self.win._shaders['stim3d_phong'][shaderKey])
2699
+
2700
+ # pass values to OpenGL as material
2701
+ GL.glColor4f(r, g, b, self.opacity)
2702
+ GL.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color)
2703
+ GL.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, color)
2704
+
2705
+ for materialName, _ in self._vao.items():
2706
+ gt.drawVAO(self._vao[materialName], GL.GL_TRIANGLES)
2707
+
2708
+ gt.useProgram(0)
2709
+
2710
+ GL.glPopMatrix()
2711
+
2712
+ win.draw3d = False