psychopy 2024.1.0__py3-none-any.whl

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

Potentially problematic release.


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

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