vispy 0.15.0__cp313-cp313-win_amd64.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 (521) 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 +1003 -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 +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -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 +1824 -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 +1046 -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 +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cp313-win_amd64.pyd +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +5 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,568 @@
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.vstack([
196
+ quad + (0, 0, 0), quad + (0, 1, 0),
197
+ quad + (1, 1, 0), quad + (1, 0, 0),
198
+ ]).astype(np.float32)
199
+
200
+ # buf2 is texture coords. Note that this is a view on buf2
201
+ buf2 = ((buf3+1.0)*0.5)[:, :2] # not C-contiguous
202
+ assert buf2.flags['C_CONTIGUOUS'] is False
203
+
204
+ # Array of colors
205
+ buf4 = np.zeros((N, 5), np.float32)
206
+ buf4[6:12, 0] = 0.5
207
+ buf4[12:18, 1] = 0.5
208
+ buf4[18:24, 2] = 0.5
209
+ buf4[:, 3] = 1.0 # alpha
210
+ buf4 = buf4[:, :4] # make non-contiguous
211
+
212
+ # Element buffer
213
+ # elements = np.arange(N, dtype=np.uint8) # C-contiguous
214
+ elements = np.arange(0, N, 0.5).astype(np.uint8)[::2] # not C-contiguous
215
+ helements = None # the OpenGL object ref
216
+
217
+
218
+ #
219
+ # The GL calls
220
+ #
221
+
222
+ def _prepare_vis():
223
+
224
+ objects = []
225
+
226
+ # --- program and shaders
227
+
228
+ # Create program and shaders
229
+ hprog = gl.glCreateProgram()
230
+ hvert = gl.glCreateShader(gl.GL_VERTEX_SHADER)
231
+ hfrag = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
232
+ objects.append((gl.glDeleteProgram, hprog))
233
+ objects.append((gl.glDeleteShader, hvert))
234
+ objects.append((gl.glDeleteShader, hfrag))
235
+
236
+ # Compile source code
237
+ gl.glShaderSource(hvert, VERT)
238
+ gl.glShaderSource(hfrag, FRAG)
239
+ gl.glCompileShader(hvert)
240
+ gl.glCompileShader(hfrag)
241
+
242
+ # Check
243
+ assert gl.glGetShaderInfoLog(hvert) == ''
244
+ assert gl.glGetShaderInfoLog(hfrag) == ''
245
+ assert gl.glGetShaderParameter(hvert, gl.GL_COMPILE_STATUS) == 1
246
+ assert gl.glGetShaderParameter(hfrag, gl.GL_COMPILE_STATUS) == 1
247
+
248
+ # Attach and link
249
+ gl.glAttachShader(hprog, hvert)
250
+ gl.glAttachShader(hprog, hfrag)
251
+ # touch glDetachShader
252
+ gl.glDetachShader(hprog, hvert)
253
+ gl.glAttachShader(hprog, hvert)
254
+
255
+ # Bind all attributes - we could let this occur automatically, but some
256
+ # implementations bind an attribute to index 0, which has the unfortunate
257
+ # property of being unable to be modified.
258
+ gl.glBindAttribLocation(hprog, 1, 'a_1')
259
+ gl.glBindAttribLocation(hprog, 2, 'a_2')
260
+ gl.glBindAttribLocation(hprog, 3, 'a_3')
261
+ gl.glBindAttribLocation(hprog, 4, 'a_4')
262
+
263
+ gl.glLinkProgram(hprog)
264
+
265
+ # Test that indeed these shaders are attached
266
+ attached_shaders = gl.glGetAttachedShaders(hprog)
267
+ assert_equal(set(attached_shaders), set([hvert, hfrag]))
268
+
269
+ # Check
270
+ assert_equal(gl.glGetProgramInfoLog(hprog), '')
271
+ assert_equal(gl.glGetProgramParameter(hprog, gl.GL_LINK_STATUS), 1)
272
+ gl.glValidateProgram(hprog)
273
+ assert_equal(gl.glGetProgramParameter(hprog, gl.GL_VALIDATE_STATUS), 1)
274
+
275
+ # Use it!
276
+ gl.glUseProgram(hprog)
277
+
278
+ # Check if all is ok
279
+ assert_equal(gl.glGetError(), 0)
280
+
281
+ # Check source
282
+ vert_source = gl.glGetShaderSource(hvert)
283
+ assert_true('attribute vec2 a_2;' in vert_source)
284
+
285
+ # --- get information on attributes and uniforms
286
+
287
+ # Count attributes and uniforms
288
+ natt = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_ATTRIBUTES)
289
+ nuni = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_UNIFORMS)
290
+ assert_equal(natt, 4)
291
+ assert_equal(nuni, 4+4+3+1)
292
+
293
+ # Get names
294
+ names = {}
295
+ for i in range(natt):
296
+ name, count, type = gl.glGetActiveAttrib(hprog, i)
297
+ names[name] = type
298
+ assert_equal(count, 1)
299
+ for i in range(nuni):
300
+ name, count, type = gl.glGetActiveUniform(hprog, i)
301
+ names[name] = type
302
+ assert_equal(count, 1)
303
+
304
+ # Check
305
+ assert_equal(names['a_1'], gl.GL_FLOAT)
306
+ assert_equal(names['a_2'], gl.GL_FLOAT_VEC2)
307
+ assert_equal(names['a_3'], gl.GL_FLOAT_VEC3)
308
+ assert_equal(names['a_4'], gl.GL_FLOAT_VEC4)
309
+ assert_equal(names['s_1'], gl.GL_SAMPLER_2D)
310
+ #
311
+ for i, type in enumerate([gl.GL_FLOAT, gl.GL_FLOAT_VEC2,
312
+ gl.GL_FLOAT_VEC3, gl.GL_FLOAT_VEC4]):
313
+ assert_equal(names['u_f%i' % (i+1)], type)
314
+ for i, type in enumerate([gl.GL_INT, gl.GL_INT_VEC2,
315
+ gl.GL_INT_VEC3, gl.GL_INT_VEC4]):
316
+ assert_equal(names['u_i%i' % (i+1)], type)
317
+ for i, type in enumerate([gl.GL_FLOAT_MAT2, gl.GL_FLOAT_MAT3,
318
+ gl.GL_FLOAT_MAT4]):
319
+ assert_equal(names['u_m%i' % (i+2)], type)
320
+
321
+ # Check if all is ok
322
+ assert_equal(gl.glGetError(), 0)
323
+
324
+ # --- texture
325
+
326
+ # Create, bind, activate
327
+ htex = gl.glCreateTexture()
328
+ objects.append((gl.glDeleteTexture, htex))
329
+ gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1)
330
+ gl.glBindTexture(gl.GL_TEXTURE_2D, htex)
331
+
332
+ # Allocate data and upload
333
+ # This data is luminance and not C-contiguous
334
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
335
+ gl.GL_UNSIGNED_BYTE, im2) # touch
336
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
337
+ gl.GL_UNSIGNED_BYTE, im2.shape[:2])
338
+ gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_LUMINANCE,
339
+ gl.GL_UNSIGNED_BYTE, im2)
340
+
341
+ # Set texture parameters (use f and i to touch both)
342
+ T = gl.GL_TEXTURE_2D
343
+ gl.glTexParameterf(T, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
344
+ gl.glTexParameteri(T, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
345
+
346
+ # Re-allocate data and upload
347
+ gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_RGB,
348
+ gl.GL_UNSIGNED_BYTE, im1.shape[:2])
349
+ gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_RGB,
350
+ gl.GL_UNSIGNED_BYTE, im1)
351
+
352
+ # Attach!
353
+ loc = gl.glGetUniformLocation(hprog, 's_1')
354
+ unit = 0
355
+ gl.glActiveTexture(gl.GL_TEXTURE0+unit)
356
+ gl.glUniform1i(loc, unit)
357
+
358
+ # Mipmaps (just to touch this function)
359
+ gl.glGenerateMipmap(gl.GL_TEXTURE_2D)
360
+
361
+ # Check min filter (touch getTextParameter)
362
+ minfilt = gl.glGetTexParameter(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER)
363
+ assert_equal(minfilt, gl.GL_LINEAR)
364
+
365
+ # Check if all is ok
366
+ assert_equal(gl.glGetError(), 0)
367
+
368
+ # --- buffer vec2 (contiguous VBO)
369
+
370
+ # Create buffer
371
+ hbuf2 = gl.glCreateBuffer()
372
+ objects.append((gl.glDeleteBuffer, hbuf2))
373
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf2)
374
+
375
+ # Allocate and set data
376
+ gl.glBufferData(gl.GL_ARRAY_BUFFER, buf2.nbytes, gl.GL_DYNAMIC_DRAW)
377
+ gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf2)
378
+
379
+ # Attach!
380
+ loc = gl.glGetAttribLocation(hprog, 'a_2')
381
+ gl.glDisableVertexAttribArray(loc) # touch
382
+ gl.glEnableVertexAttribArray(loc)
383
+ gl.glVertexAttribPointer(loc, 2, gl.GL_FLOAT, False, 2*4, 0)
384
+
385
+ # Check (touch glGetBufferParameter, glGetVertexAttrib and
386
+ # glGetVertexAttribOffset)
387
+ size = gl.glGetBufferParameter(gl.GL_ARRAY_BUFFER, gl.GL_BUFFER_SIZE)
388
+ assert_equal(size, buf2.nbytes)
389
+ stride = gl.glGetVertexAttrib(loc, gl.GL_VERTEX_ATTRIB_ARRAY_STRIDE)
390
+ assert_equal(stride, 2*4)
391
+ offset = gl.glGetVertexAttribOffset(loc, gl.GL_VERTEX_ATTRIB_ARRAY_POINTER)
392
+ assert_equal(offset, 0)
393
+
394
+ # Check if all is ok
395
+ assert_equal(gl.glGetError(), 0)
396
+
397
+ # --- buffer vec3 (non-contiguous VBO)
398
+
399
+ # Create buffer
400
+ hbuf3 = gl.glCreateBuffer()
401
+ objects.append((gl.glDeleteBuffer, hbuf3))
402
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf3)
403
+
404
+ # Allocate and set data
405
+ gl.glBufferData(gl.GL_ARRAY_BUFFER, buf3.nbytes, gl.GL_DYNAMIC_DRAW)
406
+ gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf3)
407
+
408
+ # Attach!
409
+ loc = gl.glGetAttribLocation(hprog, 'a_3')
410
+ gl.glEnableVertexAttribArray(loc)
411
+ gl.glVertexAttribPointer(loc, 3, gl.GL_FLOAT, False, 3*4, 0)
412
+
413
+ # Check if all is ok
414
+ assert_equal(gl.glGetError(), 0)
415
+
416
+ # --- buffer vec4 (client vertex data)
417
+
418
+ # Select no FBO
419
+ gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
420
+
421
+ # Attach!
422
+ loc = gl.glGetAttribLocation(hprog, 'a_4')
423
+ gl.glEnableVertexAttribArray(loc)
424
+ gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, 4*4, buf4)
425
+
426
+ # Check if all is ok
427
+ assert_equal(gl.glGetError(), 0)
428
+
429
+ # --- element buffer
430
+
431
+ # Create buffer
432
+ global helements
433
+ helements = gl.glCreateBuffer()
434
+ objects.append((gl.glDeleteBuffer, helements))
435
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
436
+
437
+ # Allocate and set data
438
+ gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, elements, gl.GL_DYNAMIC_DRAW)
439
+ gl.glBufferSubData(gl.GL_ELEMENT_ARRAY_BUFFER, 0, elements)
440
+
441
+ # Turn off
442
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
443
+
444
+ # Check if all is ok
445
+ assert_equal(gl.glGetError(), 0)
446
+
447
+ # --- uniforms
448
+
449
+ # Set integer uniforms to 0
450
+ # We set them twice just to touch both i and iv functions
451
+ for i, fun1, fun2 in [(1, gl.glUniform1i, gl.glUniform1iv),
452
+ (2, gl.glUniform2i, gl.glUniform2iv),
453
+ (3, gl.glUniform3i, gl.glUniform3iv),
454
+ (4, gl.glUniform4i, gl.glUniform4iv)]:
455
+ name = 'u_i%i' % i
456
+ value = [0] * i
457
+ loc = gl.glGetUniformLocation(hprog, name)
458
+ fun1(loc, *value) # e.g. glUniform4i
459
+ fun2(loc, 1, value) # e.g. glUniform4iv
460
+
461
+ # Set float uniforms to 1.0
462
+ # We set them twice just to touch both i and iv functions
463
+ for i, fun1, fun2 in [(1, gl.glUniform1f, gl.glUniform1fv),
464
+ (2, gl.glUniform2f, gl.glUniform2fv),
465
+ (3, gl.glUniform3f, gl.glUniform3fv),
466
+ (4, gl.glUniform4f, gl.glUniform4fv)]:
467
+ name = 'u_f%i' % i
468
+ value = [1.0] * i
469
+ loc = gl.glGetUniformLocation(hprog, name)
470
+ fun1(loc, *value) # e.g. glUniform4f
471
+ fun2(loc, 1, value) # e.g. glUniform4fv
472
+
473
+ # Set matrix uniforms
474
+ m = np.eye(5, dtype='float32')
475
+ loc = gl.glGetUniformLocation(hprog, 'u_m2')
476
+ gl.glUniformMatrix2fv(loc, 1, False, m[:2, :2])
477
+ #
478
+ loc = gl.glGetUniformLocation(hprog, 'u_m3')
479
+ m = np.eye(3, dtype='float32')
480
+ gl.glUniformMatrix3fv(loc, 1, False, m[:3, :3])
481
+ #
482
+ loc = gl.glGetUniformLocation(hprog, 'u_m4')
483
+ m = np.eye(4, dtype='float32')
484
+ gl.glUniformMatrix4fv(loc, 1, False, m[:4, :4])
485
+
486
+ # Check some uniforms
487
+ loc = gl.glGetUniformLocation(hprog, 'u_i1')
488
+ assert_equal(gl.glGetUniform(hprog, loc), 0)
489
+ loc = gl.glGetUniformLocation(hprog, 'u_i2')
490
+ assert_equal(gl.glGetUniform(hprog, loc), (0, 0))
491
+ loc = gl.glGetUniformLocation(hprog, 'u_f2')
492
+ assert_equal(gl.glGetUniform(hprog, loc), (1.0, 1.0))
493
+
494
+ # Check if all is ok
495
+ assert_equal(gl.glGetError(), 0)
496
+
497
+ # --- attributes
498
+
499
+ # Constant values for attributes. We do not even use this ...
500
+ loc = gl.glGetAttribLocation(hprog, 'a_1')
501
+ gl.glVertexAttrib1f(loc, 1.0)
502
+ loc = gl.glGetAttribLocation(hprog, 'a_2')
503
+ gl.glVertexAttrib2f(loc, 1.0, 1.0)
504
+ loc = gl.glGetAttribLocation(hprog, 'a_3')
505
+ gl.glVertexAttrib3f(loc, 1.0, 1.0, 1.0)
506
+ loc = gl.glGetAttribLocation(hprog, 'a_4')
507
+ gl.glVertexAttrib4f(loc, 1.0, 1.0, 1.0, 1.0)
508
+
509
+ # --- flush and finish
510
+
511
+ # Not really necessary, but we want to touch the functions
512
+ gl.glFlush()
513
+ gl.glFinish()
514
+
515
+ # print([i[1] for i in objects])
516
+ return objects
517
+
518
+
519
+ def _draw1():
520
+ # Draw using arrays
521
+ gl.glDrawArrays(gl.GL_TRIANGLES, 0, N)
522
+ gl.glFinish()
523
+ _check_result()
524
+
525
+
526
+ def _draw2():
527
+ # Draw using elements via buffer
528
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
529
+ gl.glDrawElements(gl.GL_TRIANGLES, elements.size, gl.GL_UNSIGNED_BYTE, 0)
530
+ gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
531
+ gl.glFinish()
532
+ _check_result()
533
+
534
+
535
+ def _draw3():
536
+ # Draw using elements via numpy array
537
+ gl.glDrawElements(gl.GL_TRIANGLES,
538
+ elements.size, gl.GL_UNSIGNED_BYTE, elements)
539
+ gl.glFinish()
540
+ _check_result()
541
+
542
+
543
+ def _check_result(assert_result=True):
544
+ """Test the color of each quadrant by picking the center pixel
545
+ of each quadrant and comparing it with the reference color.
546
+ """
547
+ # Take screenshot
548
+ x, y, w, h = gl.glGetParameter(gl.GL_VIEWPORT)
549
+ data = gl.glReadPixels(x, y, w, h, gl.GL_RGB, gl.GL_UNSIGNED_BYTE)
550
+ im = np.frombuffer(data, np.uint8)
551
+ im.shape = h, w, 3
552
+
553
+ # Get center pixel from each quadrant
554
+ pix1 = tuple(im[int(1*h/4), int(1*w/4)])
555
+ pix2 = tuple(im[int(3*h/4), int(1*w/4)])
556
+ pix3 = tuple(im[int(3*h/4), int(3*w/4)])
557
+ pix4 = tuple(im[int(1*h/4), int(3*w/4)])
558
+ # print(pix1, pix2, pix3, pix4)
559
+
560
+ if assert_result:
561
+ # Test their value
562
+ assert_equal(pix1, (0, 0, 0))
563
+ assert_equal(pix2, (255, 0, 0))
564
+ assert_equal(pix3, (0, 255, 0))
565
+ assert_equal(pix4, (0, 0, 255))
566
+
567
+
568
+ run_tests_if_main()