vispy 0.15.0__cp313-cp313-macosx_11_0_arm64.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-313-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,145 @@
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
+
5
+
6
+ """Simple polygon visual based on MeshVisual and LineVisual"""
7
+
8
+ from __future__ import division
9
+
10
+ import numpy as np
11
+
12
+ from .visual import CompoundVisual
13
+ from .mesh import MeshVisual
14
+ from .line import LineVisual
15
+ from ..color import Color
16
+ from ..geometry import PolygonData
17
+ from ..gloo import set_state
18
+
19
+
20
+ class PolygonVisual(CompoundVisual):
21
+ """
22
+ Displays a 2D polygon
23
+
24
+ Parameters
25
+ ----------
26
+ pos : array
27
+ Set of vertices defining the polygon.
28
+ color : str | tuple | list of colors
29
+ Fill color of the polygon.
30
+ border_color : str | tuple | list of colors
31
+ Border color of the polygon.
32
+ border_width : int
33
+ Border width in pixels.
34
+ Line widths > 1px are only
35
+ guaranteed to work when using `border_method='agg'` method.
36
+ border_method : str
37
+ Mode to use for drawing the border line (see `LineVisual`).
38
+
39
+ * "agg" uses anti-grain geometry to draw nicely antialiased lines
40
+ with proper joins and endcaps.
41
+ * "gl" uses OpenGL's built-in line rendering. This is much faster,
42
+ but produces much lower-quality results and is not guaranteed to
43
+ obey the requested line width or join/endcap styles.
44
+
45
+ triangulate : boolean
46
+ Triangulate the set of vertices
47
+ **kwargs : dict
48
+ Keyword arguments to pass to `CompoundVisual`.
49
+ """
50
+
51
+ def __init__(self, pos=None, color='black',
52
+ border_color=None, border_width=1, border_method='gl',
53
+ triangulate=True, **kwargs):
54
+ self._mesh = MeshVisual()
55
+ self._border = LineVisual(method=border_method)
56
+ self._pos = pos
57
+ self._color = Color(color)
58
+ self._border_width = border_width
59
+ self._border_color = Color(border_color)
60
+ self._triangulate = triangulate
61
+
62
+ self._update()
63
+ CompoundVisual.__init__(self, [self._mesh, self._border], **kwargs)
64
+ self._mesh.set_gl_state(polygon_offset_fill=True,
65
+ polygon_offset=(1, 1), cull_face=False)
66
+ self.freeze()
67
+
68
+ def _update(self):
69
+ if self._pos is None:
70
+ return
71
+ if not self._color.is_blank and self._triangulate:
72
+ data = PolygonData(vertices=np.array(self._pos, dtype=np.float32))
73
+ pts, tris = data.triangulate()
74
+ set_state(polygon_offset_fill=False)
75
+ self._mesh.set_data(vertices=pts, faces=tris.astype(np.uint32),
76
+ color=self._color.rgba)
77
+ elif not self._color.is_blank:
78
+ self.mesh.set_data(vertices=self._pos,
79
+ color=self._color.rgba)
80
+
81
+ if not self._border_color.is_blank:
82
+ # Close border if it is not already.
83
+ border_pos = self._pos
84
+ if np.any(border_pos[0] != border_pos[-1]):
85
+ border_pos = np.concatenate([border_pos, border_pos[:1]],
86
+ axis=0)
87
+ self._border.set_data(pos=border_pos,
88
+ color=self._border_color.rgba,
89
+ width=self._border_width)
90
+
91
+ self._border.update()
92
+
93
+ @property
94
+ def pos(self):
95
+ """The vertex position of the polygon."""
96
+ return self._pos
97
+
98
+ @pos.setter
99
+ def pos(self, pos):
100
+ self._pos = pos
101
+ self._update()
102
+
103
+ @property
104
+ def color(self):
105
+ """The color of the polygon."""
106
+ return self._color
107
+
108
+ @color.setter
109
+ def color(self, color):
110
+ self._color = Color(color, clip=True)
111
+ self._update()
112
+
113
+ @property
114
+ def border_color(self):
115
+ """The border color of the polygon."""
116
+ return self._border_color
117
+
118
+ @border_color.setter
119
+ def border_color(self, border_color):
120
+ self._border_color = Color(border_color)
121
+ self._update()
122
+
123
+ @property
124
+ def mesh(self):
125
+ """The vispy.visuals.MeshVisual that is owned by the PolygonVisual.
126
+ It is used to fill in the polygon
127
+ """
128
+ return self._mesh
129
+
130
+ @mesh.setter
131
+ def mesh(self, mesh):
132
+ self._mesh = mesh
133
+ self._update()
134
+
135
+ @property
136
+ def border(self):
137
+ """The vispy.visuals.LineVisual that is owned by the PolygonVisual.
138
+ It is used to draw the border of the polygon
139
+ """
140
+ return self._border
141
+
142
+ @border.setter
143
+ def border(self, border):
144
+ self._border = border
145
+ self._update()
@@ -0,0 +1,196 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copradiusight (c) 2014, Vispy Development Team.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+
6
+ """Simple ellipse visual based on PolygonVisual"""
7
+
8
+ from __future__ import division
9
+
10
+ import numpy as np
11
+ from ..color import Color
12
+ from .polygon import PolygonVisual
13
+
14
+
15
+ class RectangleVisual(PolygonVisual):
16
+ """
17
+ Displays a 2D rectangle with optional rounded corners
18
+
19
+ Parameters
20
+ ----------
21
+ center : array
22
+ Center of the rectangle
23
+ color : instance of Color
24
+ The fill color to use.
25
+ border_color : instance of Color
26
+ The border color to use.
27
+ border_width : int
28
+ Border width in pixels.
29
+ Line widths > 1px are only
30
+ guaranteed to work when using `border_method='agg'` method.
31
+ height : float
32
+ Length of the rectangle along y-axis
33
+ Defaults to 1.0
34
+ width : float
35
+ Length of the rectangle along x-axis
36
+ Defaults to 1.0
37
+ radius : float | array
38
+ Radii of curvatures of corners in clockwise order from top-left
39
+ Defaults to 0.
40
+ **kwargs : dict
41
+ Keyword arguments to pass to `PolygonVisual`.
42
+ """
43
+
44
+ def __init__(self, center=None, color='black', border_color=None,
45
+ border_width=1, height=1.0, width=1.0,
46
+ radius=[0., 0., 0., 0.], **kwargs):
47
+
48
+ self._height = height
49
+ self._width = width
50
+ self._color = Color(color)
51
+ self._border_color = Color(border_color)
52
+ self._border_width = border_width
53
+ self._radius = radius
54
+ self._center = center
55
+
56
+ # triangulation can be very slow
57
+ kwargs.setdefault('triangulate', False)
58
+ PolygonVisual.__init__(self, pos=None, color=color,
59
+ border_color=border_color,
60
+ border_width=border_width, **kwargs)
61
+
62
+ self._mesh.mode = 'triangle_fan'
63
+ self._regen_pos()
64
+ self._update()
65
+
66
+ @staticmethod
67
+ def _generate_vertices(center, radius, height, width):
68
+ half_height = height / 2.
69
+ half_width = width / 2.
70
+ hw = min(half_height, half_width)
71
+
72
+ if isinstance(radius, (list, tuple)):
73
+ if len(radius) != 4:
74
+ raise ValueError("radius must be float or 4 value tuple/list"
75
+ " (got %s of length %d)" % (type(radius),
76
+ len(radius)))
77
+
78
+ if (radius > np.ones(4) * hw).all():
79
+ raise ValueError('Radius of curvature cannot be greater than\
80
+ half of min(width, height)')
81
+ radius = np.array(radius, dtype=np.float32)
82
+
83
+ else:
84
+ if radius > hw:
85
+ raise ValueError('Radius of curvature cannot be greater than\
86
+ half of min(width, height)')
87
+ radius = np.ones(4) * radius
88
+
89
+ num_segments = (radius / hw * 500.).astype(int)
90
+
91
+ bias1 = np.ones(4) * half_width - radius
92
+ bias2 = np.ones(4) * half_height - radius
93
+
94
+ corner1 = np.empty([num_segments[0]+1, 3], dtype=np.float32)
95
+ corner2 = np.empty([num_segments[1]+1, 3], dtype=np.float32)
96
+ corner3 = np.empty([num_segments[2]+1, 3], dtype=np.float32)
97
+ corner4 = np.empty([num_segments[3]+1, 3], dtype=np.float32)
98
+
99
+ start_angle = 0.
100
+ end_angle = np.pi / 2.
101
+
102
+ theta = np.linspace(end_angle, start_angle, num_segments[0]+1)
103
+
104
+ corner1[:, 0] = center[0] - bias1[0] - radius[0] * np.sin(theta)
105
+ corner1[:, 1] = center[1] - bias2[0] - radius[0] * np.cos(theta)
106
+ corner1[:, 2] = 0
107
+
108
+ theta = np.linspace(start_angle, end_angle, num_segments[1]+1)
109
+
110
+ corner2[:, 0] = center[0] + bias1[1] + radius[1] * np.sin(theta)
111
+ corner2[:, 1] = center[1] - bias2[1] - radius[1] * np.cos(theta)
112
+ corner2[:, 2] = 0
113
+
114
+ theta = np.linspace(end_angle, start_angle, num_segments[2]+1)
115
+
116
+ corner3[:, 0] = center[0] + bias1[2] + radius[2] * np.sin(theta)
117
+ corner3[:, 1] = center[1] + bias2[2] + radius[2] * np.cos(theta)
118
+ corner3[:, 2] = 0
119
+
120
+ theta = np.linspace(start_angle, end_angle, num_segments[3]+1)
121
+
122
+ corner4[:, 0] = center[0] - bias1[3] - radius[3] * np.sin(theta)
123
+ corner4[:, 1] = center[1] + bias2[3] + radius[3] * np.cos(theta)
124
+ corner4[:, 2] = 0
125
+
126
+ output = np.concatenate(([[center[0], center[1], 0.]],
127
+ [[center[0] - half_width, center[1], 0.]],
128
+ corner1,
129
+ [[center[0], center[1] - half_height, 0.]],
130
+ corner2,
131
+ [[center[0] + half_width, center[1], 0.]],
132
+ corner3,
133
+ [[center[0], center[1] + half_height, 0.]],
134
+ corner4,
135
+ [[center[0] - half_width, center[1], 0.]]))
136
+
137
+ vertices = np.array(output, dtype=np.float32)
138
+ return vertices
139
+
140
+ @property
141
+ def center(self):
142
+ """The center of the ellipse"""
143
+ return self._center
144
+
145
+ @center.setter
146
+ def center(self, center):
147
+ """The center of the ellipse"""
148
+ self._center = center
149
+ self._regen_pos()
150
+ self._update()
151
+
152
+ @property
153
+ def height(self):
154
+ """The height of the rectangle."""
155
+ return self._height
156
+
157
+ @height.setter
158
+ def height(self, height):
159
+ if height <= 0.:
160
+ raise ValueError('Height must be positive')
161
+ self._height = height
162
+ self._regen_pos()
163
+ self._update()
164
+
165
+ @property
166
+ def width(self):
167
+ """The width of the rectangle."""
168
+ return self._width
169
+
170
+ @width.setter
171
+ def width(self, width):
172
+ if width <= 0.:
173
+ raise ValueError('Width must be positive')
174
+ self._width = width
175
+ self._regen_pos()
176
+ self._update()
177
+
178
+ @property
179
+ def radius(self):
180
+ """The radius of curvature of rounded corners."""
181
+ return self._radius
182
+
183
+ @radius.setter
184
+ def radius(self, radius):
185
+ self._radius = radius
186
+ self._regen_pos()
187
+ self._update()
188
+
189
+ def _regen_pos(self):
190
+ vertices = self._generate_vertices(center=self._center,
191
+ radius=self._radius,
192
+ height=self._height,
193
+ width=self._width)
194
+ # don't use the center point and only use X/Y coordinates
195
+ vertices = vertices[1:, ..., :2]
196
+ self._pos = vertices
@@ -0,0 +1,56 @@
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
+
5
+
6
+ """RegularPolygonVisual visual based on EllipseVisual"""
7
+
8
+ from __future__ import division
9
+
10
+ from .ellipse import EllipseVisual
11
+
12
+
13
+ class RegularPolygonVisual(EllipseVisual):
14
+ """
15
+ Displays a regular polygon
16
+
17
+ Parameters
18
+ ----------
19
+ center : array-like (x, y)
20
+ Center of the regular polygon
21
+ color : str | tuple | list of colors
22
+ Fill color of the polygon
23
+ border_color : str | tuple | list of colors
24
+ Border color of the polygon
25
+ border_width: float
26
+ The width of the border in pixels
27
+ radius : float
28
+ Radius of the regular polygon
29
+ Defaults to 0.1
30
+ sides : int
31
+ Number of sides of the regular polygon
32
+ """
33
+
34
+ def __init__(self, center=None, color='black', border_color=None,
35
+ border_width=1, radius=0.1, sides=4, **kwargs):
36
+ EllipseVisual.__init__(self, center=center,
37
+ radius=radius,
38
+ color=color,
39
+ border_color=border_color,
40
+ border_width=border_width,
41
+ num_segments=sides, **kwargs)
42
+
43
+ @property
44
+ def sides(self):
45
+ """The number of sides in the regular polygon."""
46
+ # return using the property accessor for num_segments
47
+ return self.num_segments
48
+
49
+ @sides.setter
50
+ def sides(self, sides):
51
+ if sides < 3:
52
+ raise ValueError('PolygonVisual must have at least 3 sides, not %s'
53
+ % sides)
54
+ # edit using the property accessor of num_segments so this
55
+ # internally calls the update()
56
+ self.num_segments = sides
@@ -0,0 +1,197 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+ import numpy as np
7
+
8
+ from .visual import Visual
9
+ from .. import gloo
10
+
11
+
12
+ class ScrollingLinesVisual(Visual):
13
+ """Displays many line strips of equal length, with the option to add new
14
+ vertex data to one end of the lines.
15
+
16
+ Parameters
17
+ ----------
18
+ n_lines : int
19
+ The number of independent line strips to draw.
20
+ line_size : int
21
+ The number of samples in each line strip.
22
+ dx : float
23
+ The x distance between samples
24
+ color : array-like
25
+ An array of colors to assign to each line strip.
26
+ pos_offset : array-like
27
+ An array of x, y position offsets to apply to each line strip.
28
+ columns : int
29
+ Arrange line strips into a grid with this number of columns. This
30
+ option is not compatible with *pos_offset*.
31
+ cell_size : tuple
32
+ The x, y distance between cells in the grid.
33
+ """
34
+
35
+ vertex_code = """
36
+ attribute vec2 index; // .x=line_n, .y=vertex_n
37
+ uniform sampler2D position;
38
+ uniform sampler1D pos_offset;
39
+ uniform sampler1D color_tex;
40
+
41
+ uniform vec2 pos_size; // x=n_lines, y=n_verts_per_line
42
+ uniform float offset; // rolling pointer into vertexes
43
+ uniform float dx; // x step per sample
44
+
45
+ varying vec2 v_index;
46
+ varying vec4 v_color;
47
+
48
+
49
+ void main() {
50
+ v_index = vec2(mod(index.y + offset, pos_size.y), index.x);
51
+ vec2 uv = (v_index + 0.5) / (pos_size.yx);
52
+ vec4 pos = vec4(index.y * dx, texture2D(position, uv).r, 0, 1);
53
+
54
+ // fetch starting position from texture lookup:
55
+ pos += vec4(texture1D(pos_offset, (index.x + 0.5) / pos_size.x).rg,
56
+ 0, 0);
57
+
58
+ gl_Position = $transform(pos);
59
+
60
+ v_color = texture1D(color_tex, (index.x + 0.5) / pos_size.x);
61
+ }
62
+ """
63
+
64
+ fragment_code = """
65
+ varying vec2 v_index;
66
+ varying vec4 v_color;
67
+
68
+ void main() {
69
+ if (v_index.y - floor(v_index.y) > 0) {
70
+ discard;
71
+ }
72
+ gl_FragColor = $color;
73
+ }
74
+ """
75
+
76
+ def __init__(self, n_lines, line_size, dx, color=None, pos_offset=None,
77
+ columns=None, cell_size=None):
78
+ self._pos_data = None
79
+ self._offset = 0
80
+ self._dx = dx
81
+
82
+ data = np.zeros((n_lines, line_size), dtype='float32')
83
+ self._pos_tex = gloo.Texture2D(data, format='luminance',
84
+ internalformat='r32f')
85
+ self._index_buf = gloo.VertexBuffer()
86
+ self._data_shape = data.shape
87
+
88
+ Visual.__init__(self, vcode=self.vertex_code, fcode=self.fragment_code)
89
+
90
+ self.shared_program['position'] = self._pos_tex
91
+ self.shared_program['index'] = self._index_buf
92
+ self.shared_program['dx'] = dx
93
+ self.shared_program['pos_size'] = data.shape
94
+ self.shared_program['offset'] = self._offset
95
+
96
+ # set an array giving the x/y origin for each plot
97
+ if pos_offset is None:
98
+ # construct positions as a grid
99
+ rows = int(np.ceil(n_lines / columns))
100
+ pos_offset = np.empty((rows, columns, 3), dtype='float32')
101
+ pos_offset[..., 0] = (np.arange(columns)[np.newaxis, :] *
102
+ cell_size[0])
103
+ pos_offset[..., 1] = np.arange(rows)[:, np.newaxis] * cell_size[1]
104
+ # limit position texture to the number of lines in case there are
105
+ # more row/column cells than lines
106
+ pos_offset = pos_offset.reshape((rows*columns), 3)[:n_lines, :]
107
+ self._pos_offset = gloo.Texture1D(pos_offset, internalformat='rgb32f',
108
+ interpolation='nearest')
109
+ self.shared_program['pos_offset'] = self._pos_offset
110
+
111
+ if color is None:
112
+ # default to white (1, 1, 1, 1)
113
+ self._color_tex = gloo.Texture1D(
114
+ np.ones((n_lines, 4), dtype=np.float32))
115
+ self.shared_program['color_tex'] = self._color_tex
116
+ self.shared_program.frag['color'] = 'v_color'
117
+ else:
118
+ self._color_tex = gloo.Texture1D(color)
119
+ self.shared_program['color_tex'] = self._color_tex
120
+ self.shared_program.frag['color'] = 'v_color'
121
+
122
+ # construct a vertex buffer index containing (plot_n, vertex_n) for
123
+ # each vertex
124
+ index = np.empty((data.shape[0], data.shape[1], 2), dtype='float32')
125
+ index[..., 0] = np.arange(data.shape[0])[:, np.newaxis]
126
+ index[..., 1] = np.arange(data.shape[1])[np.newaxis, :]
127
+ index = index.reshape((index.shape[0]*index.shape[1], index.shape[2]))
128
+ self._index_buf.set_data(index)
129
+
130
+ self._draw_mode = 'line_strip'
131
+ self.set_gl_state('translucent', line_width=1)
132
+ self.freeze()
133
+
134
+ def set_pos_offset(self, po):
135
+ """Set the array of position offsets for each line strip.
136
+
137
+ Parameters
138
+ ----------
139
+ po : array-like
140
+ An array of xy offset values.
141
+ """
142
+ self._pos_offset.set_data(po)
143
+
144
+ def set_color(self, color):
145
+ """Set the array of colors for each line strip.
146
+
147
+ Parameters
148
+ ----------
149
+ color : array-like
150
+ An array of rgba values.
151
+ """
152
+ self._color_tex.set_data(color)
153
+
154
+ def _prepare_transforms(self, view):
155
+ view.view_program.vert['transform'] = view.get_transform().simplified
156
+
157
+ def _prepare_draw(self, view):
158
+ pass
159
+
160
+ def _compute_bounds(self, axis, view):
161
+ if self._pos_data is None:
162
+ return None
163
+ return self._pos_data[..., axis].min(), self.pos_data[..., axis].max()
164
+
165
+ def roll_data(self, data):
166
+ """Append new data to the right side of every line strip and remove
167
+ as much data from the left.
168
+
169
+ Parameters
170
+ ----------
171
+ data : array-like
172
+ A data array to append.
173
+ """
174
+ data = data.astype('float32')[..., np.newaxis]
175
+ s1 = self._data_shape[1] - self._offset
176
+ if data.shape[1] > s1:
177
+ self._pos_tex[:, self._offset:] = data[:, :s1]
178
+ self._pos_tex[:, :data.shape[1] - s1] = data[:, s1:]
179
+ self._offset = (self._offset + data.shape[1]) % self._data_shape[1]
180
+ else:
181
+ self._pos_tex[:, self._offset:self._offset+data.shape[1]] = data
182
+ self._offset += data.shape[1]
183
+ self.shared_program['offset'] = self._offset
184
+ self.update()
185
+
186
+ def set_data(self, index, data):
187
+ """Set the complete data for a single line strip.
188
+
189
+ Parameters
190
+ ----------
191
+ index : int
192
+ The index of the line strip to be replaced.
193
+ data : array-like
194
+ The data to assign to the selected line strip.
195
+ """
196
+ self._pos_tex[index, :] = data
197
+ self.update()
@@ -0,0 +1,17 @@
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
+ """
5
+ Provides functionality for composing shaders from multiple GLSL
6
+ code snippets.
7
+ """
8
+
9
+ __all__ = ['ModularProgram', 'Function', 'MainFunction', 'Variable', 'Varying',
10
+ 'FunctionChain', 'Compiler', 'MultiProgram']
11
+
12
+ from .program import ModularProgram # noqa
13
+ from .function import Function, MainFunction, FunctionChain # noqa
14
+ from .function import StatementList # noqa
15
+ from .variable import Variable, Varying # noqa
16
+ from .compiler import Compiler # noqa
17
+ from .multiprogram import MultiProgram # noqa