vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.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 vispy might be problematic. Click here for more details.

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,566 @@
1
+ """Test to verify the functionality of the OpenGL backends. This test
2
+ sets up a real visualization with shaders and all. This tests setting
3
+ source code, setting texture and buffer data, and we touch many other
4
+ functions of the API too. The end result is an image with four colored
5
+ quads. The result is tested for pixel color.
6
+
7
+ The visualization
8
+ -----------------
9
+
10
+ We create a visualization where the screen is divided in 4 quadrants,
11
+ and each quadrant is drawn a different color (black, red, green,
12
+ blue). The drawing is done for 50% using attribute data, and 50%
13
+ using a texture. The end result should be fully saturated colors.
14
+
15
+ Remember: the bottom left is (-1, -1) and the first quadrant.
16
+ """
17
+ import sys
18
+
19
+ import numpy as np
20
+
21
+ from vispy.app import Canvas
22
+ from vispy.testing import (requires_application, requires_pyopengl, SkipTest,
23
+ run_tests_if_main, assert_equal, assert_true)
24
+
25
+ from vispy.gloo import gl
26
+ import pytest
27
+
28
+
29
+ # All these tests require a working backend.
30
+
31
+ #
32
+ # High level tests
33
+ #
34
+
35
+ def teardown_module():
36
+ gl.use_gl() # Reset to default
37
+
38
+
39
+ @pytest.mark.xfail(sys.platform == 'darwin',
40
+ reason='functionality fails on OSX (see #1178)')
41
+ @requires_application()
42
+ def test_functionality_desktop():
43
+ """Test desktop GL backend for full functionality."""
44
+ _test_functionality('gl2')
45
+
46
+
47
+ @pytest.mark.xfail(sys.platform == 'darwin',
48
+ reason='functionality fails on OSX (see #1178)')
49
+ @requires_application()
50
+ def test_functionality_proxy():
51
+ """Test GL proxy class for full functionality."""
52
+ # By using debug mode, we are using the proxy class
53
+ _test_functionality('gl2 debug')
54
+
55
+
56
+ @pytest.mark.xfail(sys.platform == 'darwin',
57
+ reason='functionality fails on OSX (see #1178)')
58
+ @requires_application()
59
+ @requires_pyopengl()
60
+ def test_functionality_pyopengl():
61
+ """Test pyopengl GL backend for full functionality."""
62
+ _test_functionality('pyopengl2')
63
+
64
+
65
+ @requires_application()
66
+ def test_functionality_es2():
67
+ """Test es2 GL backend for full functionality."""
68
+ if True:
69
+ raise SkipTest('Skip es2 functionality test for now.')
70
+ if not sys.platform.startswith('win'):
71
+ raise SkipTest('Can only test es2 functionality on Windows.')
72
+ _test_functionality('es2')
73
+
74
+
75
+ def _clear_screen():
76
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT)
77
+ gl.glFinish()
78
+
79
+
80
+ def _test_functionality(backend):
81
+ """Create app and canvas so we have a context. Then run tests."""
82
+ # use the backend
83
+ gl.use_gl(backend)
84
+
85
+ with Canvas() as canvas:
86
+ _clear_screen()
87
+
88
+ # Prepare
89
+ w, h = canvas.size
90
+ gl.glViewport(0, 0, w, h)
91
+ gl.glScissor(0, 0, w, h) # touch
92
+ gl.glClearColor(0.0, 0.0, 0.0, 1.0)
93
+
94
+ # Setup visualization, ensure to do it in a draw event
95
+ objects = _prepare_vis()
96
+ _clear_screen()
97
+ _draw1()
98
+ _clear_screen()
99
+ _draw2()
100
+ _clear_screen()
101
+ _draw3()
102
+
103
+ # Clean up
104
+ for delete_func, handle in objects:
105
+ delete_func(handle)
106
+ gl.glFinish()
107
+
108
+
109
+ #
110
+ # Create CPU data
111
+ #
112
+
113
+ # Create vertex and fragments shader. They are designed to that all
114
+ # OpenGL func can be tested, i.e. all types of uniforms are present.
115
+ # Most variables are nullified however, but we must make sure we do this
116
+ # in a way that the compiler won't optimize out :)
117
+ VERT = """
118
+ #version 120
119
+
120
+ attribute float a_1;
121
+ attribute vec2 a_2;
122
+ attribute vec3 a_3;
123
+ attribute vec4 a_4;
124
+
125
+ uniform float u_f1;
126
+ uniform vec2 u_f2;
127
+ uniform vec3 u_f3;
128
+ uniform vec4 u_f4;
129
+
130
+ uniform int u_i1;
131
+ uniform ivec2 u_i2;
132
+ uniform ivec3 u_i3;
133
+ uniform ivec4 u_i4;
134
+
135
+ uniform mat2 u_m2;
136
+ uniform mat3 u_m3;
137
+ uniform mat4 u_m4;
138
+
139
+ varying vec2 v_2; // tex coords
140
+ varying vec4 v_4; // attr colors
141
+
142
+ void main()
143
+ {
144
+ float zero = float(u_i1);
145
+
146
+ // Combine int with float uniforms (i.e. ints are "used")
147
+ float u1 = u_f1 + float(u_i1);
148
+ vec2 u2 = u_f2 + vec2(u_i2);
149
+ vec3 u3 = u_f3 + vec3(u_i3);
150
+ vec4 u4 = u_f4 + vec4(u_i4);
151
+
152
+ // Set varyings (use every 2D and 4D variable, and u1)
153
+ v_2 = a_1 * a_2 + zero*u_m2 * a_2 * u2 * u1;
154
+ v_4 = u_m4 * a_4 * u4;
155
+
156
+ // Set position (use 3D variables)
157
+ gl_Position = vec4(u_m3* a_3* u3, 1.0);
158
+ }
159
+ """
160
+
161
+ FRAG = """
162
+ #version 120
163
+
164
+ uniform sampler2D s_1;
165
+ uniform int u_i1;
166
+ varying vec2 v_2; // rex coords
167
+ varying vec4 v_4; // attr colors
168
+
169
+ void main()
170
+ {
171
+ float zero = float(u_i1);
172
+ gl_FragColor = (texture2D(s_1, v_2) + v_4);
173
+ }
174
+ """
175
+
176
+ # Color texture
177
+ texquad = 5
178
+ im1 = np.zeros((texquad*2, texquad*2, 3), np.uint8)
179
+ im1[texquad:, :texquad, 0] = 128
180
+ im1[texquad:, texquad:, 1] = 128
181
+ im1[:texquad, texquad:, 2] = 128
182
+
183
+ # Grayscale texture (uploaded but not used)
184
+ im2 = im1[:, :, 0] # A non-contiguous view
185
+ assert im2.flags['C_CONTIGUOUS'] is False
186
+
187
+ # Vertex Buffers
188
+
189
+ # Create coordinates for upper left quad
190
+ quad = np.array([[0, 0, 0], [-1, 0, 0], [-1, -1, 0],
191
+ [0, 0, 0], [-1, -1, 0], [0, -1, 0]], np.float32)
192
+ N = quad.shape[0] * 4
193
+
194
+ # buf3 contains coordinates in device coordinates for four quadrants
195
+ buf3 = np.row_stack([quad + (0, 0, 0), quad + (0, 1, 0),
196
+ quad + (1, 1, 0), quad + (1, 0, 0)]).astype(np.float32)
197
+
198
+ # buf2 is texture coords. Note that this is a view on buf2
199
+ buf2 = ((buf3+1.0)*0.5)[:, :2] # not C-contiguous
200
+ assert buf2.flags['C_CONTIGUOUS'] is False
201
+
202
+ # Array of colors
203
+ buf4 = np.zeros((N, 5), np.float32)
204
+ buf4[6:12, 0] = 0.5
205
+ buf4[12:18, 1] = 0.5
206
+ buf4[18:24, 2] = 0.5
207
+ buf4[:, 3] = 1.0 # alpha
208
+ buf4 = buf4[:, :4] # make non-contiguous
209
+
210
+ # Element buffer
211
+ # elements = np.arange(N, dtype=np.uint8) # C-contiguous
212
+ elements = np.arange(0, N, 0.5).astype(np.uint8)[::2] # not C-contiguous
213
+ helements = None # the OpenGL object ref
214
+
215
+
216
+ #
217
+ # The GL calls
218
+ #
219
+
220
+ def _prepare_vis():
221
+
222
+ objects = []
223
+
224
+ # --- program and shaders
225
+
226
+ # Create program and shaders
227
+ hprog = gl.glCreateProgram()
228
+ hvert = gl.glCreateShader(gl.GL_VERTEX_SHADER)
229
+ hfrag = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
230
+ objects.append((gl.glDeleteProgram, hprog))
231
+ objects.append((gl.glDeleteShader, hvert))
232
+ objects.append((gl.glDeleteShader, hfrag))
233
+
234
+ # Compile source code
235
+ gl.glShaderSource(hvert, VERT)
236
+ gl.glShaderSource(hfrag, FRAG)
237
+ gl.glCompileShader(hvert)
238
+ gl.glCompileShader(hfrag)
239
+
240
+ # Check
241
+ assert gl.glGetShaderInfoLog(hvert) == ''
242
+ assert gl.glGetShaderInfoLog(hfrag) == ''
243
+ assert gl.glGetShaderParameter(hvert, gl.GL_COMPILE_STATUS) == 1
244
+ assert gl.glGetShaderParameter(hfrag, gl.GL_COMPILE_STATUS) == 1
245
+
246
+ # Attach and link
247
+ gl.glAttachShader(hprog, hvert)
248
+ gl.glAttachShader(hprog, hfrag)
249
+ # touch glDetachShader
250
+ gl.glDetachShader(hprog, hvert)
251
+ gl.glAttachShader(hprog, hvert)
252
+
253
+ # Bind all attributes - we could let this occur automatically, but some
254
+ # implementations bind an attribute to index 0, which has the unfortunate
255
+ # property of being unable to be modified.
256
+ gl.glBindAttribLocation(hprog, 1, 'a_1')
257
+ gl.glBindAttribLocation(hprog, 2, 'a_2')
258
+ gl.glBindAttribLocation(hprog, 3, 'a_3')
259
+ gl.glBindAttribLocation(hprog, 4, 'a_4')
260
+
261
+ gl.glLinkProgram(hprog)
262
+
263
+ # Test that indeed these shaders are attached
264
+ attached_shaders = gl.glGetAttachedShaders(hprog)
265
+ assert_equal(set(attached_shaders), set([hvert, hfrag]))
266
+
267
+ # Check
268
+ assert_equal(gl.glGetProgramInfoLog(hprog), '')
269
+ assert_equal(gl.glGetProgramParameter(hprog, gl.GL_LINK_STATUS), 1)
270
+ gl.glValidateProgram(hprog)
271
+ assert_equal(gl.glGetProgramParameter(hprog, gl.GL_VALIDATE_STATUS), 1)
272
+
273
+ # Use it!
274
+ gl.glUseProgram(hprog)
275
+
276
+ # Check if all is ok
277
+ assert_equal(gl.glGetError(), 0)
278
+
279
+ # Check source
280
+ vert_source = gl.glGetShaderSource(hvert)
281
+ assert_true('attribute vec2 a_2;' in vert_source)
282
+
283
+ # --- get information on attributes and uniforms
284
+
285
+ # Count attributes and uniforms
286
+ natt = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_ATTRIBUTES)
287
+ nuni = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_UNIFORMS)
288
+ assert_equal(natt, 4)
289
+ assert_equal(nuni, 4+4+3+1)
290
+
291
+ # Get names
292
+ names = {}
293
+ for i in range(natt):
294
+ name, count, type = gl.glGetActiveAttrib(hprog, i)
295
+ names[name] = type
296
+ assert_equal(count, 1)
297
+ for i in range(nuni):
298
+ name, count, type = gl.glGetActiveUniform(hprog, i)
299
+ names[name] = type
300
+ assert_equal(count, 1)
301
+
302
+ # Check
303
+ assert_equal(names['a_1'], gl.GL_FLOAT)
304
+ assert_equal(names['a_2'], gl.GL_FLOAT_VEC2)
305
+ assert_equal(names['a_3'], gl.GL_FLOAT_VEC3)
306
+ assert_equal(names['a_4'], gl.GL_FLOAT_VEC4)
307
+ assert_equal(names['s_1'], gl.GL_SAMPLER_2D)
308
+ #
309
+ for i, type in enumerate([gl.GL_FLOAT, gl.GL_FLOAT_VEC2,
310
+ gl.GL_FLOAT_VEC3, gl.GL_FLOAT_VEC4]):
311
+ assert_equal(names['u_f%i' % (i+1)], type)
312
+ for i, type in enumerate([gl.GL_INT, gl.GL_INT_VEC2,
313
+ gl.GL_INT_VEC3, gl.GL_INT_VEC4]):
314
+ assert_equal(names['u_i%i' % (i+1)], type)
315
+ for i, type in enumerate([gl.GL_FLOAT_MAT2, gl.GL_FLOAT_MAT3,
316
+ gl.GL_FLOAT_MAT4]):
317
+ assert_equal(names['u_m%i' % (i+2)], type)
318
+
319
+ # Check if all is ok
320
+ assert_equal(gl.glGetError(), 0)
321
+
322
+ # --- texture
323
+
324
+ # Create, bind, activate
325
+ htex = gl.glCreateTexture()
326
+ objects.append((gl.glDeleteTexture, htex))
327
+ gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1)
328
+ gl.glBindTexture(gl.GL_TEXTURE_2D, htex)
329
+
330
+ # Allocate data and upload
331
+ # This data is luminance and not C-contiguous
332
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
333
+ gl.GL_UNSIGNED_BYTE, im2) # touch
334
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
335
+ gl.GL_UNSIGNED_BYTE, im2.shape[:2])
336
+ gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_LUMINANCE,
337
+ gl.GL_UNSIGNED_BYTE, im2)
338
+
339
+ # Set texture parameters (use f and i to touch both)
340
+ T = gl.GL_TEXTURE_2D
341
+ gl.glTexParameterf(T, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
342
+ gl.glTexParameteri(T, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
343
+
344
+ # Re-allocate data and upload
345
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_RGB,
346
+ gl.GL_UNSIGNED_BYTE, im1.shape[:2])
347
+ gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_RGB,
348
+ gl.GL_UNSIGNED_BYTE, im1)
349
+
350
+ # Attach!
351
+ loc = gl.glGetUniformLocation(hprog, 's_1')
352
+ unit = 0
353
+ gl.glActiveTexture(gl.GL_TEXTURE0+unit)
354
+ gl.glUniform1i(loc, unit)
355
+
356
+ # Mipmaps (just to touch this function)
357
+ gl.glGenerateMipmap(gl.GL_TEXTURE_2D)
358
+
359
+ # Check min filter (touch getTextParameter)
360
+ minfilt = gl.glGetTexParameter(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER)
361
+ assert_equal(minfilt, gl.GL_LINEAR)
362
+
363
+ # Check if all is ok
364
+ assert_equal(gl.glGetError(), 0)
365
+
366
+ # --- buffer vec2 (contiguous VBO)
367
+
368
+ # Create buffer
369
+ hbuf2 = gl.glCreateBuffer()
370
+ objects.append((gl.glDeleteBuffer, hbuf2))
371
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf2)
372
+
373
+ # Allocate and set data
374
+ gl.glBufferData(gl.GL_ARRAY_BUFFER, buf2.nbytes, gl.GL_DYNAMIC_DRAW)
375
+ gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf2)
376
+
377
+ # Attach!
378
+ loc = gl.glGetAttribLocation(hprog, 'a_2')
379
+ gl.glDisableVertexAttribArray(loc) # touch
380
+ gl.glEnableVertexAttribArray(loc)
381
+ gl.glVertexAttribPointer(loc, 2, gl.GL_FLOAT, False, 2*4, 0)
382
+
383
+ # Check (touch glGetBufferParameter, glGetVertexAttrib and
384
+ # glGetVertexAttribOffset)
385
+ size = gl.glGetBufferParameter(gl.GL_ARRAY_BUFFER, gl.GL_BUFFER_SIZE)
386
+ assert_equal(size, buf2.nbytes)
387
+ stride = gl.glGetVertexAttrib(loc, gl.GL_VERTEX_ATTRIB_ARRAY_STRIDE)
388
+ assert_equal(stride, 2*4)
389
+ offset = gl.glGetVertexAttribOffset(loc, gl.GL_VERTEX_ATTRIB_ARRAY_POINTER)
390
+ assert_equal(offset, 0)
391
+
392
+ # Check if all is ok
393
+ assert_equal(gl.glGetError(), 0)
394
+
395
+ # --- buffer vec3 (non-contiguous VBO)
396
+
397
+ # Create buffer
398
+ hbuf3 = gl.glCreateBuffer()
399
+ objects.append((gl.glDeleteBuffer, hbuf3))
400
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf3)
401
+
402
+ # Allocate and set data
403
+ gl.glBufferData(gl.GL_ARRAY_BUFFER, buf3.nbytes, gl.GL_DYNAMIC_DRAW)
404
+ gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf3)
405
+
406
+ # Attach!
407
+ loc = gl.glGetAttribLocation(hprog, 'a_3')
408
+ gl.glEnableVertexAttribArray(loc)
409
+ gl.glVertexAttribPointer(loc, 3, gl.GL_FLOAT, False, 3*4, 0)
410
+
411
+ # Check if all is ok
412
+ assert_equal(gl.glGetError(), 0)
413
+
414
+ # --- buffer vec4 (client vertex data)
415
+
416
+ # Select no FBO
417
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
418
+
419
+ # Attach!
420
+ loc = gl.glGetAttribLocation(hprog, 'a_4')
421
+ gl.glEnableVertexAttribArray(loc)
422
+ gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, 4*4, buf4)
423
+
424
+ # Check if all is ok
425
+ assert_equal(gl.glGetError(), 0)
426
+
427
+ # --- element buffer
428
+
429
+ # Create buffer
430
+ global helements
431
+ helements = gl.glCreateBuffer()
432
+ objects.append((gl.glDeleteBuffer, helements))
433
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
434
+
435
+ # Allocate and set data
436
+ gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, elements, gl.GL_DYNAMIC_DRAW)
437
+ gl.glBufferSubData(gl.GL_ELEMENT_ARRAY_BUFFER, 0, elements)
438
+
439
+ # Turn off
440
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
441
+
442
+ # Check if all is ok
443
+ assert_equal(gl.glGetError(), 0)
444
+
445
+ # --- uniforms
446
+
447
+ # Set integer uniforms to 0
448
+ # We set them twice just to touch both i and iv functions
449
+ for i, fun1, fun2 in [(1, gl.glUniform1i, gl.glUniform1iv),
450
+ (2, gl.glUniform2i, gl.glUniform2iv),
451
+ (3, gl.glUniform3i, gl.glUniform3iv),
452
+ (4, gl.glUniform4i, gl.glUniform4iv)]:
453
+ name = 'u_i%i' % i
454
+ value = [0] * i
455
+ loc = gl.glGetUniformLocation(hprog, name)
456
+ fun1(loc, *value) # e.g. glUniform4i
457
+ fun2(loc, 1, value) # e.g. glUniform4iv
458
+
459
+ # Set float uniforms to 1.0
460
+ # We set them twice just to touch both i and iv functions
461
+ for i, fun1, fun2 in [(1, gl.glUniform1f, gl.glUniform1fv),
462
+ (2, gl.glUniform2f, gl.glUniform2fv),
463
+ (3, gl.glUniform3f, gl.glUniform3fv),
464
+ (4, gl.glUniform4f, gl.glUniform4fv)]:
465
+ name = 'u_f%i' % i
466
+ value = [1.0] * i
467
+ loc = gl.glGetUniformLocation(hprog, name)
468
+ fun1(loc, *value) # e.g. glUniform4f
469
+ fun2(loc, 1, value) # e.g. glUniform4fv
470
+
471
+ # Set matrix uniforms
472
+ m = np.eye(5, dtype='float32')
473
+ loc = gl.glGetUniformLocation(hprog, 'u_m2')
474
+ gl.glUniformMatrix2fv(loc, 1, False, m[:2, :2])
475
+ #
476
+ loc = gl.glGetUniformLocation(hprog, 'u_m3')
477
+ m = np.eye(3, dtype='float32')
478
+ gl.glUniformMatrix3fv(loc, 1, False, m[:3, :3])
479
+ #
480
+ loc = gl.glGetUniformLocation(hprog, 'u_m4')
481
+ m = np.eye(4, dtype='float32')
482
+ gl.glUniformMatrix4fv(loc, 1, False, m[:4, :4])
483
+
484
+ # Check some uniforms
485
+ loc = gl.glGetUniformLocation(hprog, 'u_i1')
486
+ assert_equal(gl.glGetUniform(hprog, loc), 0)
487
+ loc = gl.glGetUniformLocation(hprog, 'u_i2')
488
+ assert_equal(gl.glGetUniform(hprog, loc), (0, 0))
489
+ loc = gl.glGetUniformLocation(hprog, 'u_f2')
490
+ assert_equal(gl.glGetUniform(hprog, loc), (1.0, 1.0))
491
+
492
+ # Check if all is ok
493
+ assert_equal(gl.glGetError(), 0)
494
+
495
+ # --- attributes
496
+
497
+ # Constant values for attributes. We do not even use this ...
498
+ loc = gl.glGetAttribLocation(hprog, 'a_1')
499
+ gl.glVertexAttrib1f(loc, 1.0)
500
+ loc = gl.glGetAttribLocation(hprog, 'a_2')
501
+ gl.glVertexAttrib2f(loc, 1.0, 1.0)
502
+ loc = gl.glGetAttribLocation(hprog, 'a_3')
503
+ gl.glVertexAttrib3f(loc, 1.0, 1.0, 1.0)
504
+ loc = gl.glGetAttribLocation(hprog, 'a_4')
505
+ gl.glVertexAttrib4f(loc, 1.0, 1.0, 1.0, 1.0)
506
+
507
+ # --- flush and finish
508
+
509
+ # Not really necessary, but we want to touch the functions
510
+ gl.glFlush()
511
+ gl.glFinish()
512
+
513
+ # print([i[1] for i in objects])
514
+ return objects
515
+
516
+
517
+ def _draw1():
518
+ # Draw using arrays
519
+ gl.glDrawArrays(gl.GL_TRIANGLES, 0, N)
520
+ gl.glFinish()
521
+ _check_result()
522
+
523
+
524
+ def _draw2():
525
+ # Draw using elements via buffer
526
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
527
+ gl.glDrawElements(gl.GL_TRIANGLES, elements.size, gl.GL_UNSIGNED_BYTE, 0)
528
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
529
+ gl.glFinish()
530
+ _check_result()
531
+
532
+
533
+ def _draw3():
534
+ # Draw using elements via numpy array
535
+ gl.glDrawElements(gl.GL_TRIANGLES,
536
+ elements.size, gl.GL_UNSIGNED_BYTE, elements)
537
+ gl.glFinish()
538
+ _check_result()
539
+
540
+
541
+ def _check_result(assert_result=True):
542
+ """Test the color of each quadrant by picking the center pixel
543
+ of each quadrant and comparing it with the reference color.
544
+ """
545
+ # Take screenshot
546
+ x, y, w, h = gl.glGetParameter(gl.GL_VIEWPORT)
547
+ data = gl.glReadPixels(x, y, w, h, gl.GL_RGB, gl.GL_UNSIGNED_BYTE)
548
+ im = np.frombuffer(data, np.uint8)
549
+ im.shape = h, w, 3
550
+
551
+ # Get center pixel from each quadrant
552
+ pix1 = tuple(im[int(1*h/4), int(1*w/4)])
553
+ pix2 = tuple(im[int(3*h/4), int(1*w/4)])
554
+ pix3 = tuple(im[int(3*h/4), int(3*w/4)])
555
+ pix4 = tuple(im[int(1*h/4), int(3*w/4)])
556
+ # print(pix1, pix2, pix3, pix4)
557
+
558
+ if assert_result:
559
+ # Test their value
560
+ assert_equal(pix1, (0, 0, 0))
561
+ assert_equal(pix2, (255, 0, 0))
562
+ assert_equal(pix3, (0, 255, 0))
563
+ assert_equal(pix4, (0, 0, 255))
564
+
565
+
566
+ run_tests_if_main()