vispy 0.15.0__cp312-cp312-macosx_10_13_x86_64.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.cpython-312-darwin.so +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 +6 -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,486 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ from vispy.visuals.shaders import (Function, MainFunction, Variable, Varying,
5
+ FunctionChain, StatementList)
6
+
7
+
8
+ # Users normally don't need these, but I want to test them
9
+ from vispy.visuals.shaders.expression import FunctionCall, TextExpression
10
+
11
+ from vispy.testing import (assert_in, assert_not_in, assert_is,
12
+ run_tests_if_main, assert_raises, assert_equal)
13
+
14
+
15
+ # Define some snippets
16
+
17
+ transformScale = Function("""
18
+ vec4 transform_scale(vec4 pos)
19
+ {
20
+ pos.xyz *= $scale;
21
+ return pos;
22
+ }
23
+ """)
24
+
25
+ transformZOffset = Function("""
26
+ vec4 transform_zoffset(vec4 pos)
27
+ {
28
+ pos.z += $offset;
29
+ return pos;
30
+ }
31
+ """)
32
+
33
+ vert_template = Function("""
34
+ void main(void)
35
+ {
36
+ int nlights = $nlights;
37
+ vec4 pos = $position;
38
+ pos += $correction;
39
+ gl_Position = $endtransform(pos);
40
+ }
41
+
42
+ """)
43
+
44
+ frag_template = Function("""
45
+ void main(void)
46
+ {
47
+ gl_Fragcolor = $color;
48
+ }
49
+
50
+ """)
51
+
52
+ data = 'just some dummy variable, Function is agnostic about this'
53
+
54
+
55
+ # Examples
56
+
57
+ def test_example1():
58
+ """Just a few simple compositions."""
59
+ # Get function objects. Generate random name for transforms
60
+ code = Function(vert_template)
61
+ t1 = Function(transformScale)
62
+ t2 = Function(transformZOffset)
63
+ t3 = Function(transformScale)
64
+
65
+ # We need to create a variable in order to use it in two places
66
+ pos = Variable('attribute vec4 a_position')
67
+
68
+ # Compose everything together
69
+ code['position'] = t1(t2(pos))
70
+ code['correction'] = t1(pos) # Look, we use t1 again, different sig
71
+ code['endtransform'] = t3 # function pointer rather than function call
72
+ code['nlights'] = '4'
73
+ t1['scale'] = t2
74
+ t3['scale'] = (3.0, 4.0, 5.0)
75
+ t2['offset'] = '1.0'
76
+
77
+ code2 = Function(frag_template)
78
+ code2['color'] = Varying('v_position')
79
+
80
+ code['gl_PointSize'] = '3.0'
81
+ code[code2['color']] = pos
82
+ print(code)
83
+
84
+
85
+ def test_example2():
86
+ """Demonstrate how a transform would work."""
87
+ vert_template = Function("""
88
+ void main(void)
89
+ {
90
+ gl_Position = $position;
91
+ }
92
+ """)
93
+
94
+ transformScale = Function("""
95
+ vec4 transform_scale(vec4 pos)
96
+ {
97
+ pos.xyz *= $scale;
98
+ return pos;
99
+ }
100
+ """)
101
+
102
+ class Transform(object):
103
+ def __init__(self):
104
+ # Equivalent methods to create new function object
105
+ self.func = Function(transformScale)
106
+ self.func['scale'] = 'uniform float'
107
+ # self.func = Function(transformScale)
108
+
109
+ def set_scale(self, scale):
110
+ self.func['scale'].value = scale
111
+
112
+ transforms = [Transform(), Transform(), Transform()]
113
+
114
+ code = Function(vert_template)
115
+ ob = Variable('attribute vec3 a_position')
116
+ for trans in transforms:
117
+ ob = trans.func(ob)
118
+ code['position'] = ob
119
+ print(code)
120
+
121
+ # Tests
122
+
123
+
124
+ def test_TextExpression():
125
+ exp = TextExpression('foo bar')
126
+ assert_equal('foo bar', exp.expression(None))
127
+ assert_equal(None, exp.definition(None, ('120', '')))
128
+ assert_raises(TypeError, TextExpression, 4)
129
+
130
+
131
+ def test_FunctionCall():
132
+ fun = Function(transformScale)
133
+ fun['scale'] = '1.0'
134
+ fun2 = Function(transformZOffset)
135
+
136
+ # No args
137
+ assert_raises(TypeError, fun) # need 1 arg
138
+ assert_raises(TypeError, fun, 1, 2) # need 1 arg
139
+ call = fun('x')
140
+ # Test repr
141
+ exp = call.expression({fun: 'y'})
142
+ assert_equal(exp, 'y(x)')
143
+ # Test sig
144
+ assert len(call._args) == 1
145
+ # Test dependencies
146
+ assert_in(fun, call.dependencies())
147
+ assert_in(call._args[0], call.dependencies())
148
+
149
+ # More args
150
+ call = fun(fun2('foo'))
151
+ # Test repr
152
+ exp = call.expression({fun: 'y', fun2: 'z'})
153
+ assert_in('y(z(', exp)
154
+ # Test sig
155
+ assert len(call._args) == 1
156
+ call2 = call._args[0]
157
+ assert len(call2._args) == 1
158
+ # Test dependencies
159
+ assert_in(fun, call.dependencies())
160
+ assert_in(call._args[0], call.dependencies())
161
+ assert_in(fun2, call.dependencies())
162
+ assert_in(call2._args[0], call.dependencies())
163
+
164
+
165
+ def test_Variable():
166
+
167
+ # Test init fail
168
+ assert_raises(TypeError, Variable) # no args
169
+ assert_raises(TypeError, Variable, 3) # wrong type
170
+ assert_raises(TypeError, Variable, "name", "str") # wrong type
171
+ assert_raises(ValueError, Variable, 'bla bla') # need correct vtype
172
+ assert_raises(ValueError, Variable, 'uniform b l a') # too many
173
+
174
+ # Test init success
175
+ var = Variable('uniform float bla') # Finally
176
+ assert_equal(var.name, 'bla')
177
+ assert_equal(var.dtype, 'float')
178
+ assert_equal(var.vtype, 'uniform')
179
+ assert var.value is None
180
+
181
+ # test assign new value
182
+ var.value = 10.
183
+ assert_equal(var.dtype, 'float') # type is locked; won't change
184
+
185
+ # test name-only init
186
+ var = Variable('bla') # Finally
187
+ assert_equal(var.name, 'bla')
188
+ assert_equal(var.dtype, None)
189
+ assert_equal(var.vtype, None)
190
+ assert var.value is None
191
+
192
+ # test assign new value
193
+ var.value = 10
194
+ assert_equal(var.dtype, 'int')
195
+ assert_equal(var.vtype, 'uniform')
196
+ assert_equal(var.value, 10)
197
+
198
+ # test init with value
199
+ var = Variable('bla', (1, 2, 3)) # Also valid
200
+ assert_equal(var.name, 'bla')
201
+ assert_equal(var.dtype, 'vec3')
202
+ assert_equal(var.vtype, 'uniform')
203
+ assert_equal(var.value, (1, 2, 3))
204
+
205
+ # Test value
206
+ # var = Variable('uniform float bla', data) # Also valid
207
+ # assert_equal(var.value, data)
208
+ # var.value = 3
209
+ # assert_equal(var.value, 3)
210
+
211
+ # Test repr
212
+ var = Variable('uniform float bla')
213
+ assert_in('uniform float bla', var.compile())
214
+
215
+ # Test injection, definition, dependencies
216
+ assert_equal(var.expression({var: 'xxx'}), 'xxx')
217
+ assert_equal(var.definition({var: 'xxx'}, ('120', ''), None),
218
+ 'uniform float xxx;')
219
+ assert_in(var, var.dependencies())
220
+
221
+ # Renaming
222
+ var = Variable('uniform float bla')
223
+ assert_equal(var.name, 'bla')
224
+ var.name = 'foo'
225
+ assert_equal(var.name, 'foo')
226
+
227
+
228
+ def test_function_basics():
229
+
230
+ # Test init fail
231
+ assert_raises(TypeError, Function) # no args
232
+ assert_raises(ValueError, Function, 3) # need string
233
+
234
+ # Test init success 1
235
+ fun = Function('void main(){}')
236
+ assert_equal(fun.name, 'main')
237
+ assert len(fun.template_vars) == 0
238
+
239
+ # Test init success with template vars
240
+ fun = Function('void main(){$foo; $bar;}')
241
+ assert_equal(fun.name, 'main')
242
+ assert len(fun.template_vars) == 2
243
+ assert_in('foo', fun.template_vars)
244
+
245
+ # Test that `var in fun` syntax works as well
246
+ assert 'foo' in fun
247
+ assert 'bar' in fun
248
+ assert 'baz' not in fun
249
+
250
+ assert_in('bar', fun.template_vars)
251
+
252
+ # Test setting verbatim expressions
253
+ assert_raises(KeyError, fun.__setitem__, 'bla', '33') # no such template
254
+ fun['foo'] = '33'
255
+ fun['bar'] = 'bla bla'
256
+ assert_is(type(fun['foo']), TextExpression)
257
+ assert_equal(fun['foo'].expression(None), '33')
258
+ assert_is(type(fun['bar']), TextExpression)
259
+ assert_equal(fun['bar'].expression(None), 'bla bla')
260
+
261
+ # Test setting call expressions
262
+ fun = Function('void main(){\n$foo;\n$bar;\n$spam(XX);\n$eggs(YY);\n}')
263
+ trans = Function('float transform_scale(float x) {return x+1.0;}')
264
+ assert_raises(TypeError, trans) # requires 1 arg
265
+ assert_raises(TypeError, trans, '1', '2')
266
+ fun['foo'] = trans('2')
267
+ fun['bar'] = trans('3')
268
+ fun['spam'] = trans
269
+ fun['eggs'] = trans
270
+ #
271
+ for name in ['foo', 'bar']:
272
+ assert_is(type(fun[name]), FunctionCall)
273
+ assert_equal(fun[name].function, trans)
274
+ assert_in(trans, fun.dependencies())
275
+ for name in ['spam', 'eggs']:
276
+ assert_equal(fun[name], trans)
277
+
278
+ #
279
+ text = fun.compile()
280
+ assert_in('\ntransform_scale(2);\n', text)
281
+ assert_in('\ntransform_scale(3);\n', text)
282
+ assert_in('\ntransform_scale(XX);\n', text)
283
+ assert_in('\ntransform_scale(YY);\n', text)
284
+
285
+ # test pre/post assignments
286
+ fun = Function('void main() {some stuff;}')
287
+ fun['pre'] = '__pre__'
288
+ fun['post'] = '__post__'
289
+ text = fun.compile()
290
+ assert text == 'void main() {\n __pre__\nsome stuff;\n __post__\n}\n'
291
+
292
+ # Test variable expressions
293
+ fun = Function('void main(){$foo; $bar;}')
294
+ fun['foo'] = Variable('uniform float bla')
295
+ fun['bar'] = Variable('attribute float bla')
296
+ assert_is(type(fun['foo']), Variable)
297
+ assert_is(type(fun['bar']), Variable)
298
+ assert_in(fun['foo'], fun.dependencies())
299
+ assert_in(fun['bar'], fun.dependencies())
300
+
301
+ # Test special variables
302
+ fun = Function('void main(){$foo; $bar;}')
303
+ variable = Variable('attribute vec3 v_pos')
304
+ varying = Variable('varying vec3 color')
305
+ # These do not work due to index
306
+ assert_raises(TypeError, fun.__setitem__, 3, 3) # not a string
307
+ assert_raises(KeyError, fun.__setitem__, 'xxx', 3) # unknown template var
308
+ assert_raises(TypeError, fun.__setitem__, variable, 3) # only varyings
309
+ # These work
310
+ fun['gl_PointSize'] = '3.0'
311
+ fun[varying] = variable
312
+ # And getting works
313
+ assert_equal(fun['gl_PointSize'].text, '3.0')
314
+ assert_equal(fun[varying], variable)
315
+
316
+
317
+ def test_function_changed():
318
+ ch = []
319
+
320
+ class C(object):
321
+ def _dep_changed(self, dep, **kwargs):
322
+ ch.append(dep)
323
+ ch_obj = C()
324
+
325
+ def assert_changed(*objs):
326
+ assert set(ch) == set(objs)
327
+ while ch:
328
+ ch.pop()
329
+
330
+ fun1 = Function('void main(){$var1; $var2;}')
331
+ fun1._dependents[ch_obj] = None
332
+ fun1['var1'] = 'x'
333
+ fun1['var2'] = 'y'
334
+ assert_changed(fun1)
335
+
336
+ fun1['var1'] = 'z'
337
+ assert_changed(fun1)
338
+
339
+ # same value; should result in no change events
340
+ fun1['var1'] = 'z'
341
+ assert_changed()
342
+
343
+ fun1['var1'] = 0.5
344
+ var1 = fun1['var1']
345
+ var1._dependents[ch_obj] = None
346
+ assert_changed(fun1)
347
+
348
+ var1.name = 'xxx'
349
+ assert_changed(fun1, var1)
350
+
351
+ # changing type requires code change
352
+ var1.value = 7
353
+ assert_changed(fun1, var1)
354
+
355
+ # changing value (but not type) requires no code changes
356
+ var1.value = 6
357
+ assert_changed()
358
+
359
+ # test variable disconnect
360
+ fun1['var1'] = Variable('var1', 7)
361
+ var2 = fun1['var1']
362
+ var2._dependents[ch_obj] = None
363
+ # assert_changed(fun1)
364
+ # var2 is now connected
365
+ var2.value = (1, 2, 3, 4)
366
+ assert_changed(fun1, var2)
367
+ # ..but var1 no longer triggers fun1.changed
368
+ assert_changed()
369
+ var1.value = 0.5
370
+ assert_changed(var1)
371
+
372
+ # test expressions
373
+ fun2 = Function('float fn(float x){return $var1 + x;}')
374
+ fun3 = Function('float fn(float x){return $var1 + x;}')
375
+ exp1 = fun2(fun3(0.5))
376
+ fun1['var2'] = exp1
377
+ assert_changed(fun1)
378
+
379
+ fun2._dependents[ch_obj] = None
380
+ fun3._dependents[ch_obj] = None
381
+ exp1._dependents[ch_obj] = None
382
+
383
+ fun2['var1'] = 'x'
384
+ assert_changed(fun1, fun2, exp1)
385
+
386
+ fun3['var1'] = 'x'
387
+ assert_changed(fun1, fun3, exp1)
388
+
389
+ # test disconnect
390
+ fun1['var2'] = fun2
391
+ assert_changed(fun1)
392
+ # triggers change
393
+ fun2['var1'] = 0.9
394
+ assert_changed(fun1, fun2, exp1)
395
+ # no longer triggers change
396
+ fun3['var1'] = 0.9
397
+ assert_changed(fun3, exp1)
398
+
399
+
400
+ def test_FunctionChain():
401
+
402
+ f1 = Function("void f1(){}")
403
+ f2 = Function("void f2(){}")
404
+ f3 = Function("float f3(vec3 x){}")
405
+ f4 = Function("vec3 f4(vec3 y){}")
406
+ f5 = Function("vec3 f5(vec4 z){}")
407
+
408
+ ch = FunctionChain('chain', [f1, f2])
409
+ assert ch.name == 'chain'
410
+ assert ch.args == []
411
+ assert ch.rtype == 'void'
412
+
413
+ assert_in('f1', ch.compile())
414
+ assert_in('f2', ch.compile())
415
+
416
+ ch.remove(f2)
417
+ assert_not_in('f2', ch.compile())
418
+
419
+ ch.append(f2)
420
+ assert_in('f2', ch.compile())
421
+
422
+ ch = FunctionChain(funcs=[f5, f4, f3])
423
+ assert_equal('float', ch.rtype)
424
+ assert_equal([('vec4', 'z')], ch.args)
425
+ assert_in('f3', ch.compile())
426
+ assert_in('f4', ch.compile())
427
+ assert_in('f5', ch.compile())
428
+ assert_in(f3, ch.dependencies())
429
+ assert_in(f4, ch.dependencies())
430
+ assert_in(f5, ch.dependencies())
431
+
432
+
433
+ def test_StatementList():
434
+ func = Function("void func() {}")
435
+ main = Function("void main() {}")
436
+ main['pre'] = StatementList()
437
+ expr = func()
438
+ main['pre'].add(expr, 0)
439
+ assert list(main['pre'].items) == [expr]
440
+ main['pre'].add(expr)
441
+ assert list(main['pre'].items) == [expr]
442
+
443
+ code = main.compile()
444
+ assert " func();" in code
445
+
446
+ main['pre'].remove(expr)
447
+ assert list(main['pre'].items) == []
448
+
449
+
450
+ def test_MainFunction():
451
+ code = """
452
+ const float pi = 3.0; // close enough.
453
+
454
+ vec4 rotate(vec4 pos) {
455
+ return pos; // just kidding.
456
+ }
457
+
458
+ attribute mat4 m_transform;
459
+ attribute vec4 a_pos;
460
+ void main() {
461
+ gl_Position = m_transform * a_pos;
462
+ }
463
+ """
464
+
465
+ mf = MainFunction('vertex', code)
466
+
467
+ assert mf.name == 'main'
468
+ assert mf.rtype == 'void'
469
+ assert len(mf.args) == 0
470
+ sn = set(mf.static_names())
471
+ assert sn == set(['pi', 'rotate', 'pos', 'm_transform', 'a_pos'])
472
+
473
+
474
+ if __name__ == '__main__':
475
+ for key in [key for key in globals()]:
476
+ if key.startswith('test_'):
477
+ func = globals()[key]
478
+ print('running', func.__name__)
479
+ func()
480
+
481
+ # Uncomment to run example
482
+ print('='*80)
483
+ test_example1()
484
+
485
+
486
+ run_tests_if_main()
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ from vispy.visuals.shaders import MultiProgram, Function, StatementList
5
+ from vispy.visuals.transforms import STTransform, MatrixTransform
6
+
7
+
8
+ def test_multiprogram():
9
+ vert = """
10
+ uniform float u_scale;
11
+
12
+ void main() {
13
+ gl_Position = $transform(vec4(0, 0, 0, 0));
14
+ }
15
+ """
16
+
17
+ frag = """
18
+ void main() {
19
+ gl_FragColor = $color;
20
+ $post_hook
21
+ }
22
+ """
23
+
24
+ # test adding programs
25
+ mp = MultiProgram(vert, frag)
26
+ p1 = mp.add_program()
27
+ p2 = mp.add_program('p2')
28
+ assert 'p2' in mp._programs
29
+
30
+ # test weak reference to program
31
+ mp.add_program('junk')
32
+ assert 'junk' not in mp._programs and len(mp._programs) == 2
33
+
34
+ # test setting variables on multiprogram or individual programs
35
+ mp['u_scale'] = 2
36
+ assert p1['u_scale'] == 2
37
+ assert p2['u_scale'] == 2
38
+
39
+ p1['u_scale'] = 3
40
+ assert p1['u_scale'] == 3
41
+ assert p2['u_scale'] == 2
42
+
43
+ # test setting template variables globally
44
+ mp.frag['color'] = (1, 1, 1, 1)
45
+ assert p1.frag['color'].value == (1, 1, 1, 1)
46
+ assert p2.frag['color'].value == (1, 1, 1, 1)
47
+
48
+ # test setting template variables per-program
49
+ func = Function("""
50
+ void filter() {
51
+ gl_FragColor.r = 0.5;
52
+ }
53
+ """)
54
+ p1.frag['post_hook'] = StatementList()
55
+ p2.frag['post_hook'] = StatementList()
56
+ p2.frag['post_hook'].add(func())
57
+
58
+ tr1 = STTransform()
59
+ tr2 = MatrixTransform()
60
+ p1.vert['transform'] = tr1
61
+ p2.vert['transform'] = tr2
62
+
63
+ assert 'st_transform_map' in p1.vert.compile()
64
+ assert 'affine_transform_map' in p2.vert.compile()
65
+ assert 'filter' not in p1.frag.compile()
66
+ assert 'filter' in p2.frag.compile()
67
+
68
+ # test changing shader code
69
+ mp.vert = vert + '\n//test\n'
70
+ mp.vert['transform'] = tr1
71
+ assert '//test' in p1.vert.compile()
72
+
73
+ # test that newly-added programs inherit all previously set variables
74
+ p3 = mp.add_program()
75
+ assert p3['u_scale'] == 2
76
+ assert p3.frag['color'].value == (1, 1, 1, 1)
77
+ assert '//test' in p3.vert.compile()
78
+ assert 'st_transform_map' in p3.vert.compile()
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import re
5
+
6
+ from vispy.visuals.shaders.parsing import re_identifier, find_program_variables
7
+ from vispy.testing import run_tests_if_main
8
+
9
+
10
+ def test_identifier():
11
+ assert(re.match('('+re_identifier+')', 'Ax2_d3__7').groups()[0] ==
12
+ 'Ax2_d3__7')
13
+ assert(re.match('('+re_identifier+')', '_Ax2_d3__7').groups()[0] ==
14
+ '_Ax2_d3__7')
15
+ assert(re.match(re_identifier, '7Ax2_d3__7') is None)
16
+ assert(re.match('('+re_identifier+')', 'x,y').groups()[0] == 'x')
17
+ assert(re.match('('+re_identifier+')', 'x y').groups()[0] == 'x')
18
+
19
+
20
+ def test_find_variables():
21
+ code = """
22
+ float x;
23
+ float y, z;
24
+ int w,v,u;
25
+ junk
26
+ vec4 t = vec4(0, 0, 1, 1);
27
+ junk junk junk;
28
+ uniform vec2 s;
29
+ attribute float r,q;
30
+ const mat4 p;
31
+ void main() {
32
+ vec2 float undetectable;
33
+ }
34
+ """
35
+
36
+ expect = dict(
37
+ x=(None, 'float'),
38
+ y=(None, 'float'),
39
+ z=(None, 'float'),
40
+ w=(None, 'int'),
41
+ v=(None, 'int'),
42
+ u=(None, 'int'),
43
+ t=(None, 'vec4'),
44
+ s=('uniform', 'vec2'),
45
+ q=('attribute', 'float'),
46
+ r=('attribute', 'float'),
47
+ p=('const', 'mat4'),
48
+ )
49
+
50
+ vars = find_program_variables(code)
51
+ for k in expect:
52
+ assert expect[k] == vars.pop(k)
53
+
54
+ assert len(vars) == 0
55
+
56
+
57
+ run_tests_if_main()