psychopy 2025.2.4__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.
Files changed (3127) hide show
  1. psychopy/CHANGELOG.txt +3981 -0
  2. psychopy/GIT_SHA +1 -0
  3. psychopy/LICENSE.txt +11 -0
  4. psychopy/LICENSES.txt +55 -0
  5. psychopy/VERSION +1 -0
  6. psychopy/__init__.py +148 -0
  7. psychopy/alerts/__init__.py +65 -0
  8. psychopy/alerts/_alerts.py +224 -0
  9. psychopy/alerts/_errorHandler.py +50 -0
  10. psychopy/alerts/alertsCatalogue/1000.yaml +0 -0
  11. psychopy/alerts/alertsCatalogue/1100.yaml +0 -0
  12. psychopy/alerts/alertsCatalogue/1500.yaml +0 -0
  13. psychopy/alerts/alertsCatalogue/2000.yaml +0 -0
  14. psychopy/alerts/alertsCatalogue/2100.yaml +0 -0
  15. psychopy/alerts/alertsCatalogue/2110.yaml +0 -0
  16. psychopy/alerts/alertsCatalogue/2115.yaml +21 -0
  17. psychopy/alerts/alertsCatalogue/2120.yaml +22 -0
  18. psychopy/alerts/alertsCatalogue/2150.yaml +0 -0
  19. psychopy/alerts/alertsCatalogue/2155.yaml +21 -0
  20. psychopy/alerts/alertsCatalogue/2300.yaml +0 -0
  21. psychopy/alerts/alertsCatalogue/2500.yaml +0 -0
  22. psychopy/alerts/alertsCatalogue/3000.yaml +0 -0
  23. psychopy/alerts/alertsCatalogue/3100.yaml +0 -0
  24. psychopy/alerts/alertsCatalogue/3110.yaml +25 -0
  25. psychopy/alerts/alertsCatalogue/3115.yaml +24 -0
  26. psychopy/alerts/alertsCatalogue/3200.yaml +0 -0
  27. psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
  28. psychopy/alerts/alertsCatalogue/3400.yaml +0 -0
  29. psychopy/alerts/alertsCatalogue/3600.yaml +0 -0
  30. psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
  31. psychopy/alerts/alertsCatalogue/4000.yaml +0 -0
  32. psychopy/alerts/alertsCatalogue/4051.yaml +19 -0
  33. psychopy/alerts/alertsCatalogue/4052.yaml +19 -0
  34. psychopy/alerts/alertsCatalogue/4100.yaml +0 -0
  35. psychopy/alerts/alertsCatalogue/4105.yaml +18 -0
  36. psychopy/alerts/alertsCatalogue/4115.yaml +21 -0
  37. psychopy/alerts/alertsCatalogue/4120.yaml +19 -0
  38. psychopy/alerts/alertsCatalogue/4125.yaml +23 -0
  39. psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
  40. psychopy/alerts/alertsCatalogue/4160.yaml +25 -0
  41. psychopy/alerts/alertsCatalogue/4200.yaml +0 -0
  42. psychopy/alerts/alertsCatalogue/4205.yaml +19 -0
  43. psychopy/alerts/alertsCatalogue/4210.yaml +19 -0
  44. psychopy/alerts/alertsCatalogue/4305.yaml +21 -0
  45. psychopy/alerts/alertsCatalogue/4310.yaml +21 -0
  46. psychopy/alerts/alertsCatalogue/4315.yaml +21 -0
  47. psychopy/alerts/alertsCatalogue/4320.yaml +19 -0
  48. psychopy/alerts/alertsCatalogue/4325.yaml +23 -0
  49. psychopy/alerts/alertsCatalogue/4330.yaml +19 -0
  50. psychopy/alerts/alertsCatalogue/4335.yaml +19 -0
  51. psychopy/alerts/alertsCatalogue/4340.yaml +19 -0
  52. psychopy/alerts/alertsCatalogue/4405.yaml +24 -0
  53. psychopy/alerts/alertsCatalogue/4505.yaml +22 -0
  54. psychopy/alerts/alertsCatalogue/4510.yaml +25 -0
  55. psychopy/alerts/alertsCatalogue/4520.yaml +26 -0
  56. psychopy/alerts/alertsCatalogue/4530.yaml +23 -0
  57. psychopy/alerts/alertsCatalogue/4540.yaml +19 -0
  58. psychopy/alerts/alertsCatalogue/4545.yaml +22 -0
  59. psychopy/alerts/alertsCatalogue/4550.yaml +19 -0
  60. psychopy/alerts/alertsCatalogue/4605.yaml +22 -0
  61. psychopy/alerts/alertsCatalogue/4610.yaml +22 -0
  62. psychopy/alerts/alertsCatalogue/4615.yaml +19 -0
  63. psychopy/alerts/alertsCatalogue/4705.yaml +19 -0
  64. psychopy/alerts/alertsCatalogue/4710.yaml +19 -0
  65. psychopy/alerts/alertsCatalogue/4810.yaml +19 -0
  66. psychopy/alerts/alertsCatalogue/5000.yaml +0 -0
  67. psychopy/alerts/alertsCatalogue/5055.yaml +25 -0
  68. psychopy/alerts/alertsCatalogue/6000.yaml +0 -0
  69. psychopy/alerts/alertsCatalogue/6105.yaml +18 -0
  70. psychopy/alerts/alertsCatalogue/7105.yaml +19 -0
  71. psychopy/alerts/alertsCatalogue/8105.yaml +21 -0
  72. psychopy/alerts/alertsCatalogue/8110.yaml +21 -0
  73. psychopy/alerts/alertsCatalogue/9998.yaml +19 -0
  74. psychopy/alerts/alertsCatalogue/9999.yaml +19 -0
  75. psychopy/alerts/alertsCatalogue/alertCategories.yaml +123 -0
  76. psychopy/alerts/alertsCatalogue/alertTemplate.yaml +19 -0
  77. psychopy/alerts/alertsCatalogue/alertmsg.py +173 -0
  78. psychopy/alerts/alertsCatalogue/generateAlertmsg.py +34 -0
  79. psychopy/alerts/alerttools.py +322 -0
  80. psychopy/app/Resources/README.md +12 -0
  81. psychopy/app/Resources/__init__.py +0 -0
  82. psychopy/app/Resources/betasplash.png +0 -0
  83. psychopy/app/Resources/betasplash@2x.png +0 -0
  84. psychopy/app/Resources/builder.ico +0 -0
  85. psychopy/app/Resources/classic/FlowBottom_CompLeft.png +0 -0
  86. psychopy/app/Resources/classic/FlowBottom_CompRight.png +0 -0
  87. psychopy/app/Resources/classic/FlowTop_CompLeft.png +0 -0
  88. psychopy/app/Resources/classic/FlowTop_CompRight.png +0 -0
  89. psychopy/app/Resources/classic/README.txt +9 -0
  90. psychopy/app/Resources/classic/__init__.py +0 -0
  91. psychopy/app/Resources/classic/_layouts.ai +1138 -1
  92. psychopy/app/Resources/classic/add.png +0 -0
  93. psychopy/app/Resources/classic/add@2x.png +0 -0
  94. psychopy/app/Resources/classic/addExp32.png +0 -0
  95. psychopy/app/Resources/classic/add_many.png +0 -0
  96. psychopy/app/Resources/classic/add_many@2x.png +0 -0
  97. psychopy/app/Resources/classic/alerts.png +0 -0
  98. psychopy/app/Resources/classic/beta.png +0 -0
  99. psychopy/app/Resources/classic/browser.png +0 -0
  100. psychopy/app/Resources/classic/browser@2x.png +0 -0
  101. psychopy/app/Resources/classic/bug16.png +0 -0
  102. psychopy/app/Resources/classic/case.png +0 -0
  103. psychopy/app/Resources/classic/case@2x.png +0 -0
  104. psychopy/app/Resources/classic/circle_mask.png +0 -0
  105. psychopy/app/Resources/classic/circle_mask@2x.png +0 -0
  106. psychopy/app/Resources/classic/clear.png +0 -0
  107. psychopy/app/Resources/classic/clear@2x.png +0 -0
  108. psychopy/app/Resources/classic/coderclass16.png +0 -0
  109. psychopy/app/Resources/classic/coderfunc16.png +0 -0
  110. psychopy/app/Resources/classic/coderimport16.png +0 -0
  111. psychopy/app/Resources/classic/coderjs16.png +0 -0
  112. psychopy/app/Resources/classic/coderpython16.png +0 -0
  113. psychopy/app/Resources/classic/codervar16.png +0 -0
  114. psychopy/app/Resources/classic/cogwindow32.png +0 -0
  115. psychopy/app/Resources/classic/color32.png +0 -0
  116. psychopy/app/Resources/classic/compile32.png +0 -0
  117. psychopy/app/Resources/classic/compile_js.png +0 -0
  118. psychopy/app/Resources/classic/compile_js@2x.png +0 -0
  119. psychopy/app/Resources/classic/compile_py.png +0 -0
  120. psychopy/app/Resources/classic/compile_py@2x.png +0 -0
  121. psychopy/app/Resources/classic/copy16.png +0 -0
  122. psychopy/app/Resources/classic/currentFile.png +0 -0
  123. psychopy/app/Resources/classic/currentFile@2x.png +0 -0
  124. psychopy/app/Resources/classic/delete16.png +0 -0
  125. psychopy/app/Resources/classic/desktop.png +0 -0
  126. psychopy/app/Resources/classic/desktop@2x.png +0 -0
  127. psychopy/app/Resources/classic/devices.png +0 -0
  128. psychopy/app/Resources/classic/devices@2x.png +0 -0
  129. psychopy/app/Resources/classic/dirup16.png +0 -0
  130. psychopy/app/Resources/classic/docclose16.png +0 -0
  131. psychopy/app/Resources/classic/download.png +0 -0
  132. psychopy/app/Resources/classic/edit.png +0 -0
  133. psychopy/app/Resources/classic/edit@2x.png +0 -0
  134. psychopy/app/Resources/classic/editbtn.png +0 -0
  135. psychopy/app/Resources/classic/editbtn16.png +0 -0
  136. psychopy/app/Resources/classic/editbtn16@2x.png +0 -0
  137. psychopy/app/Resources/classic/editbtn@2x.png +0 -0
  138. psychopy/app/Resources/classic/email.png +0 -0
  139. psychopy/app/Resources/classic/email@2x.png +0 -0
  140. psychopy/app/Resources/classic/experiment.png +0 -0
  141. psychopy/app/Resources/classic/experiment@2x.png +0 -0
  142. psychopy/app/Resources/classic/expsettings.png +0 -0
  143. psychopy/app/Resources/classic/expsettings@2x.png +0 -0
  144. psychopy/app/Resources/classic/file.png +0 -0
  145. psychopy/app/Resources/classic/file@2x.png +0 -0
  146. psychopy/app/Resources/classic/fileaudio.png +0 -0
  147. psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
  148. psychopy/app/Resources/classic/filecss.png +0 -0
  149. psychopy/app/Resources/classic/filecss@2x.png +0 -0
  150. psychopy/app/Resources/classic/filecsv.png +0 -0
  151. psychopy/app/Resources/classic/filecsv@2x.png +0 -0
  152. psychopy/app/Resources/classic/filedesign.png +0 -0
  153. psychopy/app/Resources/classic/filedesign@2x.png +0 -0
  154. psychopy/app/Resources/classic/filefont.png +0 -0
  155. psychopy/app/Resources/classic/filefont@2x.png +0 -0
  156. psychopy/app/Resources/classic/filegit.png +0 -0
  157. psychopy/app/Resources/classic/filegit@2x.png +0 -0
  158. psychopy/app/Resources/classic/filehtml.png +0 -0
  159. psychopy/app/Resources/classic/filehtml@2x.png +0 -0
  160. psychopy/app/Resources/classic/fileimage.png +0 -0
  161. psychopy/app/Resources/classic/fileimage@2x.png +0 -0
  162. psychopy/app/Resources/classic/fileinfo.png +0 -0
  163. psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
  164. psychopy/app/Resources/classic/filejs.png +0 -0
  165. psychopy/app/Resources/classic/filejs@2x.png +0 -0
  166. psychopy/app/Resources/classic/filejson.png +0 -0
  167. psychopy/app/Resources/classic/filejson@2x.png +0 -0
  168. psychopy/app/Resources/classic/filenew.png +0 -0
  169. psychopy/app/Resources/classic/filenew32.png +0 -0
  170. psychopy/app/Resources/classic/filenew@2x.png +0 -0
  171. psychopy/app/Resources/classic/fileopen.png +0 -0
  172. psychopy/app/Resources/classic/fileopen32.png +0 -0
  173. psychopy/app/Resources/classic/fileopen@2x.png +0 -0
  174. psychopy/app/Resources/classic/filepkg.png +0 -0
  175. psychopy/app/Resources/classic/filepkg@2x.png +0 -0
  176. psychopy/app/Resources/classic/filepsyexp.png +0 -0
  177. psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
  178. psychopy/app/Resources/classic/filepy.png +0 -0
  179. psychopy/app/Resources/classic/filepy@2x.png +0 -0
  180. psychopy/app/Resources/classic/filesave.png +0 -0
  181. psychopy/app/Resources/classic/filesave32.png +0 -0
  182. psychopy/app/Resources/classic/filesave@2x.png +0 -0
  183. psychopy/app/Resources/classic/filesaveas.png +0 -0
  184. psychopy/app/Resources/classic/filesaveas32.png +0 -0
  185. psychopy/app/Resources/classic/filesaveas@2x.png +0 -0
  186. psychopy/app/Resources/classic/filetxt.png +0 -0
  187. psychopy/app/Resources/classic/filetxt@2x.png +0 -0
  188. psychopy/app/Resources/classic/fileunknown.png +0 -0
  189. psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
  190. psychopy/app/Resources/classic/filevideo.png +0 -0
  191. psychopy/app/Resources/classic/filevideo@2x.png +0 -0
  192. psychopy/app/Resources/classic/filter.png +0 -0
  193. psychopy/app/Resources/classic/filter@2x.png +0 -0
  194. psychopy/app/Resources/classic/find.png +0 -0
  195. psychopy/app/Resources/classic/find@2x.png +0 -0
  196. psychopy/app/Resources/classic/folder-open16.png +0 -0
  197. psychopy/app/Resources/classic/folder16.png +0 -0
  198. psychopy/app/Resources/classic/foldernew16.png +0 -0
  199. psychopy/app/Resources/classic/fork.png +0 -0
  200. psychopy/app/Resources/classic/fork@2x.png +0 -0
  201. psychopy/app/Resources/classic/github.png +0 -0
  202. psychopy/app/Resources/classic/github@2x.png +0 -0
  203. psychopy/app/Resources/classic/globe.png +0 -0
  204. psychopy/app/Resources/classic/globe@2x.png +0 -0
  205. psychopy/app/Resources/classic/globe_bug.png +0 -0
  206. psychopy/app/Resources/classic/globe_bug@2x.png +0 -0
  207. psychopy/app/Resources/classic/globe_greensync.png +0 -0
  208. psychopy/app/Resources/classic/globe_greensync@2x.png +0 -0
  209. psychopy/app/Resources/classic/globe_info.png +0 -0
  210. psychopy/app/Resources/classic/globe_info@2x.png +0 -0
  211. psychopy/app/Resources/classic/globe_magnifier.png +0 -0
  212. psychopy/app/Resources/classic/globe_magnifier@2x.png +0 -0
  213. psychopy/app/Resources/classic/globe_run.png +0 -0
  214. psychopy/app/Resources/classic/globe_run@2x.png +0 -0
  215. psychopy/app/Resources/classic/globe_user.png +0 -0
  216. psychopy/app/Resources/classic/globe_user@2x.png +0 -0
  217. psychopy/app/Resources/classic/goto16.png +0 -0
  218. psychopy/app/Resources/classic/greendot.png +0 -0
  219. psychopy/app/Resources/classic/greendot@2x.png +0 -0
  220. psychopy/app/Resources/classic/greenglobe.png +0 -0
  221. psychopy/app/Resources/classic/greenglobe@2x.png +0 -0
  222. psychopy/app/Resources/classic/greenglobe_bug.png +0 -0
  223. psychopy/app/Resources/classic/greenglobe_bug@2x.png +0 -0
  224. psychopy/app/Resources/classic/greenglobe_greensync.png +0 -0
  225. psychopy/app/Resources/classic/greenglobe_greensync@2x.png +0 -0
  226. psychopy/app/Resources/classic/greenglobe_info.png +0 -0
  227. psychopy/app/Resources/classic/greenglobe_info@2x.png +0 -0
  228. psychopy/app/Resources/classic/greenglobe_magnifier.png +0 -0
  229. psychopy/app/Resources/classic/greenglobe_magnifier@2x.png +0 -0
  230. psychopy/app/Resources/classic/greenglobe_run.png +0 -0
  231. psychopy/app/Resources/classic/greenglobe_run@2x.png +0 -0
  232. psychopy/app/Resources/classic/greenglobe_user.png +0 -0
  233. psychopy/app/Resources/classic/greenglobe_user@2x.png +0 -0
  234. psychopy/app/Resources/classic/greydot.png +0 -0
  235. psychopy/app/Resources/classic/greydot@2x.png +0 -0
  236. psychopy/app/Resources/classic/greytick.png +0 -0
  237. psychopy/app/Resources/classic/greytick@2x.png +0 -0
  238. psychopy/app/Resources/classic/invalid_img.png +0 -0
  239. psychopy/app/Resources/classic/jsPilot.png +0 -0
  240. psychopy/app/Resources/classic/jsPilot@2x.png +0 -0
  241. psychopy/app/Resources/classic/jsRun.png +0 -0
  242. psychopy/app/Resources/classic/jsRun@2x.png +0 -0
  243. psychopy/app/Resources/classic/libroot.png +0 -0
  244. psychopy/app/Resources/classic/libroot@2x.png +0 -0
  245. psychopy/app/Resources/classic/loop.png +0 -0
  246. psychopy/app/Resources/classic/loop@2x.png +0 -0
  247. psychopy/app/Resources/classic/monitor16.png +0 -0
  248. psychopy/app/Resources/classic/monitors.png +0 -0
  249. psychopy/app/Resources/classic/monitors16.png +0 -0
  250. psychopy/app/Resources/classic/monitors32.png +0 -0
  251. psychopy/app/Resources/classic/monitors@2x.png +0 -0
  252. psychopy/app/Resources/classic/orangedot.png +0 -0
  253. psychopy/app/Resources/classic/orangedot@2x.png +0 -0
  254. psychopy/app/Resources/classic/pavlovia.png +0 -0
  255. psychopy/app/Resources/classic/pavlovia16.png +0 -0
  256. psychopy/app/Resources/classic/pavlovia16@2x.png +0 -0
  257. psychopy/app/Resources/classic/pavlovia@2x.png +0 -0
  258. psychopy/app/Resources/classic/pavsync.png +0 -0
  259. psychopy/app/Resources/classic/pavsync@2x.png +0 -0
  260. psychopy/app/Resources/classic/person_off.png +0 -0
  261. psychopy/app/Resources/classic/person_off@2x.png +0 -0
  262. psychopy/app/Resources/classic/person_on.png +0 -0
  263. psychopy/app/Resources/classic/person_on@2x.png +0 -0
  264. psychopy/app/Resources/classic/photometer.png +0 -0
  265. psychopy/app/Resources/classic/photometer@2x.png +0 -0
  266. psychopy/app/Resources/classic/plugin16.png +0 -0
  267. psychopy/app/Resources/classic/plugin16@2x.png +0 -0
  268. psychopy/app/Resources/classic/plugins32.png +0 -0
  269. psychopy/app/Resources/classic/plus.png +0 -0
  270. psychopy/app/Resources/classic/plus@2x.png +0 -0
  271. psychopy/app/Resources/classic/preferences-app.png +0 -0
  272. psychopy/app/Resources/classic/preferences-app48.png +0 -0
  273. psychopy/app/Resources/classic/preferences-app@2x.png +0 -0
  274. psychopy/app/Resources/classic/preferences-conn.png +0 -0
  275. psychopy/app/Resources/classic/preferences-conn48.png +0 -0
  276. psychopy/app/Resources/classic/preferences-conn@2x.png +0 -0
  277. psychopy/app/Resources/classic/preferences-debug.png +0 -0
  278. psychopy/app/Resources/classic/preferences-debug@2x.png +0 -0
  279. psychopy/app/Resources/classic/preferences-general.png +0 -0
  280. psychopy/app/Resources/classic/preferences-general48.png +0 -0
  281. psychopy/app/Resources/classic/preferences-general@2x.png +0 -0
  282. psychopy/app/Resources/classic/preferences-hardware.png +0 -0
  283. psychopy/app/Resources/classic/preferences-hardware48.png +0 -0
  284. psychopy/app/Resources/classic/preferences-hardware@2x.png +0 -0
  285. psychopy/app/Resources/classic/preferences-keyboard.png +0 -0
  286. psychopy/app/Resources/classic/preferences-keyboard48.png +0 -0
  287. psychopy/app/Resources/classic/preferences-keyboard@2x.png +0 -0
  288. psychopy/app/Resources/classic/preferences-pilot.png +0 -0
  289. psychopy/app/Resources/classic/preferences-pilot@2x.png +0 -0
  290. psychopy/app/Resources/classic/preferences32.png +0 -0
  291. psychopy/app/Resources/classic/pyPilot.png +0 -0
  292. psychopy/app/Resources/classic/pyPilot@2x.png +0 -0
  293. psychopy/app/Resources/classic/pyRun.png +0 -0
  294. psychopy/app/Resources/classic/pyRun@2x.png +0 -0
  295. psychopy/app/Resources/classic/reddot.png +0 -0
  296. psychopy/app/Resources/classic/reddot@2x.png +0 -0
  297. psychopy/app/Resources/classic/redglobe.png +0 -0
  298. psychopy/app/Resources/classic/redglobe@2x.png +0 -0
  299. psychopy/app/Resources/classic/redglobe_bug.png +0 -0
  300. psychopy/app/Resources/classic/redglobe_bug@2x.png +0 -0
  301. psychopy/app/Resources/classic/redglobe_greensync.png +0 -0
  302. psychopy/app/Resources/classic/redglobe_greensync@2x.png +0 -0
  303. psychopy/app/Resources/classic/redglobe_info.png +0 -0
  304. psychopy/app/Resources/classic/redglobe_info@2x.png +0 -0
  305. psychopy/app/Resources/classic/redglobe_magnifier.png +0 -0
  306. psychopy/app/Resources/classic/redglobe_magnifier@2x.png +0 -0
  307. psychopy/app/Resources/classic/redglobe_run.png +0 -0
  308. psychopy/app/Resources/classic/redglobe_run@2x.png +0 -0
  309. psychopy/app/Resources/classic/redglobe_user.png +0 -0
  310. psychopy/app/Resources/classic/redglobe_user@2x.png +0 -0
  311. psychopy/app/Resources/classic/redo.png +0 -0
  312. psychopy/app/Resources/classic/redo32.png +0 -0
  313. psychopy/app/Resources/classic/redo@2x.png +0 -0
  314. psychopy/app/Resources/classic/regex.png +0 -0
  315. psychopy/app/Resources/classic/regex@2x.png +0 -0
  316. psychopy/app/Resources/classic/removeExp32.png +0 -0
  317. psychopy/app/Resources/classic/rename16.png +0 -0
  318. psychopy/app/Resources/classic/restart.png +0 -0
  319. psychopy/app/Resources/classic/restart@2x.png +0 -0
  320. psychopy/app/Resources/classic/run.png +0 -0
  321. psychopy/app/Resources/classic/run@2x.png +0 -0
  322. psychopy/app/Resources/classic/runner.png +0 -0
  323. psychopy/app/Resources/classic/runner@2x.png +0 -0
  324. psychopy/app/Resources/classic/runnerPilot.png +0 -0
  325. psychopy/app/Resources/classic/runnerPilot@2x.png +0 -0
  326. psychopy/app/Resources/classic/savebtn.png +0 -0
  327. psychopy/app/Resources/classic/savebtn16.png +0 -0
  328. psychopy/app/Resources/classic/savebtn16@2x.png +0 -0
  329. psychopy/app/Resources/classic/savebtn@2x.png +0 -0
  330. psychopy/app/Resources/classic/search.png +0 -0
  331. psychopy/app/Resources/classic/search@2x.png +0 -0
  332. psychopy/app/Resources/classic/showBuilder.png +0 -0
  333. psychopy/app/Resources/classic/showBuilder@2x.png +0 -0
  334. psychopy/app/Resources/classic/showCoder.png +0 -0
  335. psychopy/app/Resources/classic/showCoder@2x.png +0 -0
  336. psychopy/app/Resources/classic/showRunner.png +0 -0
  337. psychopy/app/Resources/classic/showRunner@2x.png +0 -0
  338. psychopy/app/Resources/classic/starred.png +0 -0
  339. psychopy/app/Resources/classic/starred@2x.png +0 -0
  340. psychopy/app/Resources/classic/start.png +0 -0
  341. psychopy/app/Resources/classic/start@2x.png +0 -0
  342. psychopy/app/Resources/classic/stdout.png +0 -0
  343. psychopy/app/Resources/classic/stop.png +0 -0
  344. psychopy/app/Resources/classic/stop32.png +0 -0
  345. psychopy/app/Resources/classic/stop@2x.png +0 -0
  346. psychopy/app/Resources/classic/switchCtrlBot.png +0 -0
  347. psychopy/app/Resources/classic/switchCtrlBot@2x.png +0 -0
  348. psychopy/app/Resources/classic/switchCtrlLeft.png +0 -0
  349. psychopy/app/Resources/classic/switchCtrlLeft@2x.png +0 -0
  350. psychopy/app/Resources/classic/switchCtrlRight.png +0 -0
  351. psychopy/app/Resources/classic/switchCtrlRight@2x.png +0 -0
  352. psychopy/app/Resources/classic/switchCtrlTop.png +0 -0
  353. psychopy/app/Resources/classic/switchCtrlTop@2x.png +0 -0
  354. psychopy/app/Resources/classic/tick.png +0 -0
  355. psychopy/app/Resources/classic/tick@2x.png +0 -0
  356. psychopy/app/Resources/classic/undo.png +0 -0
  357. psychopy/app/Resources/classic/undo32.png +0 -0
  358. psychopy/app/Resources/classic/undo@2x.png +0 -0
  359. psychopy/app/Resources/classic/unstarred.png +0 -0
  360. psychopy/app/Resources/classic/unstarred@2x.png +0 -0
  361. psychopy/app/Resources/classic/user_none.png +0 -0
  362. psychopy/app/Resources/classic/view-refresh16.png +0 -0
  363. psychopy/app/Resources/classic/viewbtn.png +0 -0
  364. psychopy/app/Resources/classic/viewbtn16.png +0 -0
  365. psychopy/app/Resources/classic/viewbtn16@2x.png +0 -0
  366. psychopy/app/Resources/classic/viewbtn@2x.png +0 -0
  367. psychopy/app/Resources/classic/windows16.png +0 -0
  368. psychopy/app/Resources/classic/windows16@2x.png +0 -0
  369. psychopy/app/Resources/coder.ico +0 -0
  370. psychopy/app/Resources/dark/FlowBottom_CompLeft.png +0 -0
  371. psychopy/app/Resources/dark/FlowBottom_CompRight.png +0 -0
  372. psychopy/app/Resources/dark/FlowTop_CompLeft.png +0 -0
  373. psychopy/app/Resources/dark/FlowTop_CompRight.png +0 -0
  374. psychopy/app/Resources/dark/README.txt +3 -0
  375. psychopy/app/Resources/dark/__init__.py +0 -0
  376. psychopy/app/Resources/dark/add.png +0 -0
  377. psychopy/app/Resources/dark/add@2x.png +0 -0
  378. psychopy/app/Resources/dark/addExp32.png +0 -0
  379. psychopy/app/Resources/dark/addExp32@2x.png +0 -0
  380. psychopy/app/Resources/dark/add_many.png +0 -0
  381. psychopy/app/Resources/dark/add_many@2x.png +0 -0
  382. psychopy/app/Resources/dark/alerts.png +0 -0
  383. psychopy/app/Resources/dark/alerts@2x.png +0 -0
  384. psychopy/app/Resources/dark/beta.png +0 -0
  385. psychopy/app/Resources/dark/beta@2x.png +0 -0
  386. psychopy/app/Resources/dark/browser.png +0 -0
  387. psychopy/app/Resources/dark/browser@2x.png +0 -0
  388. psychopy/app/Resources/dark/bug16.png +0 -0
  389. psychopy/app/Resources/dark/bug16@2x.png +0 -0
  390. psychopy/app/Resources/dark/case.png +0 -0
  391. psychopy/app/Resources/dark/case@2x.png +0 -0
  392. psychopy/app/Resources/dark/circle_mask.png +0 -0
  393. psychopy/app/Resources/dark/circle_mask@2x.png +0 -0
  394. psychopy/app/Resources/dark/clear.png +0 -0
  395. psychopy/app/Resources/dark/clear@2x.png +0 -0
  396. psychopy/app/Resources/dark/coderclass16.png +0 -0
  397. psychopy/app/Resources/dark/coderclass16@2x.png +0 -0
  398. psychopy/app/Resources/dark/coderfunc16.png +0 -0
  399. psychopy/app/Resources/dark/coderfunc16@2x.png +0 -0
  400. psychopy/app/Resources/dark/coderimport16.png +0 -0
  401. psychopy/app/Resources/dark/coderimport16@2x.png +0 -0
  402. psychopy/app/Resources/dark/coderjs.png +0 -0
  403. psychopy/app/Resources/dark/coderjs@2x.png +0 -0
  404. psychopy/app/Resources/dark/coderpython.png +0 -0
  405. psychopy/app/Resources/dark/coderpython@2x.png +0 -0
  406. psychopy/app/Resources/dark/codervar16.png +0 -0
  407. psychopy/app/Resources/dark/codervar16@2x.png +0 -0
  408. psychopy/app/Resources/dark/cogwindow32.png +0 -0
  409. psychopy/app/Resources/dark/cogwindow32@2x.png +0 -0
  410. psychopy/app/Resources/dark/color32.png +0 -0
  411. psychopy/app/Resources/dark/color32@2x.png +0 -0
  412. psychopy/app/Resources/dark/compile_js.png +0 -0
  413. psychopy/app/Resources/dark/compile_js@2x.png +0 -0
  414. psychopy/app/Resources/dark/compile_py.png +0 -0
  415. psychopy/app/Resources/dark/compile_py@2x.png +0 -0
  416. psychopy/app/Resources/dark/copy16.png +0 -0
  417. psychopy/app/Resources/dark/copy16@2x.png +0 -0
  418. psychopy/app/Resources/dark/currentFile16.png +0 -0
  419. psychopy/app/Resources/dark/currentFile16@2x.png +0 -0
  420. psychopy/app/Resources/dark/delete16.png +0 -0
  421. psychopy/app/Resources/dark/delete16@2x.png +0 -0
  422. psychopy/app/Resources/dark/desktop.png +0 -0
  423. psychopy/app/Resources/dark/desktop@2x.png +0 -0
  424. psychopy/app/Resources/dark/devices.png +0 -0
  425. psychopy/app/Resources/dark/devices@2x.png +0 -0
  426. psychopy/app/Resources/dark/dirup16.png +0 -0
  427. psychopy/app/Resources/dark/dirup16@2x.png +0 -0
  428. psychopy/app/Resources/dark/docclose16.png +0 -0
  429. psychopy/app/Resources/dark/docclose16@2x.png +0 -0
  430. psychopy/app/Resources/dark/download.png +0 -0
  431. psychopy/app/Resources/dark/download@2x.png +0 -0
  432. psychopy/app/Resources/dark/edit.png +0 -0
  433. psychopy/app/Resources/dark/edit@2x.png +0 -0
  434. psychopy/app/Resources/dark/editbtn16.png +0 -0
  435. psychopy/app/Resources/dark/editbtn16@2x.png +0 -0
  436. psychopy/app/Resources/dark/email.png +0 -0
  437. psychopy/app/Resources/dark/email@2x.png +0 -0
  438. psychopy/app/Resources/dark/experiment.png +0 -0
  439. psychopy/app/Resources/dark/experiment@2x.png +0 -0
  440. psychopy/app/Resources/dark/expsettings.png +0 -0
  441. psychopy/app/Resources/dark/expsettings@2x.png +0 -0
  442. psychopy/app/Resources/dark/file.png +0 -0
  443. psychopy/app/Resources/dark/file@16w.png +0 -0
  444. psychopy/app/Resources/dark/file@16w@2x.png +0 -0
  445. psychopy/app/Resources/dark/file@2x.png +0 -0
  446. psychopy/app/Resources/dark/fileaudio.png +0 -0
  447. psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
  448. psychopy/app/Resources/dark/filecss.png +0 -0
  449. psychopy/app/Resources/dark/filecss@2x.png +0 -0
  450. psychopy/app/Resources/dark/filecsv.png +0 -0
  451. psychopy/app/Resources/dark/filecsv@2x.png +0 -0
  452. psychopy/app/Resources/dark/filedesign.png +0 -0
  453. psychopy/app/Resources/dark/filedesign@2x.png +0 -0
  454. psychopy/app/Resources/dark/filefont.png +0 -0
  455. psychopy/app/Resources/dark/filefont@2x.png +0 -0
  456. psychopy/app/Resources/dark/filegit.png +0 -0
  457. psychopy/app/Resources/dark/filegit@2x.png +0 -0
  458. psychopy/app/Resources/dark/filehtml.png +0 -0
  459. psychopy/app/Resources/dark/filehtml@2x.png +0 -0
  460. psychopy/app/Resources/dark/fileimage.png +0 -0
  461. psychopy/app/Resources/dark/fileimage@2x.png +0 -0
  462. psychopy/app/Resources/dark/fileinfo.png +0 -0
  463. psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
  464. psychopy/app/Resources/dark/filejs.png +0 -0
  465. psychopy/app/Resources/dark/filejs@2x.png +0 -0
  466. psychopy/app/Resources/dark/filejson.png +0 -0
  467. psychopy/app/Resources/dark/filejson@2x.png +0 -0
  468. psychopy/app/Resources/dark/filenew.png +0 -0
  469. psychopy/app/Resources/dark/filenew32.png +0 -0
  470. psychopy/app/Resources/dark/filenew32@2x.png +0 -0
  471. psychopy/app/Resources/dark/filenew@2x.png +0 -0
  472. psychopy/app/Resources/dark/fileopen.png +0 -0
  473. psychopy/app/Resources/dark/fileopen32.png +0 -0
  474. psychopy/app/Resources/dark/fileopen32@2x.png +0 -0
  475. psychopy/app/Resources/dark/fileopen@2x.png +0 -0
  476. psychopy/app/Resources/dark/filepkg.png +0 -0
  477. psychopy/app/Resources/dark/filepkg@2x.png +0 -0
  478. psychopy/app/Resources/dark/filepsyexp.png +0 -0
  479. psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
  480. psychopy/app/Resources/dark/filepy.png +0 -0
  481. psychopy/app/Resources/dark/filepy@2x.png +0 -0
  482. psychopy/app/Resources/dark/filesave.png +0 -0
  483. psychopy/app/Resources/dark/filesave32.png +0 -0
  484. psychopy/app/Resources/dark/filesave32@2x.png +0 -0
  485. psychopy/app/Resources/dark/filesave@2x.png +0 -0
  486. psychopy/app/Resources/dark/filesaveas.png +0 -0
  487. psychopy/app/Resources/dark/filesaveas32.png +0 -0
  488. psychopy/app/Resources/dark/filesaveas32@2x.png +0 -0
  489. psychopy/app/Resources/dark/filesaveas@2x.png +0 -0
  490. psychopy/app/Resources/dark/filetxt.png +0 -0
  491. psychopy/app/Resources/dark/filetxt@2x.png +0 -0
  492. psychopy/app/Resources/dark/fileunknown.png +0 -0
  493. psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
  494. psychopy/app/Resources/dark/filevideo.png +0 -0
  495. psychopy/app/Resources/dark/filevideo@2x.png +0 -0
  496. psychopy/app/Resources/dark/filter.png +0 -0
  497. psychopy/app/Resources/dark/filter@2x.png +0 -0
  498. psychopy/app/Resources/dark/find.png +0 -0
  499. psychopy/app/Resources/dark/find@2x.png +0 -0
  500. psychopy/app/Resources/dark/folder-open16.png +0 -0
  501. psychopy/app/Resources/dark/folder-open16@2x.png +0 -0
  502. psychopy/app/Resources/dark/folder16.png +0 -0
  503. psychopy/app/Resources/dark/folder16@2x.png +0 -0
  504. psychopy/app/Resources/dark/foldernew16.png +0 -0
  505. psychopy/app/Resources/dark/foldernew16@2x.png +0 -0
  506. psychopy/app/Resources/dark/fork.png +0 -0
  507. psychopy/app/Resources/dark/fork@2x.png +0 -0
  508. psychopy/app/Resources/dark/github.png +0 -0
  509. psychopy/app/Resources/dark/github@2x.png +0 -0
  510. psychopy/app/Resources/dark/globe.png +0 -0
  511. psychopy/app/Resources/dark/globe@2x.png +0 -0
  512. psychopy/app/Resources/dark/globe_bug.png +0 -0
  513. psychopy/app/Resources/dark/globe_bug@2x.png +0 -0
  514. psychopy/app/Resources/dark/globe_greensync.png +0 -0
  515. psychopy/app/Resources/dark/globe_greensync@2x.png +0 -0
  516. psychopy/app/Resources/dark/globe_info.png +0 -0
  517. psychopy/app/Resources/dark/globe_info@2x.png +0 -0
  518. psychopy/app/Resources/dark/globe_magnifier.png +0 -0
  519. psychopy/app/Resources/dark/globe_magnifier@2x.png +0 -0
  520. psychopy/app/Resources/dark/globe_run.png +0 -0
  521. psychopy/app/Resources/dark/globe_run@2x.png +0 -0
  522. psychopy/app/Resources/dark/globe_user.png +0 -0
  523. psychopy/app/Resources/dark/globe_user@2x.png +0 -0
  524. psychopy/app/Resources/dark/goto.png +0 -0
  525. psychopy/app/Resources/dark/goto@2x.png +0 -0
  526. psychopy/app/Resources/dark/greendot.png +0 -0
  527. psychopy/app/Resources/dark/greendot@2x.png +0 -0
  528. psychopy/app/Resources/dark/greenglobe.png +0 -0
  529. psychopy/app/Resources/dark/greenglobe@2x.png +0 -0
  530. psychopy/app/Resources/dark/greenglobe_bug.png +0 -0
  531. psychopy/app/Resources/dark/greenglobe_bug@2x.png +0 -0
  532. psychopy/app/Resources/dark/greenglobe_greensync.png +0 -0
  533. psychopy/app/Resources/dark/greenglobe_greensync@2x.png +0 -0
  534. psychopy/app/Resources/dark/greenglobe_info.png +0 -0
  535. psychopy/app/Resources/dark/greenglobe_info@2x.png +0 -0
  536. psychopy/app/Resources/dark/greenglobe_magnifier.png +0 -0
  537. psychopy/app/Resources/dark/greenglobe_magnifier@2x.png +0 -0
  538. psychopy/app/Resources/dark/greenglobe_run.png +0 -0
  539. psychopy/app/Resources/dark/greenglobe_run@2x.png +0 -0
  540. psychopy/app/Resources/dark/greenglobe_user.png +0 -0
  541. psychopy/app/Resources/dark/greenglobe_user@2x.png +0 -0
  542. psychopy/app/Resources/dark/greydot.png +0 -0
  543. psychopy/app/Resources/dark/greydot@2x.png +0 -0
  544. psychopy/app/Resources/dark/greytick.png +0 -0
  545. psychopy/app/Resources/dark/greytick@2x.png +0 -0
  546. psychopy/app/Resources/dark/invalid_img.png +0 -0
  547. psychopy/app/Resources/dark/jsPilot.png +0 -0
  548. psychopy/app/Resources/dark/jsPilot@2x.png +0 -0
  549. psychopy/app/Resources/dark/jsRun.png +0 -0
  550. psychopy/app/Resources/dark/jsRun@2x.png +0 -0
  551. psychopy/app/Resources/dark/libroot16.png +0 -0
  552. psychopy/app/Resources/dark/libroot16@2x.png +0 -0
  553. psychopy/app/Resources/dark/loop.png +0 -0
  554. psychopy/app/Resources/dark/loop@2x.png +0 -0
  555. psychopy/app/Resources/dark/monitor16.png +0 -0
  556. psychopy/app/Resources/dark/monitor16@2x.png +0 -0
  557. psychopy/app/Resources/dark/monitors.png +0 -0
  558. psychopy/app/Resources/dark/monitors32.png +0 -0
  559. psychopy/app/Resources/dark/monitors32@2x.png +0 -0
  560. psychopy/app/Resources/dark/monitors@2x.png +0 -0
  561. psychopy/app/Resources/dark/orangedot.png +0 -0
  562. psychopy/app/Resources/dark/orangedot@2x.png +0 -0
  563. psychopy/app/Resources/dark/pavlovia.png +0 -0
  564. psychopy/app/Resources/dark/pavlovia16.png +0 -0
  565. psychopy/app/Resources/dark/pavlovia16@2x.png +0 -0
  566. psychopy/app/Resources/dark/pavlovia@2x.png +0 -0
  567. psychopy/app/Resources/dark/pavsync.png +0 -0
  568. psychopy/app/Resources/dark/pavsync@2x.png +0 -0
  569. psychopy/app/Resources/dark/person_off.png +0 -0
  570. psychopy/app/Resources/dark/person_off@2x.png +0 -0
  571. psychopy/app/Resources/dark/person_on.png +0 -0
  572. psychopy/app/Resources/dark/person_on@2x.png +0 -0
  573. psychopy/app/Resources/dark/photometer.png +0 -0
  574. psychopy/app/Resources/dark/photometer@2x.png +0 -0
  575. psychopy/app/Resources/dark/plugin16.png +0 -0
  576. psychopy/app/Resources/dark/plugin16@2x.png +0 -0
  577. psychopy/app/Resources/dark/plugins32.png +0 -0
  578. psychopy/app/Resources/dark/plugins32@2x.png +0 -0
  579. psychopy/app/Resources/dark/plus.png +0 -0
  580. psychopy/app/Resources/dark/plus@2x.png +0 -0
  581. psychopy/app/Resources/dark/preferences-app.png +0 -0
  582. psychopy/app/Resources/dark/preferences-app48.png +0 -0
  583. psychopy/app/Resources/dark/preferences-app48@2x.png +0 -0
  584. psychopy/app/Resources/dark/preferences-app@2x.png +0 -0
  585. psychopy/app/Resources/dark/preferences-conn.png +0 -0
  586. psychopy/app/Resources/dark/preferences-conn48.png +0 -0
  587. psychopy/app/Resources/dark/preferences-conn48@2x.png +0 -0
  588. psychopy/app/Resources/dark/preferences-conn@2x.png +0 -0
  589. psychopy/app/Resources/dark/preferences-debug.png +0 -0
  590. psychopy/app/Resources/dark/preferences-debug@2x.png +0 -0
  591. psychopy/app/Resources/dark/preferences-general.png +0 -0
  592. psychopy/app/Resources/dark/preferences-general48.png +0 -0
  593. psychopy/app/Resources/dark/preferences-general48@2x.png +0 -0
  594. psychopy/app/Resources/dark/preferences-general@2x.png +0 -0
  595. psychopy/app/Resources/dark/preferences-hardware.png +0 -0
  596. psychopy/app/Resources/dark/preferences-hardware48.png +0 -0
  597. psychopy/app/Resources/dark/preferences-hardware48@2x.png +0 -0
  598. psychopy/app/Resources/dark/preferences-hardware@2x.png +0 -0
  599. psychopy/app/Resources/dark/preferences-keyboard.png +0 -0
  600. psychopy/app/Resources/dark/preferences-keyboard48.png +0 -0
  601. psychopy/app/Resources/dark/preferences-keyboard48@2x.png +0 -0
  602. psychopy/app/Resources/dark/preferences-keyboard@2x.png +0 -0
  603. psychopy/app/Resources/dark/preferences-pilot.png +0 -0
  604. psychopy/app/Resources/dark/preferences-pilot@2x.png +0 -0
  605. psychopy/app/Resources/dark/preferences32.png +0 -0
  606. psychopy/app/Resources/dark/preferences32@2x.png +0 -0
  607. psychopy/app/Resources/dark/pyPilot.png +0 -0
  608. psychopy/app/Resources/dark/pyPilot@2x.png +0 -0
  609. psychopy/app/Resources/dark/pyRun.png +0 -0
  610. psychopy/app/Resources/dark/pyRun@2x.png +0 -0
  611. psychopy/app/Resources/dark/reddot.png +0 -0
  612. psychopy/app/Resources/dark/reddot@2x.png +0 -0
  613. psychopy/app/Resources/dark/redglobe.png +0 -0
  614. psychopy/app/Resources/dark/redglobe@2x.png +0 -0
  615. psychopy/app/Resources/dark/redglobe_bug.png +0 -0
  616. psychopy/app/Resources/dark/redglobe_bug@2x.png +0 -0
  617. psychopy/app/Resources/dark/redglobe_greensync.png +0 -0
  618. psychopy/app/Resources/dark/redglobe_greensync@2x.png +0 -0
  619. psychopy/app/Resources/dark/redglobe_info.png +0 -0
  620. psychopy/app/Resources/dark/redglobe_info@2x.png +0 -0
  621. psychopy/app/Resources/dark/redglobe_magnifier.png +0 -0
  622. psychopy/app/Resources/dark/redglobe_magnifier@2x.png +0 -0
  623. psychopy/app/Resources/dark/redglobe_run.png +0 -0
  624. psychopy/app/Resources/dark/redglobe_run@2x.png +0 -0
  625. psychopy/app/Resources/dark/redglobe_user.png +0 -0
  626. psychopy/app/Resources/dark/redglobe_user@2x.png +0 -0
  627. psychopy/app/Resources/dark/redo.png +0 -0
  628. psychopy/app/Resources/dark/redo32.png +0 -0
  629. psychopy/app/Resources/dark/redo32@2x.png +0 -0
  630. psychopy/app/Resources/dark/redo@2x.png +0 -0
  631. psychopy/app/Resources/dark/regex.png +0 -0
  632. psychopy/app/Resources/dark/regex@2x.png +0 -0
  633. psychopy/app/Resources/dark/removeExp32.png +0 -0
  634. psychopy/app/Resources/dark/removeExp32@2x.png +0 -0
  635. psychopy/app/Resources/dark/rename16.png +0 -0
  636. psychopy/app/Resources/dark/rename16@2x.png +0 -0
  637. psychopy/app/Resources/dark/restart.png +0 -0
  638. psychopy/app/Resources/dark/restart@2x.png +0 -0
  639. psychopy/app/Resources/dark/runner.png +0 -0
  640. psychopy/app/Resources/dark/runner@2x.png +0 -0
  641. psychopy/app/Resources/dark/runnerPilot.png +0 -0
  642. psychopy/app/Resources/dark/runnerPilot@2x.png +0 -0
  643. psychopy/app/Resources/dark/savebtn16.png +0 -0
  644. psychopy/app/Resources/dark/savebtn16@2x.png +0 -0
  645. psychopy/app/Resources/dark/search.png +0 -0
  646. psychopy/app/Resources/dark/search@2x.png +0 -0
  647. psychopy/app/Resources/dark/showBuilder.png +0 -0
  648. psychopy/app/Resources/dark/showBuilder@2x.png +0 -0
  649. psychopy/app/Resources/dark/showCoder.png +0 -0
  650. psychopy/app/Resources/dark/showCoder@2x.png +0 -0
  651. psychopy/app/Resources/dark/showRunner.png +0 -0
  652. psychopy/app/Resources/dark/showRunner@2x.png +0 -0
  653. psychopy/app/Resources/dark/starred.png +0 -0
  654. psychopy/app/Resources/dark/starred@2x.png +0 -0
  655. psychopy/app/Resources/dark/start.png +0 -0
  656. psychopy/app/Resources/dark/start@2x.png +0 -0
  657. psychopy/app/Resources/dark/stdout.png +0 -0
  658. psychopy/app/Resources/dark/stdout@2x.png +0 -0
  659. psychopy/app/Resources/dark/stop.png +0 -0
  660. psychopy/app/Resources/dark/stop32.png +0 -0
  661. psychopy/app/Resources/dark/stop32@2x.png +0 -0
  662. psychopy/app/Resources/dark/stop@2x.png +0 -0
  663. psychopy/app/Resources/dark/switchCtrlBot.png +0 -0
  664. psychopy/app/Resources/dark/switchCtrlBot@2x.png +0 -0
  665. psychopy/app/Resources/dark/switchCtrlLeft.png +0 -0
  666. psychopy/app/Resources/dark/switchCtrlLeft@2x.png +0 -0
  667. psychopy/app/Resources/dark/switchCtrlRight.png +0 -0
  668. psychopy/app/Resources/dark/switchCtrlRight@2x.png +0 -0
  669. psychopy/app/Resources/dark/switchCtrlTop.png +0 -0
  670. psychopy/app/Resources/dark/switchCtrlTop@2x.png +0 -0
  671. psychopy/app/Resources/dark/tick.png +0 -0
  672. psychopy/app/Resources/dark/tick@2x.png +0 -0
  673. psychopy/app/Resources/dark/undo.png +0 -0
  674. psychopy/app/Resources/dark/undo32.png +0 -0
  675. psychopy/app/Resources/dark/undo32@2x.png +0 -0
  676. psychopy/app/Resources/dark/undo@2x.png +0 -0
  677. psychopy/app/Resources/dark/unstarred.png +0 -0
  678. psychopy/app/Resources/dark/unstarred@2x.png +0 -0
  679. psychopy/app/Resources/dark/user_none.png +0 -0
  680. psychopy/app/Resources/dark/view-refresh16.png +0 -0
  681. psychopy/app/Resources/dark/view-refresh16@2x.png +0 -0
  682. psychopy/app/Resources/dark/viewbtn16.png +0 -0
  683. psychopy/app/Resources/dark/viewbtn16@2x.png +0 -0
  684. psychopy/app/Resources/dark/windows16.png +0 -0
  685. psychopy/app/Resources/dark/windows16@2x.png +0 -0
  686. psychopy/app/Resources/light/FlowBottom_CompLeft.png +0 -0
  687. psychopy/app/Resources/light/FlowBottom_CompRight.png +0 -0
  688. psychopy/app/Resources/light/FlowTop_CompLeft.png +0 -0
  689. psychopy/app/Resources/light/FlowTop_CompRight.png +0 -0
  690. psychopy/app/Resources/light/README.txt +3 -0
  691. psychopy/app/Resources/light/__init__.py +0 -0
  692. psychopy/app/Resources/light/add.png +0 -0
  693. psychopy/app/Resources/light/add@2x.png +0 -0
  694. psychopy/app/Resources/light/addExp32.png +0 -0
  695. psychopy/app/Resources/light/addExp32@2x.png +0 -0
  696. psychopy/app/Resources/light/add_many.png +0 -0
  697. psychopy/app/Resources/light/add_many@2x.png +0 -0
  698. psychopy/app/Resources/light/alerts.png +0 -0
  699. psychopy/app/Resources/light/alerts@2x.png +0 -0
  700. psychopy/app/Resources/light/beta.png +0 -0
  701. psychopy/app/Resources/light/beta@2x.png +0 -0
  702. psychopy/app/Resources/light/browser.png +0 -0
  703. psychopy/app/Resources/light/browser@2x.png +0 -0
  704. psychopy/app/Resources/light/bug16.png +0 -0
  705. psychopy/app/Resources/light/bug16@2x.png +0 -0
  706. psychopy/app/Resources/light/case.png +0 -0
  707. psychopy/app/Resources/light/case@2x.png +0 -0
  708. psychopy/app/Resources/light/circle_mask.png +0 -0
  709. psychopy/app/Resources/light/circle_mask@2x.png +0 -0
  710. psychopy/app/Resources/light/clear.png +0 -0
  711. psychopy/app/Resources/light/clear@2x.png +0 -0
  712. psychopy/app/Resources/light/coderclass16.png +0 -0
  713. psychopy/app/Resources/light/coderclass16@2x.png +0 -0
  714. psychopy/app/Resources/light/coderfunc16.png +0 -0
  715. psychopy/app/Resources/light/coderfunc16@2x.png +0 -0
  716. psychopy/app/Resources/light/coderimport16.png +0 -0
  717. psychopy/app/Resources/light/coderimport16@2x.png +0 -0
  718. psychopy/app/Resources/light/coderjs.png +0 -0
  719. psychopy/app/Resources/light/coderjs@2x.png +0 -0
  720. psychopy/app/Resources/light/coderpython.png +0 -0
  721. psychopy/app/Resources/light/coderpython@2x.png +0 -0
  722. psychopy/app/Resources/light/codervar16.png +0 -0
  723. psychopy/app/Resources/light/codervar16@2x.png +0 -0
  724. psychopy/app/Resources/light/cogwindow32.png +0 -0
  725. psychopy/app/Resources/light/cogwindow32@2x.png +0 -0
  726. psychopy/app/Resources/light/color16.png +0 -0
  727. psychopy/app/Resources/light/color16@2x.png +0 -0
  728. psychopy/app/Resources/light/color32.png +0 -0
  729. psychopy/app/Resources/light/color32@2x.png +0 -0
  730. psychopy/app/Resources/light/compile_js.png +0 -0
  731. psychopy/app/Resources/light/compile_js@2x.png +0 -0
  732. psychopy/app/Resources/light/compile_py.png +0 -0
  733. psychopy/app/Resources/light/compile_py@2x.png +0 -0
  734. psychopy/app/Resources/light/copy16.png +0 -0
  735. psychopy/app/Resources/light/copy16@2x.png +0 -0
  736. psychopy/app/Resources/light/currentFile16.png +0 -0
  737. psychopy/app/Resources/light/currentFile16@2x.png +0 -0
  738. psychopy/app/Resources/light/delete16.png +0 -0
  739. psychopy/app/Resources/light/delete16@2x.png +0 -0
  740. psychopy/app/Resources/light/delete8.png +0 -0
  741. psychopy/app/Resources/light/desktop.png +0 -0
  742. psychopy/app/Resources/light/desktop@2x.png +0 -0
  743. psychopy/app/Resources/light/devices.png +0 -0
  744. psychopy/app/Resources/light/devices@2x.png +0 -0
  745. psychopy/app/Resources/light/dirup16.png +0 -0
  746. psychopy/app/Resources/light/dirup16@2x.png +0 -0
  747. psychopy/app/Resources/light/docclose16.png +0 -0
  748. psychopy/app/Resources/light/docclose16@2x.png +0 -0
  749. psychopy/app/Resources/light/download.png +0 -0
  750. psychopy/app/Resources/light/download@2x.png +0 -0
  751. psychopy/app/Resources/light/edit.png +0 -0
  752. psychopy/app/Resources/light/edit@2x.png +0 -0
  753. psychopy/app/Resources/light/editbtn16.png +0 -0
  754. psychopy/app/Resources/light/editbtn16@2x.png +0 -0
  755. psychopy/app/Resources/light/email.png +0 -0
  756. psychopy/app/Resources/light/email@2x.png +0 -0
  757. psychopy/app/Resources/light/experiment.png +0 -0
  758. psychopy/app/Resources/light/experiment@2x.png +0 -0
  759. psychopy/app/Resources/light/expsettings.png +0 -0
  760. psychopy/app/Resources/light/expsettings@2x.png +0 -0
  761. psychopy/app/Resources/light/file.png +0 -0
  762. psychopy/app/Resources/light/file@2x.png +0 -0
  763. psychopy/app/Resources/light/fileaudio.png +0 -0
  764. psychopy/app/Resources/light/fileaudio@2x.png +0 -0
  765. psychopy/app/Resources/light/filecss.png +0 -0
  766. psychopy/app/Resources/light/filecss@2x.png +0 -0
  767. psychopy/app/Resources/light/filecsv.png +0 -0
  768. psychopy/app/Resources/light/filecsv@2x.png +0 -0
  769. psychopy/app/Resources/light/filedesign.png +0 -0
  770. psychopy/app/Resources/light/filedesign@2x.png +0 -0
  771. psychopy/app/Resources/light/filefont.png +0 -0
  772. psychopy/app/Resources/light/filefont@2x.png +0 -0
  773. psychopy/app/Resources/light/filegit.png +0 -0
  774. psychopy/app/Resources/light/filegit@2x.png +0 -0
  775. psychopy/app/Resources/light/filehtml.png +0 -0
  776. psychopy/app/Resources/light/filehtml@2x.png +0 -0
  777. psychopy/app/Resources/light/fileimage.png +0 -0
  778. psychopy/app/Resources/light/fileimage@2x.png +0 -0
  779. psychopy/app/Resources/light/fileinfo.png +0 -0
  780. psychopy/app/Resources/light/fileinfo@2x.png +0 -0
  781. psychopy/app/Resources/light/filejs.png +0 -0
  782. psychopy/app/Resources/light/filejs@2x.png +0 -0
  783. psychopy/app/Resources/light/filejson.png +0 -0
  784. psychopy/app/Resources/light/filejson@2x.png +0 -0
  785. psychopy/app/Resources/light/filenew.png +0 -0
  786. psychopy/app/Resources/light/filenew32.png +0 -0
  787. psychopy/app/Resources/light/filenew32@2x.png +0 -0
  788. psychopy/app/Resources/light/filenew@2x.png +0 -0
  789. psychopy/app/Resources/light/fileopen.png +0 -0
  790. psychopy/app/Resources/light/fileopen32.png +0 -0
  791. psychopy/app/Resources/light/fileopen32@2x.png +0 -0
  792. psychopy/app/Resources/light/fileopen@2x.png +0 -0
  793. psychopy/app/Resources/light/filepkg.png +0 -0
  794. psychopy/app/Resources/light/filepkg@2x.png +0 -0
  795. psychopy/app/Resources/light/filepsyexp.png +0 -0
  796. psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
  797. psychopy/app/Resources/light/filepy.png +0 -0
  798. psychopy/app/Resources/light/filepy@2x.png +0 -0
  799. psychopy/app/Resources/light/filesave.png +0 -0
  800. psychopy/app/Resources/light/filesave32.png +0 -0
  801. psychopy/app/Resources/light/filesave32@2x.png +0 -0
  802. psychopy/app/Resources/light/filesave@2x.png +0 -0
  803. psychopy/app/Resources/light/filesaveas.png +0 -0
  804. psychopy/app/Resources/light/filesaveas32.png +0 -0
  805. psychopy/app/Resources/light/filesaveas32@2x.png +0 -0
  806. psychopy/app/Resources/light/filesaveas@2x.png +0 -0
  807. psychopy/app/Resources/light/filetxt.png +0 -0
  808. psychopy/app/Resources/light/filetxt@2x.png +0 -0
  809. psychopy/app/Resources/light/fileunknown.png +0 -0
  810. psychopy/app/Resources/light/fileunknown@2x.png +0 -0
  811. psychopy/app/Resources/light/filevideo.png +0 -0
  812. psychopy/app/Resources/light/filevideo@2x.png +0 -0
  813. psychopy/app/Resources/light/filter.png +0 -0
  814. psychopy/app/Resources/light/filter@2x.png +0 -0
  815. psychopy/app/Resources/light/find.png +0 -0
  816. psychopy/app/Resources/light/find@2x.png +0 -0
  817. psychopy/app/Resources/light/folder-open16.png +0 -0
  818. psychopy/app/Resources/light/folder-open16@2x.png +0 -0
  819. psychopy/app/Resources/light/folder16.png +0 -0
  820. psychopy/app/Resources/light/folder16@2x.png +0 -0
  821. psychopy/app/Resources/light/foldernew16.png +0 -0
  822. psychopy/app/Resources/light/foldernew16@2x.png +0 -0
  823. psychopy/app/Resources/light/fork.png +0 -0
  824. psychopy/app/Resources/light/fork@2x.png +0 -0
  825. psychopy/app/Resources/light/github.png +0 -0
  826. psychopy/app/Resources/light/github@2x.png +0 -0
  827. psychopy/app/Resources/light/globe.png +0 -0
  828. psychopy/app/Resources/light/globe@2x.png +0 -0
  829. psychopy/app/Resources/light/globe_bug.png +0 -0
  830. psychopy/app/Resources/light/globe_bug@2x.png +0 -0
  831. psychopy/app/Resources/light/globe_greensync.png +0 -0
  832. psychopy/app/Resources/light/globe_greensync@2x.png +0 -0
  833. psychopy/app/Resources/light/globe_info.png +0 -0
  834. psychopy/app/Resources/light/globe_info@2x.png +0 -0
  835. psychopy/app/Resources/light/globe_magnifier.png +0 -0
  836. psychopy/app/Resources/light/globe_magnifier@2x.png +0 -0
  837. psychopy/app/Resources/light/globe_run.png +0 -0
  838. psychopy/app/Resources/light/globe_run@2x.png +0 -0
  839. psychopy/app/Resources/light/globe_user.png +0 -0
  840. psychopy/app/Resources/light/globe_user@2x.png +0 -0
  841. psychopy/app/Resources/light/goto16.png +0 -0
  842. psychopy/app/Resources/light/goto16@2x.png +0 -0
  843. psychopy/app/Resources/light/greendot.png +0 -0
  844. psychopy/app/Resources/light/greendot@2x.png +0 -0
  845. psychopy/app/Resources/light/greenglobe.png +0 -0
  846. psychopy/app/Resources/light/greenglobe@2x.png +0 -0
  847. psychopy/app/Resources/light/greenglobe_bug.png +0 -0
  848. psychopy/app/Resources/light/greenglobe_bug@2x.png +0 -0
  849. psychopy/app/Resources/light/greenglobe_greensync.png +0 -0
  850. psychopy/app/Resources/light/greenglobe_greensync@2x.png +0 -0
  851. psychopy/app/Resources/light/greenglobe_info.png +0 -0
  852. psychopy/app/Resources/light/greenglobe_info@2x.png +0 -0
  853. psychopy/app/Resources/light/greenglobe_magnifier.png +0 -0
  854. psychopy/app/Resources/light/greenglobe_magnifier@2x.png +0 -0
  855. psychopy/app/Resources/light/greenglobe_run.png +0 -0
  856. psychopy/app/Resources/light/greenglobe_run@2x.png +0 -0
  857. psychopy/app/Resources/light/greenglobe_user.png +0 -0
  858. psychopy/app/Resources/light/greenglobe_user@2x.png +0 -0
  859. psychopy/app/Resources/light/greydot.png +0 -0
  860. psychopy/app/Resources/light/greydot@2x.png +0 -0
  861. psychopy/app/Resources/light/greytick.png +0 -0
  862. psychopy/app/Resources/light/greytick@2x.png +0 -0
  863. psychopy/app/Resources/light/invalid_img.png +0 -0
  864. psychopy/app/Resources/light/jsPilot.png +0 -0
  865. psychopy/app/Resources/light/jsPilot@2x.png +0 -0
  866. psychopy/app/Resources/light/jsRun.png +0 -0
  867. psychopy/app/Resources/light/jsRun@2x.png +0 -0
  868. psychopy/app/Resources/light/libroot16.png +0 -0
  869. psychopy/app/Resources/light/libroot16@2x.png +0 -0
  870. psychopy/app/Resources/light/loop.png +0 -0
  871. psychopy/app/Resources/light/loop@2x.png +0 -0
  872. psychopy/app/Resources/light/monitor16.png +0 -0
  873. psychopy/app/Resources/light/monitor16@2x.png +0 -0
  874. psychopy/app/Resources/light/monitors.png +0 -0
  875. psychopy/app/Resources/light/monitors32.png +0 -0
  876. psychopy/app/Resources/light/monitors32@2x.png +0 -0
  877. psychopy/app/Resources/light/monitors@2x.png +0 -0
  878. psychopy/app/Resources/light/orangedot.png +0 -0
  879. psychopy/app/Resources/light/orangedot@2x.png +0 -0
  880. psychopy/app/Resources/light/pavlovia.png +0 -0
  881. psychopy/app/Resources/light/pavlovia16.png +0 -0
  882. psychopy/app/Resources/light/pavlovia16@2x.png +0 -0
  883. psychopy/app/Resources/light/pavlovia@2x.png +0 -0
  884. psychopy/app/Resources/light/pavsync.png +0 -0
  885. psychopy/app/Resources/light/pavsync@2x.png +0 -0
  886. psychopy/app/Resources/light/person_off.png +0 -0
  887. psychopy/app/Resources/light/person_off@2x.png +0 -0
  888. psychopy/app/Resources/light/person_on.png +0 -0
  889. psychopy/app/Resources/light/person_on@2x.png +0 -0
  890. psychopy/app/Resources/light/photometer.png +0 -0
  891. psychopy/app/Resources/light/photometer@2x.png +0 -0
  892. psychopy/app/Resources/light/plugin16.png +0 -0
  893. psychopy/app/Resources/light/plugin16@2x.png +0 -0
  894. psychopy/app/Resources/light/plugins32.png +0 -0
  895. psychopy/app/Resources/light/plugins32@2x.png +0 -0
  896. psychopy/app/Resources/light/plus.png +0 -0
  897. psychopy/app/Resources/light/plus@2x.png +0 -0
  898. psychopy/app/Resources/light/preferences-app.png +0 -0
  899. psychopy/app/Resources/light/preferences-app48.png +0 -0
  900. psychopy/app/Resources/light/preferences-app48@2x.png +0 -0
  901. psychopy/app/Resources/light/preferences-app@2x.png +0 -0
  902. psychopy/app/Resources/light/preferences-conn.png +0 -0
  903. psychopy/app/Resources/light/preferences-conn48.png +0 -0
  904. psychopy/app/Resources/light/preferences-conn48@2x.png +0 -0
  905. psychopy/app/Resources/light/preferences-conn@2x.png +0 -0
  906. psychopy/app/Resources/light/preferences-general.png +0 -0
  907. psychopy/app/Resources/light/preferences-general48.png +0 -0
  908. psychopy/app/Resources/light/preferences-general48@2x.png +0 -0
  909. psychopy/app/Resources/light/preferences-general@2x.png +0 -0
  910. psychopy/app/Resources/light/preferences-hardware.png +0 -0
  911. psychopy/app/Resources/light/preferences-hardware48.png +0 -0
  912. psychopy/app/Resources/light/preferences-hardware48@2x.png +0 -0
  913. psychopy/app/Resources/light/preferences-hardware@2x.png +0 -0
  914. psychopy/app/Resources/light/preferences-keyboard.png +0 -0
  915. psychopy/app/Resources/light/preferences-keyboard48.png +0 -0
  916. psychopy/app/Resources/light/preferences-keyboard48@2x.png +0 -0
  917. psychopy/app/Resources/light/preferences-keyboard@2x.png +0 -0
  918. psychopy/app/Resources/light/preferences-pilot.png +0 -0
  919. psychopy/app/Resources/light/preferences-pilot@2x.png +0 -0
  920. psychopy/app/Resources/light/preferences32.png +0 -0
  921. psychopy/app/Resources/light/preferences32@2x.png +0 -0
  922. psychopy/app/Resources/light/pyPilot.png +0 -0
  923. psychopy/app/Resources/light/pyPilot@2x.png +0 -0
  924. psychopy/app/Resources/light/pyRun.png +0 -0
  925. psychopy/app/Resources/light/pyRun@2x.png +0 -0
  926. psychopy/app/Resources/light/reddot.png +0 -0
  927. psychopy/app/Resources/light/reddot@2x.png +0 -0
  928. psychopy/app/Resources/light/redglobe.png +0 -0
  929. psychopy/app/Resources/light/redglobe@2x.png +0 -0
  930. psychopy/app/Resources/light/redglobe_bug.png +0 -0
  931. psychopy/app/Resources/light/redglobe_bug@2x.png +0 -0
  932. psychopy/app/Resources/light/redglobe_greensync.png +0 -0
  933. psychopy/app/Resources/light/redglobe_greensync@2x.png +0 -0
  934. psychopy/app/Resources/light/redglobe_info.png +0 -0
  935. psychopy/app/Resources/light/redglobe_info@2x.png +0 -0
  936. psychopy/app/Resources/light/redglobe_magnifier.png +0 -0
  937. psychopy/app/Resources/light/redglobe_magnifier@2x.png +0 -0
  938. psychopy/app/Resources/light/redglobe_run.png +0 -0
  939. psychopy/app/Resources/light/redglobe_run@2x.png +0 -0
  940. psychopy/app/Resources/light/redglobe_user.png +0 -0
  941. psychopy/app/Resources/light/redglobe_user@2x.png +0 -0
  942. psychopy/app/Resources/light/redo.png +0 -0
  943. psychopy/app/Resources/light/redo32.png +0 -0
  944. psychopy/app/Resources/light/redo32@2x.png +0 -0
  945. psychopy/app/Resources/light/redo@2x.png +0 -0
  946. psychopy/app/Resources/light/regex.png +0 -0
  947. psychopy/app/Resources/light/regex@2x.png +0 -0
  948. psychopy/app/Resources/light/removeExp32.png +0 -0
  949. psychopy/app/Resources/light/removeExp32@2x.png +0 -0
  950. psychopy/app/Resources/light/rename16.png +0 -0
  951. psychopy/app/Resources/light/rename16@2x.png +0 -0
  952. psychopy/app/Resources/light/restart.png +0 -0
  953. psychopy/app/Resources/light/restart@2x.png +0 -0
  954. psychopy/app/Resources/light/runner.png +0 -0
  955. psychopy/app/Resources/light/runner@2x.png +0 -0
  956. psychopy/app/Resources/light/runnerPilot.png +0 -0
  957. psychopy/app/Resources/light/runnerPilot@2x.png +0 -0
  958. psychopy/app/Resources/light/savebtn16.png +0 -0
  959. psychopy/app/Resources/light/savebtn16@2x.png +0 -0
  960. psychopy/app/Resources/light/search.png +0 -0
  961. psychopy/app/Resources/light/search@2x.png +0 -0
  962. psychopy/app/Resources/light/showBuilder.png +0 -0
  963. psychopy/app/Resources/light/showBuilder@2x.png +0 -0
  964. psychopy/app/Resources/light/showCoder.png +0 -0
  965. psychopy/app/Resources/light/showCoder@2x.png +0 -0
  966. psychopy/app/Resources/light/showRunner.png +0 -0
  967. psychopy/app/Resources/light/showRunner@2x.png +0 -0
  968. psychopy/app/Resources/light/starred.png +0 -0
  969. psychopy/app/Resources/light/starred@2x.png +0 -0
  970. psychopy/app/Resources/light/start.png +0 -0
  971. psychopy/app/Resources/light/start@2x.png +0 -0
  972. psychopy/app/Resources/light/stdout.png +0 -0
  973. psychopy/app/Resources/light/stdout@2x.png +0 -0
  974. psychopy/app/Resources/light/stop.png +0 -0
  975. psychopy/app/Resources/light/stop32.png +0 -0
  976. psychopy/app/Resources/light/stop32@2x.png +0 -0
  977. psychopy/app/Resources/light/stop@2x.png +0 -0
  978. psychopy/app/Resources/light/switchCtrlBot.png +0 -0
  979. psychopy/app/Resources/light/switchCtrlBot@2x.png +0 -0
  980. psychopy/app/Resources/light/switchCtrlLeft.png +0 -0
  981. psychopy/app/Resources/light/switchCtrlLeft@2x.png +0 -0
  982. psychopy/app/Resources/light/switchCtrlRight.png +0 -0
  983. psychopy/app/Resources/light/switchCtrlRight@2x.png +0 -0
  984. psychopy/app/Resources/light/switchCtrlTop.png +0 -0
  985. psychopy/app/Resources/light/switchCtrlTop@2x.png +0 -0
  986. psychopy/app/Resources/light/tick.png +0 -0
  987. psychopy/app/Resources/light/tick@2x.png +0 -0
  988. psychopy/app/Resources/light/undo.png +0 -0
  989. psychopy/app/Resources/light/undo32.png +0 -0
  990. psychopy/app/Resources/light/undo32@2x.png +0 -0
  991. psychopy/app/Resources/light/undo@2x.png +0 -0
  992. psychopy/app/Resources/light/unstarred.png +0 -0
  993. psychopy/app/Resources/light/unstarred@2x.png +0 -0
  994. psychopy/app/Resources/light/user_none.png +0 -0
  995. psychopy/app/Resources/light/view-refresh16.png +0 -0
  996. psychopy/app/Resources/light/view-refresh16@2x.png +0 -0
  997. psychopy/app/Resources/light/viewbtn16.png +0 -0
  998. psychopy/app/Resources/light/viewbtn16@2x.png +0 -0
  999. psychopy/app/Resources/light/windows16.png +0 -0
  1000. psychopy/app/Resources/light/windows16@2x.png +0 -0
  1001. psychopy/app/Resources/moveComponentIcons.py +50 -0
  1002. psychopy/app/Resources/psychopy.desktop +13 -0
  1003. psychopy/app/Resources/psychopy.icns +0 -0
  1004. psychopy/app/Resources/psychopy.ico +0 -0
  1005. psychopy/app/Resources/psychopy.png +0 -0
  1006. psychopy/app/Resources/psychopy.xml +9 -0
  1007. psychopy/app/Resources/psychopy@2x.png +0 -0
  1008. psychopy/app/Resources/routine_templates/Basic.psyexp +344 -0
  1009. psychopy/app/Resources/routine_templates/Misc.psyexp +228 -0
  1010. psychopy/app/Resources/routine_templates/Online.psyexp +200 -0
  1011. psychopy/app/Resources/routine_templates/Trials.psyexp +735 -0
  1012. psychopy/app/Resources/routine_templates/readme.md +14 -0
  1013. psychopy/app/Resources/runner.ico +0 -0
  1014. psychopy/app/Resources/splash.png +0 -0
  1015. psychopy/app/Resources/splash@2x.png +0 -0
  1016. psychopy/app/Resources/tips.txt +45 -0
  1017. psychopy/app/Resources/tips_ar_001.txt +45 -0
  1018. psychopy/app/Resources/tips_fr_FR.txt +45 -0
  1019. psychopy/app/Resources/tips_ja_JP.txt +42 -0
  1020. psychopy/app/Resources/tips_zh_CN.txt +45 -0
  1021. psychopy/app/Resources/window.ico +0 -0
  1022. psychopy/app/__init__.py +339 -0
  1023. psychopy/app/__main__.py +3 -0
  1024. psychopy/app/_psychopyApp.py +1298 -0
  1025. psychopy/app/appData.spec +58 -0
  1026. psychopy/app/builder/__init__.py +5 -0
  1027. psychopy/app/builder/builder.py +4738 -0
  1028. psychopy/app/builder/dialogs/__init__.py +1910 -0
  1029. psychopy/app/builder/dialogs/dlgsCode.py +631 -0
  1030. psychopy/app/builder/dialogs/dlgsConditions.py +669 -0
  1031. psychopy/app/builder/dialogs/findDlg.py +275 -0
  1032. psychopy/app/builder/dialogs/paramCtrls.py +1802 -0
  1033. psychopy/app/builder/validators.py +589 -0
  1034. psychopy/app/coder/__init__.py +8 -0
  1035. psychopy/app/coder/codeEditorBase.py +460 -0
  1036. psychopy/app/coder/coder.py +3100 -0
  1037. psychopy/app/coder/fileBrowser.py +714 -0
  1038. psychopy/app/coder/folding.py +128 -0
  1039. psychopy/app/coder/psychoParser.py +139 -0
  1040. psychopy/app/coder/repl.py +496 -0
  1041. psychopy/app/coder/sourceTree.py +302 -0
  1042. psychopy/app/colorpicker/__init__.py +594 -0
  1043. psychopy/app/colorpicker/ui.py +336 -0
  1044. psychopy/app/connections/__init__.py +10 -0
  1045. psychopy/app/connections/news.py +104 -0
  1046. psychopy/app/connections/sendusage.py +61 -0
  1047. psychopy/app/connections/updates.py +642 -0
  1048. psychopy/app/console.py +164 -0
  1049. psychopy/app/deviceManager/__init__.py +1 -0
  1050. psychopy/app/deviceManager/addDialog.py +218 -0
  1051. psychopy/app/deviceManager/dialog.py +185 -0
  1052. psychopy/app/deviceManager/panel.py +191 -0
  1053. psychopy/app/deviceManager/utils.py +60 -0
  1054. psychopy/app/dialogs.py +664 -0
  1055. psychopy/app/errorDlg.py +238 -0
  1056. psychopy/app/frametracker.py +8 -0
  1057. psychopy/app/idle.py +181 -0
  1058. psychopy/app/jobs.py +676 -0
  1059. psychopy/app/linuxconfig/__init__.py +153 -0
  1060. psychopy/app/linuxconfig/ui.py +88 -0
  1061. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  1062. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +12695 -0
  1063. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  1064. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +10199 -0
  1065. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  1066. psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +10199 -0
  1067. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  1068. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +11221 -0
  1069. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  1070. psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +10200 -0
  1071. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  1072. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +10200 -0
  1073. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  1074. psychopy/app/locale/en_US/LC_MESSAGE/messages.po +10195 -0
  1075. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  1076. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +11917 -0
  1077. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  1078. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +11924 -0
  1079. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  1080. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +11917 -0
  1081. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  1082. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +11084 -0
  1083. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  1084. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +11590 -0
  1085. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  1086. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +10199 -0
  1087. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  1088. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +11091 -0
  1089. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  1090. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +11072 -0
  1091. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  1092. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +11071 -0
  1093. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  1094. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +10200 -0
  1095. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  1096. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +11072 -0
  1097. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  1098. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +11268 -0
  1099. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  1100. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +10199 -0
  1101. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  1102. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +11463 -0
  1103. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  1104. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +10200 -0
  1105. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  1106. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +10200 -0
  1107. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  1108. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +10200 -0
  1109. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  1110. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +11288 -0
  1111. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  1112. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +10200 -0
  1113. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  1114. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +10199 -0
  1115. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  1116. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +11441 -0
  1117. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  1118. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +11069 -0
  1119. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  1120. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +12085 -0
  1121. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  1122. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +11929 -0
  1123. psychopy/app/localizedStrings.py +386 -0
  1124. psychopy/app/pavlovia_ui/__init__.py +22 -0
  1125. psychopy/app/pavlovia_ui/_base.py +268 -0
  1126. psychopy/app/pavlovia_ui/functions.py +176 -0
  1127. psychopy/app/pavlovia_ui/menu.py +140 -0
  1128. psychopy/app/pavlovia_ui/project.py +943 -0
  1129. psychopy/app/pavlovia_ui/search.py +444 -0
  1130. psychopy/app/pavlovia_ui/sync.py +137 -0
  1131. psychopy/app/pavlovia_ui/user.py +264 -0
  1132. psychopy/app/plugin_manager/__init__.py +5 -0
  1133. psychopy/app/plugin_manager/dialog.py +402 -0
  1134. psychopy/app/plugin_manager/output.py +132 -0
  1135. psychopy/app/plugin_manager/packageIndex.py +303 -0
  1136. psychopy/app/plugin_manager/packages.py +643 -0
  1137. psychopy/app/plugin_manager/plugins.py +1363 -0
  1138. psychopy/app/plugin_manager/utils.py +115 -0
  1139. psychopy/app/preferencesDlg.py +771 -0
  1140. psychopy/app/psychopyApp.py +207 -0
  1141. psychopy/app/ribbon.py +1019 -0
  1142. psychopy/app/runner/__init__.py +1 -0
  1143. psychopy/app/runner/runner.py +1299 -0
  1144. psychopy/app/runner/scriptProcess.py +363 -0
  1145. psychopy/app/stdout/__init__.py +1 -0
  1146. psychopy/app/stdout/stdOutRich.py +410 -0
  1147. psychopy/app/sysInfoDlg.py +242 -0
  1148. psychopy/app/themes/__init__.py +78 -0
  1149. psychopy/app/themes/colors.py +201 -0
  1150. psychopy/app/themes/css/contrast_black.css +112 -0
  1151. psychopy/app/themes/css/contrast_white.css +115 -0
  1152. psychopy/app/themes/css/dark.css +112 -0
  1153. psychopy/app/themes/css/light.css +115 -0
  1154. psychopy/app/themes/fonts.py +629 -0
  1155. psychopy/app/themes/handlers.py +321 -0
  1156. psychopy/app/themes/icons.py +267 -0
  1157. psychopy/app/themes/spec/Classic.json +154 -0
  1158. psychopy/app/themes/spec/ClassicDark.json +154 -0
  1159. psychopy/app/themes/spec/GitHub.json +154 -0
  1160. psychopy/app/themes/spec/HiVisDark.json +153 -0
  1161. psychopy/app/themes/spec/HiVisLight.json +154 -0
  1162. psychopy/app/themes/spec/MinimalDark.json +154 -0
  1163. psychopy/app/themes/spec/MinimalLight.json +153 -0
  1164. psychopy/app/themes/spec/PsychopyDark.json +231 -0
  1165. psychopy/app/themes/spec/PsychopyLight.json +236 -0
  1166. psychopy/app/themes/ui.py +74 -0
  1167. psychopy/app/ui/__init__.py +184 -0
  1168. psychopy/app/urls.py +31 -0
  1169. psychopy/app/utils.py +1741 -0
  1170. psychopy/app/viewer/__init__.py +0 -0
  1171. psychopy/assets/Psychopy Window Favicon@16w.png +0 -0
  1172. psychopy/assets/Psychopy Window Favicon@32w.png +0 -0
  1173. psychopy/assets/USB-C.png +0 -0
  1174. psychopy/assets/USB.png +0 -0
  1175. psychopy/assets/__init__.py +0 -0
  1176. psychopy/assets/click.png +0 -0
  1177. psychopy/assets/clicknext.png +0 -0
  1178. psychopy/assets/creditCard.png +0 -0
  1179. psychopy/assets/default.mp3 +0 -0
  1180. psychopy/assets/default.mp4 +0 -0
  1181. psychopy/assets/default.png +0 -0
  1182. psychopy/assets/fonts/Arvo-Bold.ttf +0 -0
  1183. psychopy/assets/fonts/Arvo-BoldItalic.ttf +0 -0
  1184. psychopy/assets/fonts/Arvo-Italic.ttf +0 -0
  1185. psychopy/assets/fonts/Arvo-Regular.ttf +0 -0
  1186. psychopy/assets/fonts/DejaVuSerif.ttf +0 -0
  1187. psychopy/assets/fonts/IndieFlower-Regular.ttf +0 -0
  1188. psychopy/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  1189. psychopy/assets/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  1190. psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
  1191. psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  1192. psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
  1193. psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
  1194. psychopy/assets/next.png +0 -0
  1195. psychopy/assets/psychopy.ico +0 -0
  1196. psychopy/assets/psychopy.png +0 -0
  1197. psychopy/assets/templates/__init__.py +0 -0
  1198. psychopy/assets/templates/instruct1.png +0 -0
  1199. psychopy/assets/templates/instruct2.png +0 -0
  1200. psychopy/assets/touch.png +0 -0
  1201. psychopy/assets/touchnext.png +0 -0
  1202. psychopy/assets/voicekeyThresholdStim.wav +0 -0
  1203. psychopy/assets/window.ico +0 -0
  1204. psychopy/changes/2023.1.0.md +9 -0
  1205. psychopy/changes/2024.1.0.md +16 -0
  1206. psychopy/changes/__init__.py +0 -0
  1207. psychopy/clock.py +619 -0
  1208. psychopy/colors.py +1058 -0
  1209. psychopy/compatibility.py +147 -0
  1210. psychopy/constants.py +87 -0
  1211. psychopy/contrib/__init__.py +0 -0
  1212. psychopy/contrib/configobj/LICENSE +39 -0
  1213. psychopy/contrib/configobj/__init__.py +2455 -0
  1214. psychopy/contrib/configobj/_version.py +2 -0
  1215. psychopy/contrib/configobj/validate.py +1458 -0
  1216. psychopy/contrib/lazy_import.py +402 -0
  1217. psychopy/contrib/mseq.py +273 -0
  1218. psychopy/contrib/mseqSearch.py +183 -0
  1219. psychopy/contrib/psi.py +100 -0
  1220. psychopy/contrib/quest.py +484 -0
  1221. psychopy/contrib/tesselate.py +188 -0
  1222. psychopy/core.py +167 -0
  1223. psychopy/data/__init__.py +45 -0
  1224. psychopy/data/base.py +566 -0
  1225. psychopy/data/counterbalance.py +210 -0
  1226. psychopy/data/experiment.py +1049 -0
  1227. psychopy/data/fit.py +248 -0
  1228. psychopy/data/routine.py +94 -0
  1229. psychopy/data/shelf.py +237 -0
  1230. psychopy/data/staircase.py +2270 -0
  1231. psychopy/data/trial.py +2505 -0
  1232. psychopy/data/utils.py +858 -0
  1233. psychopy/demos/__init__.py +0 -0
  1234. psychopy/demos/builder/Design Templates/branchedExperiment/README.md +5 -0
  1235. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +354 -0
  1236. psychopy/demos/builder/Design Templates/branchedExperiment/trialTypes.xlsx +0 -0
  1237. psychopy/demos/builder/Design Templates/psychophysicsStaircase/README.md +20 -0
  1238. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +286 -0
  1239. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/README.md +14 -0
  1240. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +340 -0
  1241. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/stairDefinitions.xlsx +0 -0
  1242. psychopy/demos/builder/Design Templates/randomisedBlocks/README.md +18 -0
  1243. psychopy/demos/builder/Design Templates/randomisedBlocks/chooseBlock.xlsx +0 -0
  1244. psychopy/demos/builder/Design Templates/randomisedBlocks/facesBlock.xlsx +0 -0
  1245. psychopy/demos/builder/Design Templates/randomisedBlocks/housesBlock.xlsx +0 -0
  1246. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +219 -0
  1247. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face01.jpg +0 -0
  1248. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face02.jpg +0 -0
  1249. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face03.jpg +0 -0
  1250. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house01.jpg +0 -0
  1251. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house02.jpg +0 -0
  1252. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house03.jpg +0 -0
  1253. psychopy/demos/builder/Experiments/BART/README.md +30 -0
  1254. psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
  1255. psychopy/demos/builder/Experiments/BART/assets/background.png +0 -0
  1256. psychopy/demos/builder/Experiments/BART/assets/bang.mp3 +0 -0
  1257. psychopy/demos/builder/Experiments/BART/assets/bang.wav +0 -0
  1258. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  1259. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  1260. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  1261. psychopy/demos/builder/Experiments/BART/bart.psyexp +844 -0
  1262. psychopy/demos/builder/Experiments/BART/spreadsheets/conditions.xlsx +0 -0
  1263. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +255 -0
  1264. psychopy/demos/builder/Experiments/BigFiveInventory/README.md +23 -0
  1265. psychopy/demos/builder/Experiments/BigFiveInventory/TIPI.xlsx +0 -0
  1266. psychopy/demos/builder/Experiments/BigFiveInventory/bigFiveItems.xlsx +0 -0
  1267. psychopy/demos/builder/Experiments/BigFiveInventory/demographics.xlsx +0 -0
  1268. psychopy/demos/builder/Experiments/BigFiveInventory/mini_IPIP.xlsx +0 -0
  1269. psychopy/demos/builder/Experiments/GoNoGo/conditions.xlsx +0 -0
  1270. psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +462 -0
  1271. psychopy/demos/builder/Experiments/GoNoGo/go.png +0 -0
  1272. psychopy/demos/builder/Experiments/GoNoGo/nogo.png +0 -0
  1273. psychopy/demos/builder/Experiments/dragAndDrop/README.md +5 -0
  1274. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +494 -0
  1275. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
  1276. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
  1277. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
  1278. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
  1279. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
  1280. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
  1281. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
  1282. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
  1283. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
  1284. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
  1285. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
  1286. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
  1287. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
  1288. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  1289. psychopy/demos/builder/Experiments/goNoGo/readme.md +14 -0
  1290. psychopy/demos/builder/Experiments/mentalRotation/F.png +0 -0
  1291. psychopy/demos/builder/Experiments/mentalRotation/FR.png +0 -0
  1292. psychopy/demos/builder/Experiments/mentalRotation/MentalRot.csv +33 -0
  1293. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +646 -0
  1294. psychopy/demos/builder/Experiments/mentalRotation/README.md +23 -0
  1295. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +509 -0
  1296. psychopy/demos/builder/Experiments/navon/README.md +26 -0
  1297. psychopy/demos/builder/Experiments/navon/bigHsmallH.png +0 -0
  1298. psychopy/demos/builder/Experiments/navon/bigHsmallS.png +0 -0
  1299. psychopy/demos/builder/Experiments/navon/bigSsmallH.png +0 -0
  1300. psychopy/demos/builder/Experiments/navon/bigSsmallS.png +0 -0
  1301. psychopy/demos/builder/Experiments/navon/mask.png +0 -0
  1302. psychopy/demos/builder/Experiments/navon/stimuli.pptx +0 -0
  1303. psychopy/demos/builder/Experiments/navon/trialTypes.xlsx +0 -0
  1304. psychopy/demos/builder/Experiments/sternberg/README.md +14 -0
  1305. psychopy/demos/builder/Experiments/sternberg/mainTrials.xlsx +0 -0
  1306. psychopy/demos/builder/Experiments/sternberg/pracTrials.xlsx +0 -0
  1307. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +649 -0
  1308. psychopy/demos/builder/Experiments/stroop/README.md +15 -0
  1309. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +321 -0
  1310. psychopy/demos/builder/Experiments/stroop/trialTypes.csv +7 -0
  1311. psychopy/demos/builder/Experiments/stroopExtended/README.md +14 -0
  1312. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +418 -0
  1313. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +418 -0
  1314. psychopy/demos/builder/Experiments/stroopExtended/trialTypes.xlsx +0 -0
  1315. psychopy/demos/builder/Experiments/stroopExtended/trialTypesReverse.xlsx +0 -0
  1316. psychopy/demos/builder/Experiments/stroopVoice/README.md +27 -0
  1317. psychopy/demos/builder/Experiments/stroopVoice/conditions.xlsx +0 -0
  1318. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +382 -0
  1319. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +371 -0
  1320. psychopy/demos/builder/Feature Demos/buttonBox/readme.md +5 -0
  1321. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +308 -0
  1322. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +391 -0
  1323. psychopy/demos/builder/Feature Demos/gratings/readme.md +8 -0
  1324. psychopy/demos/builder/Feature Demos/movies/movie.psyexp +220 -0
  1325. psychopy/demos/builder/Feature Demos/movies/readme.md +3 -0
  1326. psychopy/demos/builder/Feature Demos/noise/face.jpg +0 -0
  1327. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +477 -0
  1328. psychopy/demos/builder/Feature Demos/noise/readme.md +3 -0
  1329. psychopy/demos/builder/Feature Demos/panorama/panImg.jpg +0 -0
  1330. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +177 -0
  1331. psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +434 -0
  1332. psychopy/demos/builder/Feature Demos/pilotMode/readme.md +7 -0
  1333. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +451 -0
  1334. psychopy/demos/builder/Feature Demos/progress/readme.md +1 -0
  1335. psychopy/demos/builder/Feature Demos/sliders/README.md +8 -0
  1336. psychopy/demos/builder/Feature Demos/sliders/fruitConditions.xlsx +0 -0
  1337. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +984 -0
  1338. psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
  1339. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +199 -0
  1340. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +639 -0
  1341. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +415 -0
  1342. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +659 -0
  1343. psychopy/demos/builder/Hardware/EGI_netstation/README.md +17 -0
  1344. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +339 -0
  1345. psychopy/demos/builder/Hardware/EGI_netstation/trialTypesEEG.csv +7 -0
  1346. psychopy/demos/builder/Hardware/Eyetracking_visual_search/readme.md +19 -0
  1347. psychopy/demos/builder/Hardware/Eyetracking_visual_search/trials_params.xlsx +0 -0
  1348. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +830 -0
  1349. psychopy/demos/builder/Hardware/camera/camera.psyexp +330 -0
  1350. psychopy/demos/builder/Hardware/camera/readme.md +6 -0
  1351. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +459 -0
  1352. psychopy/demos/builder/Hardware/eyetracking/readme.md +7 -0
  1353. psychopy/demos/builder/Hardware/eyetracking_custom_cal/Bullseye_grey.mov +0 -0
  1354. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +468 -0
  1355. psychopy/demos/builder/Hardware/eyetracking_custom_cal/readme.md +7 -0
  1356. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +211 -0
  1357. psychopy/demos/builder/Hardware/fMRI/readme.md +7 -0
  1358. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +360 -0
  1359. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
  1360. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
  1361. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +360 -0
  1362. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
  1363. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
  1364. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +484 -0
  1365. psychopy/demos/builder/Hardware/microphone/phrases.xlsx +0 -0
  1366. psychopy/demos/builder/Hardware/microphone/readme.md +9 -0
  1367. psychopy/demos/builder/Hardware/pump/README.md +19 -0
  1368. psychopy/demos/builder/Hardware/pump/pump.psyexp +646 -0
  1369. psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
  1370. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +350 -0
  1371. psychopy/demos/builder/Helper Tools/achorVSalignment/readme.md +5 -0
  1372. psychopy/demos/builder/Helper Tools/clockFace/README.md +3 -0
  1373. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +211 -0
  1374. psychopy/demos/builder/Helper Tools/colors/README.md +5 -0
  1375. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +321 -0
  1376. psychopy/demos/builder/Helper Tools/drawPolygon/README.md +5 -0
  1377. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +704 -0
  1378. psychopy/demos/builder/Helper Tools/keyNameFinder/README.md +14 -0
  1379. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +225 -0
  1380. psychopy/demos/builder/Helper Tools/spatialUnits/README.md +6 -0
  1381. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +206 -0
  1382. psychopy/demos/builder/README.txt +43 -0
  1383. psychopy/demos/builder/__init__.py +0 -0
  1384. psychopy/demos/coder/__init__.py +0 -0
  1385. psychopy/demos/coder/basic/hello_world.py +37 -0
  1386. psychopy/demos/coder/csvFromPsydat.py +29 -0
  1387. psychopy/demos/coder/experiment control/JND_staircase_analysis.py +85 -0
  1388. psychopy/demos/coder/experiment control/JND_staircase_exp.py +110 -0
  1389. psychopy/demos/coder/experiment control/TrialHandler.py +64 -0
  1390. psychopy/demos/coder/experiment control/TrialHandler2.py +42 -0
  1391. psychopy/demos/coder/experiment control/__init__.py +0 -0
  1392. psychopy/demos/coder/experiment control/autoDraw_autoLog.py +50 -0
  1393. psychopy/demos/coder/experiment control/experimentHandler.py +57 -0
  1394. psychopy/demos/coder/experiment control/fMRI_launchScan.py +74 -0
  1395. psychopy/demos/coder/experiment control/gammaMotionAnalysis.py +68 -0
  1396. psychopy/demos/coder/experiment control/gammaMotionNull.py +169 -0
  1397. psychopy/demos/coder/experiment control/logFiles.py +55 -0
  1398. psychopy/demos/coder/experiment control/piloting.py +65 -0
  1399. psychopy/demos/coder/experiment control/runtimeInfo.py +79 -0
  1400. psychopy/demos/coder/hardware/CRS_BitsBox.py +75 -0
  1401. psychopy/demos/coder/hardware/CRS_BitsPlusPlus.py +73 -0
  1402. psychopy/demos/coder/hardware/RiftHeadTrackingExample.py +95 -0
  1403. psychopy/demos/coder/hardware/RiftMinimal.py +44 -0
  1404. psychopy/demos/coder/hardware/VSHD_Distortion.py +49 -0
  1405. psychopy/demos/coder/hardware/__init__.py +0 -0
  1406. psychopy/demos/coder/hardware/camera.py +90 -0
  1407. psychopy/demos/coder/hardware/cedrusRB730.py +38 -0
  1408. psychopy/demos/coder/hardware/crsBitsAdvancedDemo.py +780 -0
  1409. psychopy/demos/coder/hardware/egi_netstation.py +45 -0
  1410. psychopy/demos/coder/hardware/hdf5_extract.py +133 -0
  1411. psychopy/demos/coder/hardware/ioLab_bbox.py +62 -0
  1412. psychopy/demos/coder/hardware/labjack_u3.py +61 -0
  1413. psychopy/demos/coder/hardware/monitorDemo.py +28 -0
  1414. psychopy/demos/coder/hardware/parallelPortOutput.py +49 -0
  1415. psychopy/demos/coder/hardware/qmixPump.py +79 -0
  1416. psychopy/demos/coder/hardware/testSoundLatency.py +127 -0
  1417. psychopy/demos/coder/input/GUI.py +52 -0
  1418. psychopy/demos/coder/input/__init__.py +0 -0
  1419. psychopy/demos/coder/input/customMouse.py +51 -0
  1420. psychopy/demos/coder/input/joystick_universal.py +84 -0
  1421. psychopy/demos/coder/input/keyNameFinder.py +39 -0
  1422. psychopy/demos/coder/input/mic.png +0 -0
  1423. psychopy/demos/coder/input/mouse.py +66 -0
  1424. psychopy/demos/coder/iohub/delaytest.py +231 -0
  1425. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/canal.jpg +0 -0
  1426. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/fall.jpg +0 -0
  1427. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/lake.jpg +0 -0
  1428. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/party.jpg +0 -0
  1429. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/swimming.jpg +0 -0
  1430. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByConditionVariables.py +67 -0
  1431. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByMessages.py +34 -0
  1432. psychopy/demos/coder/iohub/eyetracking/gcCursor/run.py +323 -0
  1433. psychopy/demos/coder/iohub/eyetracking/gcCursor/trial_conditions.xlsx +0 -0
  1434. psychopy/demos/coder/iohub/eyetracking/simple.py +147 -0
  1435. psychopy/demos/coder/iohub/eyetracking/validation.py +251 -0
  1436. psychopy/demos/coder/iohub/iodatastore/saveEventReport.py +56 -0
  1437. psychopy/demos/coder/iohub/keyboard.py +189 -0
  1438. psychopy/demos/coder/iohub/keyboardreactiontime.py +88 -0
  1439. psychopy/demos/coder/iohub/launchHub.py +160 -0
  1440. psychopy/demos/coder/iohub/mouse.py +112 -0
  1441. psychopy/demos/coder/iohub/mouse_multi_window.py +124 -0
  1442. psychopy/demos/coder/iohub/serial/_parseserial.py +53 -0
  1443. psychopy/demos/coder/iohub/serial/customparser.py +84 -0
  1444. psychopy/demos/coder/iohub/serial/pstbox.py +166 -0
  1445. psychopy/demos/coder/iohub/wintab/_wintabgraphics.py +281 -0
  1446. psychopy/demos/coder/iohub/wintab/pen_demo.py +260 -0
  1447. psychopy/demos/coder/misc/encrypt_data.py +48 -0
  1448. psychopy/demos/coder/misc/hdf5_2_csv +33 -0
  1449. psychopy/demos/coder/misc/makeMovie.py +28 -0
  1450. psychopy/demos/coder/misc/rigidBodyTransform.py +76 -0
  1451. psychopy/demos/coder/stimuli/Campaign.ttf +0 -0
  1452. psychopy/demos/coder/stimuli/MovieStim.py +65 -0
  1453. psychopy/demos/coder/stimuli/__init__.py +0 -0
  1454. psychopy/demos/coder/stimuli/aperture.py +37 -0
  1455. psychopy/demos/coder/stimuli/beach.jpg +0 -0
  1456. psychopy/demos/coder/stimuli/bufferImageStim.py +78 -0
  1457. psychopy/demos/coder/stimuli/clockface.py +43 -0
  1458. psychopy/demos/coder/stimuli/colorPalette.py +134 -0
  1459. psychopy/demos/coder/stimuli/compare_text_timing.py +193 -0
  1460. psychopy/demos/coder/stimuli/counterphase.py +43 -0
  1461. psychopy/demos/coder/stimuli/customTextures.py +57 -0
  1462. psychopy/demos/coder/stimuli/dot_gabors.py +35 -0
  1463. psychopy/demos/coder/stimuli/dots.py +35 -0
  1464. psychopy/demos/coder/stimuli/elementArrays.py +92 -0
  1465. psychopy/demos/coder/stimuli/embeddedOpenGL.py +35 -0
  1466. psychopy/demos/coder/stimuli/face.jpg +0 -0
  1467. psychopy/demos/coder/stimuli/face_jpg.py +48 -0
  1468. psychopy/demos/coder/stimuli/gabor.py +30 -0
  1469. psychopy/demos/coder/stimuli/imagesAndPatches.py +51 -0
  1470. psychopy/demos/coder/stimuli/jwpIntro.mp4 +0 -0
  1471. psychopy/demos/coder/stimuli/kanizsa.py +41 -0
  1472. psychopy/demos/coder/stimuli/maskReveal.py +63 -0
  1473. psychopy/demos/coder/stimuli/plaid.py +43 -0
  1474. psychopy/demos/coder/stimuli/ratingScale.py +183 -0
  1475. psychopy/demos/coder/stimuli/rotatingFlashingWedge.py +37 -0
  1476. psychopy/demos/coder/stimuli/screensAndWindows.py +58 -0
  1477. psychopy/demos/coder/stimuli/secondOrderGratings.py +66 -0
  1478. psychopy/demos/coder/stimuli/shapeContains.py +50 -0
  1479. psychopy/demos/coder/stimuli/shapes.py +63 -0
  1480. psychopy/demos/coder/stimuli/soundStimuli.py +49 -0
  1481. psychopy/demos/coder/stimuli/starField.py +48 -0
  1482. psychopy/demos/coder/stimuli/stim3d.py +107 -0
  1483. psychopy/demos/coder/stimuli/textBoxStim/textbox_glyph_placement.py +93 -0
  1484. psychopy/demos/coder/stimuli/textBoxStim/textbox_simple.py +71 -0
  1485. psychopy/demos/coder/stimuli/textStimuli.py +106 -0
  1486. psychopy/demos/coder/stimuli/textbox_editable.py +64 -0
  1487. psychopy/demos/coder/stimuli/variousVisualStims.py +47 -0
  1488. psychopy/demos/coder/stimuli/visual_noise.py +31 -0
  1489. psychopy/demos/coder/sysInfo.py +56 -0
  1490. psychopy/demos/coder/timing/__init__.py +0 -0
  1491. psychopy/demos/coder/timing/callOnFlip.py +39 -0
  1492. psychopy/demos/coder/timing/clocksAndTimers.py +46 -0
  1493. psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +323 -0
  1494. psychopy/demos/coder/timing/timeByFrames.py +80 -0
  1495. psychopy/demos/coder/timing/timeByFramesEx.py +107 -0
  1496. psychopy/demos/coder/understanding psychopy/colors.py +70 -0
  1497. psychopy/demos/coder/understanding psychopy/fontLayout.py +69 -0
  1498. psychopy/demos/demo_migration.py +214 -0
  1499. psychopy/demos/modernizeDemos.py +16 -0
  1500. psychopy/demos/test_demo_migration.py +155 -0
  1501. psychopy/devices/__init__.py +8 -0
  1502. psychopy/event.py +1339 -0
  1503. psychopy/exceptions.py +59 -0
  1504. psychopy/experiment/__init__.py +51 -0
  1505. psychopy/experiment/_experiment.py +1514 -0
  1506. psychopy/experiment/blankTemplate.xltx +0 -0
  1507. psychopy/experiment/components/__init__.py +402 -0
  1508. psychopy/experiment/components/_base.py +1689 -0
  1509. psychopy/experiment/components/aperture/__init__.py +153 -0
  1510. psychopy/experiment/components/aperture/classic/aperture.png +0 -0
  1511. psychopy/experiment/components/aperture/classic/aperture@2x.png +0 -0
  1512. psychopy/experiment/components/aperture/dark/aperture.png +0 -0
  1513. psychopy/experiment/components/aperture/dark/aperture@2x.png +0 -0
  1514. psychopy/experiment/components/aperture/light/aperture.png +0 -0
  1515. psychopy/experiment/components/aperture/light/aperture@2x.png +0 -0
  1516. psychopy/experiment/components/brush/__init__.py +165 -0
  1517. psychopy/experiment/components/brush/classic/brush.png +0 -0
  1518. psychopy/experiment/components/brush/classic/brush@2x.png +0 -0
  1519. psychopy/experiment/components/brush/dark/brush.png +0 -0
  1520. psychopy/experiment/components/brush/dark/brush@2x.png +0 -0
  1521. psychopy/experiment/components/brush/light/brush.png +0 -0
  1522. psychopy/experiment/components/brush/light/brush@2x.png +0 -0
  1523. psychopy/experiment/components/button/__init__.py +493 -0
  1524. psychopy/experiment/components/button/classic/button.png +0 -0
  1525. psychopy/experiment/components/button/classic/button@2x.png +0 -0
  1526. psychopy/experiment/components/button/dark/button.png +0 -0
  1527. psychopy/experiment/components/button/dark/button@2x.png +0 -0
  1528. psychopy/experiment/components/button/light/button.png +0 -0
  1529. psychopy/experiment/components/button/light/button@2x.png +0 -0
  1530. psychopy/experiment/components/buttonBox/__init__.py +322 -0
  1531. psychopy/experiment/components/buttonBox/classic/buttonBox.png +0 -0
  1532. psychopy/experiment/components/buttonBox/classic/buttonBox@2x.png +0 -0
  1533. psychopy/experiment/components/buttonBox/dark/buttonBox.png +0 -0
  1534. psychopy/experiment/components/buttonBox/dark/buttonBox@2x.png +0 -0
  1535. psychopy/experiment/components/buttonBox/light/buttonBox.png +0 -0
  1536. psychopy/experiment/components/buttonBox/light/buttonBox@2x.png +0 -0
  1537. psychopy/experiment/components/camera/__init__.py +381 -0
  1538. psychopy/experiment/components/camera/classic/webcam.png +0 -0
  1539. psychopy/experiment/components/camera/classic/webcam@2x.png +0 -0
  1540. psychopy/experiment/components/camera/dark/webcam.png +0 -0
  1541. psychopy/experiment/components/camera/dark/webcam@2x.png +0 -0
  1542. psychopy/experiment/components/camera/light/webcam.png +0 -0
  1543. psychopy/experiment/components/camera/light/webcam@2x.png +0 -0
  1544. psychopy/experiment/components/code/__init__.py +299 -0
  1545. psychopy/experiment/components/code/classic/code.png +0 -0
  1546. psychopy/experiment/components/code/classic/code@2x.png +0 -0
  1547. psychopy/experiment/components/code/dark/code.png +0 -0
  1548. psychopy/experiment/components/code/dark/code@2x.png +0 -0
  1549. psychopy/experiment/components/code/light/code.png +0 -0
  1550. psychopy/experiment/components/code/light/code@2x.png +0 -0
  1551. psychopy/experiment/components/dots/__init__.py +199 -0
  1552. psychopy/experiment/components/dots/classic/dots.png +0 -0
  1553. psychopy/experiment/components/dots/classic/dots@2x.png +0 -0
  1554. psychopy/experiment/components/dots/dark/dots.png +0 -0
  1555. psychopy/experiment/components/dots/dark/dots@2x.png +0 -0
  1556. psychopy/experiment/components/dots/dots.xcf +0 -0
  1557. psychopy/experiment/components/dots/light/dots.png +0 -0
  1558. psychopy/experiment/components/dots/light/dots@2x.png +0 -0
  1559. psychopy/experiment/components/eyetracker_record/__init__.py +194 -0
  1560. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record.png +0 -0
  1561. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record@2x.png +0 -0
  1562. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record.png +0 -0
  1563. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record@2x.png +0 -0
  1564. psychopy/experiment/components/eyetracker_record/light/eyetracker_record.png +0 -0
  1565. psychopy/experiment/components/eyetracker_record/light/eyetracker_record@2x.png +0 -0
  1566. psychopy/experiment/components/form/__init__.py +227 -0
  1567. psychopy/experiment/components/form/classic/form.png +0 -0
  1568. psychopy/experiment/components/form/classic/form@2x.png +0 -0
  1569. psychopy/experiment/components/form/dark/form.png +0 -0
  1570. psychopy/experiment/components/form/dark/form@2x.png +0 -0
  1571. psychopy/experiment/components/form/formItems.xltx +0 -0
  1572. psychopy/experiment/components/form/light/form.png +0 -0
  1573. psychopy/experiment/components/form/light/form@2x.png +0 -0
  1574. psychopy/experiment/components/grating/__init__.py +203 -0
  1575. psychopy/experiment/components/grating/classic/grating.png +0 -0
  1576. psychopy/experiment/components/grating/classic/grating@2x.png +0 -0
  1577. psychopy/experiment/components/grating/dark/grating.png +0 -0
  1578. psychopy/experiment/components/grating/dark/grating@2x.png +0 -0
  1579. psychopy/experiment/components/grating/light/grating.png +0 -0
  1580. psychopy/experiment/components/grating/light/grating@2x.png +0 -0
  1581. psychopy/experiment/components/image/__init__.py +195 -0
  1582. psychopy/experiment/components/image/classic/image.png +0 -0
  1583. psychopy/experiment/components/image/classic/image@2x.png +0 -0
  1584. psychopy/experiment/components/image/dark/image.png +0 -0
  1585. psychopy/experiment/components/image/dark/image@2x.png +0 -0
  1586. psychopy/experiment/components/image/light/image.png +0 -0
  1587. psychopy/experiment/components/image/light/image@2x.png +0 -0
  1588. psychopy/experiment/components/joyButtons/__init__.py +453 -0
  1589. psychopy/experiment/components/joyButtons/classic/joyButtons.png +0 -0
  1590. psychopy/experiment/components/joyButtons/classic/joybuttons@2x.png +0 -0
  1591. psychopy/experiment/components/joyButtons/dark/joyButtons.png +0 -0
  1592. psychopy/experiment/components/joyButtons/dark/joyButtons@2x.png +0 -0
  1593. psychopy/experiment/components/joyButtons/light/joyButtons.png +0 -0
  1594. psychopy/experiment/components/joyButtons/light/joyButtons@2x.png +0 -0
  1595. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +34 -0
  1596. psychopy/experiment/components/joystick/__init__.py +572 -0
  1597. psychopy/experiment/components/joystick/classic/joystick.png +0 -0
  1598. psychopy/experiment/components/joystick/classic/joystick@2x.png +0 -0
  1599. psychopy/experiment/components/joystick/dark/joystick.png +0 -0
  1600. psychopy/experiment/components/joystick/dark/joystick@2x.png +0 -0
  1601. psychopy/experiment/components/joystick/light/joystick.png +0 -0
  1602. psychopy/experiment/components/joystick/light/joystick@2x.png +0 -0
  1603. psychopy/experiment/components/joystick/virtualJoystick.py +40 -0
  1604. psychopy/experiment/components/keyboard/__init__.py +568 -0
  1605. psychopy/experiment/components/keyboard/classic/keyboard.png +0 -0
  1606. psychopy/experiment/components/keyboard/classic/keyboard@2x.png +0 -0
  1607. psychopy/experiment/components/keyboard/dark/keyboard.png +0 -0
  1608. psychopy/experiment/components/keyboard/dark/keyboard@2x.png +0 -0
  1609. psychopy/experiment/components/keyboard/light/keyboard.png +0 -0
  1610. psychopy/experiment/components/keyboard/light/keyboard@2x.png +0 -0
  1611. psychopy/experiment/components/keyboard.xcf +0 -0
  1612. psychopy/experiment/components/microphone/__init__.py +600 -0
  1613. psychopy/experiment/components/microphone/classic/microphone.png +0 -0
  1614. psychopy/experiment/components/microphone/classic/microphone@2x.png +0 -0
  1615. psychopy/experiment/components/microphone/dark/microphone.png +0 -0
  1616. psychopy/experiment/components/microphone/dark/microphone@2x.png +0 -0
  1617. psychopy/experiment/components/microphone/light/microphone.png +0 -0
  1618. psychopy/experiment/components/microphone/light/microphone@2x.png +0 -0
  1619. psychopy/experiment/components/mouse/__init__.py +773 -0
  1620. psychopy/experiment/components/mouse/classic/mouse.png +0 -0
  1621. psychopy/experiment/components/mouse/classic/mouse@2x.png +0 -0
  1622. psychopy/experiment/components/mouse/dark/mouse.png +0 -0
  1623. psychopy/experiment/components/mouse/dark/mouse@2x.png +0 -0
  1624. psychopy/experiment/components/mouse/light/mouse.png +0 -0
  1625. psychopy/experiment/components/mouse/light/mouse@2x.png +0 -0
  1626. psychopy/experiment/components/movie/__init__.py +348 -0
  1627. psychopy/experiment/components/movie/classic/movie.png +0 -0
  1628. psychopy/experiment/components/movie/classic/movie@2x.png +0 -0
  1629. psychopy/experiment/components/movie/dark/movie.png +0 -0
  1630. psychopy/experiment/components/movie/dark/movie@2x.png +0 -0
  1631. psychopy/experiment/components/movie/light/movie.png +0 -0
  1632. psychopy/experiment/components/movie/light/movie@2x.png +0 -0
  1633. psychopy/experiment/components/panorama/__init__.py +456 -0
  1634. psychopy/experiment/components/panorama/classic/panorama.png +0 -0
  1635. psychopy/experiment/components/panorama/classic/panorama@2x.png +0 -0
  1636. psychopy/experiment/components/panorama/dark/panorama.png +0 -0
  1637. psychopy/experiment/components/panorama/dark/panorama@2x.png +0 -0
  1638. psychopy/experiment/components/panorama/light/panorama.png +0 -0
  1639. psychopy/experiment/components/panorama/light/panorama@2x.png +0 -0
  1640. psychopy/experiment/components/parallelOut/__init__.py +178 -0
  1641. psychopy/experiment/components/parallelOut/classic/parallel.png +0 -0
  1642. psychopy/experiment/components/parallelOut/classic/parallel@2x.png +0 -0
  1643. psychopy/experiment/components/parallelOut/dark/parallel.png +0 -0
  1644. psychopy/experiment/components/parallelOut/dark/parallel@2x.png +0 -0
  1645. psychopy/experiment/components/parallelOut/light/parallel.png +0 -0
  1646. psychopy/experiment/components/parallelOut/light/parallel@2x.png +0 -0
  1647. psychopy/experiment/components/polygon/__init__.py +332 -0
  1648. psychopy/experiment/components/polygon/classic/polygon.png +0 -0
  1649. psychopy/experiment/components/polygon/classic/polygon@2x.png +0 -0
  1650. psychopy/experiment/components/polygon/dark/polygon.png +0 -0
  1651. psychopy/experiment/components/polygon/dark/polygon@2x.png +0 -0
  1652. psychopy/experiment/components/polygon/light/polygon.png +0 -0
  1653. psychopy/experiment/components/polygon/light/polygon@2x.png +0 -0
  1654. psychopy/experiment/components/progress/__init__.py +130 -0
  1655. psychopy/experiment/components/progress/classic/progress.png +0 -0
  1656. psychopy/experiment/components/progress/classic/progress@2x.png +0 -0
  1657. psychopy/experiment/components/progress/dark/progress.png +0 -0
  1658. psychopy/experiment/components/progress/dark/progress@2x.png +0 -0
  1659. psychopy/experiment/components/progress/light/progress.png +0 -0
  1660. psychopy/experiment/components/progress/light/progress@2x.png +0 -0
  1661. psychopy/experiment/components/resourceManager/__init__.py +176 -0
  1662. psychopy/experiment/components/resourceManager/classic/resource_manager.png +0 -0
  1663. psychopy/experiment/components/resourceManager/classic/resource_manager@2x.png +0 -0
  1664. psychopy/experiment/components/resourceManager/dark/resource_manager.png +0 -0
  1665. psychopy/experiment/components/resourceManager/dark/resource_manager@2x.png +0 -0
  1666. psychopy/experiment/components/resourceManager/light/resource_manager.png +0 -0
  1667. psychopy/experiment/components/resourceManager/light/resource_manager@2x.png +0 -0
  1668. psychopy/experiment/components/roi/__init__.py +316 -0
  1669. psychopy/experiment/components/roi/classic/eyetracker_roi.png +0 -0
  1670. psychopy/experiment/components/roi/classic/eyetracker_roi@2x.png +0 -0
  1671. psychopy/experiment/components/roi/dark/eyetracker_roi.png +0 -0
  1672. psychopy/experiment/components/roi/dark/eyetracker_roi@2X.png +0 -0
  1673. psychopy/experiment/components/roi/light/eyetracker_roi.png +0 -0
  1674. psychopy/experiment/components/roi/light/eyetracker_roi@2X.png +0 -0
  1675. psychopy/experiment/components/routineSettings/__init__.py +387 -0
  1676. psychopy/experiment/components/routineSettings/classic/routineSettings.png +0 -0
  1677. psychopy/experiment/components/routineSettings/classic/routineSettings@2x.png +0 -0
  1678. psychopy/experiment/components/routineSettings/dark/routineSettings.png +0 -0
  1679. psychopy/experiment/components/routineSettings/dark/routineSettings@2x.png +0 -0
  1680. psychopy/experiment/components/routineSettings/light/routineSettings.png +0 -0
  1681. psychopy/experiment/components/routineSettings/light/routineSettings@2x.png +0 -0
  1682. psychopy/experiment/components/serialOut/__init__.py +304 -0
  1683. psychopy/experiment/components/serialOut/classic/serial.png +0 -0
  1684. psychopy/experiment/components/serialOut/classic/serial@2x.png +0 -0
  1685. psychopy/experiment/components/serialOut/dark/serial.png +0 -0
  1686. psychopy/experiment/components/serialOut/dark/serial@2x.png +0 -0
  1687. psychopy/experiment/components/serialOut/light/serial.png +0 -0
  1688. psychopy/experiment/components/serialOut/light/serial@2x.png +0 -0
  1689. psychopy/experiment/components/settings/JS_htmlHeader.tmpl +23 -0
  1690. psychopy/experiment/components/settings/JS_setupExp.tmpl +28 -0
  1691. psychopy/experiment/components/settings/__init__.py +2254 -0
  1692. psychopy/experiment/components/settings/classic/settings.png +0 -0
  1693. psychopy/experiment/components/settings/classic/settings@2x.png +0 -0
  1694. psychopy/experiment/components/settings/dark/settings.png +0 -0
  1695. psychopy/experiment/components/settings/dark/settings@2x.png +0 -0
  1696. psychopy/experiment/components/settings/eyetracking.py +108 -0
  1697. psychopy/experiment/components/settings/light/settings.png +0 -0
  1698. psychopy/experiment/components/settings/light/settings@2x.png +0 -0
  1699. psychopy/experiment/components/slider/__init__.py +410 -0
  1700. psychopy/experiment/components/slider/classic/slider.png +0 -0
  1701. psychopy/experiment/components/slider/classic/slider@2x.png +0 -0
  1702. psychopy/experiment/components/slider/dark/slider.png +0 -0
  1703. psychopy/experiment/components/slider/dark/slider@2x.png +0 -0
  1704. psychopy/experiment/components/slider/light/slider.png +0 -0
  1705. psychopy/experiment/components/slider/light/slider@2x.png +0 -0
  1706. psychopy/experiment/components/sound/__init__.py +441 -0
  1707. psychopy/experiment/components/sound/classic/sound.png +0 -0
  1708. psychopy/experiment/components/sound/classic/sound@2x.png +0 -0
  1709. psychopy/experiment/components/sound/dark/sound.png +0 -0
  1710. psychopy/experiment/components/sound/dark/sound@2x.png +0 -0
  1711. psychopy/experiment/components/sound/light/sound.png +0 -0
  1712. psychopy/experiment/components/sound/light/sound@2x.png +0 -0
  1713. psychopy/experiment/components/soundsensor/__init__.py +324 -0
  1714. psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
  1715. psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
  1716. psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
  1717. psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
  1718. psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
  1719. psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
  1720. psychopy/experiment/components/static/__init__.py +293 -0
  1721. psychopy/experiment/components/static/classic/static.png +0 -0
  1722. psychopy/experiment/components/static/classic/static@2x.png +0 -0
  1723. psychopy/experiment/components/static/dark/static.png +0 -0
  1724. psychopy/experiment/components/static/dark/static@2x.png +0 -0
  1725. psychopy/experiment/components/static/light/static.png +0 -0
  1726. psychopy/experiment/components/static/light/static@2x.png +0 -0
  1727. psychopy/experiment/components/text/__init__.py +190 -0
  1728. psychopy/experiment/components/text/classic/text.png +0 -0
  1729. psychopy/experiment/components/text/classic/text@2x.png +0 -0
  1730. psychopy/experiment/components/text/dark/text.png +0 -0
  1731. psychopy/experiment/components/text/dark/text@2x.png +0 -0
  1732. psychopy/experiment/components/text/light/text.png +0 -0
  1733. psychopy/experiment/components/text/light/text@2x.png +0 -0
  1734. psychopy/experiment/components/textbox/__init__.py +336 -0
  1735. psychopy/experiment/components/textbox/classic/textbox.png +0 -0
  1736. psychopy/experiment/components/textbox/classic/textbox@2x.png +0 -0
  1737. psychopy/experiment/components/textbox/dark/textbox.png +0 -0
  1738. psychopy/experiment/components/textbox/dark/textbox@2x.png +0 -0
  1739. psychopy/experiment/components/textbox/light/textbox.png +0 -0
  1740. psychopy/experiment/components/textbox/light/textbox@2x.png +0 -0
  1741. psychopy/experiment/components/unknown/__init__.py +87 -0
  1742. psychopy/experiment/components/unknown/classic/unknown.png +0 -0
  1743. psychopy/experiment/components/unknown/classic/unknown@2x.png +0 -0
  1744. psychopy/experiment/components/unknown/dark/unknown.png +0 -0
  1745. psychopy/experiment/components/unknown/dark/unknown@2x.png +0 -0
  1746. psychopy/experiment/components/unknown/light/unknown.png +0 -0
  1747. psychopy/experiment/components/unknown/light/unknown@2x.png +0 -0
  1748. psychopy/experiment/components/unknownPlugin/__init__.py +86 -0
  1749. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin.png +0 -0
  1750. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin@2x.png +0 -0
  1751. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin.png +0 -0
  1752. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin@2x.png +0 -0
  1753. psychopy/experiment/components/unknownPlugin/light/unknownPlugin.png +0 -0
  1754. psychopy/experiment/components/unknownPlugin/light/unknownPlugin@2x.png +0 -0
  1755. psychopy/experiment/components/utils.py +0 -0
  1756. psychopy/experiment/components/variable/__init__.py +184 -0
  1757. psychopy/experiment/components/variable/classic/variable.png +0 -0
  1758. psychopy/experiment/components/variable/classic/variable@2x.png +0 -0
  1759. psychopy/experiment/components/variable/dark/variable.png +0 -0
  1760. psychopy/experiment/components/variable/dark/variable@2x.png +0 -0
  1761. psychopy/experiment/components/variable/light/variable.png +0 -0
  1762. psychopy/experiment/components/variable/light/variable@2x.png +0 -0
  1763. psychopy/experiment/devices.py +303 -0
  1764. psychopy/experiment/experiment.xsd +223 -0
  1765. psychopy/experiment/exports.py +390 -0
  1766. psychopy/experiment/flow.py +547 -0
  1767. psychopy/experiment/localization.py +11 -0
  1768. psychopy/experiment/loopTemplate.xltx +0 -0
  1769. psychopy/experiment/loops.py +1051 -0
  1770. psychopy/experiment/monitor.py +74 -0
  1771. psychopy/experiment/params.py +541 -0
  1772. psychopy/experiment/plugins.py +42 -0
  1773. psychopy/experiment/py2js.py +183 -0
  1774. psychopy/experiment/py2js_transpiler.py +613 -0
  1775. psychopy/experiment/questPlusTemplate.xltx +0 -0
  1776. psychopy/experiment/questTemplate.xltx +0 -0
  1777. psychopy/experiment/routines/__init__.py +108 -0
  1778. psychopy/experiment/routines/_base.py +1172 -0
  1779. psychopy/experiment/routines/audioValidator/__init__.py +229 -0
  1780. psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
  1781. psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
  1782. psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
  1783. psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
  1784. psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
  1785. psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
  1786. psychopy/experiment/routines/counterbalance/__init__.py +320 -0
  1787. psychopy/experiment/routines/counterbalance/classic/counterbalance.png +0 -0
  1788. psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png +0 -0
  1789. psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx +0 -0
  1790. psychopy/experiment/routines/counterbalance/dark/counterbalance.png +0 -0
  1791. psychopy/experiment/routines/counterbalance/dark/counterbalance@2x.png +0 -0
  1792. psychopy/experiment/routines/counterbalance/light/counterbalance.png +0 -0
  1793. psychopy/experiment/routines/counterbalance/light/counterbalance@2x.png +0 -0
  1794. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +334 -0
  1795. psychopy/experiment/routines/eyetracker_calibrate/classic/eyetracker_calib.png +0 -0
  1796. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib.png +0 -0
  1797. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib@2x.png +0 -0
  1798. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib.png +0 -0
  1799. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib@2x.png +0 -0
  1800. psychopy/experiment/routines/eyetracker_validate/__init__.py +354 -0
  1801. psychopy/experiment/routines/eyetracker_validate/classic/eyetracker_valid.png +0 -0
  1802. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid.png +0 -0
  1803. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid@2x.png +0 -0
  1804. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid.png +0 -0
  1805. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid@2x.png +0 -0
  1806. psychopy/experiment/routines/pavlovia_survey/__init__.py +236 -0
  1807. psychopy/experiment/routines/pavlovia_survey/classic/survey.png +0 -0
  1808. psychopy/experiment/routines/pavlovia_survey/classic/survey@2x.png +0 -0
  1809. psychopy/experiment/routines/pavlovia_survey/dark/survey.png +0 -0
  1810. psychopy/experiment/routines/pavlovia_survey/dark/survey@2x.png +0 -0
  1811. psychopy/experiment/routines/pavlovia_survey/light/survey.png +0 -0
  1812. psychopy/experiment/routines/pavlovia_survey/light/survey@2x.png +0 -0
  1813. psychopy/experiment/routines/unknown/__init__.py +30 -0
  1814. psychopy/experiment/routines/unknown/classic/eyetracker_record.png +0 -0
  1815. psychopy/experiment/routines/unknown/classic/unknown.png +0 -0
  1816. psychopy/experiment/routines/unknown/dark/eyetracker_record.png +0 -0
  1817. psychopy/experiment/routines/unknown/dark/eyetracker_record@2x.png +0 -0
  1818. psychopy/experiment/routines/unknown/dark/unknown.png +0 -0
  1819. psychopy/experiment/routines/unknown/dark/unknown@2x.png +0 -0
  1820. psychopy/experiment/routines/unknown/light/eyetracker_record.png +0 -0
  1821. psychopy/experiment/routines/unknown/light/eyetracker_record@2x.png +0 -0
  1822. psychopy/experiment/routines/unknown/light/unknown.png +0 -0
  1823. psychopy/experiment/routines/unknown/light/unknown@2x.png +0 -0
  1824. psychopy/experiment/routines/utils.py +0 -0
  1825. psychopy/experiment/routines/visualValidator/__init__.py +395 -0
  1826. psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
  1827. psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
  1828. psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
  1829. psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
  1830. psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
  1831. psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
  1832. psychopy/experiment/staircaseTemplate.xltx +0 -0
  1833. psychopy/experiment/utils.py +44 -0
  1834. psychopy/filters.py +11 -0
  1835. psychopy/gamma.py +9 -0
  1836. psychopy/gui/__init__.py +47 -0
  1837. psychopy/gui/qtgui.py +882 -0
  1838. psychopy/gui/util.py +74 -0
  1839. psychopy/gui/wxgui.py +420 -0
  1840. psychopy/hardware/__init__.py +178 -0
  1841. psychopy/hardware/base.py +466 -0
  1842. psychopy/hardware/bbtk/__init__.py +24 -0
  1843. psychopy/hardware/brainproducts.py +25 -0
  1844. psychopy/hardware/button.py +238 -0
  1845. psychopy/hardware/buttonbox/__init__.py +122 -0
  1846. psychopy/hardware/camera/__init__.py +3657 -0
  1847. psychopy/hardware/cedrus.py +24 -0
  1848. psychopy/hardware/crs/__init__.py +46 -0
  1849. psychopy/hardware/crs/bits.py +37 -0
  1850. psychopy/hardware/crs/colorcal.py +18 -0
  1851. psychopy/hardware/crs/optical.py +33 -0
  1852. psychopy/hardware/crs/shaders.py +34 -0
  1853. psychopy/hardware/emotiv.py +33 -0
  1854. psychopy/hardware/emulator.py +46 -0
  1855. psychopy/hardware/exceptions.py +86 -0
  1856. psychopy/hardware/eyetracker.py +132 -0
  1857. psychopy/hardware/forp.py +37 -0
  1858. psychopy/hardware/gammasci.py +26 -0
  1859. psychopy/hardware/iolab.py +24 -0
  1860. psychopy/hardware/joystick/__init__.py +1196 -0
  1861. psychopy/hardware/joystick/_base.py +251 -0
  1862. psychopy/hardware/joystick/backend_glfw.py +306 -0
  1863. psychopy/hardware/joystick/backend_pyglet.py +309 -0
  1864. psychopy/hardware/joystick/mappings.py +287 -0
  1865. psychopy/hardware/keyboard.py +975 -0
  1866. psychopy/hardware/knownDevices.json +52 -0
  1867. psychopy/hardware/labhackers.py +27 -0
  1868. psychopy/hardware/labjacks.py +26 -0
  1869. psychopy/hardware/lightsensor.py +789 -0
  1870. psychopy/hardware/listener.py +330 -0
  1871. psychopy/hardware/manager.py +992 -0
  1872. psychopy/hardware/microphone.py +1630 -0
  1873. psychopy/hardware/minolta.py +33 -0
  1874. psychopy/hardware/monitor.py +144 -0
  1875. psychopy/hardware/mouse/__init__.py +885 -0
  1876. psychopy/hardware/photometer/__init__.py +207 -0
  1877. psychopy/hardware/pr.py +33 -0
  1878. psychopy/hardware/qmix.py +32 -0
  1879. psychopy/hardware/serialdevice.py +387 -0
  1880. psychopy/hardware/soundsensor.py +476 -0
  1881. psychopy/hardware/spatial/__init__.py +231 -0
  1882. psychopy/hardware/speaker.py +351 -0
  1883. psychopy/hardware/triggerbox/__init__.py +56 -0
  1884. psychopy/hardware/triggerbox/base.py +170 -0
  1885. psychopy/hardware/triggerbox/parallel.py +362 -0
  1886. psychopy/info.py +719 -0
  1887. psychopy/iohub/__init__.py +50 -0
  1888. psychopy/iohub/client/__init__.py +1481 -0
  1889. psychopy/iohub/client/connect.py +260 -0
  1890. psychopy/iohub/client/eyetracker/__init__.py +4 -0
  1891. psychopy/iohub/client/eyetracker/validation/__init__.py +8 -0
  1892. psychopy/iohub/client/eyetracker/validation/posgrid.py +274 -0
  1893. psychopy/iohub/client/eyetracker/validation/procedure.py +1292 -0
  1894. psychopy/iohub/client/eyetracker/validation/trigger.py +240 -0
  1895. psychopy/iohub/client/keyboard.py +513 -0
  1896. psychopy/iohub/client/wintab.py +378 -0
  1897. psychopy/iohub/constants.py +1176 -0
  1898. psychopy/iohub/datastore/__init__.py +439 -0
  1899. psychopy/iohub/datastore/default_datastore.yaml +8 -0
  1900. psychopy/iohub/datastore/util.py +868 -0
  1901. psychopy/iohub/default_config.yaml +17 -0
  1902. psychopy/iohub/devices/__init__.py +1047 -0
  1903. psychopy/iohub/devices/computer.py +607 -0
  1904. psychopy/iohub/devices/default_device.yaml +15 -0
  1905. psychopy/iohub/devices/deviceConfigValidation.py +519 -0
  1906. psychopy/iohub/devices/display/__init__.py +755 -0
  1907. psychopy/iohub/devices/display/default_display.yaml +118 -0
  1908. psychopy/iohub/devices/display/supported_config_settings.yaml +69 -0
  1909. psychopy/iohub/devices/eventfilters.py +3572 -0
  1910. psychopy/iohub/devices/experiment/__init__.py +316 -0
  1911. psychopy/iohub/devices/experiment/default_experiment.yaml +74 -0
  1912. psychopy/iohub/devices/experiment/supported_config_settings.yaml +26 -0
  1913. psychopy/iohub/devices/eyetracker/__init__.py +474 -0
  1914. psychopy/iohub/devices/eyetracker/calibration/__init__.py +1 -0
  1915. psychopy/iohub/devices/eyetracker/calibration/procedure.py +391 -0
  1916. psychopy/iohub/devices/eyetracker/default_eyetracker.yaml +18 -0
  1917. psychopy/iohub/devices/eyetracker/eye_events.py +1751 -0
  1918. psychopy/iohub/devices/eyetracker/filters/__init__.py +4 -0
  1919. psychopy/iohub/devices/eyetracker/filters/parser.py +913 -0
  1920. psychopy/iohub/devices/eyetracker/hw/__init__.py +4 -0
  1921. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +29 -0
  1922. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +29 -0
  1923. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/calibration.py +18 -0
  1924. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +31 -0
  1925. psychopy/iohub/devices/eyetracker/hw/mouse/__init__.py +8 -0
  1926. psychopy/iohub/devices/eyetracker/hw/mouse/calibration.py +10 -0
  1927. psychopy/iohub/devices/eyetracker/hw/mouse/default_eyetracker.yaml +102 -0
  1928. psychopy/iohub/devices/eyetracker/hw/mouse/eyetracker.py +443 -0
  1929. psychopy/iohub/devices/eyetracker/hw/mouse/supported_config_settings.yaml +110 -0
  1930. psychopy/iohub/devices/eyetracker/hw/pupil_labs/__init__.py +4 -0
  1931. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +27 -0
  1932. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/eyetracker.py +18 -0
  1933. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/__init__.py +29 -0
  1934. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/bisector.py +20 -0
  1935. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/constants.py +19 -0
  1936. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/data_parse.py +22 -0
  1937. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/eyetracker.py +18 -0
  1938. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/pupil_remote.py +18 -0
  1939. psychopy/iohub/devices/eyetracker/hw/sr_research/__init__.py +4 -0
  1940. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/__init__.py +28 -0
  1941. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/calibration.py +22 -0
  1942. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/eyetracker.py +38 -0
  1943. psychopy/iohub/devices/eyetracker/hw/tobii/__init__.py +29 -0
  1944. psychopy/iohub/devices/eyetracker/hw/tobii/calibration.py +19 -0
  1945. psychopy/iohub/devices/eyetracker/hw/tobii/eyetracker.py +17 -0
  1946. psychopy/iohub/devices/eyetracker/hw/tobii/tobiiwrapper.py +19 -0
  1947. psychopy/iohub/devices/eyetracker/supported_config_settings.yaml +44 -0
  1948. psychopy/iohub/devices/keyboard/__init__.py +309 -0
  1949. psychopy/iohub/devices/keyboard/darwin.py +431 -0
  1950. psychopy/iohub/devices/keyboard/darwinkey.py +94 -0
  1951. psychopy/iohub/devices/keyboard/default_keyboard.yaml +94 -0
  1952. psychopy/iohub/devices/keyboard/linux2.py +102 -0
  1953. psychopy/iohub/devices/keyboard/supported_config_settings.yaml +39 -0
  1954. psychopy/iohub/devices/keyboard/win32.py +356 -0
  1955. psychopy/iohub/devices/mouse/__init__.py +709 -0
  1956. psychopy/iohub/devices/mouse/darwin.py +414 -0
  1957. psychopy/iohub/devices/mouse/default_mouse.yaml +92 -0
  1958. psychopy/iohub/devices/mouse/linux2.py +172 -0
  1959. psychopy/iohub/devices/mouse/supported_config_settings.yaml +39 -0
  1960. psychopy/iohub/devices/mouse/win32.py +284 -0
  1961. psychopy/iohub/devices/pyXHook.py +619 -0
  1962. psychopy/iohub/devices/serial/__init__.py +779 -0
  1963. psychopy/iohub/devices/serial/default_pstbox.yaml +108 -0
  1964. psychopy/iohub/devices/serial/default_serial.yaml +108 -0
  1965. psychopy/iohub/devices/serial/supported_config_settings.yaml +85 -0
  1966. psychopy/iohub/devices/serial/supported_config_settings_pstbox.yaml +85 -0
  1967. psychopy/iohub/devices/supported_config_settings.yaml +36 -0
  1968. psychopy/iohub/devices/wintab/__init__.py +580 -0
  1969. psychopy/iohub/devices/wintab/default_wintab.yaml +89 -0
  1970. psychopy/iohub/devices/wintab/supported_config_settings.yaml +42 -0
  1971. psychopy/iohub/devices/wintab/win32.py +722 -0
  1972. psychopy/iohub/devices/xlib.py +6795 -0
  1973. psychopy/iohub/errors.py +61 -0
  1974. psychopy/iohub/lazy_import.py +582 -0
  1975. psychopy/iohub/net.py +349 -0
  1976. psychopy/iohub/server.py +1075 -0
  1977. psychopy/iohub/start_iohub_process.py +121 -0
  1978. psychopy/iohub/util/__init__.py +832 -0
  1979. psychopy/iohub/util/visualangle.py +126 -0
  1980. psychopy/layout.py +916 -0
  1981. psychopy/liaison.py +471 -0
  1982. psychopy/locale_setup.py +41 -0
  1983. psychopy/localization/__init__.py +22 -0
  1984. psychopy/localization/_localization.py +155 -0
  1985. psychopy/localization/generateTranslationTemplate.py +257 -0
  1986. psychopy/localization/mappings.txt +170 -0
  1987. psychopy/localization/messages.pot +9950 -0
  1988. psychopy/localization/readme.txt +68 -0
  1989. psychopy/logging.py +415 -0
  1990. psychopy/microphone.py +28 -0
  1991. psychopy/misc.py +40 -0
  1992. psychopy/monitors/MonitorCenter.py +1354 -0
  1993. psychopy/monitors/__init__.py +30 -0
  1994. psychopy/monitors/calibData.py +78 -0
  1995. psychopy/monitors/calibTools.py +1301 -0
  1996. psychopy/monitors/getLumSeries.py +50 -0
  1997. psychopy/monitors/psychopy-icon.svg +395 -0
  1998. psychopy/monitors/psychopy.ico +0 -0
  1999. psychopy/parallel/__init__.py +206 -0
  2000. psychopy/parallel/_dlportio.py +150 -0
  2001. psychopy/parallel/_inpout.py +120 -0
  2002. psychopy/parallel/_linux.py +105 -0
  2003. psychopy/piloting.py +61 -0
  2004. psychopy/platform_specific/__init__.py +46 -0
  2005. psychopy/platform_specific/darwin.py +326 -0
  2006. psychopy/platform_specific/linux.py +77 -0
  2007. psychopy/platform_specific/win32.py +124 -0
  2008. psychopy/plugins/__init__.py +1397 -0
  2009. psychopy/plugins/util.py +104 -0
  2010. psychopy/preferences/Darwin.spec +294 -0
  2011. psychopy/preferences/FreeBSD.spec +294 -0
  2012. psychopy/preferences/Linux.spec +294 -0
  2013. psychopy/preferences/Windows.spec +294 -0
  2014. psychopy/preferences/__init__.py +20 -0
  2015. psychopy/preferences/baseNoArch.spec +290 -0
  2016. psychopy/preferences/devices.py +80 -0
  2017. psychopy/preferences/generateHints.py +93 -0
  2018. psychopy/preferences/generateSpec.py +80 -0
  2019. psychopy/preferences/hints.py +367 -0
  2020. psychopy/preferences/preferences.py +448 -0
  2021. psychopy/projects/__init__.py +11 -0
  2022. psychopy/projects/gitignore.py +45 -0
  2023. psychopy/projects/pavlovia.py +1674 -0
  2024. psychopy/projects/sshkeys.py +107 -0
  2025. psychopy/psychojs.zip +0 -0
  2026. psychopy/pylintrc +69 -0
  2027. psychopy/scripts/__init__.py +0 -0
  2028. psychopy/scripts/psychopy-pkgutil.py +969 -0
  2029. psychopy/scripts/psyexpCompile.py +229 -0
  2030. psychopy/session.py +1651 -0
  2031. psychopy/sound/__init__.py +50 -0
  2032. psychopy/sound/_base.py +399 -0
  2033. psychopy/sound/audioclip.py +1325 -0
  2034. psychopy/sound/audiodevice.py +857 -0
  2035. psychopy/sound/backend_ptb.py +406 -0
  2036. psychopy/sound/backend_pygame.py +323 -0
  2037. psychopy/sound/backend_pyo.py +64 -0
  2038. psychopy/sound/backend_pysound.py +324 -0
  2039. psychopy/sound/backend_sounddevice.py +44 -0
  2040. psychopy/sound/backends/__init__.py +0 -0
  2041. psychopy/sound/exceptions.py +115 -0
  2042. psychopy/sound/microphone.py +357 -0
  2043. psychopy/sound/sound.py +58 -0
  2044. psychopy/sound/transcribe.py +1321 -0
  2045. psychopy/tests/README.md +344 -0
  2046. psychopy/tests/__init__.py +47 -0
  2047. psychopy/tests/data/Electronic_Chime-KevanGC-495939803.wav +0 -0
  2048. psychopy/tests/data/TestCircle_w128h128_bottom_left.png +0 -0
  2049. psychopy/tests/data/TestCircle_w128h128_bottom_right.png +0 -0
  2050. psychopy/tests/data/TestCircle_w128h128_center_center.png +0 -0
  2051. psychopy/tests/data/TestCircle_w128h128_top_left.png +0 -0
  2052. psychopy/tests/data/TestCircle_w128h128_top_right.png +0 -0
  2053. psychopy/tests/data/TestCircle_w128h64_bottom_left.png +0 -0
  2054. psychopy/tests/data/TestCircle_w128h64_bottom_right.png +0 -0
  2055. psychopy/tests/data/TestCircle_w128h64_center_center.png +0 -0
  2056. psychopy/tests/data/TestCircle_w128h64_top_left.png +0 -0
  2057. psychopy/tests/data/TestCircle_w128h64_top_right.png +0 -0
  2058. psychopy/tests/data/TestCircle_w64h128_bottom_left.png +0 -0
  2059. psychopy/tests/data/TestCircle_w64h128_bottom_right.png +0 -0
  2060. psychopy/tests/data/TestCircle_w64h128_center_center.png +0 -0
  2061. psychopy/tests/data/TestCircle_w64h128_top_left.png +0 -0
  2062. psychopy/tests/data/TestCircle_w64h128_top_right.png +0 -0
  2063. psychopy/tests/data/TestCircle_w64h64_bottom_left.png +0 -0
  2064. psychopy/tests/data/TestCircle_w64h64_bottom_right.png +0 -0
  2065. psychopy/tests/data/TestCircle_w64h64_center_center.png +0 -0
  2066. psychopy/tests/data/TestCircle_w64h64_top_left.png +0 -0
  2067. psychopy/tests/data/TestCircle_w64h64_top_right.png +0 -0
  2068. psychopy/tests/data/TestForm_scrolling_nq10_s0.5.png +0 -0
  2069. psychopy/tests/data/TestForm_scrolling_nq10_s0.png +0 -0
  2070. psychopy/tests/data/TestForm_scrolling_nq10_s1.png +0 -0
  2071. psychopy/tests/data/TestForm_scrolling_nq1_s0.5.png +0 -0
  2072. psychopy/tests/data/TestForm_scrolling_nq1_s0.png +0 -0
  2073. psychopy/tests/data/TestForm_scrolling_nq1_s1.png +0 -0
  2074. psychopy/tests/data/TestForm_scrolling_nq3_s0.5.png +0 -0
  2075. psychopy/tests/data/TestForm_scrolling_nq3_s0.png +0 -0
  2076. psychopy/tests/data/TestForm_scrolling_nq3_s1.png +0 -0
  2077. psychopy/tests/data/TestImage_w128h128_bottom_left.png +0 -0
  2078. psychopy/tests/data/TestImage_w128h128_bottom_right.png +0 -0
  2079. psychopy/tests/data/TestImage_w128h128_center_center.png +0 -0
  2080. psychopy/tests/data/TestImage_w128h128_top_left.png +0 -0
  2081. psychopy/tests/data/TestImage_w128h128_top_right.png +0 -0
  2082. psychopy/tests/data/TestImage_w128h64_bottom_left.png +0 -0
  2083. psychopy/tests/data/TestImage_w128h64_bottom_right.png +0 -0
  2084. psychopy/tests/data/TestImage_w128h64_center_center.png +0 -0
  2085. psychopy/tests/data/TestImage_w128h64_top_left.png +0 -0
  2086. psychopy/tests/data/TestImage_w128h64_top_right.png +0 -0
  2087. psychopy/tests/data/TestImage_w64h128_bottom_left.png +0 -0
  2088. psychopy/tests/data/TestImage_w64h128_bottom_right.png +0 -0
  2089. psychopy/tests/data/TestImage_w64h128_center_center.png +0 -0
  2090. psychopy/tests/data/TestImage_w64h128_top_left.png +0 -0
  2091. psychopy/tests/data/TestImage_w64h128_top_right.png +0 -0
  2092. psychopy/tests/data/TestImage_w64h64_bottom_left.png +0 -0
  2093. psychopy/tests/data/TestImage_w64h64_bottom_right.png +0 -0
  2094. psychopy/tests/data/TestImage_w64h64_center_center.png +0 -0
  2095. psychopy/tests/data/TestImage_w64h64_top_left.png +0 -0
  2096. psychopy/tests/data/TestImage_w64h64_top_right.png +0 -0
  2097. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.3.png +0 -0
  2098. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.6.png +0 -0
  2099. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.3.png +0 -0
  2100. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.6.png +0 -0
  2101. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.3.png +0 -0
  2102. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.6.png +0 -0
  2103. psychopy/tests/data/TestProgress_testValue_minmax_0.png +0 -0
  2104. psychopy/tests/data/TestProgress_testValue_minmax_1.png +0 -0
  2105. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.3.png +0 -0
  2106. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.6.png +0 -0
  2107. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.3.png +0 -0
  2108. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.6.png +0 -0
  2109. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.3.png +0 -0
  2110. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.6.png +0 -0
  2111. psychopy/tests/data/TestProgress_w128h128_bottom_left.png +0 -0
  2112. psychopy/tests/data/TestProgress_w128h128_bottom_right.png +0 -0
  2113. psychopy/tests/data/TestProgress_w128h128_center_center.png +0 -0
  2114. psychopy/tests/data/TestProgress_w128h128_top_left.png +0 -0
  2115. psychopy/tests/data/TestProgress_w128h128_top_right.png +0 -0
  2116. psychopy/tests/data/TestProgress_w128h64_bottom_left.png +0 -0
  2117. psychopy/tests/data/TestProgress_w128h64_bottom_right.png +0 -0
  2118. psychopy/tests/data/TestProgress_w128h64_center_center.png +0 -0
  2119. psychopy/tests/data/TestProgress_w128h64_top_left.png +0 -0
  2120. psychopy/tests/data/TestProgress_w128h64_top_right.png +0 -0
  2121. psychopy/tests/data/TestProgress_w64h128_bottom_left.png +0 -0
  2122. psychopy/tests/data/TestProgress_w64h128_bottom_right.png +0 -0
  2123. psychopy/tests/data/TestProgress_w64h128_center_center.png +0 -0
  2124. psychopy/tests/data/TestProgress_w64h128_top_left.png +0 -0
  2125. psychopy/tests/data/TestProgress_w64h128_top_right.png +0 -0
  2126. psychopy/tests/data/TestProgress_w64h64_bottom_left.png +0 -0
  2127. psychopy/tests/data/TestProgress_w64h64_bottom_right.png +0 -0
  2128. psychopy/tests/data/TestProgress_w64h64_center_center.png +0 -0
  2129. psychopy/tests/data/TestProgress_w64h64_top_left.png +0 -0
  2130. psychopy/tests/data/TestProgress_w64h64_top_right.png +0 -0
  2131. psychopy/tests/data/TestROI_w128h128_bottom_left.png +0 -0
  2132. psychopy/tests/data/TestROI_w128h128_bottom_right.png +0 -0
  2133. psychopy/tests/data/TestROI_w128h128_center_center.png +0 -0
  2134. psychopy/tests/data/TestROI_w128h128_top_left.png +0 -0
  2135. psychopy/tests/data/TestROI_w128h128_top_right.png +0 -0
  2136. psychopy/tests/data/TestROI_w128h64_bottom_left.png +0 -0
  2137. psychopy/tests/data/TestROI_w128h64_bottom_right.png +0 -0
  2138. psychopy/tests/data/TestROI_w128h64_center_center.png +0 -0
  2139. psychopy/tests/data/TestROI_w128h64_top_left.png +0 -0
  2140. psychopy/tests/data/TestROI_w128h64_top_right.png +0 -0
  2141. psychopy/tests/data/TestROI_w64h128_bottom_left.png +0 -0
  2142. psychopy/tests/data/TestROI_w64h128_bottom_right.png +0 -0
  2143. psychopy/tests/data/TestROI_w64h128_center_center.png +0 -0
  2144. psychopy/tests/data/TestROI_w64h128_top_left.png +0 -0
  2145. psychopy/tests/data/TestROI_w64h128_top_right.png +0 -0
  2146. psychopy/tests/data/TestROI_w64h64_bottom_left.png +0 -0
  2147. psychopy/tests/data/TestROI_w64h64_bottom_right.png +0 -0
  2148. psychopy/tests/data/TestROI_w64h64_center_center.png +0 -0
  2149. psychopy/tests/data/TestROI_w64h64_top_left.png +0 -0
  2150. psychopy/tests/data/TestROI_w64h64_top_right.png +0 -0
  2151. psychopy/tests/data/TestSession_exp1.png +0 -0
  2152. psychopy/tests/data/TestSession_exp2.png +0 -0
  2153. psychopy/tests/data/TestShape_w128h128_bottom_left.png +0 -0
  2154. psychopy/tests/data/TestShape_w128h128_bottom_right.png +0 -0
  2155. psychopy/tests/data/TestShape_w128h128_center_center.png +0 -0
  2156. psychopy/tests/data/TestShape_w128h128_top_left.png +0 -0
  2157. psychopy/tests/data/TestShape_w128h128_top_right.png +0 -0
  2158. psychopy/tests/data/TestShape_w128h64_bottom_left.png +0 -0
  2159. psychopy/tests/data/TestShape_w128h64_bottom_right.png +0 -0
  2160. psychopy/tests/data/TestShape_w128h64_center_center.png +0 -0
  2161. psychopy/tests/data/TestShape_w128h64_top_left.png +0 -0
  2162. psychopy/tests/data/TestShape_w128h64_top_right.png +0 -0
  2163. psychopy/tests/data/TestShape_w64h128_bottom_left.png +0 -0
  2164. psychopy/tests/data/TestShape_w64h128_bottom_right.png +0 -0
  2165. psychopy/tests/data/TestShape_w64h128_center_center.png +0 -0
  2166. psychopy/tests/data/TestShape_w64h128_top_left.png +0 -0
  2167. psychopy/tests/data/TestShape_w64h128_top_right.png +0 -0
  2168. psychopy/tests/data/TestShape_w64h64_bottom_left.png +0 -0
  2169. psychopy/tests/data/TestShape_w64h64_bottom_right.png +0 -0
  2170. psychopy/tests/data/TestShape_w64h64_center_center.png +0 -0
  2171. psychopy/tests/data/TestShape_w64h64_top_left.png +0 -0
  2172. psychopy/tests/data/TestShape_w64h64_top_right.png +0 -0
  2173. psychopy/tests/data/TestTarget_w128h128_bottom_left.png +0 -0
  2174. psychopy/tests/data/TestTarget_w128h128_bottom_right.png +0 -0
  2175. psychopy/tests/data/TestTarget_w128h128_center_center.png +0 -0
  2176. psychopy/tests/data/TestTarget_w128h128_top_left.png +0 -0
  2177. psychopy/tests/data/TestTarget_w128h128_top_right.png +0 -0
  2178. psychopy/tests/data/TestTarget_w128h64_bottom_left.png +0 -0
  2179. psychopy/tests/data/TestTarget_w128h64_bottom_right.png +0 -0
  2180. psychopy/tests/data/TestTarget_w128h64_center_center.png +0 -0
  2181. psychopy/tests/data/TestTarget_w128h64_top_left.png +0 -0
  2182. psychopy/tests/data/TestTarget_w128h64_top_right.png +0 -0
  2183. psychopy/tests/data/TestTarget_w64h128_bottom_left.png +0 -0
  2184. psychopy/tests/data/TestTarget_w64h128_bottom_right.png +0 -0
  2185. psychopy/tests/data/TestTarget_w64h128_center_center.png +0 -0
  2186. psychopy/tests/data/TestTarget_w64h128_top_left.png +0 -0
  2187. psychopy/tests/data/TestTarget_w64h128_top_right.png +0 -0
  2188. psychopy/tests/data/TestTarget_w64h64_bottom_left.png +0 -0
  2189. psychopy/tests/data/TestTarget_w64h64_bottom_right.png +0 -0
  2190. psychopy/tests/data/TestTarget_w64h64_center_center.png +0 -0
  2191. psychopy/tests/data/TestTarget_w64h64_top_left.png +0 -0
  2192. psychopy/tests/data/TestTarget_w64h64_top_right.png +0 -0
  2193. psychopy/tests/data/TestTextbox_testLetterSpacing_0p6.png +0 -0
  2194. psychopy/tests/data/TestTextbox_testLetterSpacing_0p8.png +0 -0
  2195. psychopy/tests/data/TestTextbox_testLetterSpacing_1.png +0 -0
  2196. psychopy/tests/data/TestTextbox_testLetterSpacing_1p2.png +0 -0
  2197. psychopy/tests/data/TestTextbox_testLetterSpacing_1p4.png +0 -0
  2198. psychopy/tests/data/TestTextbox_testLetterSpacing_1p6.png +0 -0
  2199. psychopy/tests/data/TestTextbox_testLetterSpacing_1p8.png +0 -0
  2200. psychopy/tests/data/TestTextbox_testLetterSpacing_2p0.png +0 -0
  2201. psychopy/tests/data/TestTextbox_testLetterSpacing_None.png +0 -0
  2202. psychopy/tests/data/TestUnknownPluginComponent_load_resave.psyexp +135 -0
  2203. psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png +0 -0
  2204. psychopy/tests/data/Test_textbox/test_ori_0_center.png +0 -0
  2205. psychopy/tests/data/Test_textbox/test_ori_0_top left.png +0 -0
  2206. psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png +0 -0
  2207. psychopy/tests/data/Test_textbox/test_ori_120_center.png +0 -0
  2208. psychopy/tests/data/Test_textbox/test_ori_120_top left.png +0 -0
  2209. psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png +0 -0
  2210. psychopy/tests/data/Test_textbox/test_ori_180_center.png +0 -0
  2211. psychopy/tests/data/Test_textbox/test_ori_180_top left.png +0 -0
  2212. psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png +0 -0
  2213. psychopy/tests/data/Test_textbox/test_ori_240_center.png +0 -0
  2214. psychopy/tests/data/Test_textbox/test_ori_240_top left.png +0 -0
  2215. psychopy/tests/data/Test_textbox_testSpeechpoint_-3ovr8_0ovr8.png +0 -0
  2216. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_-3ovr8.png +0 -0
  2217. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_3ovr8.png +0 -0
  2218. psychopy/tests/data/Test_textbox_testSpeechpoint_3ovr8_0ovr8.png +0 -0
  2219. psychopy/tests/data/Test_textbox_w128h128_bottom_left.png +0 -0
  2220. psychopy/tests/data/Test_textbox_w128h128_bottom_right.png +0 -0
  2221. psychopy/tests/data/Test_textbox_w128h128_center_center.png +0 -0
  2222. psychopy/tests/data/Test_textbox_w128h128_top_left.png +0 -0
  2223. psychopy/tests/data/Test_textbox_w128h128_top_right.png +0 -0
  2224. psychopy/tests/data/Test_textbox_w128h64_bottom_left.png +0 -0
  2225. psychopy/tests/data/Test_textbox_w128h64_bottom_right.png +0 -0
  2226. psychopy/tests/data/Test_textbox_w128h64_center_center.png +0 -0
  2227. psychopy/tests/data/Test_textbox_w128h64_top_left.png +0 -0
  2228. psychopy/tests/data/Test_textbox_w128h64_top_right.png +0 -0
  2229. psychopy/tests/data/Test_textbox_w64h128_bottom_left.png +0 -0
  2230. psychopy/tests/data/Test_textbox_w64h128_bottom_right.png +0 -0
  2231. psychopy/tests/data/Test_textbox_w64h128_center_center.png +0 -0
  2232. psychopy/tests/data/Test_textbox_w64h128_top_left.png +0 -0
  2233. psychopy/tests/data/Test_textbox_w64h128_top_right.png +0 -0
  2234. psychopy/tests/data/Test_textbox_w64h64_bottom_left.png +0 -0
  2235. psychopy/tests/data/Test_textbox_w64h64_bottom_right.png +0 -0
  2236. psychopy/tests/data/Test_textbox_w64h64_center_center.png +0 -0
  2237. psychopy/tests/data/Test_textbox_w64h64_top_left.png +0 -0
  2238. psychopy/tests/data/Test_textbox_w64h64_top_right.png +0 -0
  2239. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_left.png +0 -0
  2240. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_right.png +0 -0
  2241. psychopy/tests/data/Test_uax14_textbox_w128h128_center_center.png +0 -0
  2242. psychopy/tests/data/Test_uax14_textbox_w128h128_top_left.png +0 -0
  2243. psychopy/tests/data/Test_uax14_textbox_w128h128_top_right.png +0 -0
  2244. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_left.png +0 -0
  2245. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_right.png +0 -0
  2246. psychopy/tests/data/Test_uax14_textbox_w128h64_center_center.png +0 -0
  2247. psychopy/tests/data/Test_uax14_textbox_w128h64_top_left.png +0 -0
  2248. psychopy/tests/data/Test_uax14_textbox_w128h64_top_right.png +0 -0
  2249. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_left.png +0 -0
  2250. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_right.png +0 -0
  2251. psychopy/tests/data/Test_uax14_textbox_w64h128_center_center.png +0 -0
  2252. psychopy/tests/data/Test_uax14_textbox_w64h128_top_left.png +0 -0
  2253. psychopy/tests/data/Test_uax14_textbox_w64h128_top_right.png +0 -0
  2254. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_left.png +0 -0
  2255. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_right.png +0 -0
  2256. psychopy/tests/data/Test_uax14_textbox_w64h64_center_center.png +0 -0
  2257. psychopy/tests/data/Test_uax14_textbox_w64h64_top_left.png +0 -0
  2258. psychopy/tests/data/Test_uax14_textbox_w64h64_top_right.png +0 -0
  2259. psychopy/tests/data/TextComponent_disabled.psyexp +63 -0
  2260. psychopy/tests/data/TextComponent_not_disabled.psyexp +63 -0
  2261. psychopy/tests/data/aperture1_deg.png +0 -0
  2262. psychopy/tests/data/aperture1_degFlat.png +0 -0
  2263. psychopy/tests/data/aperture1_degFlatPos.png +0 -0
  2264. psychopy/tests/data/aperture1_norm.png +0 -0
  2265. psychopy/tests/data/aperture1_normHexbackground.png +0 -0
  2266. psychopy/tests/data/aperture1_normNoShade.png +0 -0
  2267. psychopy/tests/data/aperture1_pix.png +0 -0
  2268. psychopy/tests/data/aperture1_stencil.png +0 -0
  2269. psychopy/tests/data/aperture2_deg.png +0 -0
  2270. psychopy/tests/data/aperture2_degFlat.png +0 -0
  2271. psychopy/tests/data/aperture2_degFlatPos.png +0 -0
  2272. psychopy/tests/data/aperture2_norm.png +0 -0
  2273. psychopy/tests/data/aperture2_normHexbackground.png +0 -0
  2274. psychopy/tests/data/aperture2_normNoShade.png +0 -0
  2275. psychopy/tests/data/aperture2_pix.png +0 -0
  2276. psychopy/tests/data/aperture2_stencil.png +0 -0
  2277. psychopy/tests/data/beatandrcos_cm.png +0 -0
  2278. psychopy/tests/data/beatandrcos_deg.png +0 -0
  2279. psychopy/tests/data/beatandrcos_degFlat.png +0 -0
  2280. psychopy/tests/data/beatandrcos_degFlatPos.png +0 -0
  2281. psychopy/tests/data/beatandrcos_height.png +0 -0
  2282. psychopy/tests/data/beatandrcos_norm.png +0 -0
  2283. psychopy/tests/data/beatandrcos_normAddBlend.png +0 -0
  2284. psychopy/tests/data/beatandrcos_normHexbackground.png +0 -0
  2285. psychopy/tests/data/beatandrcos_pix.png +0 -0
  2286. psychopy/tests/data/beatandrcos_stencil.png +0 -0
  2287. psychopy/tests/data/blend_add_cm.png +0 -0
  2288. psychopy/tests/data/blend_add_deg.png +0 -0
  2289. psychopy/tests/data/blend_add_degFlat.png +0 -0
  2290. psychopy/tests/data/blend_add_degFlatPos.png +0 -0
  2291. psychopy/tests/data/blend_add_height.png +0 -0
  2292. psychopy/tests/data/blend_add_norm.png +0 -0
  2293. psychopy/tests/data/blend_add_normAddBlend.png +0 -0
  2294. psychopy/tests/data/blend_add_normHexbackground.png +0 -0
  2295. psychopy/tests/data/blend_add_normNoShade.png +0 -0
  2296. psychopy/tests/data/blend_add_pix.png +0 -0
  2297. psychopy/tests/data/blend_add_stencil.png +0 -0
  2298. psychopy/tests/data/broken2020_2_5_resources/broken_resources.psyexp +84 -0
  2299. psychopy/tests/data/broken2020_2_5_resources/psychopy72.png +0 -0
  2300. psychopy/tests/data/bufferimg_gabor_cm.png +0 -0
  2301. psychopy/tests/data/bufferimg_gabor_deg.png +0 -0
  2302. psychopy/tests/data/bufferimg_gabor_degFlat.png +0 -0
  2303. psychopy/tests/data/bufferimg_gabor_degFlatPos.png +0 -0
  2304. psychopy/tests/data/bufferimg_gabor_height.png +0 -0
  2305. psychopy/tests/data/bufferimg_gabor_norm.png +0 -0
  2306. psychopy/tests/data/bufferimg_gabor_normAddBlend.png +0 -0
  2307. psychopy/tests/data/bufferimg_gabor_normHexbackground.png +0 -0
  2308. psychopy/tests/data/bufferimg_gabor_normNoShade.png +0 -0
  2309. psychopy/tests/data/bufferimg_gabor_pix.png +0 -0
  2310. psychopy/tests/data/bufferimg_gabor_stencil.png +0 -0
  2311. psychopy/tests/data/circleHex_cm.png +0 -0
  2312. psychopy/tests/data/circleHex_deg.png +0 -0
  2313. psychopy/tests/data/circleHex_degFlat.png +0 -0
  2314. psychopy/tests/data/circleHex_degFlatPos.png +0 -0
  2315. psychopy/tests/data/circleHex_height.png +0 -0
  2316. psychopy/tests/data/circleHex_norm.png +0 -0
  2317. psychopy/tests/data/circleHex_normAddBlend.png +0 -0
  2318. psychopy/tests/data/circleHex_normHexbackground.png +0 -0
  2319. psychopy/tests/data/circleHex_normNoShade.png +0 -0
  2320. psychopy/tests/data/circleHex_pix.png +0 -0
  2321. psychopy/tests/data/circleHex_stencil.png +0 -0
  2322. psychopy/tests/data/corrFullRandom.csv +16 -0
  2323. psychopy/tests/data/corrFullRandom.tsv +6 -0
  2324. psychopy/tests/data/corrFullRandomTH2.csv +16 -0
  2325. psychopy/tests/data/corrMultiKeyExpWide.csv +3 -0
  2326. psychopy/tests/data/corrMultiKeyTrials.csv +8 -0
  2327. psychopy/tests/data/corrMultiKeyTrials.xlsx +0 -0
  2328. psychopy/tests/data/corrRandom.csv +16 -0
  2329. psychopy/tests/data/corrRandom.tsv +6 -0
  2330. psychopy/tests/data/corrRandomTH2.csv +16 -0
  2331. psychopy/tests/data/corrXlsx.xlsx +0 -0
  2332. psychopy/tests/data/correctScript/js/correctCodeComponent.js +181 -0
  2333. psychopy/tests/data/correctScript/js/correctImageComponent.js +204 -0
  2334. psychopy/tests/data/correctScript/js/correctKeyboardComponent.js +225 -0
  2335. psychopy/tests/data/correctScript/js/correctMouseComponent.js +221 -0
  2336. psychopy/tests/data/correctScript/js/correctMovieComponent.js +210 -0
  2337. psychopy/tests/data/correctScript/js/correctPolygonComponent.js +205 -0
  2338. psychopy/tests/data/correctScript/js/correctSliderComponent.js +209 -0
  2339. psychopy/tests/data/correctScript/js/correctSoundComponent.js +205 -0
  2340. psychopy/tests/data/correctScript/js/correctTextComponent.js +207 -0
  2341. psychopy/tests/data/correctScript/python/correctApertureComponent.py +157 -0
  2342. psychopy/tests/data/correctScript/python/correctCodeComponent.py +135 -0
  2343. psychopy/tests/data/correctScript/python/correctDotsComponent.py +161 -0
  2344. psychopy/tests/data/correctScript/python/correctEnvGratingComponent.py +167 -0
  2345. psychopy/tests/data/correctScript/python/correctFormComponent.py +150 -0
  2346. psychopy/tests/data/correctScript/python/correctGratingComponent.py +158 -0
  2347. psychopy/tests/data/correctScript/python/correctImageComponent.py +160 -0
  2348. psychopy/tests/data/correctScript/python/correctJoyButtonsComponent.py +204 -0
  2349. psychopy/tests/data/correctScript/python/correctJoystickComponent.py +214 -0
  2350. psychopy/tests/data/correctScript/python/correctKeyboardComponent.py +169 -0
  2351. psychopy/tests/data/correctScript/python/correctMicrophoneComponent.py +163 -0
  2352. psychopy/tests/data/correctScript/python/correctMouseComponent.py +174 -0
  2353. psychopy/tests/data/correctScript/python/correctMovieComponent.py +160 -0
  2354. psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +169 -0
  2355. psychopy/tests/data/correctScript/python/correctParallelOutComponent.py +156 -0
  2356. psychopy/tests/data/correctScript/python/correctPatchComponent.py +159 -0
  2357. psychopy/tests/data/correctScript/python/correctPolygonComponent.py +159 -0
  2358. psychopy/tests/data/correctScript/python/correctQmixPumpComponent.py +174 -0
  2359. psychopy/tests/data/correctScript/python/correctRatingScaleComponent.py +152 -0
  2360. psychopy/tests/data/correctScript/python/correctSliderComponent.py +159 -0
  2361. psychopy/tests/data/correctScript/python/correctSoundComponent.py +157 -0
  2362. psychopy/tests/data/correctScript/python/correctStaticComponent.py +176 -0
  2363. psychopy/tests/data/correctScript/python/correctTextComponent.py +159 -0
  2364. psychopy/tests/data/correctScript/python/correctVariableComponent.py +139 -0
  2365. psychopy/tests/data/correctScript/python/correctcedrusButtonBoxComponent.py +199 -0
  2366. psychopy/tests/data/correctScript/python/correctioLabsButtonBoxComponent.py +187 -0
  2367. psychopy/tests/data/dataTest.xlsx +0 -0
  2368. psychopy/tests/data/dots_cm.png +0 -0
  2369. psychopy/tests/data/dots_deg.png +0 -0
  2370. psychopy/tests/data/dots_degFlat.png +0 -0
  2371. psychopy/tests/data/dots_degFlatPos.png +0 -0
  2372. psychopy/tests/data/dots_height.png +0 -0
  2373. psychopy/tests/data/dots_norm.png +0 -0
  2374. psychopy/tests/data/dots_normAddBlend.png +0 -0
  2375. psychopy/tests/data/dots_normHexbackground.png +0 -0
  2376. psychopy/tests/data/dots_normNoShade.png +0 -0
  2377. psychopy/tests/data/dots_pix.png +0 -0
  2378. psychopy/tests/data/dots_stencil.png +0 -0
  2379. psychopy/tests/data/duplicateHeaders.csv +2 -0
  2380. psychopy/tests/data/elarray1_cm.png +0 -0
  2381. psychopy/tests/data/elarray1_deg.png +0 -0
  2382. psychopy/tests/data/elarray1_degFlat.png +0 -0
  2383. psychopy/tests/data/elarray1_degFlatPos.png +0 -0
  2384. psychopy/tests/data/elarray1_height.png +0 -0
  2385. psychopy/tests/data/elarray1_norm.png +0 -0
  2386. psychopy/tests/data/elarray1_normAddBlend.png +0 -0
  2387. psychopy/tests/data/elarray1_normHexbackground.png +0 -0
  2388. psychopy/tests/data/elarray1_pix.png +0 -0
  2389. psychopy/tests/data/elarray1_stencil.png +0 -0
  2390. psychopy/tests/data/envelopeandrcos_cm.png +0 -0
  2391. psychopy/tests/data/envelopeandrcos_deg.png +0 -0
  2392. psychopy/tests/data/envelopeandrcos_degFlat.png +0 -0
  2393. psychopy/tests/data/envelopeandrcos_degFlatPos.png +0 -0
  2394. psychopy/tests/data/envelopeandrcos_height.png +0 -0
  2395. psychopy/tests/data/envelopeandrcos_norm.png +0 -0
  2396. psychopy/tests/data/envelopeandrcos_normAddBlend.png +0 -0
  2397. psychopy/tests/data/envelopeandrcos_normHexbackground.png +0 -0
  2398. psychopy/tests/data/envelopeandrcos_pix.png +0 -0
  2399. psychopy/tests/data/envelopeandrcos_stencil.png +0 -0
  2400. psychopy/tests/data/envelopepowerandrcos_cm.png +0 -0
  2401. psychopy/tests/data/envelopepowerandrcos_deg.png +0 -0
  2402. psychopy/tests/data/envelopepowerandrcos_degFlat.png +0 -0
  2403. psychopy/tests/data/envelopepowerandrcos_degFlatPos.png +0 -0
  2404. psychopy/tests/data/envelopepowerandrcos_height.png +0 -0
  2405. psychopy/tests/data/envelopepowerandrcos_norm.png +0 -0
  2406. psychopy/tests/data/envelopepowerandrcos_normAddBlend.png +0 -0
  2407. psychopy/tests/data/envelopepowerandrcos_normHexbackground.png +0 -0
  2408. psychopy/tests/data/envelopepowerandrcos_pix.png +0 -0
  2409. psychopy/tests/data/envelopepowerandrcos_stencil.png +0 -0
  2410. psychopy/tests/data/filltext.png +0 -0
  2411. psychopy/tests/data/form_font_demographics.png +0 -0
  2412. psychopy/tests/data/form_font_demographics.xlsx +0 -0
  2413. psychopy/tests/data/form_font_languages.png +0 -0
  2414. psychopy/tests/data/form_font_languages.xlsx +0 -0
  2415. psychopy/tests/data/form_font_nonstandard.png +0 -0
  2416. psychopy/tests/data/futureParams.psyexp +150 -0
  2417. psychopy/tests/data/gabor1_cm.png +0 -0
  2418. psychopy/tests/data/gabor1_deg.png +0 -0
  2419. psychopy/tests/data/gabor1_degFlat.png +0 -0
  2420. psychopy/tests/data/gabor1_degFlatPos.png +0 -0
  2421. psychopy/tests/data/gabor1_height.png +0 -0
  2422. psychopy/tests/data/gabor1_norm.png +0 -0
  2423. psychopy/tests/data/gabor1_normAddBlend.png +0 -0
  2424. psychopy/tests/data/gabor1_normHexbackground.png +0 -0
  2425. psychopy/tests/data/gabor1_normNoShade.png +0 -0
  2426. psychopy/tests/data/gabor1_pix.png +0 -0
  2427. psychopy/tests/data/gabor1_stencil.png +0 -0
  2428. psychopy/tests/data/gabor2_cm.png +0 -0
  2429. psychopy/tests/data/gabor2_deg.png +0 -0
  2430. psychopy/tests/data/gabor2_degFlat.png +0 -0
  2431. psychopy/tests/data/gabor2_degFlatPos.png +0 -0
  2432. psychopy/tests/data/gabor2_height.png +0 -0
  2433. psychopy/tests/data/gabor2_norm.png +0 -0
  2434. psychopy/tests/data/gabor2_normAddBlend.png +0 -0
  2435. psychopy/tests/data/gabor2_normHexbackground.png +0 -0
  2436. psychopy/tests/data/gabor2_normNoShade.png +0 -0
  2437. psychopy/tests/data/gabor2_pix.png +0 -0
  2438. psychopy/tests/data/gabor2_stencil.png +0 -0
  2439. psychopy/tests/data/ghost_stroop.psyexp +131 -0
  2440. psychopy/tests/data/ghost_trialTypes.xlsx +0 -0
  2441. psychopy/tests/data/green_48000.flac.dist +0 -0
  2442. psychopy/tests/data/greyscale.jpg +0 -0
  2443. psychopy/tests/data/greyscale2.png +0 -0
  2444. psychopy/tests/data/greyscale2_cm.png +0 -0
  2445. psychopy/tests/data/greyscale2_deg.png +0 -0
  2446. psychopy/tests/data/greyscale2_degFlat.png +0 -0
  2447. psychopy/tests/data/greyscale2_degFlatPos.png +0 -0
  2448. psychopy/tests/data/greyscale2_height.png +0 -0
  2449. psychopy/tests/data/greyscale2_norm.png +0 -0
  2450. psychopy/tests/data/greyscale2_normAddBlend.png +0 -0
  2451. psychopy/tests/data/greyscale2_normHexbackground.png +0 -0
  2452. psychopy/tests/data/greyscale2_normNoShade.png +0 -0
  2453. psychopy/tests/data/greyscale2_pix.png +0 -0
  2454. psychopy/tests/data/greyscale2_stencil.png +0 -0
  2455. psychopy/tests/data/greyscaleLowContr_cm.png +0 -0
  2456. psychopy/tests/data/greyscaleLowContr_deg.png +0 -0
  2457. psychopy/tests/data/greyscaleLowContr_degFlat.png +0 -0
  2458. psychopy/tests/data/greyscaleLowContr_degFlatPos.png +0 -0
  2459. psychopy/tests/data/greyscaleLowContr_height.png +0 -0
  2460. psychopy/tests/data/greyscaleLowContr_norm.png +0 -0
  2461. psychopy/tests/data/greyscaleLowContr_normAddBlend.png +0 -0
  2462. psychopy/tests/data/greyscaleLowContr_normHexbackground.png +0 -0
  2463. psychopy/tests/data/greyscaleLowContr_normNoShade.png +0 -0
  2464. psychopy/tests/data/greyscaleLowContr_pix.png +0 -0
  2465. psychopy/tests/data/greyscaleLowContr_stencil.png +0 -0
  2466. psychopy/tests/data/greyscale_cm.png +0 -0
  2467. psychopy/tests/data/greyscale_deg.png +0 -0
  2468. psychopy/tests/data/greyscale_degFlat.png +0 -0
  2469. psychopy/tests/data/greyscale_degFlatPos.png +0 -0
  2470. psychopy/tests/data/greyscale_height.png +0 -0
  2471. psychopy/tests/data/greyscale_norm.png +0 -0
  2472. psychopy/tests/data/greyscale_normAddBlend.png +0 -0
  2473. psychopy/tests/data/greyscale_normHexbackground.png +0 -0
  2474. psychopy/tests/data/greyscale_normNoShade.png +0 -0
  2475. psychopy/tests/data/greyscale_pix.png +0 -0
  2476. psychopy/tests/data/greyscale_stencil.png +0 -0
  2477. psychopy/tests/data/imageAndGauss_cm.png +0 -0
  2478. psychopy/tests/data/imageAndGauss_deg.png +0 -0
  2479. psychopy/tests/data/imageAndGauss_degFlat.png +0 -0
  2480. psychopy/tests/data/imageAndGauss_degFlatPos.png +0 -0
  2481. psychopy/tests/data/imageAndGauss_height.png +0 -0
  2482. psychopy/tests/data/imageAndGauss_norm.png +0 -0
  2483. psychopy/tests/data/imageAndGauss_normAddBlend.png +0 -0
  2484. psychopy/tests/data/imageAndGauss_normHexbackground.png +0 -0
  2485. psychopy/tests/data/imageAndGauss_normNoShade.png +0 -0
  2486. psychopy/tests/data/imageAndGauss_pix.png +0 -0
  2487. psychopy/tests/data/imageAndGauss_stencil.png +0 -0
  2488. psychopy/tests/data/movFrame1_cm.png +0 -0
  2489. psychopy/tests/data/movFrame1_deg.png +0 -0
  2490. psychopy/tests/data/movFrame1_degFlat.png +0 -0
  2491. psychopy/tests/data/movFrame1_degFlatPos.png +0 -0
  2492. psychopy/tests/data/movFrame1_height.png +0 -0
  2493. psychopy/tests/data/movFrame1_norm.png +0 -0
  2494. psychopy/tests/data/movFrame1_normAddBlend.png +0 -0
  2495. psychopy/tests/data/movFrame1_normHexbackground.png +0 -0
  2496. psychopy/tests/data/movFrame1_normNoShade.png +0 -0
  2497. psychopy/tests/data/movFrame1_pix.png +0 -0
  2498. psychopy/tests/data/movFrame1_stencil.png +0 -0
  2499. psychopy/tests/data/multiKeypressExperiment.psydat +357 -0
  2500. psychopy/tests/data/multiKeypressTrialhandler.psydat +252 -0
  2501. psychopy/tests/data/multiStairConds.xlsx +0 -0
  2502. psychopy/tests/data/multiStairQuestPlus.xlsx +0 -0
  2503. psychopy/tests/data/newstyle.psydat +6155 -0
  2504. psychopy/tests/data/noiseAndRcos_cm.png +0 -0
  2505. psychopy/tests/data/noiseAndRcos_deg.png +0 -0
  2506. psychopy/tests/data/noiseAndRcos_degFlat.png +0 -0
  2507. psychopy/tests/data/noiseAndRcos_degFlatPos.png +0 -0
  2508. psychopy/tests/data/noiseAndRcos_height.png +0 -0
  2509. psychopy/tests/data/noiseAndRcos_norm.png +0 -0
  2510. psychopy/tests/data/noiseAndRcos_normAddBlend.png +0 -0
  2511. psychopy/tests/data/noiseAndRcos_normHexbackground.png +0 -0
  2512. psychopy/tests/data/noiseAndRcos_normNoShade.png +0 -0
  2513. psychopy/tests/data/noiseAndRcos_pix.png +0 -0
  2514. psychopy/tests/data/noiseAndRcos_stencil.png +0 -0
  2515. psychopy/tests/data/noiseFiltersAndRcos_cm.png +0 -0
  2516. psychopy/tests/data/noiseFiltersAndRcos_deg.png +0 -0
  2517. psychopy/tests/data/noiseFiltersAndRcos_degFlat.png +0 -0
  2518. psychopy/tests/data/noiseFiltersAndRcos_degFlatPos.png +0 -0
  2519. psychopy/tests/data/noiseFiltersAndRcos_height.png +0 -0
  2520. psychopy/tests/data/noiseFiltersAndRcos_norm.png +0 -0
  2521. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend.png +0 -0
  2522. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground.png +0 -0
  2523. psychopy/tests/data/noiseFiltersAndRcos_normNoShade.png +0 -0
  2524. psychopy/tests/data/noiseFiltersAndRcos_pix.png +0 -0
  2525. psychopy/tests/data/noiseFiltersAndRcos_stencil.png +0 -0
  2526. psychopy/tests/data/numpyImage_cm.png +0 -0
  2527. psychopy/tests/data/numpyImage_deg.png +0 -0
  2528. psychopy/tests/data/numpyImage_degFlat.png +0 -0
  2529. psychopy/tests/data/numpyImage_degFlatPos.png +0 -0
  2530. psychopy/tests/data/numpyImage_height.png +0 -0
  2531. psychopy/tests/data/numpyImage_norm.png +0 -0
  2532. psychopy/tests/data/numpyImage_normAddBlend.png +0 -0
  2533. psychopy/tests/data/numpyImage_normHexbackground.png +0 -0
  2534. psychopy/tests/data/numpyImage_normNoShade.png +0 -0
  2535. psychopy/tests/data/numpyImage_pix.png +0 -0
  2536. psychopy/tests/data/numpyImage_stencil.png +0 -0
  2537. psychopy/tests/data/numpyLowContr_cm.png +0 -0
  2538. psychopy/tests/data/numpyLowContr_deg.png +0 -0
  2539. psychopy/tests/data/numpyLowContr_degFlat.png +0 -0
  2540. psychopy/tests/data/numpyLowContr_degFlatPos.png +0 -0
  2541. psychopy/tests/data/numpyLowContr_height.png +0 -0
  2542. psychopy/tests/data/numpyLowContr_norm.png +0 -0
  2543. psychopy/tests/data/numpyLowContr_normAddBlend.png +0 -0
  2544. psychopy/tests/data/numpyLowContr_normHexbackground.png +0 -0
  2545. psychopy/tests/data/numpyLowContr_normNoShade.png +0 -0
  2546. psychopy/tests/data/numpyLowContr_pix.png +0 -0
  2547. psychopy/tests/data/numpyLowContr_stencil.png +0 -0
  2548. psychopy/tests/data/oldstyle.psydat +1534 -0
  2549. psychopy/tests/data/oldstyle_stair.psydat +263 -0
  2550. psychopy/tests/data/ratingscale1_cm.png +0 -0
  2551. psychopy/tests/data/ratingscale1_deg.png +0 -0
  2552. psychopy/tests/data/ratingscale1_degFlat.png +0 -0
  2553. psychopy/tests/data/ratingscale1_degFlatPos.png +0 -0
  2554. psychopy/tests/data/ratingscale1_height.png +0 -0
  2555. psychopy/tests/data/ratingscale1_norm.png +0 -0
  2556. psychopy/tests/data/ratingscale1_normAddBlend.png +0 -0
  2557. psychopy/tests/data/ratingscale1_normHexbackground.png +0 -0
  2558. psychopy/tests/data/ratingscale1_normNoShade.png +0 -0
  2559. psychopy/tests/data/ratingscale1_pix.png +0 -0
  2560. psychopy/tests/data/ratingscale1_stencil.png +0 -0
  2561. psychopy/tests/data/red_16000.flac.dist +0 -0
  2562. psychopy/tests/data/retroListParam.psyexp +82 -0
  2563. psychopy/tests/data/right_to_left_unidcode.xlsx +0 -0
  2564. psychopy/tests/data/sample.meshwarp.data +11522 -0
  2565. psychopy/tests/data/shape2_1_cm.png +0 -0
  2566. psychopy/tests/data/shape2_1_deg.png +0 -0
  2567. psychopy/tests/data/shape2_1_degFlat.png +0 -0
  2568. psychopy/tests/data/shape2_1_degFlatPos.png +0 -0
  2569. psychopy/tests/data/shape2_1_height.png +0 -0
  2570. psychopy/tests/data/shape2_1_norm.png +0 -0
  2571. psychopy/tests/data/shape2_1_normAddBlend.png +0 -0
  2572. psychopy/tests/data/shape2_1_normHexbackground.png +0 -0
  2573. psychopy/tests/data/shape2_1_normNoShade.png +0 -0
  2574. psychopy/tests/data/shape2_1_pix.png +0 -0
  2575. psychopy/tests/data/shape2_1_stencil.png +0 -0
  2576. psychopy/tests/data/shape2_2_cm.png +0 -0
  2577. psychopy/tests/data/shape2_2_deg.png +0 -0
  2578. psychopy/tests/data/shape2_2_degFlat.png +0 -0
  2579. psychopy/tests/data/shape2_2_degFlatPos.png +0 -0
  2580. psychopy/tests/data/shape2_2_height.png +0 -0
  2581. psychopy/tests/data/shape2_2_norm.png +0 -0
  2582. psychopy/tests/data/shape2_2_normAddBlend.png +0 -0
  2583. psychopy/tests/data/shape2_2_normHexbackground.png +0 -0
  2584. psychopy/tests/data/shape2_2_normNoShade.png +0 -0
  2585. psychopy/tests/data/shape2_2_pix.png +0 -0
  2586. psychopy/tests/data/shape2_2_stencil.png +0 -0
  2587. psychopy/tests/data/simpleimage1_cm.png +0 -0
  2588. psychopy/tests/data/simpleimage1_deg.png +0 -0
  2589. psychopy/tests/data/simpleimage1_degFlat.png +0 -0
  2590. psychopy/tests/data/simpleimage1_degFlatPos.png +0 -0
  2591. psychopy/tests/data/simpleimage1_height.png +0 -0
  2592. psychopy/tests/data/simpleimage1_norm.png +0 -0
  2593. psychopy/tests/data/simpleimage1_normAddBlend.png +0 -0
  2594. psychopy/tests/data/simpleimage1_normHexbackground.png +0 -0
  2595. psychopy/tests/data/simpleimage1_normNoShade.png +0 -0
  2596. psychopy/tests/data/simpleimage1_pix.png +0 -0
  2597. psychopy/tests/data/simpleimage1_stencil.png +0 -0
  2598. psychopy/tests/data/test001EntryImporting.psyexp +66 -0
  2599. psychopy/tests/data/testMovie.mp4 +0 -0
  2600. psychopy/tests/data/test_basic_run.py +1 -0
  2601. psychopy/tests/data/test_circle_radius_.1height.png +0 -0
  2602. psychopy/tests/data/test_circle_radius_.2height.png +0 -0
  2603. psychopy/tests/data/test_circle_radius_10pix.png +0 -0
  2604. psychopy/tests/data/test_circle_radius_20pix.png +0 -0
  2605. psychopy/tests/data/test_components/testClearKeyboard/testClearKeyboard.psyexp +200 -0
  2606. psychopy/tests/data/test_form_combinations_choice_bigItem.png +0 -0
  2607. psychopy/tests/data/test_form_combinations_choice_bigItemOverflow.png +0 -0
  2608. psychopy/tests/data/test_form_combinations_choice_bigResp.png +0 -0
  2609. psychopy/tests/data/test_form_combinations_choice_bigRespOverflow.png +0 -0
  2610. psychopy/tests/data/test_form_combinations_description_bigItem.png +0 -0
  2611. psychopy/tests/data/test_form_combinations_description_bigItemOverflow.png +0 -0
  2612. psychopy/tests/data/test_form_combinations_description_bigResp.png +0 -0
  2613. psychopy/tests/data/test_form_combinations_description_bigRespOverflow.png +0 -0
  2614. psychopy/tests/data/test_form_combinations_free text_bigItem.png +0 -0
  2615. psychopy/tests/data/test_form_combinations_free text_bigItemOverflow.png +0 -0
  2616. psychopy/tests/data/test_form_combinations_free text_bigResp.png +0 -0
  2617. psychopy/tests/data/test_form_combinations_free text_bigRespOverflow.png +0 -0
  2618. psychopy/tests/data/test_form_combinations_heading_bigItem.png +0 -0
  2619. psychopy/tests/data/test_form_combinations_heading_bigItemOverflow.png +0 -0
  2620. psychopy/tests/data/test_form_combinations_heading_bigResp.png +0 -0
  2621. psychopy/tests/data/test_form_combinations_heading_bigRespOverflow.png +0 -0
  2622. psychopy/tests/data/test_form_combinations_radio_bigItem.png +0 -0
  2623. psychopy/tests/data/test_form_combinations_radio_bigItemOverflow.png +0 -0
  2624. psychopy/tests/data/test_form_combinations_radio_bigResp.png +0 -0
  2625. psychopy/tests/data/test_form_combinations_radio_bigRespOverflow.png +0 -0
  2626. psychopy/tests/data/test_form_combinations_rating_bigItem.png +0 -0
  2627. psychopy/tests/data/test_form_combinations_rating_bigItemOverflow.png +0 -0
  2628. psychopy/tests/data/test_form_combinations_rating_bigResp.png +0 -0
  2629. psychopy/tests/data/test_form_combinations_rating_bigRespOverflow.png +0 -0
  2630. psychopy/tests/data/test_form_combinations_slider_bigItem.png +0 -0
  2631. psychopy/tests/data/test_form_combinations_slider_bigItemOverflow.png +0 -0
  2632. psychopy/tests/data/test_form_combinations_slider_bigResp.png +0 -0
  2633. psychopy/tests/data/test_form_combinations_slider_bigRespOverflow.png +0 -0
  2634. psychopy/tests/data/test_get_resources/blue.png +0 -0
  2635. psychopy/tests/data/test_get_resources/groupA.csv +3 -0
  2636. psychopy/tests/data/test_get_resources/groupB.csv +3 -0
  2637. psychopy/tests/data/test_get_resources/groups.csv +3 -0
  2638. psychopy/tests/data/test_get_resources/handledbyrm_constrloop.psyexp +143 -0
  2639. psychopy/tests/data/test_get_resources/handledbyrm_noloop.psyexp +114 -0
  2640. psychopy/tests/data/test_get_resources/handledbyrm_recurloop.psyexp +138 -0
  2641. psychopy/tests/data/test_get_resources/handledbyrm_strloop.psyexp +126 -0
  2642. psychopy/tests/data/test_get_resources/handledbystatic_constrloop.psyexp +141 -0
  2643. psychopy/tests/data/test_get_resources/handledbystatic_noloop.psyexp +112 -0
  2644. psychopy/tests/data/test_get_resources/handledbystatic_recurloop.psyexp +136 -0
  2645. psychopy/tests/data/test_get_resources/handledbystatic_strloop.psyexp +124 -0
  2646. psychopy/tests/data/test_get_resources/unhandled_constrloop.psyexp +128 -0
  2647. psychopy/tests/data/test_get_resources/unhandled_noloop.psyexp +99 -0
  2648. psychopy/tests/data/test_get_resources/unhandled_recurloop.psyexp +123 -0
  2649. psychopy/tests/data/test_get_resources/unhandled_strloop.psyexp +111 -0
  2650. psychopy/tests/data/test_get_resources/white.png +0 -0
  2651. psychopy/tests/data/test_get_resources/yellow.png +0 -0
  2652. psychopy/tests/data/test_image_aspect_default_None.png +0 -0
  2653. psychopy/tests/data/test_image_aspect_default_xFull_yNone.png +0 -0
  2654. psychopy/tests/data/test_image_aspect_default_xNone_yFull.png +0 -0
  2655. psychopy/tests/data/test_image_aspect_default_xNone_yNone.png +0 -0
  2656. psychopy/tests/data/test_image_flip_anchor_horiz.png +0 -0
  2657. psychopy/tests/data/test_image_flip_anchor_vert.png +0 -0
  2658. psychopy/tests/data/test_loaded_namespace/test_counterbalance.psyexp +142 -0
  2659. psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
  2660. psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
  2661. psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
  2662. psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
  2663. psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -0
  2664. psychopy/tests/data/test_loops/testLoopsBlocks.psyexp +161 -0
  2665. psychopy/tests/data/test_loops/testStaircase.psyexp +105 -0
  2666. psychopy/tests/data/test_loops/test_current_loop_attr.psyexp +185 -0
  2667. psychopy/tests/data/test_panorama/panoramaTestImage.png +0 -0
  2668. psychopy/tests/data/test_panorama/panoramaTestImage.svg +1 -0
  2669. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_-0.3.png +0 -0
  2670. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_0.3.png +0 -0
  2671. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_-0.3.png +0 -0
  2672. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_0.3.png +0 -0
  2673. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_-1.0.png +0 -0
  2674. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_1.0.png +0 -0
  2675. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_-0.3.png +0 -0
  2676. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_0.3.png +0 -0
  2677. psychopy/tests/data/test_resources.psyexp +491 -0
  2678. psychopy/tests/data/test_session/outside_root/externalExp.psyexp +116 -0
  2679. psychopy/tests/data/test_session/root/annotation/annotation.psyexp +161 -0
  2680. psychopy/tests/data/test_session/root/error/error.psyexp +93 -0
  2681. psychopy/tests/data/test_session/root/exp1/exp1.psyexp +133 -0
  2682. psychopy/tests/data/test_session/root/exp2/exp2.psyexp +133 -0
  2683. psychopy/tests/data/test_session/root/frameRate/frameRate.psyexp +114 -0
  2684. psychopy/tests/data/test_session/root/invUseVersion/invUseVersion.psyexp +133 -0
  2685. psychopy/tests/data/test_session/root/testClockFormat/testClockFormat.psyexp +122 -0
  2686. psychopy/tests/data/test_session/root/testCtrls/testCtrls.psyexp +115 -0
  2687. psychopy/tests/data/test_session/root/testEditExpInfo/testEditExpInfo.psyexp +135 -0
  2688. psychopy/tests/data/test_session/root/testFutureTrials/testFutureTrials.psyexp +155 -0
  2689. psychopy/tests/data/test_session/root/testNamedButtonBox/testNamedButtonBox.psyexp +145 -0
  2690. psychopy/tests/data/test_session/root/testTrialNav/trialNav.psyexp +158 -0
  2691. psychopy/tests/data/test_slider_horiz_accute_horiz.png +0 -0
  2692. psychopy/tests/data/test_slider_horiz_accute_vert.png +0 -0
  2693. psychopy/tests/data/test_slider_horiz_horiz.png +0 -0
  2694. psychopy/tests/data/test_slider_horiz_obtuse_horiz.png +0 -0
  2695. psychopy/tests/data/test_slider_horiz_obtuse_vert.png +0 -0
  2696. psychopy/tests/data/test_slider_horiz_vert.png +0 -0
  2697. psychopy/tests/data/test_slider_ticklabelloc_blanks.png +0 -0
  2698. psychopy/tests/data/test_slider_ticklabelloc_clustered.png +0 -0
  2699. psychopy/tests/data/test_slider_ticklabelloc_morelabels.png +0 -0
  2700. psychopy/tests/data/test_slider_ticklabelloc_morelabelsclustered.png +0 -0
  2701. psychopy/tests/data/test_slider_ticklabelloc_moreticks.png +0 -0
  2702. psychopy/tests/data/test_slider_ticklabelloc_moreticksclustered.png +0 -0
  2703. psychopy/tests/data/test_slider_ticklabelloc_nolabels.png +0 -0
  2704. psychopy/tests/data/test_slider_ticklabelloc_noticks.png +0 -0
  2705. psychopy/tests/data/test_slider_ticklabelloc_simple.png +0 -0
  2706. psychopy/tests/data/test_slider_triangle_horiz_False_flip_False.png +0 -0
  2707. psychopy/tests/data/test_slider_triangle_horiz_False_flip_True.png +0 -0
  2708. psychopy/tests/data/test_slider_triangle_horiz_True_flip_False.png +0 -0
  2709. psychopy/tests/data/test_slider_triangle_horiz_True_flip_True.png +0 -0
  2710. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  2711. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  2712. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  2713. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  2714. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  2715. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  2716. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  2717. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  2718. psychopy/tests/data/test_static_component_script.psyexp +76 -0
  2719. psychopy/tests/data/test_win_bg_large_256_default.png +0 -0
  2720. psychopy/tests/data/test_win_bg_large_500_default.png +0 -0
  2721. psychopy/tests/data/test_win_bg_small_200_default.png +0 -0
  2722. psychopy/tests/data/test_win_bg_small_256_default.png +0 -0
  2723. psychopy/tests/data/test_win_bg_tall_200_default.png +0 -0
  2724. psychopy/tests/data/test_win_bg_tall_256_default.png +0 -0
  2725. psychopy/tests/data/test_win_bg_tall_500_default.png +0 -0
  2726. psychopy/tests/data/test_win_bg_tall_fill_default.png +0 -0
  2727. psychopy/tests/data/test_win_bg_wide_200_default.png +0 -0
  2728. psychopy/tests/data/test_win_bg_wide_256_default.png +0 -0
  2729. psychopy/tests/data/test_win_bg_wide_500_default.png +0 -0
  2730. psychopy/tests/data/test_win_bg_wide_fill_default.png +0 -0
  2731. psychopy/tests/data/test_win_bgcolor_blue.png +0 -0
  2732. psychopy/tests/data/test_win_bgcolor_green.png +0 -0
  2733. psychopy/tests/data/test_win_bgcolor_red.png +0 -0
  2734. psychopy/tests/data/testimage.jpg +0 -0
  2735. psychopy/tests/data/testimagegray.jpg +0 -0
  2736. psychopy/tests/data/testpixels.png +0 -0
  2737. psychopy/tests/data/testwedges.png +0 -0
  2738. psychopy/tests/data/text1_cm.png +0 -0
  2739. psychopy/tests/data/text1_deg.png +0 -0
  2740. psychopy/tests/data/text1_degFlat.png +0 -0
  2741. psychopy/tests/data/text1_degFlatPos.png +0 -0
  2742. psychopy/tests/data/text1_height.png +0 -0
  2743. psychopy/tests/data/text1_norm.png +0 -0
  2744. psychopy/tests/data/text1_normAddBlend.png +0 -0
  2745. psychopy/tests/data/text1_normHexbackground.png +0 -0
  2746. psychopy/tests/data/text1_normNoShade.png +0 -0
  2747. psychopy/tests/data/text1_pix.png +0 -0
  2748. psychopy/tests/data/text1_stencil.png +0 -0
  2749. psychopy/tests/data/text2_cm.png +0 -0
  2750. psychopy/tests/data/text2_deg.png +0 -0
  2751. psychopy/tests/data/text2_degFlat.png +0 -0
  2752. psychopy/tests/data/text2_degFlatPos.png +0 -0
  2753. psychopy/tests/data/text2_norm.png +0 -0
  2754. psychopy/tests/data/text2_normNoShade.png +0 -0
  2755. psychopy/tests/data/text2_pix.png +0 -0
  2756. psychopy/tests/data/textbox_charcolors_default_roygbiv.png +0 -0
  2757. psychopy/tests/data/textbox_charcolors_default_white_hello_black_there.png +0 -0
  2758. psychopy/tests/data/textbox_default_align_bottom_center.png +0 -0
  2759. psychopy/tests/data/textbox_default_align_bottom_left.png +0 -0
  2760. psychopy/tests/data/textbox_default_align_bottom_right.png +0 -0
  2761. psychopy/tests/data/textbox_default_align_center.png +0 -0
  2762. psychopy/tests/data/textbox_default_align_center_center.png +0 -0
  2763. psychopy/tests/data/textbox_default_align_center_left.png +0 -0
  2764. psychopy/tests/data/textbox_default_align_center_right.png +0 -0
  2765. psychopy/tests/data/textbox_default_align_centre.png +0 -0
  2766. psychopy/tests/data/textbox_default_align_centre_centre.png +0 -0
  2767. psychopy/tests/data/textbox_default_align_more_than_two_words.png +0 -0
  2768. psychopy/tests/data/textbox_default_align_someword.png +0 -0
  2769. psychopy/tests/data/textbox_default_align_top_center.png +0 -0
  2770. psychopy/tests/data/textbox_default_align_top_left.png +0 -0
  2771. psychopy/tests/data/textbox_default_align_top_right.png +0 -0
  2772. psychopy/tests/data/textbox_default_colors_WOB.png +0 -0
  2773. psychopy/tests/data/textbox_default_colors_exemplar1.png +0 -0
  2774. psychopy/tests/data/textbox_default_colors_exemplar2.png +0 -0
  2775. psychopy/tests/data/textbox_default_colors_exemplar3.png +0 -0
  2776. psychopy/tests/data/textbox_default_colors_tyke1.png +0 -0
  2777. psychopy/tests/data/textbox_default_colors_tyke2.png +0 -0
  2778. psychopy/tests/data/textbox_default_colors_tyke3.png +0 -0
  2779. psychopy/tests/data/textbox_default_cutoff_top.png +0 -0
  2780. psychopy/tests/data/textbox_default_exemplar_1.png +0 -0
  2781. psychopy/tests/data/textbox_default_exemplar_2.png +0 -0
  2782. psychopy/tests/data/textbox_default_exemplar_3.png +0 -0
  2783. psychopy/tests/data/textbox_default_exemplar_4.png +0 -0
  2784. psychopy/tests/data/textbox_default_tyke_1.png +0 -0
  2785. psychopy/tests/data/textbox_default_tyke_2.png +0 -0
  2786. psychopy/tests/data/textbox_typing_blank.png +0 -0
  2787. psychopy/tests/data/textbox_typing_longKoeran.png +0 -0
  2788. psychopy/tests/data/textbox_typing_longWord.png +0 -0
  2789. psychopy/tests/data/textbox_typing_navDel.png +0 -0
  2790. psychopy/tests/data/textbox_typing_navLR.png +0 -0
  2791. psychopy/tests/data/textbox_typing_newline.png +0 -0
  2792. psychopy/tests/data/textbox_typing_pangram.png +0 -0
  2793. psychopy/tests/data/textbox_uax14_align_bottom_center.png +0 -0
  2794. psychopy/tests/data/textbox_uax14_align_bottom_left.png +0 -0
  2795. psychopy/tests/data/textbox_uax14_align_bottom_right.png +0 -0
  2796. psychopy/tests/data/textbox_uax14_align_center.png +0 -0
  2797. psychopy/tests/data/textbox_uax14_align_center_center.png +0 -0
  2798. psychopy/tests/data/textbox_uax14_align_center_left.png +0 -0
  2799. psychopy/tests/data/textbox_uax14_align_center_right.png +0 -0
  2800. psychopy/tests/data/textbox_uax14_align_centre.png +0 -0
  2801. psychopy/tests/data/textbox_uax14_align_centre_centre.png +0 -0
  2802. psychopy/tests/data/textbox_uax14_align_more_than_two_words.png +0 -0
  2803. psychopy/tests/data/textbox_uax14_align_someword.png +0 -0
  2804. psychopy/tests/data/textbox_uax14_align_top_center.png +0 -0
  2805. psychopy/tests/data/textbox_uax14_align_top_left.png +0 -0
  2806. psychopy/tests/data/textbox_uax14_align_top_right.png +0 -0
  2807. psychopy/tests/data/textbox_uax14_colors_WOB.png +0 -0
  2808. psychopy/tests/data/textbox_uax14_colors_exemplar1.png +0 -0
  2809. psychopy/tests/data/textbox_uax14_colors_exemplar2.png +0 -0
  2810. psychopy/tests/data/textbox_uax14_colors_exemplar3.png +0 -0
  2811. psychopy/tests/data/textbox_uax14_colors_tyke1.png +0 -0
  2812. psychopy/tests/data/textbox_uax14_colors_tyke2.png +0 -0
  2813. psychopy/tests/data/textbox_uax14_colors_tyke3.png +0 -0
  2814. psychopy/tests/data/textbox_uax14_cutoff_top.png +0 -0
  2815. psychopy/tests/data/textbox_uax14_exemplar_1.png +0 -0
  2816. psychopy/tests/data/textbox_uax14_exemplar_2.png +0 -0
  2817. psychopy/tests/data/textbox_uax14_exemplar_3.png +0 -0
  2818. psychopy/tests/data/textbox_uax14_exemplar_4.png +0 -0
  2819. psychopy/tests/data/textbox_uax14_tyke_1.png +0 -0
  2820. psychopy/tests/data/textbox_uax14_tyke_2.png +0 -0
  2821. psychopy/tests/data/trialTypes.csv +1 -0
  2822. psychopy/tests/data/trialTypes.docx +0 -0
  2823. psychopy/tests/data/trialTypes.pkl +0 -0
  2824. psychopy/tests/data/trialTypes.tsv +7 -0
  2825. psychopy/tests/data/trialTypes.xls +0 -0
  2826. psychopy/tests/data/trialTypes.xlsx +0 -0
  2827. psychopy/tests/data/trialTypes_eu.csv +7 -0
  2828. psychopy/tests/data/trialsBlankCols.xlsx +0 -0
  2829. psychopy/tests/data/wedge1_cm.png +0 -0
  2830. psychopy/tests/data/wedge1_deg.png +0 -0
  2831. psychopy/tests/data/wedge1_degFlat.png +0 -0
  2832. psychopy/tests/data/wedge1_degFlatPos.png +0 -0
  2833. psychopy/tests/data/wedge1_height.png +0 -0
  2834. psychopy/tests/data/wedge1_norm.png +0 -0
  2835. psychopy/tests/data/wedge1_normAddBlend.png +0 -0
  2836. psychopy/tests/data/wedge1_normHexbackground.png +0 -0
  2837. psychopy/tests/data/wedge1_normNoShade.png +0 -0
  2838. psychopy/tests/data/wedge1_pix.png +0 -0
  2839. psychopy/tests/data/wedge1_stencil.png +0 -0
  2840. psychopy/tests/data/wedge2_cm.png +0 -0
  2841. psychopy/tests/data/wedge2_deg.png +0 -0
  2842. psychopy/tests/data/wedge2_degFlat.png +0 -0
  2843. psychopy/tests/data/wedge2_degFlatPos.png +0 -0
  2844. psychopy/tests/data/wedge2_height.png +0 -0
  2845. psychopy/tests/data/wedge2_norm.png +0 -0
  2846. psychopy/tests/data/wedge2_normAddBlend.png +0 -0
  2847. psychopy/tests/data/wedge2_normHexbackground.png +0 -0
  2848. psychopy/tests/data/wedge2_normNoShade.png +0 -0
  2849. psychopy/tests/data/wedge2_pix.png +0 -0
  2850. psychopy/tests/data/wedge2_stencil.png +0 -0
  2851. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos-0.4_0.png +0 -0
  2852. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos0_0.png +0 -0
  2853. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos-0.4_0.png +0 -0
  2854. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos0_0.png +0 -0
  2855. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos-0.4_0.png +0 -0
  2856. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos0_0.png +0 -0
  2857. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos-0.4_0.png +0 -0
  2858. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos0_0.png +0 -0
  2859. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos-0.4_0.png +0 -0
  2860. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos0_0.png +0 -0
  2861. psychopy/tests/data/winScalePos_ori0_scale1_1_pos-0.4_0.png +0 -0
  2862. psychopy/tests/data/winScalePos_ori0_scale1_1_pos0_0.png +0 -0
  2863. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos-0.4_0.png +0 -0
  2864. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos0_0.png +0 -0
  2865. psychopy/tests/data/winScalePos_ori0_scale2_2_pos-0.4_0.png +0 -0
  2866. psychopy/tests/data/winScalePos_ori0_scale2_2_pos0_0.png +0 -0
  2867. psychopy/tests/data/winScalePos_ori45_scale-1_-1_pos0_0.png +0 -0
  2868. psychopy/tests/data/winScalePos_ori45_scale-1_1_pos0_0.png +0 -0
  2869. psychopy/tests/data/winScalePos_ori45_scale-2_-2_pos0_0.png +0 -0
  2870. psychopy/tests/data/winScalePos_ori45_scale-2_2_pos0_0.png +0 -0
  2871. psychopy/tests/data/winScalePos_ori45_scale1_-1_pos0_0.png +0 -0
  2872. psychopy/tests/data/winScalePos_ori45_scale1_1_pos0_0.png +0 -0
  2873. psychopy/tests/data/winScalePos_ori45_scale2_-2_pos0_0.png +0 -0
  2874. psychopy/tests/data/winScalePos_ori45_scale2_2_pos0_0.png +0 -0
  2875. psychopy/tests/doc/run_btn.png +0 -0
  2876. psychopy/tests/doc/test-suite-bugs.jpg +0 -0
  2877. psychopy/tests/doc/user-bugs.jpg +0 -0
  2878. psychopy/tests/dummy_xorg.conf +21 -0
  2879. psychopy/tests/run.py +50 -0
  2880. psychopy/tests/test_Installation.py +38 -0
  2881. psychopy/tests/test_alerts/test_alerts.py +37 -0
  2882. psychopy/tests/test_alerts/test_alerttools.py +132 -0
  2883. psychopy/tests/test_app/__init__.py +0 -0
  2884. psychopy/tests/test_app/conftest.py +40 -0
  2885. psychopy/tests/test_app/test_builder/__init__.py +0 -0
  2886. psychopy/tests/test_app/test_builder/test_BuilderFrame.py +166 -0
  2887. psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +133 -0
  2888. psychopy/tests/test_app/test_builder/test_ComponentDialogs.py +98 -0
  2889. psychopy/tests/test_app/test_command_line.py +65 -0
  2890. psychopy/tests/test_app/test_runner/__init__.py +0 -0
  2891. psychopy/tests/test_app/test_runner/test_RunnerFrame.py +166 -0
  2892. psychopy/tests/test_app/test_speed.py +147 -0
  2893. psychopy/tests/test_app/test_themes/test_icons.py +79 -0
  2894. psychopy/tests/test_codecov.py +29 -0
  2895. psychopy/tests/test_colors/test_Color.py +41 -0
  2896. psychopy/tests/test_data/dataPrev.xlsx +0 -0
  2897. psychopy/tests/test_data/test_ExperimentHandler.py +171 -0
  2898. psychopy/tests/test_data/test_MultiStairHandler.py +174 -0
  2899. psychopy/tests/test_data/test_StairHandlers.py +1241 -0
  2900. psychopy/tests/test_data/test_TrialHandler.py +335 -0
  2901. psychopy/tests/test_data/test_TrialHandler2.py +584 -0
  2902. psychopy/tests/test_data/test_TrialHandlerExt.py +359 -0
  2903. psychopy/tests/test_data/test_fitFunctions.py +101 -0
  2904. psychopy/tests/test_data/test_utils.py +173 -0
  2905. psychopy/tests/test_data/test_xlsx.py +92 -0
  2906. psychopy/tests/test_demos/test_builder_demos.py +52 -0
  2907. psychopy/tests/test_experiment/__init__.py +0 -0
  2908. psychopy/tests/test_experiment/known_py_diffs.txt +47 -0
  2909. psychopy/tests/test_experiment/needs_wx/__init__.py +0 -0
  2910. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +14780 -0
  2911. psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +130 -0
  2912. psychopy/tests/test_experiment/needs_wx/test_Experiment.py +406 -0
  2913. psychopy/tests/test_experiment/needs_wx/test_components.py +170 -0
  2914. psychopy/tests/test_experiment/test_component_compile_js.py +59 -0
  2915. psychopy/tests/test_experiment/test_component_compile_python.py +165 -0
  2916. psychopy/tests/test_experiment/test_components/__init__.py +1 -0
  2917. psychopy/tests/test_experiment/test_components/test_ButtonBoxComponent.py +218 -0
  2918. psychopy/tests/test_experiment/test_components/test_CodeComponent.py +70 -0
  2919. psychopy/tests/test_experiment/test_components/test_GratingComponent.py +7 -0
  2920. psychopy/tests/test_experiment/test_components/test_ImageComponent.py +8 -0
  2921. psychopy/tests/test_experiment/test_components/test_KeyboardComponent.py +28 -0
  2922. psychopy/tests/test_experiment/test_components/test_MouseComponent.py +136 -0
  2923. psychopy/tests/test_experiment/test_components/test_PolygonComponent.py +65 -0
  2924. psychopy/tests/test_experiment/test_components/test_ResourceManagerComponent.py +50 -0
  2925. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  2926. psychopy/tests/test_experiment/test_components/test_SettingsComponent.py +80 -0
  2927. psychopy/tests/test_experiment/test_components/test_StaticComponent.py +51 -0
  2928. psychopy/tests/test_experiment/test_components/test_UnknownPluginComponent.py +27 -0
  2929. psychopy/tests/test_experiment/test_components/test_all_components.py +104 -0
  2930. psychopy/tests/test_experiment/test_components/test_base_components.py +477 -0
  2931. psychopy/tests/test_experiment/test_experiment.py +199 -0
  2932. psychopy/tests/test_experiment/test_loops.py +103 -0
  2933. psychopy/tests/test_experiment/test_params.py +363 -0
  2934. psychopy/tests/test_experiment/test_py2js.py +230 -0
  2935. psychopy/tests/test_experiment/test_routines/__init__.py +1 -0
  2936. psychopy/tests/test_experiment/test_routines/test_EyetrackerCalibrationRoutine.py +9 -0
  2937. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +9 -0
  2938. psychopy/tests/test_experiment/test_routines/test_all_routines.py +23 -0
  2939. psychopy/tests/test_experiment/test_routines/test_base_routine.py +154 -0
  2940. psychopy/tests/test_experiment/test_routines/test_standalone_routines.py +36 -0
  2941. psychopy/tests/test_gui/test_DlgFromDictQt.py +82 -0
  2942. psychopy/tests/test_gui/test_DlgFromDictWx.py +82 -0
  2943. psychopy/tests/test_hardware/__init__.py +0 -0
  2944. psychopy/tests/test_hardware/test_device_manager.py +36 -0
  2945. psychopy/tests/test_hardware/test_emulator.py +106 -0
  2946. psychopy/tests/test_hardware/test_gammasci.py +35 -0
  2947. psychopy/tests/test_hardware/test_keyboard.py +241 -0
  2948. psychopy/tests/test_hardware/test_keyboard_events.py +362 -0
  2949. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  2950. psychopy/tests/test_hardware/test_ports.py +129 -0
  2951. psychopy/tests/test_iohub/__init__.py +1 -0
  2952. psychopy/tests/test_iohub/test_computer.py +124 -0
  2953. psychopy/tests/test_iohub/test_event_get_and_clear.py +94 -0
  2954. psychopy/tests/test_iohub/test_keyboard.py +91 -0
  2955. psychopy/tests/test_iohub/test_launch.py +19 -0
  2956. psychopy/tests/test_iohub/testutil.py +54 -0
  2957. psychopy/tests/test_liaison/test_Liaison.py +275 -0
  2958. psychopy/tests/test_misc/__init__.py +0 -0
  2959. psychopy/tests/test_misc/memory_usage.py +164 -0
  2960. psychopy/tests/test_misc/test_GammaFun.py +15 -0
  2961. psychopy/tests/test_misc/test_clock.py +63 -0
  2962. psychopy/tests/test_misc/test_color.py +205 -0
  2963. psychopy/tests/test_misc/test_core.py +451 -0
  2964. psychopy/tests/test_misc/test_event.py +308 -0
  2965. psychopy/tests/test_misc/test_info.py +18 -0
  2966. psychopy/tests/test_misc/test_layout.py +49 -0
  2967. psychopy/tests/test_misc/test_locale.py +38 -0
  2968. psychopy/tests/test_misc/test_web.py +22 -0
  2969. psychopy/tests/test_monitors/test_monitors.py +91 -0
  2970. psychopy/tests/test_plugins/__init__.py +0 -0
  2971. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  2972. psychopy/tests/test_preferences/__init__.py +0 -0
  2973. psychopy/tests/test_preferences/test_prefs.py +28 -0
  2974. psychopy/tests/test_session/test_Session.py +257 -0
  2975. psychopy/tests/test_sound/__init__.py +0 -0
  2976. psychopy/tests/test_sound/test_audioclip.py +331 -0
  2977. psychopy/tests/test_sound/test_hamming.py +45 -0
  2978. psychopy/tests/test_sound/test_sound.py +138 -0
  2979. psychopy/tests/test_sound/test_sound_pygame.py +67 -0
  2980. psychopy/tests/test_tools/test_animationtools.py +51 -0
  2981. psychopy/tests/test_tools/test_arraytools.py +242 -0
  2982. psychopy/tests/test_tools/test_attributetools.py +257 -0
  2983. psychopy/tests/test_tools/test_colorspacetools.py +150 -0
  2984. psychopy/tests/test_tools/test_environmenttools.py +52 -0
  2985. psychopy/tests/test_tools/test_fileerrortools.py +97 -0
  2986. psychopy/tests/test_tools/test_filetools.py +104 -0
  2987. psychopy/tests/test_tools/test_imagetools.py +57 -0
  2988. psychopy/tests/test_tools/test_mathtools.py +688 -0
  2989. psychopy/tests/test_tools/test_stringtools.py +143 -0
  2990. psychopy/tests/test_tools/test_versionchooser.py +209 -0
  2991. psychopy/tests/test_tools/test_viewtools.py +168 -0
  2992. psychopy/tests/test_validators/__init__.py +0 -0
  2993. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  2994. psychopy/tests/test_visual/__init__.py +0 -0
  2995. psychopy/tests/test_visual/measure_parity.py +243 -0
  2996. psychopy/tests/test_visual/test_all_stimuli.py +655 -0
  2997. psychopy/tests/test_visual/test_basevisual.py +564 -0
  2998. psychopy/tests/test_visual/test_brush.py +68 -0
  2999. psychopy/tests/test_visual/test_button.py +15 -0
  3000. psychopy/tests/test_visual/test_circle.py +74 -0
  3001. psychopy/tests/test_visual/test_contains_overlaps.py +242 -0
  3002. psychopy/tests/test_visual/test_custommouse.py +47 -0
  3003. psychopy/tests/test_visual/test_dots.py +155 -0
  3004. psychopy/tests/test_visual/test_form.py +414 -0
  3005. psychopy/tests/test_visual/test_framepacking.py +41 -0
  3006. psychopy/tests/test_visual/test_gamma.py +152 -0
  3007. psychopy/tests/test_visual/test_glfw_backend.py +14 -0
  3008. psychopy/tests/test_visual/test_image.py +219 -0
  3009. psychopy/tests/test_visual/test_panorama.py +41 -0
  3010. psychopy/tests/test_visual/test_progress.py +96 -0
  3011. psychopy/tests/test_visual/test_projections.py +215 -0
  3012. psychopy/tests/test_visual/test_projections_interactive.py +163 -0
  3013. psychopy/tests/test_visual/test_roi.py +105 -0
  3014. psychopy/tests/test_visual/test_shape.py +23 -0
  3015. psychopy/tests/test_visual/test_slider.py +328 -0
  3016. psychopy/tests/test_visual/test_target.py +35 -0
  3017. psychopy/tests/test_visual/test_textbox.py +508 -0
  3018. psychopy/tests/test_visual/test_winFlipTiming.py +95 -0
  3019. psychopy/tests/test_visual/test_winScalePos.py +78 -0
  3020. psychopy/tests/test_visual/test_window.py +124 -0
  3021. psychopy/tests/utils.py +372 -0
  3022. psychopy/tools/LineBreak.txt +3597 -0
  3023. psychopy/tools/__init__.py +9 -0
  3024. psychopy/tools/animationtools.py +49 -0
  3025. psychopy/tools/apptools.py +32 -0
  3026. psychopy/tools/arraytools.py +561 -0
  3027. psychopy/tools/attributetools.py +263 -0
  3028. psychopy/tools/audiotools.py +361 -0
  3029. psychopy/tools/colorspacetools.py +717 -0
  3030. psychopy/tools/coordinatetools.py +104 -0
  3031. psychopy/tools/environmenttools.py +62 -0
  3032. psychopy/tools/fileerrortools.py +66 -0
  3033. psychopy/tools/filetools.py +406 -0
  3034. psychopy/tools/fontmanager.py +1065 -0
  3035. psychopy/tools/gltools.py +7367 -0
  3036. psychopy/tools/imagetools.py +65 -0
  3037. psychopy/tools/linebreak.py +322 -0
  3038. psychopy/tools/mathtools.py +4910 -0
  3039. psychopy/tools/monitorunittools.py +276 -0
  3040. psychopy/tools/movietools.py +1111 -0
  3041. psychopy/tools/pkgtools.py +654 -0
  3042. psychopy/tools/plottools.py +25 -0
  3043. psychopy/tools/rifttools.py +76 -0
  3044. psychopy/tools/stereotools.py +9 -0
  3045. psychopy/tools/stimulustools.py +198 -0
  3046. psychopy/tools/stringtools.py +466 -0
  3047. psychopy/tools/systemtools.py +1331 -0
  3048. psychopy/tools/typetools.py +52 -0
  3049. psychopy/tools/unittools.py +16 -0
  3050. psychopy/tools/versionchooser.py +604 -0
  3051. psychopy/tools/viewtools.py +1068 -0
  3052. psychopy/tools/wizard.py +804 -0
  3053. psychopy/validation/__init__.py +6 -0
  3054. psychopy/validation/audio.py +78 -0
  3055. psychopy/validation/visual.py +119 -0
  3056. psychopy/visual/__init__.py +121 -0
  3057. psychopy/visual/aperture.py +333 -0
  3058. psychopy/visual/backends/__init__.py +77 -0
  3059. psychopy/visual/backends/_base.py +481 -0
  3060. psychopy/visual/backends/gamma.py +349 -0
  3061. psychopy/visual/backends/glfwbackend.py +24 -0
  3062. psychopy/visual/backends/pygamebackend.py +343 -0
  3063. psychopy/visual/backends/pygletbackend.py +970 -0
  3064. psychopy/visual/basevisual.py +2027 -0
  3065. psychopy/visual/brush.py +204 -0
  3066. psychopy/visual/bufferimage.py +311 -0
  3067. psychopy/visual/button.py +194 -0
  3068. psychopy/visual/circle.py +165 -0
  3069. psychopy/visual/custommouse.py +263 -0
  3070. psychopy/visual/dot.py +734 -0
  3071. psychopy/visual/dropdown.py +165 -0
  3072. psychopy/visual/elementarray.py +802 -0
  3073. psychopy/visual/filters.py +419 -0
  3074. psychopy/visual/form.py +1195 -0
  3075. psychopy/visual/globalVars.py +24 -0
  3076. psychopy/visual/grating.py +581 -0
  3077. psychopy/visual/helpers.py +336 -0
  3078. psychopy/visual/image.py +438 -0
  3079. psychopy/visual/line.py +227 -0
  3080. psychopy/visual/movie.py +12 -0
  3081. psychopy/visual/movie2.py +21 -0
  3082. psychopy/visual/movie3.py +18 -0
  3083. psychopy/visual/movies/__init__.py +2334 -0
  3084. psychopy/visual/movies/frame.py +258 -0
  3085. psychopy/visual/movies/metadata.py +242 -0
  3086. psychopy/visual/movies/players/_base.py +364 -0
  3087. psychopy/visual/nnlvs.py +830 -0
  3088. psychopy/visual/noise.py +32 -0
  3089. psychopy/visual/panorama.py +313 -0
  3090. psychopy/visual/patch.py +21 -0
  3091. psychopy/visual/pie.py +237 -0
  3092. psychopy/visual/polygon.py +226 -0
  3093. psychopy/visual/progress.py +313 -0
  3094. psychopy/visual/radial.py +29 -0
  3095. psychopy/visual/ratingscale.py +18 -0
  3096. psychopy/visual/rect.py +195 -0
  3097. psychopy/visual/rift.py +2660 -0
  3098. psychopy/visual/roi.py +141 -0
  3099. psychopy/visual/secondorder.py +27 -0
  3100. psychopy/visual/shaders.py +787 -0
  3101. psychopy/visual/shape.py +897 -0
  3102. psychopy/visual/simpleimage.py +303 -0
  3103. psychopy/visual/slider.py +1222 -0
  3104. psychopy/visual/stim3d.py +2109 -0
  3105. psychopy/visual/target.py +278 -0
  3106. psychopy/visual/text.py +769 -0
  3107. psychopy/visual/textbox/__init__.py +1280 -0
  3108. psychopy/visual/textbox/fontmanager.py +574 -0
  3109. psychopy/visual/textbox/parsedtext.py +317 -0
  3110. psychopy/visual/textbox/textgrid.py +278 -0
  3111. psychopy/visual/textbox/textureatlas.py +248 -0
  3112. psychopy/visual/textbox2/__init__.py +4 -0
  3113. psychopy/visual/textbox2/textbox2.py +1970 -0
  3114. psychopy/visual/vlcmoviestim.py +1294 -0
  3115. psychopy/visual/window.py +3910 -0
  3116. psychopy/visual/windowframepack.py +86 -0
  3117. psychopy/visual/windowwarp.py +457 -0
  3118. psychopy/voicekey/__init__.py +56 -0
  3119. psychopy/voicekey/labjack_vks.py +9 -0
  3120. psychopy/voicekey/parallel_vks.py +9 -0
  3121. psychopy/voicekey/vk_tools.py +131 -0
  3122. psychopy/web.py +289 -0
  3123. psychopy-2025.2.4.dist-info/METADATA +160 -0
  3124. psychopy-2025.2.4.dist-info/RECORD +3127 -0
  3125. psychopy-2025.2.4.dist-info/WHEEL +4 -0
  3126. psychopy-2025.2.4.dist-info/entry_points.txt +5 -0
  3127. psychopy-2025.2.4.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,2660 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """Oculus Rift HMD support for PsychoPy.
4
+
5
+ Copyright (C) 2019 - Matthew D. Cutone, The Centre for Vision Research, Toronto,
6
+ Ontario, Canada
7
+
8
+ Uses PsychXR to interface with the Oculus Rift runtime (LibOVR) and SDK. See
9
+ http://psychxr.org for more information. The Oculus PC SDK is Copyright (c)
10
+ Facebook Technologies, LLC and its affiliates. All rights reserved.
11
+
12
+ """
13
+
14
+ # Part of the PsychoPy library
15
+ # Copyright (C) 2018 Jonathan Peirce
16
+ # Distributed under the terms of the GNU General Public License (GPL).
17
+
18
+ __all__ = ['Rift']
19
+
20
+ # ----------
21
+ # Initialize
22
+ # ----------
23
+
24
+ # Check if they system has PsychXR installed and is importable. If not, this
25
+ # module will still load, but the `Rift` class will fail to load. This allows
26
+ # the Rift library to be lazy-loaded on systems without PsychXR.
27
+ #
28
+ _HAS_PSYCHXR_ = True
29
+
30
+ try:
31
+ import psychxr.drivers.libovr as libovr
32
+ except ImportError:
33
+ _HAS_PSYCHXR_ = False
34
+
35
+ # -------
36
+ # Imports
37
+ # -------
38
+
39
+ import warnings
40
+ import platform
41
+ import ctypes
42
+ import numpy as np
43
+ import pyglet.gl as GL
44
+ from psychopy.visual import window
45
+ from psychopy.hardware.exceptions import DeviceNotConnectedError
46
+ from psychopy import platform_specific, logging, core
47
+ from psychopy.tools.attributetools import setAttribute
48
+ from psychopy.localization import _translate
49
+
50
+ try:
51
+ from PIL import Image
52
+ except ImportError:
53
+ import Image
54
+
55
+ reportNDroppedFrames = 5
56
+
57
+ # -------------------------------------------
58
+ # Look-up tables for PsychXR/LibOVR constants
59
+ #
60
+
61
+ if _HAS_PSYCHXR_:
62
+ # Controller types supported by PsychXR
63
+ RIFT_CONTROLLER_TYPES = {
64
+ 'Xbox': libovr.CONTROLLER_TYPE_XBOX,
65
+ 'Remote': libovr.CONTROLLER_TYPE_REMOTE,
66
+ 'Touch': libovr.CONTROLLER_TYPE_TOUCH,
67
+ 'LeftTouch': libovr.CONTROLLER_TYPE_LTOUCH,
68
+ 'RightTouch': libovr.CONTROLLER_TYPE_RTOUCH,
69
+ 'Object0': libovr.CONTROLLER_TYPE_OBJECT0,
70
+ 'Object1': libovr.CONTROLLER_TYPE_OBJECT1,
71
+ 'Object2': libovr.CONTROLLER_TYPE_OBJECT2,
72
+ 'Object3': libovr.CONTROLLER_TYPE_OBJECT3,
73
+ libovr.CONTROLLER_TYPE_XBOX: 'Xbox',
74
+ libovr.CONTROLLER_TYPE_REMOTE: 'Remote',
75
+ libovr.CONTROLLER_TYPE_TOUCH: 'Touch',
76
+ libovr.CONTROLLER_TYPE_LTOUCH: 'LeftTouch',
77
+ libovr.CONTROLLER_TYPE_RTOUCH: 'RightTouch',
78
+ libovr.CONTROLLER_TYPE_OBJECT0: 'Object0',
79
+ libovr.CONTROLLER_TYPE_OBJECT1: 'Object1',
80
+ libovr.CONTROLLER_TYPE_OBJECT2: 'Object2',
81
+ libovr.CONTROLLER_TYPE_OBJECT3: 'Object3'
82
+ }
83
+
84
+ # Button types supported by PsychXR
85
+ RIFT_BUTTON_TYPES = {
86
+ "A": libovr.BUTTON_A,
87
+ "B": libovr.BUTTON_B,
88
+ "RThumb": libovr.BUTTON_RTHUMB,
89
+ "RShoulder": libovr.BUTTON_RSHOULDER,
90
+ "X": libovr.BUTTON_X,
91
+ "Y": libovr.BUTTON_Y,
92
+ "LThumb": libovr.BUTTON_LTHUMB,
93
+ "LShoulder": libovr.BUTTON_LSHOULDER,
94
+ "Up": libovr.BUTTON_UP,
95
+ "Down": libovr.BUTTON_DOWN,
96
+ "Left": libovr.BUTTON_LEFT,
97
+ "Right": libovr.BUTTON_RIGHT,
98
+ "Enter": libovr.BUTTON_ENTER,
99
+ "Back": libovr.BUTTON_BACK,
100
+ "VolUp": libovr.BUTTON_VOLUP,
101
+ "VolDown": libovr.BUTTON_VOLDOWN,
102
+ "Home": libovr.BUTTON_HOME,
103
+ }
104
+
105
+ # Touch types supported by PsychXR
106
+ RIFT_TOUCH_TYPES = {
107
+ "A": libovr.TOUCH_A,
108
+ "B": libovr.TOUCH_B,
109
+ "RThumb": libovr.TOUCH_RTHUMB,
110
+ "RThumbRest": libovr.TOUCH_RTHUMBREST,
111
+ "RThumbUp": libovr.TOUCH_RTHUMBUP,
112
+ "RIndexPointing": libovr.TOUCH_RINDEXPOINTING,
113
+ "X": libovr.TOUCH_X,
114
+ "Y": libovr.TOUCH_Y,
115
+ "LThumb": libovr.TOUCH_LTHUMB,
116
+ "LThumbRest": libovr.TOUCH_LTHUMBREST,
117
+ "LThumbUp": libovr.TOUCH_LTHUMBUP,
118
+ "LIndexPointing": libovr.TOUCH_LINDEXPOINTING
119
+ }
120
+
121
+ # Tracked device identifiers
122
+ RIFT_TRACKED_DEVICE_TYPES = {
123
+ "HMD": libovr.TRACKED_DEVICE_TYPE_HMD,
124
+ "LTouch": libovr.TRACKED_DEVICE_TYPE_LTOUCH,
125
+ "RTouch": libovr.TRACKED_DEVICE_TYPE_RTOUCH,
126
+ "Touch": libovr.TRACKED_DEVICE_TYPE_TOUCH,
127
+ "Object0": libovr.TRACKED_DEVICE_TYPE_OBJECT0,
128
+ "Object1": libovr.TRACKED_DEVICE_TYPE_OBJECT1,
129
+ "Object2": libovr.TRACKED_DEVICE_TYPE_OBJECT2,
130
+ "Object3": libovr.TRACKED_DEVICE_TYPE_OBJECT3
131
+ }
132
+
133
+ # Tracking origin types
134
+ RIFT_TRACKING_ORIGIN_TYPE = {
135
+ "floor": libovr.TRACKING_ORIGIN_FLOOR_LEVEL,
136
+ "eye": libovr.TRACKING_ORIGIN_EYE_LEVEL
137
+ }
138
+
139
+ # Performance hud modes
140
+ RIFT_PERF_HUD_MODES = {
141
+ 'PerfSummary': libovr.PERF_HUD_PERF_SUMMARY,
142
+ 'LatencyTiming': libovr.PERF_HUD_LATENCY_TIMING,
143
+ 'AppRenderTiming': libovr.PERF_HUD_APP_RENDER_TIMING,
144
+ 'CompRenderTiming': libovr.PERF_HUD_COMP_RENDER_TIMING,
145
+ 'AswStats': libovr.PERF_HUD_ASW_STATS,
146
+ 'VersionInfo': libovr.PERF_HUD_VERSION_INFO,
147
+ 'Off': libovr.PERF_HUD_OFF
148
+ }
149
+
150
+ # stereo debug hud modes
151
+ RIFT_STEREO_DEBUG_HUD_MODES = {
152
+ 'Off': libovr.DEBUG_HUD_STEREO_MODE_OFF,
153
+ 'Quad': libovr.DEBUG_HUD_STEREO_MODE_QUAD,
154
+ 'QuadWithCrosshair': libovr.DEBUG_HUD_STEREO_MODE_QUAD_WITH_CROSSHAIR,
155
+ 'CrosshairAtInfinity': libovr.DEBUG_HUD_STEREO_MODE_CROSSHAIR_AT_INFINITY
156
+ }
157
+
158
+ # Boundary types
159
+ RIFT_BOUNDARY_TYPE = {
160
+ 'PlayArea': libovr.BOUNDARY_PLAY_AREA,
161
+ 'Outer': libovr.BOUNDARY_OUTER
162
+ }
163
+
164
+ # mirror modes
165
+ RIFT_MIRROR_MODES = {
166
+ 'left': libovr.MIRROR_OPTION_LEFT_EYE_ONLY,
167
+ 'right': libovr.MIRROR_OPTION_RIGHT_EYE_ONLY,
168
+ 'distortion': libovr.MIRROR_OPTION_POST_DISTORTION,
169
+ 'default': libovr.MIRROR_OPTION_DEFAULT
170
+ }
171
+
172
+ # eye types
173
+ RIFT_EYE_TYPE = {'left': libovr.EYE_LEFT, 'right': libovr.EYE_RIGHT}
174
+
175
+
176
+ # ------------------------------------------------------------------------------
177
+ # LibOVR Error Handler
178
+ #
179
+ # Exceptions raised by LibOVR will wrapped with this Python exception. This will
180
+ # display the error string passed from LibOVR.
181
+ #
182
+
183
+ class LibOVRError(Exception):
184
+ """Exception for LibOVR errors."""
185
+ pass
186
+
187
+
188
+ class Rift(window.Window):
189
+ """Class provides a display and peripheral interface for the Oculus Rift
190
+ (see: https://www.oculus.com/) head-mounted display. This is a
191
+ lazy-imported class, therefore import using full path
192
+ `from psychopy.visual.rift import Rift` when inheriting from it.
193
+
194
+
195
+ Requires PsychXR 0.2.4 to be installed. Setting the `winType='glfw'` is
196
+ preferred for VR applications.
197
+
198
+ """
199
+ def __init__(
200
+ self,
201
+ fovType='recommended',
202
+ trackingOriginType='floor',
203
+ texelsPerPixel=1.0,
204
+ headLocked=False,
205
+ highQuality=True,
206
+ monoscopic=False,
207
+ samples=1,
208
+ mirrorMode='default',
209
+ mirrorRes=None,
210
+ warnAppFrameDropped=True,
211
+ autoUpdateInput=True,
212
+ legacyOpenGL=True,
213
+ *args,
214
+ **kwargs):
215
+ """
216
+ Parameters
217
+ ----------
218
+ fovType : str
219
+ Field-of-view (FOV) configuration type. Using 'recommended'
220
+ auto-configures the FOV using the recommended parameters computed by
221
+ the runtime. Using 'symmetric' forces a symmetric FOV using optimal
222
+ parameters from the SDK, this mode is required for displaying 2D
223
+ stimuli. Specifying 'max' will use the maximum FOVs supported by the
224
+ HMD.
225
+ trackingOriginType : str
226
+ Specify the HMD origin type. If 'floor', the height of the user
227
+ is added to the head tracker by LibOVR.
228
+ texelsPerPixel : float
229
+ Texture pixels per display pixel at FOV center. A value of 1.0
230
+ results in 1:1 mapping. A fractional value results in a lower
231
+ resolution draw buffer which may increase performance.
232
+ headLocked : bool
233
+ Lock the compositor render layer in-place, disabling Asynchronous
234
+ Space Warp (ASW). Enable this if you plan on computing eye poses
235
+ using custom or modified head poses.
236
+ highQuality : bool
237
+ Configure the compositor to use anisotropic texture sampling (4x).
238
+ This reduces aliasing artifacts resulting from high frequency
239
+ details particularly in the periphery.
240
+ nearClip, farClip : float
241
+ Location of the near and far clipping plane in GL units (meters by
242
+ default) from the viewer. These values can be updated after
243
+ initialization.
244
+ monoscopic : bool
245
+ Enable monoscopic rendering mode which presents the same image to
246
+ both eyes. Eye poses used will be both centered at the HMD origin.
247
+ Monoscopic mode uses a separate rendering pipeline which reduces
248
+ VRAM usage. When in monoscopic mode, you do not need to call
249
+ 'setBuffer' prior to rendering (doing so will do have no effect).
250
+ samples : int or str
251
+ Specify the number of samples for multi-sample anti-aliasing (MSAA).
252
+ When >1, multi-sampling logic is enabled in the rendering pipeline.
253
+ If 'max' is specified, the largest number of samples supported by
254
+ the platform is used. If floating point textures are used, MSAA
255
+ sampling is disabled. Must be power of two value.
256
+ mirrorMode : str
257
+ On-screen mirror mode. Values 'left' and 'right' show rectilinear
258
+ images of a single eye. Value 'distortion` shows the post-distortion
259
+ image after being processed by the compositor. Value 'default'
260
+ displays rectilinear images of both eyes side-by-side.
261
+ mirrorRes : list of int
262
+ Resolution of the mirror texture. If `None`, the resolution will
263
+ match the window size. The value of `mirrorRes` is used for to
264
+ define the resolution of movie frames.
265
+ warnAppFrameDropped : bool
266
+ Log a warning if the application drops a frame. This occurs when
267
+ the application fails to submit a frame to the compositor on-time.
268
+ Application frame drops can have many causes, such as running
269
+ routines in your application loop that take too long to complete.
270
+ However, frame drops can happen sporadically due to driver bugs and
271
+ running background processes (such as Windows Update). Use the
272
+ performance HUD to help diagnose the causes of frame drops.
273
+ autoUpdateInput : bool
274
+ Automatically update controller input states at the start of each
275
+ frame. If `False`, you must manually call `updateInputState` before
276
+ getting input values from `LibOVR` managed input devices.
277
+ legacyOpenGL : bool
278
+ Disable 'immediate mode' OpenGL calls in the rendering pipeline.
279
+ Specifying False maintains compatibility with existing PsychoPy
280
+ stimuli drawing routines. Use True when computing transformations
281
+ using some other method and supplying shaders matrices directly.
282
+
283
+ """
284
+ if not _HAS_PSYCHXR_:
285
+ raise ModuleNotFoundError(
286
+ "PsychXR must be installed to use the `Rift` class. Exiting.")
287
+
288
+ self._closed = False
289
+ self._legacyOpenGL = legacyOpenGL
290
+ self._monoscopic = monoscopic
291
+ self._texelsPerPixel = texelsPerPixel
292
+ self._headLocked = headLocked
293
+ self._highQuality = highQuality
294
+
295
+ self._samples = samples
296
+ self._mirrorRes = mirrorRes
297
+ self._mirrorMode = mirrorMode
298
+
299
+ self.autoUpdateInput = autoUpdateInput
300
+
301
+ # performance statistics
302
+ # this can be changed while running
303
+ self.warnAppFrameDropped = warnAppFrameDropped
304
+
305
+ # check if we are using Windows
306
+ if platform.system() != 'Windows':
307
+ raise RuntimeError("`Rift` class only supports Windows OS at this " +
308
+ "time, exiting.")
309
+
310
+ # check if we are using 64-bit Python
311
+ if platform.architecture()[0] != '64bit': # sys.maxsize != 2**64
312
+ raise RuntimeError("`Rift` class only supports 64-bit Python, " +
313
+ "exiting.")
314
+
315
+ # check if the background service is running and an HMD is connected
316
+ if not libovr.isOculusServiceRunning():
317
+ raise RuntimeError("HMD service is not available or started, " +
318
+ "exiting.")
319
+
320
+ if not libovr.isHmdConnected():
321
+ raise DeviceNotConnectedError(
322
+ _translate(
323
+ "Cannot find any connected HMD, check connections and try again."
324
+ ),
325
+ deviceClass=Rift
326
+ )
327
+
328
+ # create a VR session, do some initial configuration
329
+ initResult = libovr.initialize() # removed logging callback
330
+ if libovr.failure(initResult):
331
+ _, msg = libovr.getLastErrorInfo()
332
+ raise LibOVRError(msg)
333
+
334
+ if libovr.failure(libovr.create()):
335
+ libovr.shutdown() # shutdown the session
336
+ _, msg = libovr.getLastErrorInfo()
337
+ raise LibOVRError(msg)
338
+
339
+ if libovr.failure(libovr.resetPerfStats()):
340
+ logging.warn('Failed to reset performance stats.')
341
+
342
+ self._perfStats = libovr.getPerfStats()
343
+ self._lastAppDroppedFrameCount = 0
344
+
345
+ # update session status object
346
+ _, status = libovr.getSessionStatus()
347
+ self._sessionStatus = status
348
+
349
+ # get HMD information
350
+ self._hmdInfo = libovr.getHmdInfo()
351
+
352
+ # configure the internal render descriptors based on the requested
353
+ # viewing parameters.
354
+ if fovType == 'symmetric' or self._monoscopic:
355
+ # Use symmetric FOVs for cases where off-center frustums are not
356
+ # desired. This is required for monoscopic rendering to permit
357
+ # comfortable binocular fusion.
358
+ eyeFovs = self._hmdInfo.symmetricEyeFov
359
+ logging.info('Using symmetric eye FOVs.')
360
+ elif fovType == 'recommended' or fovType == 'default':
361
+ # use the recommended FOVs, these have wider FOVs looking outward
362
+ # due to off-center frustums.
363
+ eyeFovs = self._hmdInfo.defaultEyeFov
364
+ logging.info('Using default/recommended eye FOVs.')
365
+ elif fovType == 'max':
366
+ # the maximum FOVs for the HMD supports
367
+ eyeFovs = self._hmdInfo.maxEyeFov
368
+ logging.info('Using maximum eye FOVs.')
369
+ else:
370
+ raise ValueError(
371
+ "Invalid FOV type '{}' specified.".format(fovType))
372
+
373
+ # pass the FOVs to PsychXR
374
+ for eye, fov in enumerate(eyeFovs):
375
+ libovr.setEyeRenderFov(eye, fov)
376
+
377
+ libovr.setHeadLocked(headLocked) # enable head locked mode
378
+ libovr.setHighQuality(highQuality) # enable high quality mode
379
+
380
+ # Compute texture sizes for render buffers, these are reported by the
381
+ # LibOVR SDK based on the FOV settings specified above.
382
+ texSizeLeft = libovr.calcEyeBufferSize(libovr.EYE_LEFT)
383
+ texSizeRight = libovr.calcEyeBufferSize(libovr.EYE_RIGHT)
384
+
385
+ # we are using a shared texture, so we need to combine dimensions
386
+ if not self._monoscopic:
387
+ hmdBufferWidth = texSizeLeft[0] + texSizeRight[0]
388
+ else:
389
+ hmdBufferWidth = max(texSizeLeft[0], texSizeRight[0])
390
+
391
+ hmdBufferHeight = max(texSizeLeft[1], texSizeRight[1])
392
+
393
+ # buffer viewport size
394
+ self._hmdBufferSize = hmdBufferWidth, hmdBufferHeight
395
+ logging.debug(
396
+ 'Required HMD buffer size is {}x{}.'.format(*self._hmdBufferSize))
397
+
398
+ # Calculate the swap texture size. These can differ in later
399
+ # configurations, right now they are the same.
400
+ self._swapTextureSize = self._hmdBufferSize
401
+
402
+ # Compute the required viewport parameters for the given buffer and
403
+ # texture sizes. If we are using a power of two texture, we need to
404
+ # centre the viewports on the textures.
405
+ if not self._monoscopic:
406
+ leftViewport = (0, 0, texSizeLeft[0], texSizeLeft[1])
407
+ rightViewport = (texSizeLeft[0], 0, texSizeRight[0], texSizeRight[1])
408
+ else:
409
+ # In mono mode, we use the same viewport for both eyes. Therefore,
410
+ # the swap texture only needs to be half as wide. This save VRAM
411
+ # and does not require buffer changes when rendering.
412
+ leftViewport = (0, 0, texSizeLeft[0], texSizeLeft[1])
413
+ rightViewport = (0, 0, texSizeRight[0], texSizeRight[1])
414
+
415
+ libovr.setEyeRenderViewport(libovr.EYE_LEFT, leftViewport)
416
+ logging.debug(
417
+ 'Set left eye viewport to: x={}, y={}, w={}, h={}.'.format(
418
+ *leftViewport))
419
+
420
+ libovr.setEyeRenderViewport(libovr.EYE_RIGHT, rightViewport)
421
+ logging.debug(
422
+ 'Set right eye viewport to: x={}, y={}, w={}, h={}.'.format(
423
+ *rightViewport))
424
+
425
+ self.scrWidthPIX = max(texSizeLeft[0], texSizeRight[0])
426
+
427
+ # frame index
428
+ self._frameIndex = 0
429
+
430
+ # setup a mirror texture
431
+ self._mirrorRes = mirrorRes
432
+
433
+ # view buffer to divert operations to, if None, drawing is sent to the
434
+ # on-screen window.
435
+ self.buffer = None
436
+
437
+ # View matrices, these are updated every frame based on computed head
438
+ # position. Projection matrices need only to be computed once.
439
+ if not self._monoscopic:
440
+ self._projectionMatrix = [
441
+ np.identity(4, dtype=np.float32),
442
+ np.identity(4, dtype=np.float32)]
443
+ self._viewMatrix = [
444
+ np.identity(4, dtype=np.float32),
445
+ np.identity(4, dtype=np.float32)]
446
+ else:
447
+ self._projectionMatrix = np.identity(4, dtype=np.float32)
448
+ self._viewMatrix = np.identity(4, dtype=np.float32)
449
+
450
+ # disable v-sync since the HMD runs at a different frequency
451
+ kwargs['waitBlanking'] = False
452
+
453
+ # force checkTiming and quad-buffer stereo off
454
+ kwargs["checkTiming"] = False # not used here for now
455
+ kwargs["stereo"] = False # false, using our own stuff for stereo
456
+ kwargs['useFBO'] = True # true, but uses it's ow FBO logic
457
+ kwargs['multiSample'] = False # not for the back buffer of the widow
458
+
459
+ # do not allow 'endFrame' to be called until _startOfFlip is called
460
+ self._allowHmdRendering = False
461
+
462
+ # VR pose data, updated every frame
463
+ self._headPose = libovr.LibOVRPose()
464
+
465
+ # set the tracking origin type
466
+ self.trackingOriginType = trackingOriginType
467
+
468
+ # performance information
469
+ self.nDroppedFrames = 0
470
+ self.controllerPollTimes = {}
471
+
472
+ # call up a new window object
473
+ super(Rift, self).__init__(*args, **kwargs)
474
+
475
+ self._updateProjectionMatrix()
476
+
477
+ def close(self):
478
+ """Close the window and cleanly shutdown the LibOVR session.
479
+ """
480
+ logging.info('Closing `Rift` window, de-allocating resources and '
481
+ 'shutting down VR session.')
482
+
483
+ # switch off persistent HUD features
484
+ self.perfHudMode = 'Off'
485
+ self.stereoDebugHudMode = 'Off'
486
+
487
+ # clean up allocated LibOVR resources before closing the window
488
+ logging.debug('Destroying mirror texture.')
489
+ libovr.destroyMirrorTexture()
490
+ logging.debug('Destroying texture GL swap chain.')
491
+ libovr.destroyTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
492
+ logging.debug('Destroying LibOVR session.')
493
+ libovr.destroy()
494
+
495
+ # start closing the window
496
+ self._closed = True
497
+ logging.debug('Closing window associated with LibOVR session.')
498
+ self.backend.close()
499
+
500
+ try:
501
+ core.openWindows.remove(self)
502
+ except Exception:
503
+ pass
504
+
505
+ try:
506
+ self.mouseVisible = True
507
+ except Exception:
508
+ pass
509
+
510
+ # shutdown the session completely
511
+ #libovr.shutdown()
512
+ logging.info('LibOVR session shutdown cleanly.')
513
+
514
+ try:
515
+ logging.flush()
516
+ except Exception:
517
+ pass
518
+
519
+ @property
520
+ def size(self):
521
+ """Size property to get the dimensions of the view buffer instead of
522
+ the window. If there are no view buffers, always return the dims of the
523
+ window.
524
+
525
+ """
526
+ # this is a hack to get stimuli to draw correctly
527
+ if self.buffer is None:
528
+ return self.frameBufferSize
529
+ else:
530
+ if self._monoscopic:
531
+ return np.array(
532
+ (self._hmdBufferSize[0], self._hmdBufferSize[1]),
533
+ int)
534
+ else:
535
+ return np.array(
536
+ (int(self._hmdBufferSize[0] / 2), self._hmdBufferSize[1]),
537
+ int)
538
+
539
+ @size.setter
540
+ def size(self, value):
541
+ """Set the size of the window.
542
+
543
+ """
544
+ self.__dict__['size'] = np.array(value, int)
545
+
546
+ def setSize(self, value, log=True):
547
+ setAttribute(self, 'size', value, log=log)
548
+
549
+ def perfHudMode(self, mode='Off'):
550
+ """Set the performance HUD mode.
551
+
552
+ Parameters
553
+ ----------
554
+ mode : str
555
+ HUD mode to use.
556
+
557
+ """
558
+ result = libovr.setInt(libovr.PERF_HUD_MODE, RIFT_PERF_HUD_MODES[mode])
559
+ if libovr.success(result):
560
+ logging.info("Performance HUD mode set to '{}'.".format(mode))
561
+ else:
562
+ logging.error('Failed to set performance HUD mode to "{}".'.format(
563
+ mode))
564
+
565
+ def hidePerfHud(self):
566
+ """Hide the performance HUD."""
567
+ libovr.setInt(libovr.PERF_HUD_MODE, libovr.PERF_HUD_OFF)
568
+ logging.info('Performance HUD disabled.')
569
+
570
+ def stereoDebugHudMode(self, mode):
571
+ """Set the debug stereo HUD mode.
572
+
573
+ This makes the compositor add stereoscopic reference guides to the
574
+ scene. You can configure the HUD can be configured using other methods.
575
+
576
+ Parameters
577
+ ----------
578
+ mode : str
579
+ Stereo debug mode to use. Valid options are `Off`, `Quad`,
580
+ `QuadWithCrosshair`, and `CrosshairAtInfinity`.
581
+
582
+ Examples
583
+ --------
584
+ Enable a stereo debugging guide::
585
+
586
+ hmd.stereoDebugHudMode('CrosshairAtInfinity')
587
+
588
+ Hide the debugging guide. Should be called before exiting the
589
+ application since it's persistent until the Oculus service is
590
+ restarted::
591
+
592
+ hmd.stereoDebugHudMode('Off')
593
+
594
+ """
595
+ result = libovr.setInt(
596
+ libovr.DEBUG_HUD_STEREO_MODE, RIFT_STEREO_DEBUG_HUD_MODES[mode])
597
+
598
+ if result:
599
+ logging.info("Stereo debug HUD mode set to '{}'.".format(mode))
600
+ else:
601
+ logging.warning(
602
+ "Failed to set stereo debug HUD mode set to '{}'.".format(mode))
603
+
604
+ def setStereoDebugHudOption(self, option, value):
605
+ """Configure stereo debug HUD guides.
606
+
607
+ Parameters
608
+ ----------
609
+ option : str
610
+ Option to set. Valid options are `InfoEnable`, `Size`, `Position`,
611
+ `YawPitchRoll`, and `Color`.
612
+ value : array_like or bool
613
+ Value to set for a given `option`. Appropriate types for each
614
+ option are:
615
+
616
+ * `InfoEnable` - bool, `True` to show, `False` to hide.
617
+ * `Size` - array_like, [w, h] in meters.
618
+ * `Position` - array_like, [x, y, z] in meters.
619
+ * `YawPitchRoll` - array_like, [pitch, yaw, roll] in degrees.
620
+ * `Color` - array_like, [r, g, b] as floats ranging 0.0 to 1.0.
621
+
622
+ Returns
623
+ -------
624
+ bool
625
+ ``True`` if the option was successfully set.
626
+
627
+ Examples
628
+ --------
629
+ Configuring a stereo debug HUD guide::
630
+
631
+ # show a quad with a crosshair
632
+ hmd.stereoDebugHudMode('QuadWithCrosshair')
633
+ # enable displaying guide information
634
+ hmd.setStereoDebugHudOption('InfoEnable', True)
635
+ # set the position of the guide quad in the scene
636
+ hmd.setStereoDebugHudOption('Position', [0.0, 1.7, -2.0])
637
+
638
+ """
639
+ if option == 'InfoEnable':
640
+ result = libovr.setBool(
641
+ libovr.DEBUG_HUD_STEREO_GUIDE_INFO_ENABLE, value)
642
+ elif option == 'Size':
643
+ value = np.asarray(value, dtype=np.float32)
644
+ result = libovr.setFloatArray(
645
+ libovr.DEBUG_HUD_STEREO_GUIDE_SIZE, value)
646
+ elif option == 'Position':
647
+ value = np.asarray(value, dtype=np.float32)
648
+ result = libovr.setFloatArray(
649
+ libovr.DEBUG_HUD_STEREO_GUIDE_POSITION, value)
650
+ elif option == 'YawPitchRoll':
651
+ value = np.asarray(value, dtype=np.float32)
652
+ result = libovr.setFloatArray(
653
+ libovr.DEBUG_HUD_STEREO_GUIDE_YAWPITCHROLL, value)
654
+ elif option == 'Color' or option == 'Colour':
655
+ value = np.asarray(value, dtype=np.float32)
656
+ result = libovr.setFloatArray(
657
+ libovr.DEBUG_HUD_STEREO_GUIDE_COLOR, value)
658
+ else:
659
+ raise ValueError("Invalid option `{}` specified.".format(option))
660
+
661
+ if result:
662
+ logging.info(
663
+ "Stereo debug HUD option '{}' set to {}.".format(
664
+ option, str(value)))
665
+ else:
666
+ logging.warning(
667
+ "Failed to set stereo debug HUD option '{}' set to {}.".format(
668
+ option, str(value)))
669
+
670
+ @property
671
+ def userHeight(self):
672
+ """Get user height in meters (`float`)."""
673
+ return libovr.getFloat(libovr.KEY_PLAYER_HEIGHT,
674
+ libovr.DEFAULT_PLAYER_HEIGHT)
675
+
676
+ @property
677
+ def eyeHeight(self):
678
+ """Eye height in meters (`float`)."""
679
+ return libovr.getFloat(libovr.KEY_EYE_HEIGHT,
680
+ libovr.DEFAULT_EYE_HEIGHT)
681
+
682
+ @property
683
+ def eyeToNoseDistance(self):
684
+ """Eye to nose distance in meters (`float`).
685
+
686
+ Examples
687
+ --------
688
+ Generate your own eye poses. These are used when
689
+ :py:meth:`calcEyePoses` is called::
690
+
691
+ leftEyePose = Rift.createPose((-self.eyeToNoseDistance, 0., 0.))
692
+ rightEyePose = Rift.createPose((self.eyeToNoseDistance, 0., 0.))
693
+
694
+ Get the inter-axial separation (IAS) reported by `LibOVR`::
695
+
696
+ iad = self.eyeToNoseDistance * 2.0
697
+
698
+ """
699
+ eyeToNoseDist = np.zeros((2,), dtype=np.float32)
700
+ libovr.getFloatArray(libovr.KEY_EYE_TO_NOSE_DISTANCE, eyeToNoseDist)
701
+
702
+ return eyeToNoseDist
703
+
704
+ @property
705
+ def eyeOffset(self):
706
+ """Eye separation in centimeters (`float`).
707
+
708
+ """
709
+ leftEyeHmdPose = libovr.getHmdToEyePose(libovr.EYE_LEFT)
710
+ rightEyeHmdPose = libovr.getHmdToEyePose(libovr.EYE_RIGHT)
711
+
712
+ return (-leftEyeHmdPose.pos[0] + rightEyeHmdPose.pos[0]) / 100.0
713
+
714
+ @eyeOffset.setter
715
+ def eyeOffset(self, value):
716
+ halfIAS = (value / 2.0) * 100.0
717
+ libovr.setHmdToEyePose(
718
+ libovr.EYE_LEFT, libovr.LibOVRPose((halfIAS, 0.0, 0.0)))
719
+ libovr.setHmdToEyePose(
720
+ libovr.EYE_RIGHT, libovr.LibOVRPose((-halfIAS, 0.0, 0.0)))
721
+
722
+ logging.info(
723
+ 'Eye separation set to {} centimeters.'.format(value))
724
+
725
+ @property
726
+ def hasPositionTracking(self):
727
+ """``True`` if the HMD is capable of tracking position."""
728
+ return self._hmdInfo.hasPositionTracking
729
+
730
+ @property
731
+ def hasOrientationTracking(self):
732
+ """``True`` if the HMD is capable of tracking orientation."""
733
+ return self._hmdInfo.hasOrientationTracking
734
+
735
+ @property
736
+ def hasMagYawCorrection(self):
737
+ """``True`` if this HMD supports yaw drift correction."""
738
+ return self._hmdInfo.hasMagYawCorrection
739
+
740
+ @property
741
+ def productName(self):
742
+ """Get the HMD's product name (`str`).
743
+ """
744
+ return self._hmdInfo.productName
745
+
746
+ @property
747
+ def manufacturer(self):
748
+ """Get the connected HMD's manufacturer (`str`).
749
+ """
750
+ return self._hmdInfo.manufacturer
751
+
752
+ @property
753
+ def serialNumber(self):
754
+ """Get the connected HMD's unique serial number (`str`).
755
+
756
+ Use this to identify a particular unit if you own many.
757
+ """
758
+ return self._hmdInfo.serialNumber
759
+
760
+ @property
761
+ def hid(self):
762
+ """USB human interface device (HID) identifiers (`int`, `int`).
763
+
764
+ """
765
+ return self._hmdInfo.hid
766
+
767
+ @property
768
+ def firmwareVersion(self):
769
+ """Get the firmware version of the active HMD (`int`, `int`).
770
+
771
+ """
772
+ return self._hmdInfo.firmwareVersion
773
+
774
+ @property
775
+ def displayResolution(self):
776
+ """Get the HMD's raster display size (`int`, `int`).
777
+
778
+ """
779
+ return self._hmdInfo.resolution
780
+
781
+ @property
782
+ def displayRefreshRate(self):
783
+ """Get the HMD's display refresh rate in Hz (`float`).
784
+
785
+ """
786
+ return self._hmdInfo.refreshRate
787
+
788
+ @property
789
+ def pixelsPerTanAngleAtCenter(self):
790
+ """Horizontal and vertical pixels per tangent angle (=1) at the center
791
+ of the display.
792
+
793
+ This can be used to compute pixels-per-degree for the display.
794
+
795
+ """
796
+ return [libovr.getPixelsPerTanAngleAtCenter(libovr.EYE_LEFT),
797
+ libovr.getPixelsPerTanAngleAtCenter(libovr.EYE_RIGHT)]
798
+
799
+ def tanAngleToNDC(self, horzTan, vertTan):
800
+ """Convert tan angles to the normalized device coordinates for the
801
+ current buffer.
802
+
803
+ Parameters
804
+ ----------
805
+ horzTan : float
806
+ Horizontal tan angle.
807
+ vertTan : float
808
+ Vertical tan angle.
809
+
810
+ Returns
811
+ -------
812
+ tuple of float
813
+ Normalized device coordinates X, Y. Coordinates range between -1.0
814
+ and 1.0. Returns `None` if an invalid buffer is selected.
815
+
816
+ """
817
+ if self.buffer == 'left':
818
+ return libovr.getTanAngleToRenderTargetNDC(
819
+ libovr.EYE_LEFT, (horzTan, vertTan))
820
+ elif self.buffer == 'right':
821
+ return libovr.getTanAngleToRenderTargetNDC(
822
+ libovr.EYE_RIGHT, (horzTan, vertTan))
823
+
824
+ @property
825
+ def trackerCount(self):
826
+ """Number of attached trackers."""
827
+ return libovr.getTrackerCount()
828
+
829
+ def getTrackerInfo(self, trackerIdx):
830
+ """Get tracker information.
831
+
832
+ Parameters
833
+ ----------
834
+ trackerIdx : int
835
+ Tracker index, ranging from 0 to :py:class:`~Rift.trackerCount`.
836
+
837
+ Returns
838
+ -------
839
+ :py:class:`~psychxr.libovr.LibOVRTrackerInfo`
840
+ Object containing tracker information.
841
+
842
+ Raises
843
+ ------
844
+ IndexError
845
+ Raised when `trackerIdx` out of range.
846
+
847
+ """
848
+ if 0 <= trackerIdx < libovr.getTrackerCount():
849
+ return libovr.getTrackerInfo(trackerIdx)
850
+ else:
851
+ raise IndexError(
852
+ "Tracker index '{}' out of range.".format(trackerIdx))
853
+
854
+ @property
855
+ def headLocked(self):
856
+ """`True` if head locking is enabled."""
857
+ return libovr.isHeadLocked()
858
+
859
+ @headLocked.setter
860
+ def headLocked(self, value):
861
+ libovr.setHeadLocked(bool(value))
862
+
863
+ @property
864
+ def trackingOriginType(self):
865
+ """Current tracking origin type (`str`).
866
+
867
+ Valid tracking origin types are 'floor' and 'eye'.
868
+
869
+ """
870
+ originType = libovr.getTrackingOriginType()
871
+
872
+ if originType == libovr.TRACKING_ORIGIN_FLOOR_LEVEL:
873
+ return 'floor'
874
+ elif originType == libovr.TRACKING_ORIGIN_EYE_LEVEL:
875
+ return 'eye'
876
+ else:
877
+ raise ValueError("LibOVR returned unknown tracking origin type.")
878
+
879
+ @trackingOriginType.setter
880
+ def trackingOriginType(self, value):
881
+ libovr.setTrackingOriginType(RIFT_TRACKING_ORIGIN_TYPE[value])
882
+
883
+ def recenterTrackingOrigin(self):
884
+ """Recenter the tracking origin using the current head position."""
885
+ libovr.recenterTrackingOrigin()
886
+
887
+ def specifyTrackingOrigin(self, pose):
888
+ """Specify a tracking origin. If `trackingOriginType='floor'`, this
889
+ function sets the origin of the scene in the ground plane. If
890
+ `trackingOriginType='eye'`, the scene origin is set to the known eye
891
+ height.
892
+
893
+ Parameters
894
+ ----------
895
+ pose : LibOVRPose
896
+ Tracking origin pose.
897
+
898
+ """
899
+ libovr.specifyTrackingOrigin(pose)
900
+
901
+ def specifyTrackingOriginPosOri(self, pos=(0., 0., 0.), ori=(0., 0., 0., 1.)):
902
+ """Specify a tracking origin using a pose and orientation. This is the
903
+ same as `specifyTrackingOrigin`, but accepts a position vector [x, y, z]
904
+ and orientation quaternion [x, y, z, w].
905
+
906
+ Parameters
907
+ ----------
908
+ pos : tuple or list of float, or ndarray
909
+ Position coordinate of origin (x, y, z).
910
+ ori : tuple or list of float, or ndarray
911
+ Quaternion specifying orientation (x, y, z, w).
912
+
913
+ """
914
+ libovr.specifyTrackingOrigin(libovr.LibOVRPose(pos, ori))
915
+
916
+ def clearShouldRecenterFlag(self):
917
+ """Clear the 'shouldRecenter' status flag at the API level."""
918
+ libovr.clearShouldRecenterFlag()
919
+
920
+ def testBoundary(self, deviceType, bounadryType='PlayArea'):
921
+ """Test if tracked devices are colliding with the play area boundary.
922
+
923
+ This returns an object containing test result data.
924
+
925
+ Parameters
926
+ ----------
927
+ deviceType : str, list or tuple
928
+ The device to check for boundary collision. If a list of names is
929
+ provided, they will be combined and all tested.
930
+ boundaryType : str
931
+ Boundary type to test.
932
+
933
+ """
934
+ if isinstance(deviceType, (list, tuple,)):
935
+ deviceBits = 0x00000000
936
+ for device in deviceType:
937
+ deviceBits |= RIFT_TRACKED_DEVICE_TYPES[device]
938
+ elif isinstance(deviceType, str):
939
+ deviceBits = RIFT_TRACKED_DEVICE_TYPES[deviceType]
940
+ elif isinstance(deviceType, int):
941
+ deviceBits = deviceType
942
+ else:
943
+ raise TypeError("Invalid type specified for `deviceType`.")
944
+
945
+ result, testResult = libovr.testBoundary(
946
+ deviceBits, RIFT_BOUNDARY_TYPE[bounadryType])
947
+
948
+ if libovr.failure(result):
949
+ raise RuntimeError('Failed to get boundary test result')
950
+
951
+ return testResult
952
+
953
+ @property
954
+ def sensorSampleTime(self):
955
+ """Sensor sample time (`float`). This value corresponds to the time the
956
+ head (HMD) position was sampled, which is required for computing
957
+ motion-to-photon latency. This does not need to be specified if
958
+ `getTrackingState` was called with `latencyMarker=True`.
959
+ """
960
+ return libovr.getSensorSampleTime()
961
+
962
+ @sensorSampleTime.setter
963
+ def sensorSampleTime(self, value):
964
+ libovr.setSensorSampleTime(value)
965
+
966
+ def getDevicePose(self, deviceName, absTime=None, latencyMarker=False):
967
+ """Get the pose of a tracked device. For head (HMD) and hand poses
968
+ (Touch controllers) it is better to use :py:meth:`getTrackingState`
969
+ instead.
970
+
971
+ Parameters
972
+ ----------
973
+ deviceName : str
974
+ Name of the device. Valid device names are: 'HMD', 'LTouch',
975
+ 'RTouch', 'Touch', 'Object0', 'Object1', 'Object2', and 'Object3'.
976
+ absTime : float, optional
977
+ Absolute time in seconds the device pose refers to. If not
978
+ specified, the predicted time is used.
979
+ latencyMarker : bool
980
+ Insert a marker for motion-to-photon latency calculation. Should
981
+ only be `True` if the HMD pose is being used to compute eye poses.
982
+
983
+ Returns
984
+ -------
985
+ `LibOVRPoseState` or `None`
986
+ Pose state object. `None` if device tracking was lost.
987
+
988
+ """
989
+ if absTime is None:
990
+ absTime = self.getPredictedDisplayTime()
991
+
992
+ deviceStatus, devicePose = libovr.getDevicePoses(
993
+ [RIFT_TRACKED_DEVICE_TYPES[deviceName]], absTime, latencyMarker)
994
+
995
+ # check if tracking was lost
996
+ if deviceStatus == libovr.ERROR_LOST_TRACKING:
997
+ return None
998
+
999
+ return devicePose[0]
1000
+
1001
+ def getTrackingState(self, absTime=None, latencyMarker=True):
1002
+ """Get the tracking state of the head and hands.
1003
+
1004
+ Calling this function retrieves the tracking state of the head (HMD)
1005
+ and hands at `absTime` from the `LibOVR` runtime. The returned object is
1006
+ a :py:class:`~psychxr.libovr.LibOVRTrackingState` instance with poses,
1007
+ motion derivatives (i.e. linear and angular velocity/acceleration), and
1008
+ tracking status flags accessible through its attributes.
1009
+
1010
+ The pose states of the head and hands are available by accessing the
1011
+ `headPose` and `handPoses` attributes, respectively.
1012
+
1013
+ Parameters
1014
+ ----------
1015
+ absTime : float, optional
1016
+ Absolute time the tracking state refers to. If not specified,
1017
+ the predicted display time is used.
1018
+ latencyMarker : bool, optional
1019
+ Set a latency marker upon getting the tracking state. This is used
1020
+ for motion-to-photon calculations.
1021
+
1022
+ Returns
1023
+ -------
1024
+ :py:class:`~psychxr.libovr.LibOVRTrackingState`
1025
+ Tracking state object. For more information about this type see:
1026
+
1027
+ See Also
1028
+ --------
1029
+ getPredictedDisplayTime
1030
+ Time at mid-frame for the current frame index.
1031
+
1032
+ Examples
1033
+ --------
1034
+ Get the tracked head pose and use it to calculate render eye poses::
1035
+
1036
+ # get tracking state at predicted mid-frame time
1037
+ absTime = getPredictedDisplayTime()
1038
+ trackingState = hmd.getTrackingState(absTime)
1039
+
1040
+ # get the head pose from the tracking state
1041
+ headPose = trackingState.headPose.thePose
1042
+ hmd.calcEyePoses(headPose) # compute eye poses
1043
+
1044
+ Get linear/angular velocity and acceleration vectors of the right
1045
+ touch controller::
1046
+
1047
+ # right hand is the second value (index 1) at `handPoses`
1048
+ rightHandState = trackingState.handPoses[1] # is `LibOVRPoseState`
1049
+
1050
+ # access `LibOVRPoseState` fields to get the data
1051
+ linearVel = rightHandState.linearVelocity # m/s
1052
+ angularVel = rightHandState.angularVelocity # rad/s
1053
+ linearAcc = rightHandState.linearAcceleration # m/s^2
1054
+ angularAcc = rightHandState.angularAcceleration # rad/s^2
1055
+
1056
+ # extract components like this if desired
1057
+ vx, vy, vz = linearVel
1058
+ ax, ay, az = angularVel
1059
+
1060
+ Above is useful for physics simulations, where one can compute the
1061
+ magnitude and direction of a force applied to a virtual object.
1062
+
1063
+ It's often the case that object tracking becomes unreliable for some
1064
+ reason, for instance, if it becomes occluded and is no longer visible to
1065
+ the sensors. In such cases, the reported pose state is invalid and may
1066
+ not be useful. You can check if the position and orientation of a
1067
+ tracked object is invalid using flags associated with the tracking
1068
+ state. This shows how to check if head position and orientation tracking
1069
+ was valid when sampled::
1070
+
1071
+ if trackingState.positionValid and trackingState.orientationValid:
1072
+ print('Tracking valid.')
1073
+
1074
+ It's up to the programmer to determine what to do in such cases. Note
1075
+ that tracking may still be valid even if
1076
+
1077
+ Get the calibrated origin used for tracking during the sample period
1078
+ of the tracking state::
1079
+
1080
+ calibratedOrigin = trackingState.calibratedOrigin
1081
+ calibPos, calibOri = calibratedOrigin.posOri
1082
+
1083
+ Time integrate a tracking state. This extrapolates the pose over time
1084
+ given the present computed motion derivatives. The contrived example
1085
+ below shows how to implement head pose forward prediction::
1086
+
1087
+ # get current system time
1088
+ absTime = getTimeInSeconds()
1089
+
1090
+ # get the elapsed time from `absTime` to predicted v-sync time,
1091
+ # again this is an example, you would usually pass predicted time to
1092
+ # `getTrackingState` directly.
1093
+ dt = getPredictedDisplayTime() - absTime
1094
+
1095
+ # get the tracking state for the current time, poses will lag where
1096
+ # they are expected at predicted time by `dt` seconds
1097
+ trackingState = hmd.getTrackingState(absTime)
1098
+
1099
+ # time integrate a pose by `dt`
1100
+ headPoseState = trackingState.headPose
1101
+ headPosePredicted = headPoseState.timeIntegrate(dt)
1102
+
1103
+ # calc eye poses with predicted head pose, this is a custom pose to
1104
+ # head-locking should be enabled!
1105
+ hmd.calcEyePoses(headPosePredicted)
1106
+
1107
+ The resulting head pose is usually very close to what `getTrackingState`
1108
+ would return if the predicted time was used. Simple forward prediction
1109
+ with time integration becomes increasingly unstable as the prediction
1110
+ interval increases. Under normal circumstances, let the runtime handle
1111
+ forward prediction by using the pose states returned at the predicted
1112
+ display time. If you plan on doing your own forward prediction, you need
1113
+ enable head-locking, clamp the prediction interval, and apply some sort
1114
+ of smoothing to keep the image as stable as possible.
1115
+
1116
+ """
1117
+ if absTime is None:
1118
+ absTime = self.getPredictedDisplayTime()
1119
+
1120
+ return libovr.getTrackingState(absTime, latencyMarker)
1121
+
1122
+ def calcEyePoses(self, headPose, originPose=None):
1123
+ """Calculate eye poses for rendering.
1124
+
1125
+ This function calculates the eye poses to define the viewpoint
1126
+ transformation for each eye buffer. Upon starting a new frame, the
1127
+ application loop is halted until this function is called and returns.
1128
+
1129
+ Once this function returns, `setBuffer` may be called and frame
1130
+ rendering can commence. The computed eye pose for the selected buffer is
1131
+ accessible through the :py:attr:`eyeRenderPose` attribute after calling
1132
+ :py:meth:`setBuffer`. If `monoscopic=True`, the eye poses are set to
1133
+ the head pose.
1134
+
1135
+ The source data specified to `headPose` can originate from the tracking
1136
+ state retrieved by calling :py:meth:`getTrackingState`, or from
1137
+ other sources. If a custom head pose is specified (for instance, from a
1138
+ motion tracker), you must ensure `head-locking` is enabled to prevent
1139
+ the ASW feature of the compositor from engaging. Furthermore, you must
1140
+ specify sensor sample time for motion-to-photon calculation derived from
1141
+ the sample time of the custom tracking source.
1142
+
1143
+ Parameters
1144
+ ----------
1145
+ headPose : LibOVRPose
1146
+ Head pose to use.
1147
+ originPose : LibOVRPose, optional
1148
+ Origin of tracking in the VR scene.
1149
+
1150
+ Examples
1151
+ --------
1152
+ Get the tracking state and calculate the eye poses::
1153
+
1154
+ # get tracking state at predicted mid-frame time
1155
+ trackingState = hmd.getTrackingState()
1156
+
1157
+ # get the head pose from the tracking state
1158
+ headPose = trackingState.headPose.thePose
1159
+ hmd.calcEyePoses(headPose) # compute eye poses
1160
+
1161
+ # begin rendering to each eye
1162
+ for eye in ('left', 'right'):
1163
+ hmd.setBuffer(eye)
1164
+ hmd.setRiftView()
1165
+ # draw stuff here ...
1166
+
1167
+ Using a custom head pose (make sure ``headLocked=True`` before doing
1168
+ this)::
1169
+
1170
+ headPose = createPose((0., 1.75, 0.))
1171
+ hmd.calcEyePoses(headPose) # compute eye poses
1172
+
1173
+ """
1174
+ if not self._allowHmdRendering:
1175
+ return
1176
+
1177
+ libovr.calcEyePoses(headPose, originPose)
1178
+ self._headPose = headPose
1179
+
1180
+ # Calculate eye poses, this needs to be called every frame.
1181
+ # apply additional transformations to eye poses
1182
+ if not self._monoscopic:
1183
+ for eye, matrix in enumerate(self._viewMatrix):
1184
+ # compute each eye's transformation modelMatrix from returned poses
1185
+ libovr.getEyeViewMatrix(eye, matrix)
1186
+ else:
1187
+ # view modelMatrix derived from head position when in monoscopic mode
1188
+ self._viewMatrix = headPose.getViewMatrix()
1189
+
1190
+ self._startHmdFrame()
1191
+
1192
+ @property
1193
+ def eyeRenderPose(self):
1194
+ """Computed eye pose for the current buffer. Only valid after calling
1195
+ :func:`calcEyePoses`.
1196
+
1197
+ """
1198
+ if not self._monoscopic:
1199
+ if self.buffer == 'left':
1200
+ return libovr.getEyeRenderPose(libovr.EYE_LEFT)
1201
+ elif self.buffer == 'right':
1202
+ return libovr.getEyeRenderPose(libovr.EYE_RIGHT)
1203
+ else:
1204
+ return self._headPose
1205
+
1206
+ @property
1207
+ def shouldQuit(self):
1208
+ """`True` if the user requested the application should quit through the
1209
+ headset's interface.
1210
+ """
1211
+ return self._sessionStatus.shouldQuit
1212
+
1213
+ @property
1214
+ def isVisible(self):
1215
+ """`True` if the app has focus in the HMD and is visible to the viewer.
1216
+ """
1217
+ return self._sessionStatus.isVisible
1218
+
1219
+ @property
1220
+ def hmdMounted(self):
1221
+ """`True` if the HMD is mounted on the user's head.
1222
+ """
1223
+ return self._sessionStatus.hmdMounted
1224
+
1225
+ @property
1226
+ def hmdPresent(self):
1227
+ """`True` if the HMD is present.
1228
+ """
1229
+ return self._sessionStatus.hmdPresent
1230
+
1231
+ @property
1232
+ def shouldRecenter(self):
1233
+ """`True` if the user requested the origin be re-centered through the
1234
+ headset's interface.
1235
+ """
1236
+ return self._sessionStatus.shouldRecenter
1237
+
1238
+ @property
1239
+ def hasInputFocus(self):
1240
+ """`True` if the application currently has input focus.
1241
+ """
1242
+ return self._sessionStatus.hasInputFocus
1243
+
1244
+ @property
1245
+ def overlayPresent(self):
1246
+ return self._sessionStatus.overlayPresent
1247
+
1248
+ def _setupFrameBuffer(self):
1249
+ """Override the default framebuffer init code in window.Window to use
1250
+ the HMD swap chain. The HMD's swap texture and render buffer are
1251
+ configured here.
1252
+
1253
+ If multisample anti-aliasing (MSAA) is enabled, a secondary render
1254
+ buffer is created. Rendering is diverted to the multi-sample buffer
1255
+ when drawing, which is then resolved into the HMD's swap chain texture
1256
+ prior to committing it to the chain. Consequently, you cannot pass
1257
+ the texture attached to the FBO specified by `frameBuffer` until the
1258
+ MSAA buffer is resolved. Doing so will result in a blank texture.
1259
+
1260
+ """
1261
+ # create a texture swap chain for both eye textures
1262
+ result = libovr.createTextureSwapChainGL(
1263
+ libovr.TEXTURE_SWAP_CHAIN0,
1264
+ self._swapTextureSize[0],
1265
+ self._swapTextureSize[1])
1266
+
1267
+ if libovr.success(result):
1268
+ logging.info(
1269
+ 'Created texture swap chain with dimensions {w}x{h}.'.format(
1270
+ w=self._swapTextureSize[0],
1271
+ h=self._swapTextureSize[1]))
1272
+ else:
1273
+ _, msg = libovr.getLastErrorInfo()
1274
+ raise LibOVRError(msg)
1275
+
1276
+ # assign the same swap chain to both eyes
1277
+ for eye in range(libovr.EYE_COUNT):
1278
+ libovr.setEyeColorTextureSwapChain(eye, libovr.TEXTURE_SWAP_CHAIN0)
1279
+
1280
+ # Use MSAA if more than one sample is specified. If enabled, a render
1281
+ # buffer will be created.
1282
+ #
1283
+ max_samples = GL.GLint()
1284
+ GL.glGetIntegerv(GL.GL_MAX_SAMPLES, max_samples)
1285
+ if isinstance(self._samples, int):
1286
+ if (self._samples & (self._samples - 1)) != 0:
1287
+ # power of two?
1288
+ logging.warning(
1289
+ 'Invalid number of MSAA samples provided, must be '
1290
+ 'power of two. Disabling.')
1291
+ elif 0 > self._samples > max_samples.value:
1292
+ # check if within range
1293
+ logging.warning(
1294
+ 'Invalid number of MSAA samples provided, outside of valid '
1295
+ 'range. Disabling.')
1296
+ elif isinstance(self._samples, str):
1297
+ if self._samples == 'max':
1298
+ self._samples = max_samples.value
1299
+
1300
+ # create an MSAA render buffer if self._samples > 1
1301
+ self.frameBufferMsaa = GL.GLuint() # is zero if not configured
1302
+ if self._samples > 1:
1303
+ logging.info(
1304
+ 'Samples > 1, creating multi-sample framebuffer with dimensions'
1305
+ '{w}x{h}.'.format(w=int(self._swapTextureSize[0]),
1306
+ h=int(self._swapTextureSize[1])))
1307
+
1308
+ # multi-sample FBO and rander buffer
1309
+ GL.glGenFramebuffers(1, ctypes.byref(self.frameBufferMsaa))
1310
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
1311
+
1312
+ # we don't need a multi-sample texture
1313
+ rb_color_msaa_id = GL.GLuint()
1314
+ GL.glGenRenderbuffers(1, ctypes.byref(rb_color_msaa_id))
1315
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, rb_color_msaa_id)
1316
+ GL.glRenderbufferStorageMultisample(
1317
+ GL.GL_RENDERBUFFER,
1318
+ self._samples,
1319
+ GL.GL_RGBA8,
1320
+ int(self._swapTextureSize[0]),
1321
+ int(self._swapTextureSize[1]))
1322
+ GL.glFramebufferRenderbuffer(
1323
+ GL.GL_FRAMEBUFFER,
1324
+ GL.GL_COLOR_ATTACHMENT0,
1325
+ GL.GL_RENDERBUFFER,
1326
+ rb_color_msaa_id)
1327
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
1328
+
1329
+ rb_depth_msaa_id = GL.GLuint()
1330
+ GL.glGenRenderbuffers(1, ctypes.byref(rb_depth_msaa_id))
1331
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, rb_depth_msaa_id)
1332
+ GL.glRenderbufferStorageMultisample(
1333
+ GL.GL_RENDERBUFFER,
1334
+ self._samples,
1335
+ GL.GL_DEPTH24_STENCIL8,
1336
+ int(self._swapTextureSize[0]),
1337
+ int(self._swapTextureSize[1]))
1338
+ GL.glFramebufferRenderbuffer(
1339
+ GL.GL_FRAMEBUFFER,
1340
+ GL.GL_DEPTH_ATTACHMENT,
1341
+ GL.GL_RENDERBUFFER,
1342
+ rb_depth_msaa_id)
1343
+ GL.glFramebufferRenderbuffer(
1344
+ GL.GL_FRAMEBUFFER,
1345
+ GL.GL_STENCIL_ATTACHMENT,
1346
+ GL.GL_RENDERBUFFER,
1347
+ rb_depth_msaa_id)
1348
+
1349
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
1350
+ GL.glClear(GL.GL_STENCIL_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
1351
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1352
+
1353
+ # create a frame buffer object as a render target for the HMD textures
1354
+ self.frameBuffer = GL.GLuint()
1355
+ GL.glGenFramebuffers(1, ctypes.byref(self.frameBuffer))
1356
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
1357
+
1358
+ # initialize the frame texture variable
1359
+ self.frameTexture = 0
1360
+
1361
+ # create depth and stencil render buffers
1362
+ depth_rb_id = GL.GLuint()
1363
+ GL.glGenRenderbuffers(1, ctypes.byref(depth_rb_id))
1364
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, depth_rb_id)
1365
+ GL.glRenderbufferStorage(
1366
+ GL.GL_RENDERBUFFER,
1367
+ GL.GL_DEPTH24_STENCIL8,
1368
+ int(self._swapTextureSize[0]),
1369
+ int(self._swapTextureSize[1]))
1370
+ GL.glFramebufferRenderbuffer(
1371
+ GL.GL_FRAMEBUFFER,
1372
+ GL.GL_DEPTH_ATTACHMENT,
1373
+ GL.GL_RENDERBUFFER,
1374
+ depth_rb_id)
1375
+ GL.glFramebufferRenderbuffer(
1376
+ GL.GL_FRAMEBUFFER,
1377
+ GL.GL_STENCIL_ATTACHMENT,
1378
+ GL.GL_RENDERBUFFER,
1379
+ depth_rb_id)
1380
+ GL.glBindRenderbuffer(GL.GL_RENDERBUFFER, 0)
1381
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1382
+ self._frameStencil = depth_rb_id # should make this the MSAA's?
1383
+
1384
+ GL.glClear(GL.GL_STENCIL_BUFFER_BIT)
1385
+ GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
1386
+
1387
+ # Setup the mirror texture framebuffer. The swap chain is managed
1388
+ # internally by PsychXR.
1389
+ self._mirrorFbo = GL.GLuint()
1390
+ GL.glGenFramebuffers(1, ctypes.byref(self._mirrorFbo))
1391
+
1392
+ if self._mirrorRes is None:
1393
+ self._mirrorRes = self.frameBufferSize
1394
+
1395
+ mirrorW, mirrorH = self._mirrorRes
1396
+ if libovr.success(libovr.createMirrorTexture(
1397
+ mirrorW,
1398
+ mirrorH,
1399
+ mirrorOptions=RIFT_MIRROR_MODES[self._mirrorMode])):
1400
+ logging.info(
1401
+ 'Created mirror texture with dimensions {w} x {h}'.format(
1402
+ w=mirrorW, h=mirrorH))
1403
+ else:
1404
+ _, msg = libovr.getLastErrorInfo()
1405
+ raise LibOVRError(msg)
1406
+
1407
+ GL.glDisable(GL.GL_TEXTURE_2D)
1408
+
1409
+ return True # assume the FBOs are complete for now
1410
+
1411
+ def _resolveMSAA(self):
1412
+ """Resolve multisample anti-aliasing (MSAA). If MSAA is enabled, drawing
1413
+ operations are diverted to a special multisample render buffer. Pixel
1414
+ data must be 'resolved' by blitting it to the swap chain texture. If
1415
+ not, the texture will be blank.
1416
+
1417
+ Notes
1418
+ -----
1419
+ You cannot perform operations on the default FBO (at `frameBuffer`) when
1420
+ MSAA is enabled. Any changes will be over-written when 'flip' is called.
1421
+
1422
+ """
1423
+ # if multi-sampling is off just NOP
1424
+ if self._samples == 1:
1425
+ return
1426
+
1427
+ # bind framebuffer
1428
+ GL.glBindFramebuffer(GL.GL_READ_FRAMEBUFFER, self.frameBufferMsaa)
1429
+ GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, self.frameBuffer)
1430
+
1431
+ # bind the HMD swap texture to the draw buffer
1432
+ GL.glFramebufferTexture2D(
1433
+ GL.GL_DRAW_FRAMEBUFFER,
1434
+ GL.GL_COLOR_ATTACHMENT0,
1435
+ GL.GL_TEXTURE_2D,
1436
+ self.frameTexture,
1437
+ 0)
1438
+
1439
+ # blit the texture
1440
+ fbo_w, fbo_h = self._swapTextureSize
1441
+ self.viewport = self.scissor = (0, 0, fbo_w, fbo_h)
1442
+ GL.glBlitFramebuffer(
1443
+ 0, 0, fbo_w, fbo_h,
1444
+ 0, 0, fbo_w, fbo_h, # flips texture
1445
+ GL.GL_COLOR_BUFFER_BIT,
1446
+ GL.GL_NEAREST)
1447
+
1448
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1449
+
1450
+ def _prepareMonoFrame(self, clear=True):
1451
+ """Prepare a frame for monoscopic rendering. This is called
1452
+ automatically after :func:`_startHmdFrame` if monoscopic rendering is
1453
+ enabled.
1454
+
1455
+ """
1456
+ # bind the framebuffer, if MSAA is enabled binding the texture is
1457
+ # deferred until the MSAA buffer is resolved.
1458
+ if self._samples > 1:
1459
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
1460
+ else:
1461
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
1462
+ GL.glFramebufferTexture2D(
1463
+ GL.GL_FRAMEBUFFER,
1464
+ GL.GL_COLOR_ATTACHMENT0,
1465
+ GL.GL_TEXTURE_2D,
1466
+ self.frameTexture,
1467
+ 0)
1468
+
1469
+ # use the mono viewport
1470
+ self.buffer = 'mono'
1471
+ GL.glEnable(GL.GL_SCISSOR_TEST)
1472
+
1473
+ self.viewport = self.scissor = \
1474
+ libovr.getEyeRenderViewport(libovr.EYE_LEFT) # mono mode
1475
+ GL.glDepthMask(GL.GL_TRUE)
1476
+
1477
+ if clear:
1478
+ self.setColor(self.color, colorSpace=self.colorSpace) # clear the texture to the window color
1479
+ GL.glClear(
1480
+ GL.GL_COLOR_BUFFER_BIT |
1481
+ GL.GL_DEPTH_BUFFER_BIT |
1482
+ GL.GL_STENCIL_BUFFER_BIT
1483
+ )
1484
+
1485
+ # if self.sRGB:
1486
+ # GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
1487
+
1488
+ if self._samples > 1:
1489
+ GL.glEnable(GL.GL_MULTISAMPLE)
1490
+
1491
+ GL.glDisable(GL.GL_TEXTURE_2D)
1492
+ GL.glEnable(GL.GL_BLEND)
1493
+
1494
+ def setBuffer(self, buffer, clear=True):
1495
+ """Set the active draw buffer.
1496
+
1497
+ Warnings
1498
+ --------
1499
+ The window.Window.size property will return the buffer's dimensions in
1500
+ pixels instead of the window's when `setBuffer` is set to 'left' or
1501
+ 'right'.
1502
+
1503
+ Parameters
1504
+ ----------
1505
+ buffer : str
1506
+ View buffer to divert successive drawing operations to, can be
1507
+ either 'left' or 'right'.
1508
+ clear : boolean
1509
+ Clear the color, stencil and depth buffer.
1510
+
1511
+ """
1512
+ # if monoscopic, nop
1513
+ if self._monoscopic:
1514
+ warnings.warn("`setBuffer` called in monoscopic mode.", RuntimeWarning)
1515
+ return
1516
+
1517
+ # check if the buffer name is valid
1518
+ if buffer not in ('left', 'right'):
1519
+ raise RuntimeError("Invalid buffer name specified.")
1520
+
1521
+ # bind the framebuffer, if MSAA is enabled binding the texture is
1522
+ # deferred until the MSAA buffer is resolved.
1523
+ if self._samples > 1:
1524
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBufferMsaa)
1525
+ else:
1526
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self.frameBuffer)
1527
+ GL.glFramebufferTexture2D(
1528
+ GL.GL_FRAMEBUFFER,
1529
+ GL.GL_COLOR_ATTACHMENT0,
1530
+ GL.GL_TEXTURE_2D,
1531
+ self.frameTexture,
1532
+ 0)
1533
+
1534
+ self.buffer = buffer # set buffer string
1535
+ GL.glEnable(GL.GL_SCISSOR_TEST)
1536
+
1537
+ # set the viewport and scissor rect for the buffer
1538
+ if buffer == 'left':
1539
+ self.viewport = self.scissor = libovr.getEyeRenderViewport(
1540
+ libovr.EYE_LEFT)
1541
+ elif buffer == 'right':
1542
+ self.viewport = self.scissor = libovr.getEyeRenderViewport(
1543
+ libovr.EYE_RIGHT)
1544
+
1545
+ if clear:
1546
+ self.setColor(self.color, colorSpace=self.colorSpace) # clear the texture to the window color
1547
+ GL.glClearDepth(1.0)
1548
+ GL.glDepthMask(GL.GL_TRUE)
1549
+ GL.glClear(
1550
+ GL.GL_COLOR_BUFFER_BIT |
1551
+ GL.GL_DEPTH_BUFFER_BIT |
1552
+ GL.GL_STENCIL_BUFFER_BIT)
1553
+
1554
+ # if self.sRGB:
1555
+ # GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
1556
+
1557
+ if self._samples > 1:
1558
+ GL.glEnable(GL.GL_MULTISAMPLE)
1559
+
1560
+ GL.glDisable(GL.GL_TEXTURE_2D)
1561
+ GL.glEnable(GL.GL_BLEND)
1562
+
1563
+ def getPredictedDisplayTime(self):
1564
+ """Get the predicted time the next frame will be displayed on the HMD.
1565
+ The returned time is referenced to the clock `LibOVR` is using.
1566
+
1567
+ Returns
1568
+ -------
1569
+ float
1570
+ Absolute frame mid-point time for the given frame index in seconds.
1571
+
1572
+ """
1573
+ return libovr.getPredictedDisplayTime(self._frameIndex)
1574
+
1575
+ def getTimeInSeconds(self):
1576
+ """Absolute time in seconds. The returned time is referenced to the
1577
+ clock `LibOVR` is using.
1578
+
1579
+ Returns
1580
+ -------
1581
+ float
1582
+ Time in seconds.
1583
+
1584
+ """
1585
+ return libovr.timeInSeconds()
1586
+
1587
+ @property
1588
+ def viewMatrix(self):
1589
+ """The view matrix for the current eye buffer. Only valid after a
1590
+ :py:meth:`calcEyePoses` call. Note that setting `viewMatrix` manually
1591
+ will break visibility culling.
1592
+
1593
+ """
1594
+ if not self._monoscopic:
1595
+ if self.buffer == 'left':
1596
+ return self._viewMatrix[libovr.EYE_LEFT]
1597
+ elif self.buffer == 'right':
1598
+ return self._viewMatrix[libovr.EYE_RIGHT]
1599
+ else:
1600
+ return self._viewMatrix
1601
+
1602
+ @property
1603
+ def nearClip(self):
1604
+ """Distance to the near clipping plane in meters."""
1605
+ return self._nearClip
1606
+
1607
+ @nearClip.setter
1608
+ def nearClip(self, value):
1609
+ self._nearClip = value
1610
+ self._updateProjectionMatrix()
1611
+
1612
+ @property
1613
+ def farClip(self):
1614
+ """Distance to the far clipping plane in meters."""
1615
+ return self._farClip
1616
+
1617
+ @farClip.setter
1618
+ def farClip(self, value):
1619
+ self._farClip = value
1620
+ self._updateProjectionMatrix()
1621
+
1622
+ @property
1623
+ def projectionMatrix(self):
1624
+ """Get the projection matrix for the current eye buffer. Note that
1625
+ setting `projectionMatrix` manually will break visibility culling.
1626
+
1627
+ """
1628
+ if not self._monoscopic:
1629
+ if self.buffer == 'left':
1630
+ return self._projectionMatrix[libovr.EYE_LEFT]
1631
+ elif self.buffer == 'right':
1632
+ return self._projectionMatrix[libovr.EYE_RIGHT]
1633
+ else:
1634
+ return self._projectionMatrix
1635
+
1636
+ @property
1637
+ def isBoundaryVisible(self):
1638
+ """True if the VR boundary is visible.
1639
+ """
1640
+ result, isVisible = libovr.getBoundaryVisible()
1641
+ return bool(isVisible)
1642
+
1643
+ def getBoundaryDimensions(self, boundaryType='PlayArea'):
1644
+ """Get boundary dimensions.
1645
+
1646
+ Parameters
1647
+ ----------
1648
+ boundaryType : str
1649
+ Boundary type, can be 'PlayArea' or 'Outer'.
1650
+
1651
+ Returns
1652
+ -------
1653
+ ndarray
1654
+ Dimensions of the boundary meters [x, y, z].
1655
+
1656
+ """
1657
+ result, dims = libovr.getBoundaryDimensions(
1658
+ RIFT_BOUNDARY_TYPE[boundaryType])
1659
+
1660
+ return dims
1661
+
1662
+ @property
1663
+ def connectedControllers(self):
1664
+ """Connected controller types (`list` of `str`)"""
1665
+ controllers = libovr.getConnectedControllerTypes()
1666
+ ctrlKeys = {val: key for key, val in RIFT_CONTROLLER_TYPES.items()}
1667
+
1668
+ return [ctrlKeys[ctrl] for ctrl in controllers]
1669
+
1670
+ def updateInputState(self, controllers=None):
1671
+ """Update all connected controller states. This updates controller input
1672
+ states for an input device managed by `LibOVR`.
1673
+
1674
+ The polling time for each device is accessible through the
1675
+ `controllerPollTimes` attribute. This attribute returns a dictionary
1676
+ where the polling time from the last `updateInputState` call for a
1677
+ given controller can be retrieved by using the name as a key.
1678
+
1679
+ Parameters
1680
+ ----------
1681
+ controllers : tuple or list, optional
1682
+ List of controllers to poll. If `None`, all available controllers
1683
+ will be polled.
1684
+
1685
+ Examples
1686
+ --------
1687
+ Poll the state of specific controllers by name::
1688
+
1689
+ controllers = ['XBox', 'Touch']
1690
+ updateInputState(controllers)
1691
+
1692
+ """
1693
+ if controllers is None:
1694
+ toPoll = libovr.getConnectedControllerTypes()
1695
+ elif isinstance(controllers, (list, tuple,)):
1696
+ toPoll = [RIFT_CONTROLLER_TYPES[ctrl] for ctrl in controllers]
1697
+ else:
1698
+ raise TypeError("Argument 'controllers' must be iterable type.")
1699
+
1700
+ for i in toPoll:
1701
+ result, t_sec = libovr.updateInputState(i)
1702
+ self.controllerPollTimes[RIFT_CONTROLLER_TYPES[i]] = t_sec
1703
+
1704
+ def _waitToBeginHmdFrame(self):
1705
+ """Wait until the HMD surfaces are available for rendering.
1706
+ """
1707
+ # First time this function is called, make True.
1708
+ if not self._allowHmdRendering:
1709
+ self._allowHmdRendering = True
1710
+
1711
+ # update session status
1712
+ result, status = libovr.getSessionStatus()
1713
+ self._sessionStatus = status
1714
+
1715
+ # get performance stats for the last frame
1716
+ self._updatePerfStats()
1717
+
1718
+ # Wait for the buffer to be freed by the compositor, this is like
1719
+ # waiting for v-sync.
1720
+ libovr.waitToBeginFrame(self._frameIndex)
1721
+
1722
+ # update input states
1723
+ if self.autoUpdateInput:
1724
+ self.updateInputState()
1725
+
1726
+ #if result == ovr.SUCCESS_NOT_VISIBLE:
1727
+ # pass
1728
+ #self.updateInputState() # poll controller states
1729
+
1730
+ # # update the tracking state
1731
+ # if self.autoUpdatePoses:
1732
+ # # get the current frame time
1733
+ # absTime = libovr.getPredictedDisplayTime(self._frameIndex)
1734
+ # # Get the current tracking state structure, estimated poses for the
1735
+ # # head and hands are stored here. The latency marker for computing
1736
+ # # motion-to-photon latency is set when this function is called.
1737
+ # self.calcEyePoses()
1738
+
1739
+ def _startHmdFrame(self):
1740
+ """Prepare to render an HMD frame. This must be called every frame
1741
+ before flipping or setting the view buffer.
1742
+
1743
+ This function will wait until the HMD is ready to begin rendering before
1744
+ continuing. The current frame texture from the swap chain are pulled
1745
+ from the SDK and made available for binding.
1746
+
1747
+ """
1748
+ # begin frame
1749
+ libovr.beginFrame(self._frameIndex)
1750
+ # get the next available buffer texture in the swap chain
1751
+ result, swapChainIdx = libovr.getTextureSwapChainCurrentIndex(
1752
+ libovr.TEXTURE_SWAP_CHAIN0)
1753
+ result, colorTextureId = libovr.getTextureSwapChainBufferGL(
1754
+ libovr.TEXTURE_SWAP_CHAIN0, swapChainIdx)
1755
+ self.frameTexture = colorTextureId
1756
+
1757
+ # If mono mode, we want to configure the render framebuffer at this
1758
+ # point since 'setBuffer' will not be called.
1759
+ if self._monoscopic:
1760
+ self._prepareMonoFrame()
1761
+
1762
+ def _startOfFlip(self):
1763
+ """Custom :py:class:`~Rift._startOfFlip` for HMD rendering. This
1764
+ finalizes the HMD texture before diverting drawing operations back to
1765
+ the on-screen window. This allows :py:class:`~Rift.flip` to swap the
1766
+ on-screen and HMD buffers when called. This function always returns
1767
+ `True`.
1768
+
1769
+ Returns
1770
+ -------
1771
+ True
1772
+
1773
+ """
1774
+ # Switch off multi-sampling
1775
+ GL.glDisable(GL.GL_MULTISAMPLE)
1776
+
1777
+ if self._allowHmdRendering:
1778
+ # resolve MSAA buffers
1779
+ self._resolveMSAA()
1780
+
1781
+ # commit current texture buffer to the swap chain
1782
+ libovr.commitTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
1783
+
1784
+ # Call end_frame and increment the frame index, no more rendering to
1785
+ # HMD's view texture at this point.
1786
+ result, _ = libovr.endFrame(self._frameIndex)
1787
+
1788
+ if libovr.failure(result):
1789
+ if result == libovr.ERROR_DISPLAY_LOST: # display lost!
1790
+ libovr.destroyMirrorTexture()
1791
+ libovr.destroyTextureSwapChain(libovr.TEXTURE_SWAP_CHAIN0)
1792
+ libovr.destroy()
1793
+ #libovr.shutdown() # avoid error
1794
+
1795
+ _, msg = libovr.getLastErrorInfo()
1796
+ raise LibOVRError(msg)
1797
+
1798
+ self._frameIndex += 1 # increment frame index
1799
+
1800
+ # Set to None so the 'size' attribute returns the on-screen window size.
1801
+ self.buffer = None
1802
+
1803
+ # Make sure this is called after flipping, this updates VR information
1804
+ # and diverts rendering to the HMD texture.
1805
+ #self.callOnFlip(self._waitToBeginHmdFrame)
1806
+
1807
+ # Call frame timing routines
1808
+ #self.callOnFlip(self._updatePerformanceStats)
1809
+
1810
+ # This always returns True
1811
+ return True
1812
+
1813
+ def flip(self, clearBuffer=True, drawMirror=True):
1814
+ """Submit view buffer images to the HMD's compositor for display at next
1815
+ V-SYNC and draw the mirror texture to the on-screen window. This must
1816
+ be called every frame.
1817
+
1818
+ Parameters
1819
+ ----------
1820
+ clearBuffer : bool
1821
+ Clear the frame after flipping.
1822
+ drawMirror : bool
1823
+ Draw the HMD mirror texture from the compositor to the window.
1824
+
1825
+ Returns
1826
+ -------
1827
+ float
1828
+ Absolute time in seconds when control was given back to the
1829
+ application. The difference between the current and previous values
1830
+ should be very close to 1 / refreshRate of the HMD.
1831
+
1832
+ Notes
1833
+ -----
1834
+
1835
+ * The HMD compositor and application are asynchronous, therefore there
1836
+ is no guarantee that the timestamp returned by 'flip' corresponds to
1837
+ the exact vertical retrace time of the HMD.
1838
+
1839
+ """
1840
+ # NOTE: Most of this code is shared with the regular Window's flip
1841
+ # function for compatibility. We're only concerned with calling the
1842
+ # _startOfFlip function and drawing the mirror texture to the onscreen
1843
+ # window. Display timing functions are kept in for now, but they are not
1844
+ # active.
1845
+ #
1846
+
1847
+ flipThisFrame = self._startOfFlip()
1848
+ if flipThisFrame:
1849
+ self._prepareFBOrender()
1850
+ # need blit the framebuffer object to the actual back buffer
1851
+ result, mirrorTexId = libovr.getMirrorTexture()
1852
+ if libovr.failure(result):
1853
+ _, msg = libovr.getLastErrorInfo()
1854
+ raise LibOVRError(msg)
1855
+
1856
+ # unbind the framebuffer as the render target
1857
+ GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0)
1858
+ GL.glDisable(GL.GL_BLEND)
1859
+ stencilOn = GL.glIsEnabled(GL.GL_STENCIL_TEST)
1860
+ GL.glDisable(GL.GL_STENCIL_TEST)
1861
+
1862
+ win_w, win_h = self.frameBufferSize
1863
+ self.viewport = self.scissor = (0, 0, win_w, win_h)
1864
+
1865
+ # draw the mirror texture, if not anything drawn to the backbuffer
1866
+ # will be displayed instead
1867
+ if drawMirror:
1868
+ # blit mirror texture
1869
+ GL.glBindFramebuffer(GL.GL_READ_FRAMEBUFFER, self._mirrorFbo)
1870
+ GL.glBindFramebuffer(GL.GL_DRAW_FRAMEBUFFER, 0)
1871
+
1872
+ GL.glEnable(GL.GL_FRAMEBUFFER_SRGB)
1873
+ # bind the rift's texture to the framebuffer
1874
+ GL.glFramebufferTexture2D(
1875
+ GL.GL_READ_FRAMEBUFFER,
1876
+ GL.GL_COLOR_ATTACHMENT0,
1877
+ GL.GL_TEXTURE_2D, mirrorTexId, 0)
1878
+
1879
+ win_w, win_h = self.frameBufferSize
1880
+
1881
+ tex_w, tex_h = self._mirrorRes
1882
+ self.viewport = self.scissor = (0, 0, win_w, win_h)
1883
+ GL.glClearColor(0.0, 0.0, 0.0, 1.0)
1884
+ GL.glClear(GL.GL_COLOR_BUFFER_BIT)
1885
+ GL.glBlitFramebuffer(0, 0, tex_w, tex_h,
1886
+ 0, win_h, win_w, 0, # flips texture
1887
+ GL.GL_COLOR_BUFFER_BIT,
1888
+ GL.GL_LINEAR)
1889
+
1890
+ GL.glDisable(GL.GL_FRAMEBUFFER_SRGB)
1891
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1892
+
1893
+ self._finishFBOrender()
1894
+
1895
+ # call this before flip() whether FBO was used or not
1896
+ self._afterFBOrender()
1897
+
1898
+ # flip the mirror window
1899
+ self.backend.swapBuffers(flipThisFrame)
1900
+
1901
+ if flipThisFrame:
1902
+ # set rendering back to the framebuffer object
1903
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0)
1904
+ #GL.glReadBuffer(GL.GL_BACK)
1905
+ #GL.glDrawBuffer(GL.GL_BACK)
1906
+ GL.glClearColor(0.0, 0.0, 0.0, 1.0)
1907
+ GL.glClear(GL.GL_COLOR_BUFFER_BIT)
1908
+ # set to no active rendering texture
1909
+ GL.glActiveTexture(GL.GL_TEXTURE0)
1910
+ GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
1911
+ if stencilOn:
1912
+ GL.glEnable(GL.GL_STENCIL_TEST)
1913
+
1914
+ # reset returned buffer for next frame
1915
+ self._endOfFlip(clearBuffer)
1916
+
1917
+ # wait until surfaces are available for drawing
1918
+ self._waitToBeginHmdFrame()
1919
+
1920
+ # get timestamp at the point control is handed back to the application
1921
+ now = logging.defaultClock.getTime()
1922
+
1923
+ # run other functions immediately after flip completes
1924
+ for callEntry in self._toCall:
1925
+ callEntry['function'](*callEntry['args'], **callEntry['kwargs'])
1926
+ del self._toCall[:]
1927
+
1928
+ # do bookkeeping
1929
+ if self.recordFrameIntervals:
1930
+ self.frames += 1
1931
+ deltaT = now - self.lastFrameT
1932
+ self.lastFrameT = now
1933
+ if self.recordFrameIntervalsJustTurnedOn: # don't do anything
1934
+ self.recordFrameIntervalsJustTurnedOn = False
1935
+ else: # past the first frame since turned on
1936
+ self.frameIntervals.append(deltaT)
1937
+ if deltaT > self.refreshThreshold:
1938
+ self.nDroppedFrames += 1
1939
+ if self.nDroppedFrames < reportNDroppedFrames:
1940
+ txt = 't of last frame was %.2fms (=1/%i)'
1941
+ msg = txt % (deltaT * 1000, 1 / deltaT)
1942
+ logging.warning(msg, t=now)
1943
+ elif self.nDroppedFrames == reportNDroppedFrames:
1944
+ logging.warning("Multiple dropped frames have "
1945
+ "occurred - I'll stop bothering you "
1946
+ "about them!")
1947
+
1948
+ # log events
1949
+ for logEntry in self._toLog:
1950
+ # {'msg':msg, 'level':level, 'obj':copy.copy(obj)}
1951
+ logging.log(msg=logEntry['msg'],
1952
+ level=logEntry['level'],
1953
+ t=now,
1954
+ obj=logEntry['obj'])
1955
+ del self._toLog[:]
1956
+
1957
+ # keep the system awake (prevent screen-saver or sleep)
1958
+ platform_specific.sendStayAwake()
1959
+
1960
+ return now
1961
+
1962
+ def multiplyViewMatrixGL(self):
1963
+ """Multiply the local eye pose transformation modelMatrix obtained from the
1964
+ SDK using ``glMultMatrixf``. The modelMatrix used depends on the current eye
1965
+ buffer set by :func:`setBuffer`.
1966
+
1967
+ Returns
1968
+ -------
1969
+ None
1970
+
1971
+ """
1972
+ if not self._legacyOpenGL:
1973
+ return
1974
+
1975
+ if not self._monoscopic:
1976
+ if self.buffer == 'left':
1977
+ GL.glMultTransposeMatrixf(
1978
+ self._viewMatrix[0].flatten().ctypes.data_as(
1979
+ ctypes.POINTER(ctypes.c_float)))
1980
+ elif self.buffer == 'right':
1981
+ GL.glMultTransposeMatrixf(
1982
+ self._viewMatrix[1].flatten().ctypes.data_as(
1983
+ ctypes.POINTER(ctypes.c_float)))
1984
+ else:
1985
+ GL.glMultTransposeMatrixf(self._viewMatrix.ctypes.data_as(
1986
+ ctypes.POINTER(ctypes.c_float)))
1987
+
1988
+ def multiplyProjectionMatrixGL(self):
1989
+ """Multiply the current projection modelMatrix obtained from the SDK
1990
+ using ``glMultMatrixf``. The projection matrix used depends on the
1991
+ current eye buffer set by :func:`setBuffer`.
1992
+
1993
+ """
1994
+ if not self._legacyOpenGL:
1995
+ return
1996
+
1997
+ if not self._monoscopic:
1998
+ if self.buffer == 'left':
1999
+ GL.glMultTransposeMatrixf(
2000
+ self._projectionMatrix[0].flatten().ctypes.data_as(
2001
+ ctypes.POINTER(ctypes.c_float)))
2002
+ elif self.buffer == 'right':
2003
+ GL.glMultTransposeMatrixf(
2004
+ self._projectionMatrix[1].flatten().ctypes.data_as(
2005
+ ctypes.POINTER(ctypes.c_float)))
2006
+ else:
2007
+ GL.glMultTransposeMatrixf(
2008
+ self._projectionMatrix.flatten().ctypes.data_as(
2009
+ ctypes.POINTER(ctypes.c_float)))
2010
+
2011
+ def setRiftView(self, clearDepth=True):
2012
+ """Set head-mounted display view. Gets the projection and view matrices
2013
+ from the HMD and applies them.
2014
+
2015
+ Note: This only has an effect if using Rift in legacy immediate mode
2016
+ OpenGL.
2017
+
2018
+ Parameters
2019
+ ----------
2020
+ clearDepth : bool
2021
+ Clear the depth buffer prior after configuring the view parameters.
2022
+
2023
+ """
2024
+ if self._legacyOpenGL:
2025
+ GL.glMatrixMode(GL.GL_PROJECTION)
2026
+ GL.glLoadIdentity()
2027
+ self.multiplyProjectionMatrixGL()
2028
+
2029
+ GL.glMatrixMode(GL.GL_MODELVIEW)
2030
+ GL.glLoadIdentity()
2031
+ self.multiplyViewMatrixGL()
2032
+
2033
+ if clearDepth:
2034
+ GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
2035
+
2036
+ def setDefaultView(self, clearDepth=True):
2037
+ """Return to default projection. Call this before drawing PsychoPy's
2038
+ 2D stimuli after a stereo projection change.
2039
+
2040
+ Note: This only has an effect if using Rift in legacy immediate mode
2041
+ OpenGL.
2042
+
2043
+ Parameters
2044
+ ----------
2045
+ clearDepth : bool
2046
+ Clear the depth buffer prior after configuring the view parameters.
2047
+
2048
+ """
2049
+ if self._legacyOpenGL:
2050
+ GL.glMatrixMode(GL.GL_PROJECTION)
2051
+ GL.glLoadIdentity()
2052
+ GL.glOrtho(-1, 1, -1, 1, -1, 1)
2053
+ GL.glMatrixMode(GL.GL_MODELVIEW)
2054
+ GL.glLoadIdentity()
2055
+
2056
+ if clearDepth:
2057
+ GL.glClear(GL.GL_DEPTH_BUFFER_BIT)
2058
+
2059
+ def _updateProjectionMatrix(self):
2060
+ """Update or re-calculate projection matrices based on the current
2061
+ render descriptor configuration.
2062
+ """
2063
+ if not self._monoscopic:
2064
+ libovr.getEyeProjectionMatrix(
2065
+ libovr.EYE_LEFT,
2066
+ self._projectionMatrix[0])
2067
+ libovr.getEyeProjectionMatrix(
2068
+ libovr.EYE_RIGHT,
2069
+ self._projectionMatrix[1])
2070
+ else:
2071
+ libovr.getEyeProjectionMatrix(
2072
+ libovr.EYE_LEFT,
2073
+ self._projectionMatrix)
2074
+
2075
+ def getMovieFrame(self, buffer='mirror'):
2076
+ """Capture the current HMD frame as an image.
2077
+
2078
+ Saves to stack for :py:attr:`~Window.saveMovieFrames()`. As of v1.81.00
2079
+ this also returns the frame as a PIL image.
2080
+
2081
+ This can be done at any time (usually after a :py:attr:`~Window.flip()`
2082
+ command).
2083
+
2084
+ Frames are stored in memory until a :py:attr:`~Window.saveMovieFrames()`
2085
+ command is issued. You can issue :py:attr:`~Window.getMovieFrame()` as
2086
+ often as you like and then save them all in one go when finished.
2087
+
2088
+ For HMD frames, you should call `getMovieFrame` after calling `flip` to
2089
+ ensure that the mirror texture saved reflects what is presently being
2090
+ shown on the HMD. Note, that this function is somewhat slow and may
2091
+ impact performance. Only call this function when you're not collecting
2092
+ experimental data.
2093
+
2094
+ Parameters
2095
+ ----------
2096
+ buffer : str, optional
2097
+ Buffer to capture. For the HMD, only 'mirror' is available at this
2098
+ time.
2099
+
2100
+ Returns
2101
+ -------
2102
+ Image
2103
+ Buffer pixel contents as a PIL/Pillow image object.
2104
+
2105
+ """
2106
+ im = self._getFrame(buffer=buffer)
2107
+ self.movieFrames.append(im)
2108
+ return im
2109
+
2110
+ def _getFrame(self, rect=None, buffer='mirror'):
2111
+ """Return the current HMD view as an image.
2112
+
2113
+ Parameters
2114
+ ----------
2115
+ rect : array_like
2116
+ Rectangle [x, y, w, h] defining a sub-region of the frame to
2117
+ capture. This should remain `None` for HMD frames.
2118
+ buffer : str, optional
2119
+ Buffer to capture. For the HMD, only 'mirror' is available at this
2120
+ time.
2121
+
2122
+ Returns
2123
+ -------
2124
+ Image
2125
+ Buffer pixel contents as a PIL/Pillow image object.
2126
+
2127
+ """
2128
+ if buffer == 'mirror':
2129
+ result, mirrorTexId = libovr.getMirrorTexture()
2130
+ if libovr.failure(result):
2131
+ _, msg = libovr.getLastErrorInfo()
2132
+ raise LibOVRError(msg)
2133
+
2134
+ GL.glBindFramebuffer(GL.GL_FRAMEBUFFER, self._mirrorFbo)
2135
+
2136
+ # GL.glEnable(GL.GL_FRAMEBUFFER_SRGB)
2137
+ # bind the rift's texture to the framebuffer
2138
+ GL.glFramebufferTexture2D(
2139
+ GL.GL_READ_FRAMEBUFFER,
2140
+ GL.GL_COLOR_ATTACHMENT0,
2141
+ GL.GL_TEXTURE_2D, mirrorTexId, 0)
2142
+ else:
2143
+ raise ValueError("Requested read from buffer '{}' but should be "
2144
+ "'mirror'.".format(buffer))
2145
+
2146
+ if rect:
2147
+ x, y = self._mirrorRes
2148
+
2149
+ # box corners in pix
2150
+ left = int((rect[0] / 2. + 0.5) * x)
2151
+ top = int((rect[1] / -2. + 0.5) * y)
2152
+ w = int((rect[2] / 2. + 0.5) * x) - left
2153
+ h = int((rect[3] / -2. + 0.5) * y) - top
2154
+ else:
2155
+ left = top = 0
2156
+ w, h = self.size # of window, not image
2157
+
2158
+ # http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml
2159
+ bufferDat = (GL.GLubyte * (4 * w * h))()
2160
+ GL.glReadPixels(left, top, w, h,
2161
+ GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, bufferDat)
2162
+ try:
2163
+ im = Image.fromstring(mode='RGBA', size=(w, h),
2164
+ data=bufferDat)
2165
+ except Exception:
2166
+ im = Image.frombytes(mode='RGBA', size=(w, h),
2167
+ data=bufferDat)
2168
+
2169
+ im = im.transpose(Image.FLIP_TOP_BOTTOM)
2170
+ im = im.convert('RGB')
2171
+
2172
+ if self.buffer is not None:
2173
+ self.setBuffer(self.buffer, clear=False) # go back to previous buffer
2174
+ else:
2175
+ GL.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, self.frameBuffer)
2176
+
2177
+ return im
2178
+
2179
+ def getThumbstickValues(self, controller='Xbox', deadzone=False):
2180
+ """Get controller thumbstick values.
2181
+
2182
+ Parameters
2183
+ ----------
2184
+ controller : str
2185
+ Name of the controller to get thumbstick values. Possible values for
2186
+ `controller` are 'Xbox', 'Touch', 'RTouch', 'LTouch', 'Object0',
2187
+ 'Object1', 'Object2', and 'Object3'; the only devices with
2188
+ thumbsticks the SDK manages. For additional controllers, use
2189
+ PsychPy's built-in event or hardware support.
2190
+ deadzone : bool
2191
+ Apply the deadzone to thumbstick values. This pre-filters stick
2192
+ input to apply a dead-zone where 0.0 will be returned if the sticks
2193
+ return a displacement within -0.2746 to 0.2746.
2194
+
2195
+ Returns
2196
+ -------
2197
+ tuple
2198
+ Left and right, X and Y thumbstick values. Axis displacements are
2199
+ represented in each tuple by floats ranging from -1.0 (full
2200
+ left/down) to 1.0 (full right/up). The returned values reflect the
2201
+ controller state since the last :py:class:`~Rift.updateInputState`
2202
+ or :py:class:`~Rift.flip` call.
2203
+
2204
+ """
2205
+ return libovr.getThumbstickValues(RIFT_CONTROLLER_TYPES[controller],
2206
+ deadzone)
2207
+
2208
+ def getIndexTriggerValues(self, controller='Xbox', deadzone=False):
2209
+ """Get the values of the index triggers.
2210
+
2211
+ Parameters
2212
+ ----------
2213
+ controller : str
2214
+ Name of the controller to get index trigger values. Possible values
2215
+ for `controller` are 'Xbox', 'Touch', 'RTouch', 'LTouch', 'Object0',
2216
+ 'Object1', 'Object2', and 'Object3'; the only devices with index
2217
+ triggers the SDK manages. For additional controllers, use PsychPy's
2218
+ built-in event or hardware support.
2219
+ deadzone : bool
2220
+ Apply the deadzone to index trigger values. This pre-filters stick
2221
+ input to apply a dead-zone where 0.0 will be returned if the trigger
2222
+ returns a displacement within 0.2746.
2223
+
2224
+ Returns
2225
+ -------
2226
+ tuple of float
2227
+ Left and right index trigger values. Displacements are represented
2228
+ as `tuple` of two float representing the left anr right displacement
2229
+ values, which range from 0.0 to 1.0. The returned values reflect the
2230
+ controller state since the last :py:class:`~Rift.updateInputState`
2231
+ or :py:class:`~Rift.flip` call.
2232
+
2233
+ """
2234
+ return libovr.getIndexTriggerValues(RIFT_CONTROLLER_TYPES[controller],
2235
+ deadzone)
2236
+
2237
+ def getHandTriggerValues(self, controller='Touch', deadzone=False):
2238
+ """Get the values of the hand triggers.
2239
+
2240
+ Parameters
2241
+ ----------
2242
+ controller : str
2243
+ Name of the controller to get hand trigger values. Possible values
2244
+ for `controller` are 'Touch', 'RTouch', 'LTouch', 'Object0',
2245
+ 'Object1', 'Object2', and 'Object3'; the only devices with hand
2246
+ triggers the SDK manages. For additional controllers, use PsychPy's
2247
+ built-in event or hardware support.
2248
+ deadzone : bool
2249
+ Apply the deadzone to hand trigger values. This pre-filters stick
2250
+ input to apply a dead-zone where 0.0 will be returned if the trigger
2251
+ returns a displacement within 0.2746.
2252
+
2253
+ Returns
2254
+ -------
2255
+ tuple
2256
+ Left and right hand trigger values. Displacements are represented
2257
+ as `tuple` of two float representing the left anr right displacement
2258
+ values, which range from 0.0 to 1.0. The returned values reflect the
2259
+ controller state since the last :py:class:`~Rift.updateInputState`
2260
+ or :py:class:`~Rift.flip` call.
2261
+
2262
+ """
2263
+ return libovr.getHandTriggerValues(RIFT_CONTROLLER_TYPES[controller],
2264
+ deadzone)
2265
+
2266
+ def getButtons(self, buttons, controller='Xbox', testState='continuous'):
2267
+ """Get button states from a controller.
2268
+
2269
+ Returns `True` if any names specified to `buttons` reflect `testState`
2270
+ since the last :py:class:`~Rift.updateInputState` or
2271
+ :py:class:`~Rift.flip` call. If multiple button names are specified as a
2272
+ `list` or `tuple` to `buttons`, multiple button states are tested,
2273
+ returning `True` if all the buttons presently satisfy the `testState`.
2274
+ Note that not all controllers available share the same buttons. If a
2275
+ button is not available, this function will always return `False`.
2276
+
2277
+ Parameters
2278
+ ----------
2279
+ buttons : `list` of `str` or `str`
2280
+ Buttons to test. Valid `buttons` names are 'A', 'B', 'RThumb',
2281
+ 'RShoulder' 'X', 'Y', 'LThumb', 'LShoulder', 'Up', 'Down', 'Left',
2282
+ 'Right', 'Enter', 'Back', 'VolUp', 'VolDown', and 'Home'. Names can
2283
+ be passed as a `list` to test multiple button states.
2284
+ controller : `str`
2285
+ Controller name.
2286
+ testState : `str`
2287
+ State to test. Valid values are:
2288
+
2289
+ * **continuous** - Button is presently being held down.
2290
+ * **rising** or **pressed** - Button has been *pressed* since
2291
+ the last update.
2292
+ * **falling** or **released** - Button has been *released* since
2293
+ the last update.
2294
+
2295
+ Returns
2296
+ -------
2297
+ tuple of bool, float
2298
+ Button state and timestamp in seconds the controller was polled.
2299
+
2300
+ Examples
2301
+ --------
2302
+
2303
+ Check if the 'Enter' button on the Oculus remote was released::
2304
+
2305
+ isPressed, tsec = hmd.getButtons(['Enter'], 'Remote', 'falling')
2306
+
2307
+ Check if the 'A' button was pressed on the touch controller::
2308
+
2309
+ isPressed, tsec = hmd.getButtons(['A'], 'Touch', 'pressed')
2310
+
2311
+ """
2312
+ if isinstance(buttons, str): # single value
2313
+ return libovr.getButton(
2314
+ RIFT_CONTROLLER_TYPES[controller],
2315
+ RIFT_BUTTON_TYPES[buttons],
2316
+ testState)
2317
+ elif isinstance(buttons, (list, tuple,)): # combine buttons
2318
+ buttonBits = 0x00000000
2319
+ for buttonName in buttons:
2320
+ buttonBits |= RIFT_BUTTON_TYPES[buttonName]
2321
+ return libovr.getButton(
2322
+ RIFT_CONTROLLER_TYPES[controller],
2323
+ buttonBits,
2324
+ testState)
2325
+ elif isinstance(buttons, int): # using enums directly
2326
+ return libovr.getButton(
2327
+ RIFT_CONTROLLER_TYPES[controller],
2328
+ buttons,
2329
+ testState)
2330
+ else:
2331
+ raise ValueError("Invalid 'buttons' specified.")
2332
+
2333
+ def getTouches(self, touches, controller='Touch', testState='continuous'):
2334
+ """Get touch states from a controller.
2335
+
2336
+ Returns `True` if any names specified to `touches` reflect `testState`
2337
+ since the last :py:class:`~Rift.updateInputState` or
2338
+ :py:class:`~Rift.flip` call. If multiple button names are specified as a
2339
+ `list` or `tuple` to `touches`, multiple button states are tested,
2340
+ returning `True` if all the touches presently satisfy the `testState`.
2341
+ Note that not all controllers available support touches. If a touch is
2342
+ not supported or available, this function will always return `False`.
2343
+
2344
+ Special states can be used for basic gesture recognition, such as
2345
+ 'LThumbUp', 'RThumbUp', 'LIndexPointing', and 'RIndexPointing'.
2346
+
2347
+ Parameters
2348
+ ----------
2349
+ touches : `list` of `str` or `str`
2350
+ Buttons to test. Valid `touches` names are 'A', 'B', 'RThumb',
2351
+ 'RThumbRest' 'RThumbUp', 'RIndexPointing', 'LThumb', 'LThumbRest',
2352
+ 'LThumbUp', 'LIndexPointing', 'X', and 'Y'. Names can be passed as a
2353
+ `list` to test multiple button states.
2354
+ controller : `str`
2355
+ Controller name.
2356
+ testState : `str`
2357
+ State to test. Valid values are:
2358
+
2359
+ * **continuous** - User is touching something on the controller.
2360
+ * **rising** or **pressed** - User began touching something since
2361
+ the last call to `updateInputState`.
2362
+ * **falling** or **released** - User stopped touching something
2363
+ since the last call to `updateInputState`.
2364
+
2365
+ Returns
2366
+ -------
2367
+ tuple of bool, float
2368
+ Touch state and timestamp in seconds the controller was polled.
2369
+
2370
+ Examples
2371
+ --------
2372
+
2373
+ Check if the 'Enter' button on the Oculus remote was released::
2374
+
2375
+ isPressed, tsec = hmd.getButtons(['Enter'], 'Remote', 'falling')
2376
+
2377
+ Check if the 'A' button was pressed on the touch controller::
2378
+
2379
+ isPressed, tsec = hmd.getButtons(['A'], 'Touch', 'pressed')
2380
+
2381
+ """
2382
+ if isinstance(touches, str): # single value
2383
+ return libovr.getTouch(
2384
+ RIFT_CONTROLLER_TYPES[controller],
2385
+ RIFT_TOUCH_TYPES[touches],
2386
+ testState)
2387
+ elif isinstance(touches, (list, tuple,)): # combine buttons
2388
+ touchBits = 0x00000000
2389
+ for buttonName in touches:
2390
+ touchBits |= RIFT_TOUCH_TYPES[buttonName]
2391
+ return libovr.getTouch(
2392
+ RIFT_CONTROLLER_TYPES[controller],
2393
+ touchBits,
2394
+ testState)
2395
+ elif isinstance(touches, int): # using enums directly
2396
+ return libovr.getTouch(
2397
+ RIFT_CONTROLLER_TYPES[controller],
2398
+ touches,
2399
+ testState)
2400
+ else:
2401
+ raise ValueError("Invalid 'touches' specified.")
2402
+
2403
+ def startHaptics(self, controller, frequency='low', amplitude=1.0):
2404
+ """Start haptic feedback (vibration).
2405
+
2406
+ Vibration is constant at fixed frequency and amplitude. Vibration lasts
2407
+ 2.5 seconds, so this function needs to be called more often than that
2408
+ for sustained vibration. Only controllers which support vibration can be
2409
+ used here.
2410
+
2411
+ There are only two frequencies permitted 'high' and 'low', however,
2412
+ amplitude can vary from 0.0 to 1.0. Specifying `frequency`='off' stops
2413
+ vibration if in progress.
2414
+
2415
+ Parameters
2416
+ ----------
2417
+ controller : str
2418
+ Name of the controller to vibrate.
2419
+ frequency : str
2420
+ Vibration frequency. Valid values are: 'off', 'low', or 'high'.
2421
+ amplitude : float
2422
+ Vibration amplitude in the range of [0.0 and 1.0]. Values outside
2423
+ this range are clamped.
2424
+
2425
+ """
2426
+ libovr.setControllerVibration(
2427
+ RIFT_CONTROLLER_TYPES[controller],
2428
+ frequency,
2429
+ amplitude)
2430
+
2431
+ def stopHaptics(self, controller):
2432
+ """Stop haptic feedback.
2433
+
2434
+ Convenience function to stop controller vibration initiated by the last
2435
+ :py:class:`~Rift.vibrateController` call. This is the same as calling
2436
+ ``vibrateController(controller, frequency='off')``.
2437
+
2438
+ Parameters
2439
+ ----------
2440
+ controller : str
2441
+ Name of the controller to stop vibrating.
2442
+
2443
+ """
2444
+ libovr.setControllerVibration(
2445
+ RIFT_CONTROLLER_TYPES[controller], 'off', 0.0)
2446
+
2447
+ @staticmethod
2448
+ def createHapticsBuffer(samples):
2449
+ """Create a new haptics buffer.
2450
+
2451
+ A haptics buffer is object which stores vibration amplitude samples for
2452
+ playback through the Touch controllers. To play a haptics buffer, pass
2453
+ it to :py:meth:`submitHapticsBuffer`.
2454
+
2455
+ Parameters
2456
+ ----------
2457
+ samples : array_like
2458
+ 1-D array of amplitude samples, ranging from 0 to 1. Values outside
2459
+ of this range will be clipped. The buffer must not exceed
2460
+ `HAPTICS_BUFFER_SAMPLES_MAX` samples, any additional samples will be
2461
+ dropped.
2462
+
2463
+ Returns
2464
+ -------
2465
+ LibOVRHapticsBuffer
2466
+ Haptics buffer object.
2467
+
2468
+ Notes
2469
+ -----
2470
+ Methods `startHaptics` and `stopHaptics` cannot be used interchangeably
2471
+ with this function.
2472
+
2473
+ Examples
2474
+ --------
2475
+ Create a haptics buffer where vibration amplitude ramps down over the
2476
+ course of playback::
2477
+
2478
+ samples = np.linspace(
2479
+ 1.0, 0.0, num=HAPTICS_BUFFER_SAMPLES_MAX-1, dtype=np.float32)
2480
+ hbuff = Rift.createHapticsBuffer(samples)
2481
+
2482
+ # vibrate right Touch controller
2483
+ hmd.submitControllerVibration(CONTROLLER_TYPE_RTOUCH, hbuff)
2484
+
2485
+ """
2486
+ if len(samples) > libovr.HAPTICS_BUFFER_SAMPLES_MAX:
2487
+ samples = samples[:libovr.HAPTICS_BUFFER_SAMPLES_MAX]
2488
+
2489
+ return libovr.LibOVRHapticsBuffer(samples)
2490
+
2491
+ def submitControllerVibration(self, controller, hapticsBuffer):
2492
+ """Submit a haptics buffer to begin controller vibration.
2493
+
2494
+ Parameters
2495
+ ----------
2496
+ controller : str
2497
+ Name of controller to vibrate.
2498
+ hapticsBuffer : LibOVRHapticsBuffer
2499
+ Haptics buffer to playback.
2500
+
2501
+ Notes
2502
+ -----
2503
+ Methods `startHaptics` and `stopHaptics` cannot be used interchangeably
2504
+ with this function.
2505
+
2506
+ """
2507
+ libovr.submitControllerVibration(
2508
+ RIFT_CONTROLLER_TYPES[controller], hapticsBuffer)
2509
+
2510
+ @staticmethod
2511
+ def createPose(pos=(0., 0., 0.), ori=(0., 0., 0., 1.)):
2512
+ """Create a new Rift pose object
2513
+ (:py:class:`~psychxr.libovr.LibOVRPose`).
2514
+
2515
+ :py:class:`~psychxr.libovr.LibOVRPose` is used to represent a rigid body
2516
+ pose mainly for use with the PsychXR's LibOVR module. There are several
2517
+ methods associated with the object to manipulate the pose.
2518
+
2519
+ This function exposes the :py:class:`~psychxr.libovr.LibOVRPose` class
2520
+ so you don't need to access it by importing `psychxr`.
2521
+
2522
+ Parameters
2523
+ ----------
2524
+ pos : tuple, list, or ndarray of float
2525
+ Position vector/coordinate (x, y, z).
2526
+ ori : tuple, list, or ndarray of float
2527
+ Orientation quaternion (x, y, z, w).
2528
+
2529
+ Returns
2530
+ -------
2531
+ :py:class:`~psychxr.libovr.LibOVRPose`
2532
+ Object representing a rigid body pose for use with LibOVR.
2533
+
2534
+ """
2535
+ return libovr.LibOVRPose(pos, ori)
2536
+
2537
+ @staticmethod
2538
+ def createBoundingBox(extents=None):
2539
+ """Create a new bounding box object
2540
+ (:py:class:`~psychxr.libovr.LibOVRBounds`).
2541
+
2542
+ :py:class:`~psychxr.libovr.LibOVRBounds` represents an axis-aligned
2543
+ bounding box with dimensions defined by `extents`. Bounding boxes are
2544
+ primarily used for visibility testing and culling by `PsychXR`. The
2545
+ dimensions of the bounding box can be specified explicitly, or fitted
2546
+ to meshes by passing vertices to the
2547
+ :py:meth:`~psychxr.libovr.LibOVRBounds.fit` method after initialization.
2548
+
2549
+ This function exposes the :py:class:`~psychxr.libovr.LibOVRBounds` class
2550
+ so you don't need to access it by importing `psychxr`.
2551
+
2552
+ Parameters
2553
+ ----------
2554
+ extents : array_like or None
2555
+ Extents of the bounding box as (`mins`, `maxs`). Where `mins`
2556
+ (x, y, z) is the minimum and `maxs` (x, y, z) is the maximum extents
2557
+ of the bounding box in world units. If `None` is specified, the
2558
+ returned bounding box will be invalid. The bounding box can be later
2559
+ constructed using the :py:meth:`~psychxr.libovr.LibOVRBounds.fit`
2560
+ method or the :py:attr:`~psychxr.libovr.LibOVRBounds.extents`
2561
+ attribute.
2562
+
2563
+ Returns
2564
+ -------
2565
+ `~psychxr.libovr.LibOVRBounds`
2566
+ Object representing a bounding box.
2567
+
2568
+ Examples
2569
+ --------
2570
+ Add a bounding box to a pose::
2571
+
2572
+ # create a 1 meter cube bounding box centered with the pose
2573
+ bbox = Rift.createBoundingBox(((-.5, -.5, -.5), (.5, .5, .5)))
2574
+
2575
+ # create a pose and attach the bounding box
2576
+ modelPose = Rift.createPose()
2577
+ modelPose.boundingBox = bbox
2578
+
2579
+ Perform visibility culling on the pose using the bounding box by
2580
+ using the :py:meth:`~psychxr.libovr.LibOVRBounds.isVisible` method::
2581
+
2582
+ if hmd.isPoseVisible(modelPose):
2583
+ modelPose.draw()
2584
+
2585
+ """
2586
+ return libovr.LibOVRBounds(extents)
2587
+
2588
+ def isPoseVisible(self, pose):
2589
+ """Check if a pose object if visible to the present eye. This method can
2590
+ be used to perform visibility culling to avoid executing draw commands
2591
+ for objects that fall outside the FOV for the current eye buffer.
2592
+
2593
+ If :py:attr:`~psychxr.libovr.LibOVRPose.boundingBox` has a valid
2594
+ bounding box object, this function will return `False` if all the box
2595
+ points fall completely to one side of the view frustum. If
2596
+ :py:attr:`~psychxr.libovr.LibOVRPose.boundingBox` is `None`, the point
2597
+ at :py:attr:`~psychxr.libovr.LibOVRPose.pos` is checked, returning
2598
+ `False` if it falls outside of the frustum. If the present buffer is not
2599
+ 'left' or 'right', this function will always return `False`.
2600
+
2601
+ Parameters
2602
+ ----------
2603
+ pose : :py:class:`~psychxr.libovr.LibOVRPose`
2604
+ Pose to test for visibility.
2605
+
2606
+ Returns
2607
+ -------
2608
+ bool
2609
+ `True` if pose's bounding box or origin is outside of the view
2610
+ frustum.
2611
+
2612
+ """
2613
+ if self.buffer == 'left' or self.buffer == 'mono':
2614
+ return pose.isVisible(libovr.EYE_LEFT)
2615
+ elif self.buffer == 'right':
2616
+ return pose.isVisible(libovr.EYE_RIGHT)
2617
+
2618
+ return False
2619
+
2620
+ def _updatePerfStats(self):
2621
+ """Update and process performance statistics obtained from LibOVR. This
2622
+ should be called at the beginning of each frame to get the stats of the
2623
+ last frame.
2624
+
2625
+ This is called automatically when
2626
+ :py:meth:`~psychopy.visual.Rift._waitToBeginHmdFrame` is called at the
2627
+ beginning of each frame.
2628
+
2629
+ """
2630
+ # update perf stats
2631
+ self._perfStats = libovr.getPerfStats()
2632
+
2633
+ # if we have more >1 stat available, process the stats
2634
+ if self._perfStats.frameStatsCount > 0:
2635
+ recentStat = self._perfStats.frameStats[0] # get the most recent
2636
+ # check for dropped frames since last call
2637
+ if self.warnAppFrameDropped and \
2638
+ reportNDroppedFrames > self._lastAppDroppedFrameCount:
2639
+ appDroppedFrameCount = recentStat.appDroppedFrameCount
2640
+ if appDroppedFrameCount > self._lastAppDroppedFrameCount:
2641
+ logging.warn(
2642
+ 'Application failed to meet deadline to submit frame '
2643
+ 'to HMD ({}).'.format(self._frameIndex))
2644
+
2645
+ self._lastAppDroppedFrameCount = appDroppedFrameCount
2646
+
2647
+ if reportNDroppedFrames == self._lastAppDroppedFrameCount:
2648
+ logging.warn(
2649
+ "Maximum number of dropped frames detected. I'll stop "
2650
+ "warning you about them.")
2651
+
2652
+
2653
+ # def _logCallback(level, msg):
2654
+ # """Callback function for log messages generated by LibOVR."""
2655
+ # if level == libovr.LOG_LEVEL_INFO:
2656
+ # logging.info(msg)
2657
+ # elif level == libovr.LOG_LEVEL_DEBUG:
2658
+ # logging.debug(msg)
2659
+ # elif level == libovr.LOG_LEVEL_ERROR:
2660
+ # logging.error(msg)