vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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

Potentially problematic release.


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

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,810 @@
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
+ """Marker Visual and shader definitions."""
7
+
8
+ import numpy as np
9
+
10
+ from ..color import ColorArray
11
+ from ..gloo import VertexBuffer
12
+ from .shaders import Function, Variable
13
+ from .visual import Visual
14
+ from ..util.event import Event
15
+
16
+
17
+ _VERTEX_SHADER = """
18
+ uniform float u_antialias;
19
+ uniform float u_px_scale;
20
+ uniform bool u_scaling;
21
+ uniform bool u_spherical;
22
+
23
+ attribute vec3 a_position;
24
+ attribute vec4 a_fg_color;
25
+ attribute vec4 a_bg_color;
26
+ attribute float a_edgewidth;
27
+ attribute float a_size;
28
+ attribute float a_symbol;
29
+
30
+ varying vec4 v_fg_color;
31
+ varying vec4 v_bg_color;
32
+ varying float v_edgewidth;
33
+ varying float v_depth_middle;
34
+ varying float v_alias_ratio;
35
+ varying float v_symbol;
36
+
37
+ float big_float = 1e10; // prevents numerical imprecision
38
+
39
+ void main (void) {
40
+ v_fg_color = a_fg_color;
41
+ v_bg_color = a_bg_color;
42
+ // fluctuations can mess "fake integers" up, so we do +0.5 and floor to make sure it's right
43
+ v_symbol = a_symbol + 0.5;
44
+
45
+ vec4 pos = vec4(a_position, 1);
46
+ vec4 fb_pos = $visual_to_framebuffer(pos);
47
+ vec4 x;
48
+ vec4 size_vec;
49
+ gl_Position = $framebuffer_to_render(fb_pos);
50
+
51
+ // NOTE: gl_stuff uses framebuffer coords!
52
+ if (u_scaling) {
53
+ // scaling == "scene": scale marker using entire visual -> framebuffer set of transforms
54
+ // scaling == "visual": scale marker using only the Visual's transform
55
+ pos = $framebuffer_to_scene_or_visual(fb_pos);
56
+ x = $framebuffer_to_scene_or_visual(fb_pos + vec4(big_float, 0, 0, 0));
57
+ x = (x - pos);
58
+ // multiply that direction by the size and add it to the position
59
+ // this gives us the position of the edge of the point, which we convert in screen space
60
+ size_vec = $scene_or_visual_to_framebuffer(pos + normalize(x) * a_size);
61
+ // divide by `w` for perspective, and subtract pos
62
+ // this gives us the actual screen-space size of the point
63
+ $v_size = size_vec.x / size_vec.w - fb_pos.x / fb_pos.w;
64
+ v_edgewidth = ($v_size / a_size) * a_edgewidth;
65
+ }
66
+ else {
67
+ // scaling == "fixed": marker is always the same number of pixels
68
+ $v_size = a_size * u_px_scale;
69
+ v_edgewidth = a_edgewidth * u_px_scale;
70
+ }
71
+
72
+ // gl_PointSize is the diameter
73
+ gl_PointSize = $v_size + 4. * (v_edgewidth + 1.5 * u_antialias);
74
+
75
+ if (u_spherical == true) {
76
+ // similar as above for scaling, but in towards the screen direction
77
+ // Get the framebuffer z direction relative to this sphere in visual coords
78
+ vec4 z = $framebuffer_to_scene_or_visual(fb_pos + vec4(0, 0, big_float, 0));
79
+ z = (z - pos);
80
+ // Get the depth of the sphere in its middle point on the screen
81
+ // size/2 because we need the radius, not the diameter
82
+ vec4 depth_z_vec = $scene_or_visual_to_framebuffer(pos + normalize(z) * a_size / 2);
83
+ v_depth_middle = depth_z_vec.z / depth_z_vec.w - fb_pos.z / fb_pos.w;
84
+ // size ratio between aliased and non-aliased, needed for correct depth
85
+ v_alias_ratio = gl_PointSize / $v_size;
86
+ }
87
+ }
88
+ """
89
+
90
+
91
+ _FRAGMENT_SHADER = """#version 120
92
+ uniform vec3 u_light_position;
93
+ uniform vec3 u_light_color;
94
+ uniform float u_light_ambient;
95
+ uniform float u_alpha;
96
+ uniform float u_antialias;
97
+ uniform bool u_spherical;
98
+
99
+ varying vec4 v_fg_color;
100
+ varying vec4 v_bg_color;
101
+ varying float v_edgewidth;
102
+ varying float v_depth_middle;
103
+ varying float v_alias_ratio;
104
+ varying float v_symbol;
105
+
106
+ void main()
107
+ {
108
+ // Discard plotting marker body and edge if zero-size
109
+ if ($v_size <= 0.)
110
+ discard;
111
+
112
+ float edgealphafactor = min(v_edgewidth, 1.0);
113
+
114
+ float size = $v_size + 4.*(v_edgewidth + 1.5*u_antialias);
115
+ // factor 6 for acute edge angles that need room as for star marker
116
+
117
+ // The marker function needs to be linked with this shader
118
+ float r = $marker(gl_PointCoord, size, int(v_symbol));
119
+
120
+ // it takes into account an antialising layer
121
+ // of size u_antialias inside the edge
122
+ // r:
123
+ // [-e/2-a, -e/2+a] antialising face-edge
124
+ // [-e/2+a, e/2-a] core edge (center 0, diameter e-2a = 2t)
125
+ // [e/2-a, e/2+a] antialising edge-background
126
+ // use max because we don't want negative transition zone
127
+ float t = max(0.5*v_edgewidth - u_antialias, 0);
128
+ float d = abs(r) - t;
129
+
130
+ if (r > 0.5*v_edgewidth + u_antialias)
131
+ {
132
+ // out of the marker (beyond the outer edge of the edge
133
+ // including transition zone due to antialiasing)
134
+ discard;
135
+ }
136
+
137
+ vec4 facecolor = v_bg_color;
138
+ vec4 edgecolor = vec4(v_fg_color.rgb, edgealphafactor*v_fg_color.a);
139
+ float depth_change = 0;
140
+
141
+ // change color and depth if spherical mode is active
142
+ if (u_spherical == true) {
143
+ // multiply by alias_ratio and then clamp, so we're back to non-alias coordinates
144
+ // and the aliasing ring has the same coordinates as the point just inside,
145
+ // which is important for lighting
146
+ vec2 texcoord = (gl_PointCoord * 2 - 1) * v_alias_ratio;
147
+ float x = clamp(texcoord.x, -1, 1);
148
+ float y = clamp(texcoord.y, -1, 1);
149
+ float z = sqrt(clamp(1 - x*x - y*y, 0, 1));
150
+ vec3 normal = vec3(x, y, z);
151
+
152
+ // Diffuse color
153
+ float diffuse = dot(u_light_position, normal);
154
+ // clamp, because 0 < theta < pi/2
155
+ diffuse = clamp(diffuse, 0, 1);
156
+ vec3 diffuse_color = u_light_ambient + u_light_color * diffuse;
157
+
158
+ // Specular color
159
+ // reflect light wrt normal for the reflected ray, then
160
+ // find the angle made with the eye
161
+ vec3 eye = vec3(0, 0, -1);
162
+ float specular = dot(reflect(u_light_position, normal), eye);
163
+ specular = clamp(specular, 0, 1);
164
+ // raise to the material's shininess, multiply with a
165
+ // small factor for spread
166
+ specular = pow(specular, 80);
167
+ vec3 specular_color = u_light_color * specular;
168
+
169
+ facecolor = vec4(facecolor.rgb * diffuse_color + specular_color, facecolor.a * u_alpha);
170
+ edgecolor = vec4(edgecolor.rgb * diffuse_color + specular_color, edgecolor.a * u_alpha);
171
+ // TODO: figure out why this 0.5 is needed, despite already having the radius, not diameter
172
+ depth_change = -0.5 * z * v_depth_middle;
173
+ }
174
+
175
+ if (d < 0.0)
176
+ {
177
+ // inside the width of the edge
178
+ // (core, out of the transition zone for antialiasing)
179
+ gl_FragColor = edgecolor;
180
+ }
181
+ else if (v_edgewidth == 0.)
182
+ {// no edge
183
+ if (r > -u_antialias)
184
+ {// outside
185
+ float alpha = 1.0 + r/u_antialias;
186
+ alpha = exp(-alpha*alpha);
187
+ gl_FragColor = vec4(facecolor.rgb, alpha*facecolor.a);
188
+ }
189
+ else
190
+ {// inside
191
+ gl_FragColor = facecolor;
192
+ }
193
+ }
194
+ else
195
+ {// non-zero edge
196
+ float alpha = d/u_antialias;
197
+ alpha = exp(-alpha*alpha);
198
+ if (r > 0.)
199
+ {
200
+ // outer part of the edge: fade out into the background...
201
+ gl_FragColor = vec4(edgecolor.rgb, alpha*edgecolor.a);
202
+ }
203
+ else
204
+ {
205
+ // inner part of the edge: fade into the face color
206
+ gl_FragColor = mix(facecolor, edgecolor, alpha);
207
+ }
208
+ }
209
+ gl_FragDepth = gl_FragCoord.z + depth_change;
210
+ }
211
+ """
212
+
213
+ disc = """
214
+ float r = length((pointcoord.xy - vec2(0.5,0.5))*size);
215
+ r -= $v_size/2.;
216
+ return r;
217
+ """
218
+
219
+
220
+ arrow = """
221
+ const float sqrt2 = sqrt(2.);
222
+ float half_size = $v_size/2.;
223
+ float ady = abs(pointcoord.y -.5)*size;
224
+ float dx = (pointcoord.x -.5)*size;
225
+ float r1 = abs(dx) + ady - half_size;
226
+ float r2 = dx + 0.25*$v_size + ady - half_size;
227
+ float r = max(r1,-r2);
228
+ return r/sqrt2;//account for slanted edge and correct for width
229
+ """
230
+
231
+
232
+ ring = """
233
+ float r1 = length((pointcoord.xy - vec2(0.5,0.5))*size) - $v_size/2.;
234
+ float r2 = length((pointcoord.xy - vec2(0.5,0.5))*size) - $v_size/4.;
235
+ float r = max(r1,-r2);
236
+ return r;
237
+ """
238
+
239
+ clobber = """
240
+ const float sqrt3 = sqrt(3.);
241
+ const float PI = 3.14159265358979323846264;
242
+ const float t1 = -PI/2;
243
+ float circle_radius = 0.32 * $v_size;
244
+ float center_shift = 0.36/sqrt3 * $v_size;
245
+ //total size (horizontal) = 2*circle_radius + sqrt3*center_shirt = $v_size
246
+ vec2 c1 = vec2(cos(t1),sin(t1))*center_shift;
247
+ const float t2 = t1+2*PI/3;
248
+ vec2 c2 = vec2(cos(t2),sin(t2))*center_shift;
249
+ const float t3 = t2+2*PI/3;
250
+ vec2 c3 = vec2(cos(t3),sin(t3))*center_shift;
251
+ //xy is shift to center marker vertically
252
+ vec2 xy = (pointcoord.xy-vec2(0.5,0.5))*size + vec2(0.,-0.25*center_shift);
253
+ float r1 = length(xy - c1) - circle_radius;
254
+ float r2 = length(xy - c2) - circle_radius;
255
+ float r3 = length(xy - c3) - circle_radius;
256
+ float r = min(min(r1,r2),r3);
257
+ return r;
258
+ """
259
+
260
+
261
+ square = """
262
+ float r = max(abs(pointcoord.x -.5)*size, abs(pointcoord.y -.5)*size);
263
+ r -= $v_size/2.;
264
+ return r;
265
+ """
266
+
267
+ x = """
268
+ vec2 rotcoord = vec2((pointcoord.x + pointcoord.y - 1.) / sqrt(2.),
269
+ (pointcoord.y - pointcoord.x) / sqrt(2.));
270
+ //vbar
271
+ float r1 = abs(rotcoord.x)*size - $v_size/6.;
272
+ float r2 = abs(rotcoord.y)*size - $v_size/2.;
273
+ float vbar = max(r1,r2);
274
+ //hbar
275
+ float r3 = abs(rotcoord.y)*size - $v_size/6.;
276
+ float r4 = abs(rotcoord.x)*size - $v_size/2.;
277
+ float hbar = max(r3,r4);
278
+ return min(vbar, hbar);
279
+ """
280
+
281
+
282
+ diamond = """
283
+ float r = abs(pointcoord.x -.5)*size + abs(pointcoord.y -.5)*size;
284
+ r -= $v_size/2.;
285
+ return r / sqrt(2.);//account for slanted edge and correct for width
286
+ """
287
+
288
+
289
+ vbar = """
290
+ float r1 = abs(pointcoord.x - 0.5)*size - $v_size/6.;
291
+ float r3 = abs(pointcoord.y - 0.5)*size - $v_size/2.;
292
+ float r = max(r1,r3);
293
+ return r;
294
+ """
295
+
296
+ hbar = """
297
+ float r2 = abs(pointcoord.y - 0.5)*size - $v_size/6.;
298
+ float r3 = abs(pointcoord.x - 0.5)*size - $v_size/2.;
299
+ float r = max(r2,r3);
300
+ return r;
301
+ """
302
+
303
+ cross = """
304
+ //vbar
305
+ float r1 = abs(pointcoord.x - 0.5)*size - $v_size/6.;
306
+ float r2 = abs(pointcoord.y - 0.5)*size - $v_size/2.;
307
+ float vbar = max(r1,r2);
308
+ //hbar
309
+ float r3 = abs(pointcoord.y - 0.5)*size - $v_size/6.;
310
+ float r4 = abs(pointcoord.x - 0.5)*size - $v_size/2.;
311
+ float hbar = max(r3,r4);
312
+ return min(vbar, hbar);
313
+ """
314
+
315
+
316
+ tailed_arrow = """
317
+ const float sqrt2 = sqrt(2.);
318
+ float half_size = $v_size/2.;
319
+ float ady = abs(pointcoord.y -.5)*size;
320
+ float dx = (pointcoord.x -.5)*size;
321
+ float r1 = abs(dx) + ady - half_size;
322
+ float r2 = dx + 0.25*$v_size + ady - half_size;
323
+ float arrow = max(r1,-r2);
324
+ //hbar
325
+ float upper_bottom_edges = ady - $v_size/8./sqrt2;
326
+ float left_edge = -dx - half_size;
327
+ float right_edge = dx + ady - half_size;
328
+ float hbar = max(upper_bottom_edges, left_edge);
329
+ float scale = 1.; //rescaling for slanted edge
330
+ if (right_edge >= hbar)
331
+ {
332
+ hbar = right_edge;
333
+ scale = sqrt2;
334
+ }
335
+ if (arrow <= hbar)
336
+ {
337
+ return arrow / sqrt2;//account for slanted edge and correct for width
338
+ }
339
+ else
340
+ {
341
+ return hbar / scale;
342
+ }
343
+ """
344
+
345
+
346
+ triangle_up = """
347
+ float height = $v_size*sqrt(3.)/2.;
348
+ float bottom = ((pointcoord.y - 0.5)*size - height/2.);
349
+ float rotated_y = sqrt(3.)/2. * (pointcoord.x - 0.5) * size
350
+ - 0.5 * ((pointcoord.y - 0.5)*size - height/6.) + height/6.;
351
+ float right_edge = (rotated_y - height/2.);
352
+ float cc_rotated_y = -sqrt(3.)/2. * (pointcoord.x - 0.5)*size
353
+ - 0.5 * ((pointcoord.y - 0.5)*size - height/6.) + height/6.;
354
+ float left_edge = (cc_rotated_y - height/2.);
355
+ float slanted_edges = max(right_edge, left_edge);
356
+ return max(slanted_edges, bottom);
357
+ """
358
+
359
+ triangle_down = """
360
+ float height = -$v_size*sqrt(3.)/2.;
361
+ float bottom = -((pointcoord.y - 0.5)*size - height/2.);
362
+ float rotated_y = sqrt(3.)/2. * (pointcoord.x - 0.5) * size
363
+ - 0.5 * ((pointcoord.y - 0.5)*size - height/6.) + height/6.;
364
+ float right_edge = -(rotated_y - height/2.);
365
+ float cc_rotated_y = -sqrt(3.)/2. * (pointcoord.x - 0.5)*size
366
+ - 0.5 * ((pointcoord.y - 0.5)*size - height/6.) + height/6.;
367
+ float left_edge = -(cc_rotated_y - height/2.);
368
+ float slanted_edges = max(right_edge, left_edge);
369
+ return max(slanted_edges, bottom);
370
+ """
371
+
372
+
373
+ star = """
374
+ float star = -10000.;
375
+ const float PI2_5 = 3.141592653589*2./5.;
376
+ const float PI2_20 = 3.141592653589/10.; //PI*2/20
377
+ // downwards shift to that the marker center is halfway vertically
378
+ // between the top of the upward spike (y = -v_size/2.)
379
+ // and the bottom of one of two downward spikes
380
+ // (y = +v_size/2.*cos(2.*pi/10.) approx +v_size/2.*0.8)
381
+ // center is at -v_size/2.*0.1
382
+ float shift_y = -0.05*$v_size;
383
+ // first spike upwards,
384
+ // rotate spike by 72 deg four times to complete the star
385
+ for (int i = 0; i <= 4; i++)
386
+ {
387
+ //if not the first spike, rotate it upwards
388
+ float x = (pointcoord.x - 0.5)*size;
389
+ float y = (pointcoord.y - 0.5)*size;
390
+ float spike_rot_angle = float(i) * PI2_5;
391
+ float cosangle = cos(spike_rot_angle);
392
+ float sinangle = sin(spike_rot_angle);
393
+ float spike_x = x;
394
+ float spike_y = y + shift_y;
395
+ if (i > 0)
396
+ {
397
+ spike_x = cosangle * x - sinangle * (y + shift_y);
398
+ spike_y = sinangle * x + cosangle * (y + shift_y);
399
+ }
400
+ // in the frame where the spike is upwards:
401
+ // rotate 18 deg the zone x < 0 around the top of the star
402
+ // (point whose coords are -s/2, 0 where s is the size of the marker)
403
+ // compute y coordonates as well because
404
+ // we do a second rotation to put the spike at its final position
405
+ float rot_center_y = -$v_size/2.;
406
+ float rot18x = cos(PI2_20) * spike_x
407
+ - sin(PI2_20) * (spike_y - rot_center_y);
408
+ //rotate -18 deg the zone x > 0 arount the top of the star
409
+ float rot_18x = cos(PI2_20) * spike_x
410
+ + sin(PI2_20) * (spike_y - rot_center_y);
411
+ float bottom = spike_y - $v_size/10.;
412
+ // max(left edge, right edge)
413
+ float spike = max(bottom, max(rot18x, -rot_18x));
414
+ if (i == 0)
415
+ {// first spike, skip the rotation
416
+ star = spike;
417
+ }
418
+ else // i > 0
419
+ {
420
+ star = min(star, spike);
421
+ }
422
+ }
423
+ return star;
424
+ """
425
+
426
+ cross_lines = """
427
+ //vbar
428
+ float r1 = abs(pointcoord.x - 0.5)*size;
429
+ float r2 = abs(pointcoord.y - 0.5)*size - $v_size/2;
430
+ float vbar = max(r1,r2);
431
+ //hbar
432
+ float r3 = abs(pointcoord.y - 0.5)*size;
433
+ float r4 = abs(pointcoord.x - 0.5)*size - $v_size/2;
434
+ float hbar = max(r3,r4);
435
+ return min(vbar, hbar);
436
+ """
437
+
438
+ symbol_shaders = {
439
+ 'disc': disc,
440
+ 'arrow': arrow,
441
+ 'ring': ring,
442
+ 'clobber': clobber,
443
+ 'square': square,
444
+ 'x': x,
445
+ 'diamond': diamond,
446
+ 'vbar': vbar,
447
+ 'hbar': hbar,
448
+ 'cross': cross,
449
+ 'tailed_arrow': tailed_arrow,
450
+ 'triangle_up': triangle_up,
451
+ 'triangle_down': triangle_down,
452
+ 'star': star,
453
+ 'cross_lines': cross_lines,
454
+ }
455
+
456
+ # combine all the symbol shaders in a big if-else statement
457
+ symbol_func = f"""
458
+ float symbol(vec2 pointcoord, float size, int symbol) {{
459
+ {' else'.join(
460
+ f''' if (symbol == {i}) {{
461
+ // {name}
462
+ {shader}
463
+ }}'''
464
+ for i, (name, shader) in enumerate(symbol_shaders.items())
465
+ )}
466
+ }}"""
467
+
468
+ # aliases
469
+ symbol_aliases = {
470
+ 'o': 'disc',
471
+ '+': 'cross',
472
+ '++': 'cross_lines',
473
+ 's': 'square',
474
+ '-': 'hbar',
475
+ '|': 'vbar',
476
+ '->': 'tailed_arrow',
477
+ '>': 'arrow',
478
+ '^': 'triangle_up',
479
+ 'v': 'triangle_down',
480
+ '*': 'star',
481
+ }
482
+
483
+ symbol_shader_values = {name: i for i, name in enumerate(symbol_shaders)}
484
+ symbol_shader_values.update({
485
+ **{alias: symbol_shader_values[name] for alias, name in symbol_aliases.items()},
486
+ })
487
+
488
+
489
+ class MarkersVisual(Visual):
490
+ """Visual displaying marker symbols.
491
+
492
+ Parameters
493
+ ----------
494
+ pos : array
495
+ The array of locations to display each symbol.
496
+ size : float or array
497
+ The symbol size in screen (or data, if scaling is on) px.
498
+ edge_width : float or array or None
499
+ The width of the symbol outline in screen (or data, if scaling is on) px.
500
+ edge_width_rel : float or array or None
501
+ The width as a fraction of marker size. Exactly one of
502
+ `edge_width` and `edge_width_rel` must be supplied.
503
+ edge_color : Color | ColorArray
504
+ The color used to draw each symbol outline.
505
+ face_color : Color | ColorArray
506
+ The color used to draw each symbol interior.
507
+ symbol : str or array
508
+ The style of symbol used to draw each marker (see Notes).
509
+ scaling : str | bool
510
+ Scaling method of individual markers. If set to "fixed" (default) then
511
+ no scaling is done and markers will always be the same number of
512
+ pixels on the screen. If set to "scene" then the chain of transforms
513
+ from the Visual's transform to the transform mapping to the OpenGL
514
+ framebuffer are used to scaling the marker. This has the effect of the
515
+ marker staying the same size in the "scene" coordinate space and
516
+ changing size as the visualization is zoomed in and out. If set to
517
+ "visual" the marker is scaled only using the transform of the Visual
518
+ and not the rest of the scene/camera. This means that something like
519
+ a camera changing the view will not affect the size of the marker, but
520
+ the user can still scale it using the Visual's transform. For
521
+ backwards compatibility this can be set to the boolean ``False`` for
522
+ "fixed" or ``True`` for "scene".
523
+ alpha : float
524
+ The opacity level of the visual.
525
+ antialias : float
526
+ Antialiasing amount (in px).
527
+ spherical : bool
528
+ Whether to add a spherical effect on the marker using lighting.
529
+ light_color : Color | ColorArray
530
+ The color of the light used to create the spherical effect.
531
+ light_position : array
532
+ The coordinates of the light used to create the spherical effect.
533
+ light_ambient : float
534
+ The amount of ambient light used to create the spherical effect.
535
+
536
+ Notes
537
+ -----
538
+ Allowed style strings are: disc, arrow, ring, clobber, square, diamond,
539
+ vbar, hbar, cross, tailed_arrow, x, triangle_up, triangle_down,
540
+ and star.
541
+ """
542
+
543
+ _shaders = {
544
+ 'vertex': _VERTEX_SHADER,
545
+ 'fragment': _FRAGMENT_SHADER,
546
+ }
547
+ _symbol_shader_values = symbol_shader_values
548
+ _symbol_shader = symbol_func
549
+
550
+ def __init__(self, scaling="fixed", alpha=1, antialias=1, spherical=False,
551
+ light_color='white', light_position=(1, -1, 1), light_ambient=0.3, **kwargs):
552
+ self._vbo = VertexBuffer()
553
+ self._data = None
554
+ self._scaling = "fixed"
555
+
556
+ Visual.__init__(self, vcode=self._shaders['vertex'], fcode=self._shaders['fragment'])
557
+ self._symbol_func = Function(self._symbol_shader)
558
+ self.shared_program.frag['marker'] = self._symbol_func
559
+ self._v_size_var = Variable('varying float v_size')
560
+ self.shared_program.vert['v_size'] = self._v_size_var
561
+ self.shared_program.frag['v_size'] = self._v_size_var
562
+ self._symbol_func['v_size'] = self._v_size_var
563
+
564
+ self.set_gl_state(depth_test=True, blend=True,
565
+ blend_func=('src_alpha', 'one_minus_src_alpha'))
566
+ self._draw_mode = 'points'
567
+
568
+ self.events.add(data_updated=Event)
569
+
570
+ if len(kwargs) > 0:
571
+ self.set_data(**kwargs)
572
+
573
+ self.scaling = scaling
574
+ self.antialias = antialias
575
+ self.light_color = light_color
576
+ self.light_position = light_position
577
+ self.light_ambient = light_ambient
578
+ self.alpha = alpha
579
+ self.spherical = spherical
580
+
581
+ self.freeze()
582
+
583
+ def set_data(self, pos=None, size=10., edge_width=1., edge_width_rel=None,
584
+ edge_color='black', face_color='white',
585
+ symbol='o'):
586
+ """Set the data used to display this visual.
587
+
588
+ Parameters
589
+ ----------
590
+ pos : array
591
+ The array of locations to display each symbol.
592
+ size : float or array
593
+ The symbol size in screen (or data, if scaling is on) px.
594
+ edge_width : float or array or None
595
+ The width of the symbol outline in screen (or data, if scaling is on) px.
596
+ edge_width_rel : float or array or None
597
+ The width as a fraction of marker size. Exactly one of
598
+ `edge_width` and `edge_width_rel` must be supplied.
599
+ edge_color : Color | ColorArray
600
+ The color used to draw each symbol outline.
601
+ face_color : Color | ColorArray
602
+ The color used to draw each symbol interior.
603
+ symbol : str or array
604
+ The style of symbol used to draw each marker (see Notes).
605
+ """
606
+ if (edge_width is not None) + (edge_width_rel is not None) != 1:
607
+ raise ValueError('exactly one of edge_width and edge_width_rel '
608
+ 'must be non-None')
609
+
610
+ if edge_width is not None:
611
+ edge_width = np.asarray(edge_width)
612
+ if np.any(edge_width < 0):
613
+ raise ValueError('edge_width cannot be negative')
614
+ else:
615
+ edge_width_rel = np.asarray(edge_width_rel)
616
+ if np.any(edge_width_rel < 0):
617
+ raise ValueError('edge_width_rel cannot be negative')
618
+
619
+ if symbol is not None:
620
+ if not np.all(np.isin(np.asarray(symbol), self.symbols)):
621
+ raise ValueError(f'symbols must one of {self.symbols}')
622
+
623
+ edge_color = ColorArray(edge_color).rgba
624
+ if len(edge_color) == 1:
625
+ edge_color = edge_color[0]
626
+
627
+ face_color = ColorArray(face_color).rgba
628
+ if len(face_color) == 1:
629
+ face_color = face_color[0]
630
+
631
+ if pos is not None:
632
+ assert (isinstance(pos, np.ndarray) and
633
+ pos.ndim == 2 and pos.shape[1] in (2, 3))
634
+
635
+ n = len(pos)
636
+ data = np.zeros(n, dtype=[('a_position', np.float32, 3),
637
+ ('a_fg_color', np.float32, 4),
638
+ ('a_bg_color', np.float32, 4),
639
+ ('a_size', np.float32),
640
+ ('a_edgewidth', np.float32),
641
+ ('a_symbol', np.float32)])
642
+ data['a_fg_color'] = edge_color
643
+ data['a_bg_color'] = face_color
644
+ if edge_width is not None:
645
+ data['a_edgewidth'] = edge_width
646
+ else:
647
+ data['a_edgewidth'] = size * edge_width_rel
648
+ data['a_position'][:, :pos.shape[1]] = pos
649
+ data['a_size'] = size
650
+
651
+ data['a_symbol'] = np.vectorize(self._symbol_shader_values.get)(symbol)
652
+
653
+ self._data = data
654
+ self._vbo.set_data(data)
655
+ self.shared_program.bind(self._vbo)
656
+
657
+ self.events.data_updated()
658
+ self.update()
659
+
660
+ @property
661
+ def symbols(self):
662
+ return list(self._symbol_shader_values)
663
+
664
+ @property
665
+ def symbol(self):
666
+ if self._data is None:
667
+ return None
668
+ value_to_symbol = {v: k for k, v in self._symbol_shader_values.items()}
669
+ return np.vectorize(value_to_symbol.get)(self._data['a_symbol'])
670
+
671
+ @symbol.setter
672
+ def symbol(self, value):
673
+ if self._data is not None:
674
+ rec_to_kw = {
675
+ 'a_position': 'pos',
676
+ 'a_fg_color': 'edge_color',
677
+ 'a_bg_color': 'face_color',
678
+ 'a_size': 'size',
679
+ 'a_edgewidth': 'edge_width',
680
+ 'a_symbol': 'symbol',
681
+ }
682
+ kwargs = {kw: self._data[rec] for rec, kw in rec_to_kw.items()}
683
+ else:
684
+ kwargs = {}
685
+ kwargs['symbol'] = value
686
+ self.set_data(**kwargs)
687
+
688
+ @property
689
+ def scaling(self):
690
+ """
691
+ If set to True, marker scales when rezooming.
692
+ """
693
+ return self._scaling
694
+
695
+ @scaling.setter
696
+ def scaling(self, value):
697
+ scaling_modes = {
698
+ False: "fixed",
699
+ True: "scene",
700
+ "fixed": "fixed",
701
+ "scene": "scene",
702
+ "visual": "visual",
703
+ }
704
+ if value not in scaling_modes:
705
+ possible_options = ", ".join(repr(opt) for opt in scaling_modes)
706
+ raise ValueError(f"Unknown scaling option {value!r}, expected one of: {possible_options}")
707
+ self._scaling = scaling_modes[value]
708
+ self.shared_program['u_scaling'] = self._scaling != "fixed"
709
+ self.update()
710
+
711
+ @property
712
+ def antialias(self):
713
+ """
714
+ Antialiasing amount (in px).
715
+ """
716
+ return self._antialias
717
+
718
+ @antialias.setter
719
+ def antialias(self, value):
720
+ value = float(value)
721
+ self.shared_program['u_antialias'] = value
722
+ self._antialias = value
723
+ self.update()
724
+
725
+ @property
726
+ def light_position(self):
727
+ """
728
+ The coordinates of the light used to create the spherical effect.
729
+ """
730
+ return self._light_position
731
+
732
+ @light_position.setter
733
+ def light_position(self, value):
734
+ value = np.array(value)
735
+ self.shared_program['u_light_position'] = value / np.linalg.norm(value)
736
+ self._light_position = value
737
+ self.update()
738
+
739
+ @property
740
+ def light_ambient(self):
741
+ """
742
+ The amount of ambient light used to create the spherical effect.
743
+ """
744
+ return self._light_ambient
745
+
746
+ @light_ambient.setter
747
+ def light_ambient(self, value):
748
+ self.shared_program['u_light_ambient'] = value
749
+ self._light_ambient = value
750
+ self.update()
751
+
752
+ @property
753
+ def light_color(self):
754
+ """
755
+ The color of the light used to create the spherical effect.
756
+ """
757
+ return self._light_color
758
+
759
+ @light_color.setter
760
+ def light_color(self, value):
761
+ self.shared_program['u_light_color'] = ColorArray(value).rgb
762
+ self._light_color = value
763
+ self.update()
764
+
765
+ @property
766
+ def alpha(self):
767
+ """
768
+ The opacity level of the visual.
769
+ """
770
+ return self._alpha
771
+
772
+ @alpha.setter
773
+ def alpha(self, value):
774
+ self.shared_program['u_alpha'] = value
775
+ self._alpha = value
776
+ self.update()
777
+
778
+ @property
779
+ def spherical(self):
780
+ """
781
+ Whether to add a spherical effect on the marker using lighting.
782
+ """
783
+ return self._spherical
784
+
785
+ @spherical.setter
786
+ def spherical(self, value):
787
+ self.shared_program['u_spherical'] = value
788
+ self._spherical = value
789
+ self.update()
790
+
791
+ def _prepare_transforms(self, view):
792
+ view.view_program.vert['visual_to_framebuffer'] = view.get_transform('visual', 'framebuffer')
793
+ view.view_program.vert['framebuffer_to_render'] = view.get_transform('framebuffer', 'render')
794
+ scaling = view._scaling if view._scaling != "fixed" else "scene"
795
+ view.view_program.vert['framebuffer_to_scene_or_visual'] = view.get_transform('framebuffer', scaling)
796
+ view.view_program.vert['scene_or_visual_to_framebuffer'] = view.get_transform(scaling, 'framebuffer')
797
+
798
+ def _prepare_draw(self, view):
799
+ if self._data is None:
800
+ return False
801
+ view.view_program['u_px_scale'] = view.transforms.pixel_scale
802
+
803
+ def _compute_bounds(self, axis, view):
804
+ pos = self._data['a_position']
805
+ if pos is None:
806
+ return None
807
+ if pos.shape[1] > axis:
808
+ return (pos[:, axis].min(), pos[:, axis].max())
809
+ else:
810
+ return (0, 0)