vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

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

Potentially problematic release.


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

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-x86_64-linux-gnu.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,208 @@
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
+ # Author: Siddharth Bhat
7
+ # -----------------------------------------------------------------------------
8
+
9
+ import numpy as np
10
+
11
+ from . import Visual
12
+ from ..color import Color
13
+
14
+ _VERTEX_SHADER = """
15
+ attribute vec2 a_position;
16
+ attribute vec2 a_adjust_dir;
17
+
18
+ void main() {
19
+ // First map the vertex to document coordinates
20
+ vec4 doc_pos = $visual_to_doc(vec4(a_position, 0, 1));
21
+
22
+ // Also need to map the adjustment direction vector, but this is tricky!
23
+ // We need to adjust separately for each component of the vector:
24
+ vec4 adjusted;
25
+ if ( a_adjust_dir.x == 0. ) {
26
+ // If this is an outer vertex, no adjustment for line weight is needed.
27
+ // (In fact, trying to make the adjustment would result in no
28
+ // triangles being drawn, hence the if/else block)
29
+ adjusted = doc_pos;
30
+ }
31
+ else {
32
+ // Inner vertexes must be adjusted for line width, but this is
33
+ // surprisingly tricky given that the rectangle may have been scaled
34
+ // and rotated!
35
+ vec4 doc_x = $visual_to_doc(vec4(a_adjust_dir.x, 0., 0., 0.)) -
36
+ $visual_to_doc(vec4(0., 0., 0., 0.));
37
+ vec4 doc_y = $visual_to_doc(vec4(0, a_adjust_dir.y, 0., 0.)) -
38
+ $visual_to_doc(vec4(0., 0., 0., 0.));
39
+ doc_x = normalize(doc_x);
40
+ doc_y = normalize(doc_y);
41
+
42
+ // Now doc_x + doc_y points in the direction we need in order to
43
+ // correct the line weight of _both_ segments, but the magnitude of
44
+ // that correction is wrong. To correct it we first need to
45
+ // measure the width that would result from using doc_x + doc_y:
46
+ vec4 proj_y_x = dot(doc_x, doc_y) * doc_x; // project y onto x
47
+ float cur_width = length(doc_y - proj_y_x); // measure current weight
48
+
49
+ // And now we can adjust vertex position for line width:
50
+ adjusted = doc_pos + ($border_width / cur_width) * (doc_x + doc_y);
51
+ }
52
+
53
+ // Finally map the remainder of the way to render coordinates
54
+ gl_Position = $doc_to_render(adjusted);
55
+ }
56
+ """
57
+
58
+ _FRAGMENT_SHADER = """
59
+ void main() {
60
+ gl_FragColor = $border_color;
61
+ }
62
+ """ # noqa
63
+
64
+
65
+ class _BorderVisual(Visual):
66
+ """
67
+ Visual subclass to display 2D pixel-width borders.
68
+
69
+ Parameters
70
+ ----------
71
+ pos : tuple (x, y)
72
+ Position where the colorbar is to be placed with
73
+ respect to the center of the colorbar
74
+ halfdim : tuple (half_width, half_height)
75
+ Half the dimensions of the colorbar measured
76
+ from the center. That way, the total dimensions
77
+ of the colorbar is (x - half_width) to (x + half_width)
78
+ and (y - half_height) to (y + half_height)
79
+ border_width : float (in px)
80
+ The width of the border the colormap should have. This measurement
81
+ is given in pixels
82
+ border_color : str | vispy.color.Color
83
+ The color of the border of the colormap. This can either be a
84
+ str as the color's name or an actual instace of a vipy.color.Color
85
+ """
86
+
87
+ _shaders = {
88
+ 'vertex': _VERTEX_SHADER,
89
+ 'fragment': _FRAGMENT_SHADER,
90
+ }
91
+
92
+ def __init__(self, pos, halfdim,
93
+ border_width=1.0,
94
+ border_color=None,
95
+ **kwargs):
96
+
97
+ self._pos = pos
98
+ self._halfdim = halfdim
99
+ self._border_width = border_width
100
+ self._border_color = Color(border_color)
101
+
102
+ Visual.__init__(self, vcode=self._shaders['vertex'], fcode=self._shaders['fragment'])
103
+
104
+ @staticmethod
105
+ def _prepare_transforms(view):
106
+
107
+ program = view.shared_program
108
+ program.vert['visual_to_doc'] = \
109
+ view.transforms.get_transform('visual', 'document')
110
+ program.vert['doc_to_render'] = \
111
+ view.transforms.get_transform('document', 'render')
112
+
113
+ @property
114
+ def visual_border_width(self):
115
+ """The border width in visual coordinates"""
116
+ render_to_doc = \
117
+ self.transforms.get_transform('document', 'visual')
118
+
119
+ vec = render_to_doc.map([self.border_width, self.border_width, 0])
120
+ origin = render_to_doc.map([0, 0, 0])
121
+
122
+ visual_border_width = [vec[0] - origin[0], vec[1] - origin[1]]
123
+
124
+ # we need to flip the y axis because coordinate systems are inverted
125
+ visual_border_width[1] *= -1
126
+
127
+ return visual_border_width
128
+
129
+ def _update(self):
130
+ x, y = self._pos
131
+ halfw, halfh = self._halfdim
132
+
133
+ border_vertices = np.array([
134
+ [x - halfw, y - halfh],
135
+ [x - halfw, y - halfh],
136
+
137
+ [x + halfw, y - halfh],
138
+ [x + halfw, y - halfh],
139
+
140
+ [x + halfw, y + halfh],
141
+ [x + halfw, y + halfh],
142
+
143
+ [x - halfw, y + halfh],
144
+ [x - halfw, y + halfh],
145
+
146
+ [x - halfw, y - halfh],
147
+ [x - halfw, y - halfh],
148
+ ], dtype=np.float32)
149
+
150
+ # Direction each vertex should move to correct for line width
151
+ adjust_dir = np.array([
152
+ [0, 0], [-1, -1],
153
+ [0, 0], [1, -1],
154
+ [0, 0], [1, 1],
155
+ [0, 0], [-1, 1],
156
+ [0, 0], [-1, -1],
157
+ ], dtype=np.float32)
158
+
159
+ self.shared_program['a_position'] = border_vertices
160
+ self.shared_program['a_adjust_dir'] = adjust_dir
161
+ self.shared_program.vert['border_width'] = float(self._border_width)
162
+ self.shared_program.frag['border_color'] = self._border_color.rgba
163
+
164
+ def _prepare_draw(self, view=None):
165
+ self._update()
166
+ self._draw_mode = "triangle_strip"
167
+ return True
168
+
169
+ @property
170
+ def border_width(self):
171
+ """The width of the border"""
172
+ return self._border_width
173
+
174
+ @border_width.setter
175
+ def border_width(self, border_width):
176
+ self._border_width = border_width
177
+ # positions of text need to be changed accordingly
178
+ self._update()
179
+
180
+ @property
181
+ def border_color(self):
182
+ """The color of the border in pixels"""
183
+ return self._border_color
184
+
185
+ @border_color.setter
186
+ def border_color(self, border_color):
187
+ self._border_color = Color(border_color)
188
+ self.shared_program.frag['border_color'] = self._border_color.rgba
189
+
190
+ @property
191
+ def pos(self):
192
+ """The center of the BorderVisual"""
193
+ return self._pos
194
+
195
+ @pos.setter
196
+ def pos(self, pos):
197
+ self._pos = pos
198
+ self._update()
199
+
200
+ @property
201
+ def halfdim(self):
202
+ """The half-dimensions measured from the center of the BorderVisual"""
203
+ return self._halfdim
204
+
205
+ @halfdim.setter
206
+ def halfdim(self, halfdim):
207
+ self._halfdim = halfdim
208
+ self._update()
vispy/visuals/box.py ADDED
@@ -0,0 +1,79 @@
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
+
7
+ from ..geometry import create_box
8
+ from .mesh import MeshVisual
9
+ from .visual import CompoundVisual
10
+
11
+
12
+ class BoxVisual(CompoundVisual):
13
+ """Visual that displays a box.
14
+
15
+ Parameters
16
+ ----------
17
+ width : float
18
+ Box width.
19
+ height : float
20
+ Box height.
21
+ depth : float
22
+ Box depth.
23
+ width_segments : int
24
+ Box segments count along the width.
25
+ height_segments : float
26
+ Box segments count along the height.
27
+ depth_segments : float
28
+ Box segments count along the depth.
29
+ planes: array_like
30
+ Any combination of ``{'-x', '+x', '-y', '+y', '-z', '+z'}``
31
+ Included planes in the box construction.
32
+ vertex_colors : ndarray
33
+ Same as for `MeshVisual` class. See `create_plane` for vertex ordering.
34
+ face_colors : ndarray
35
+ Same as for `MeshVisual` class. See `create_plane` for vertex ordering.
36
+ color : Color
37
+ The `Color` to use when drawing the cube faces.
38
+ edge_color : tuple or Color
39
+ The `Color` to use when drawing the cube edges. If `None`, then no
40
+ cube edges are drawn.
41
+ """
42
+
43
+ def __init__(self, width=1, height=1, depth=1, width_segments=1,
44
+ height_segments=1, depth_segments=1, planes=None,
45
+ vertex_colors=None, face_colors=None,
46
+ color=(0.5, 0.5, 1, 1), edge_color=None, **kwargs):
47
+ vertices, filled_indices, outline_indices = create_box(
48
+ width, height, depth, width_segments, height_segments,
49
+ depth_segments, planes)
50
+
51
+ self._mesh = MeshVisual(vertices['position'], filled_indices,
52
+ vertex_colors, face_colors, color)
53
+ if edge_color:
54
+ self._border = MeshVisual(vertices['position'], outline_indices,
55
+ color=edge_color, mode='lines')
56
+ else:
57
+ self._border = MeshVisual()
58
+
59
+ CompoundVisual.__init__(self, [self._mesh, self._border], **kwargs)
60
+ self.mesh.set_gl_state(polygon_offset_fill=True,
61
+ polygon_offset=(1, 1), depth_test=True)
62
+
63
+ @property
64
+ def mesh(self):
65
+ """The vispy.visuals.MeshVisual that used to fill in."""
66
+ return self._mesh
67
+
68
+ @mesh.setter
69
+ def mesh(self, mesh):
70
+ self._mesh = mesh
71
+
72
+ @property
73
+ def border(self):
74
+ """The vispy.visuals.MeshVisual that used to draw the border."""
75
+ return self._border
76
+
77
+ @border.setter
78
+ def border(self, border):
79
+ self._border = border
@@ -0,0 +1,30 @@
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
+ """
7
+ Collections allow batch rendering of object of the same type:
8
+
9
+ - Points
10
+ - Line segments
11
+ - Polylines (paths)
12
+ - Raw Triangles
13
+ - Polygons
14
+
15
+ Each collection has several modes:
16
+
17
+ - raw (point, segment, path, triangle, polygon)
18
+ - agg (point, segment, path, polygon)
19
+ - agg+ (path, polygon)
20
+
21
+ Note: Storage of shared attributes requires non-clamped textures which is not
22
+ the case on all graphic cards. This means such shared attributes must be
23
+ normalized on CPU and scales back on GPU (in shader code).
24
+ """
25
+
26
+ from . path_collection import PathCollection # noqa
27
+ from . point_collection import PointCollection # noqa
28
+ from . polygon_collection import PolygonCollection # noqa
29
+ from . segment_collection import SegmentCollection # noqa
30
+ from . triangle_collection import TriangleCollection # noqa
@@ -0,0 +1,219 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+ """
7
+ Antigrain Geometry Fast Path Collection
8
+
9
+ This collection provides antialiased and accurate paths with caps and miter
10
+ joins. It consume x4 more memory than regular lines and is a bit slower, but
11
+ the quality of the output is worth the cost. Note that no control can be made
12
+ on miter joins which may result in some glitches on screen.
13
+ """
14
+ import numpy as np
15
+ from ... import glsl
16
+ from ... import gloo
17
+ from . collection import Collection
18
+ from ..transforms import NullTransform
19
+
20
+
21
+ class AggFastPathCollection(Collection):
22
+ """
23
+ Antigrain Geometry Fast Path Collection
24
+
25
+ This collection provides antialiased and accurate paths with caps and miter
26
+ joins. It consume x4 more memory than regular lines and is a bit slower,
27
+ but the quality of the output is worth the cost. Note that no control can
28
+ be made on miter joins which may result in some glitches on screen.
29
+ """
30
+
31
+ def __init__(self, user_dtype=None, transform=None,
32
+ vertex=None, fragment=None, **kwargs):
33
+ """
34
+ Initialize the collection.
35
+
36
+ Parameters
37
+ ----------
38
+ user_dtype: list
39
+ The base dtype can be completed (appended) by the used_dtype. It
40
+ only make sense if user also provide vertex and/or fragment shaders
41
+
42
+ transform : string
43
+ GLSL Transform code defining the vec4 transform(vec3) function
44
+
45
+ vertex: string
46
+ Vertex shader code
47
+
48
+ fragment: string
49
+ Fragment shader code
50
+
51
+ caps : string
52
+ 'local', 'shared' or 'global'
53
+
54
+ color : string
55
+ 'local', 'shared' or 'global'
56
+
57
+ linewidth : string
58
+ 'local', 'shared' or 'global'
59
+
60
+ antialias : string
61
+ 'local', 'shared' or 'global'
62
+ """
63
+ base_dtype = [('prev', (np.float32, 3), '!local', (0, 0, 0)),
64
+ ('curr', (np.float32, 3), '!local', (0, 0, 0)),
65
+ ('next', (np.float32, 3), '!local', (0, 0, 0)),
66
+ ('id', (np.float32, 1), '!local', 0),
67
+ ('color', (np.float32, 4), 'global', (0, 0, 0, 1)),
68
+ ('linewidth', (np.float32, 1), 'global', 1),
69
+ ('antialias', (np.float32, 1), 'global', 1),
70
+ ("viewport", (np.float32, 4), 'global', (0, 0, 512, 512))] # noqa
71
+ dtype = base_dtype
72
+ if user_dtype:
73
+ dtype.extend(user_dtype)
74
+
75
+ if vertex is None:
76
+ vertex = glsl.get('collections/agg-fast-path.vert')
77
+ if transform is None:
78
+ transform = NullTransform()
79
+ self.transform = transform
80
+ if fragment is None:
81
+ fragment = glsl.get('collections/agg-fast-path.frag')
82
+
83
+ Collection.__init__(self, dtype=dtype, itype=None,
84
+ mode="triangle_strip",
85
+ vertex=vertex, fragment=fragment, **kwargs)
86
+
87
+ program = self._programs[0]
88
+ program.vert['transform'] = self.transform
89
+
90
+ def append(self, P, closed=False, itemsize=None, **kwargs):
91
+ """
92
+ Append a new set of vertices to the collection.
93
+
94
+ For kwargs argument, n is the number of vertices (local) or the number
95
+ of item (shared)
96
+
97
+ Parameters
98
+ ----------
99
+ P : np.array
100
+ Vertices positions of the path(s) to be added
101
+
102
+ closed: bool
103
+ Whether path(s) is/are closed
104
+
105
+ itemsize: int or None
106
+ Size of an individual path
107
+
108
+ caps : list, array or 2-tuple
109
+ Path start /end cap
110
+
111
+ color : list, array or 4-tuple
112
+ Path color
113
+
114
+ linewidth : list, array or float
115
+ Path linewidth
116
+
117
+ antialias : list, array or float
118
+ Path antialias area
119
+ """
120
+ itemsize = int(itemsize or len(P))
121
+ itemcount = len(P) // itemsize
122
+
123
+ P = P.reshape(itemcount, itemsize, 3)
124
+ if closed:
125
+ V = np.empty((itemcount, itemsize + 3), dtype=self.vtype)
126
+ # Apply default values on vertices
127
+ for name in self.vtype.names:
128
+ if name not in ['collection_index', 'prev', 'curr', 'next']:
129
+ V[name][1:-2] = kwargs.get(name, self._defaults[name])
130
+ V['prev'][:, 2:-1] = P
131
+ V['prev'][:, 1] = V['prev'][:, -2]
132
+ V['curr'][:, 1:-2] = P
133
+ V['curr'][:, -2] = V['curr'][:, 1]
134
+ V['next'][:, 0:-3] = P
135
+ V['next'][:, -3] = V['next'][:, 0]
136
+ V['next'][:, -2] = V['next'][:, 1]
137
+ else:
138
+ V = np.empty((itemcount, itemsize + 2), dtype=self.vtype)
139
+ # Apply default values on vertices
140
+ for name in self.vtype.names:
141
+ if name not in ['collection_index', 'prev', 'curr', 'next']:
142
+ V[name][1:-1] = kwargs.get(name, self._defaults[name])
143
+ V['prev'][:, 2:] = P
144
+ V['prev'][:, 1] = V['prev'][:, 2]
145
+ V['curr'][:, 1:-1] = P
146
+ V['next'][:, :-2] = P
147
+ V['next'][:, -2] = V['next'][:, -3]
148
+
149
+ V[:, 0] = V[:, 1]
150
+ V[:, -1] = V[:, -2]
151
+ V = V.ravel()
152
+ V = np.repeat(V, 2, axis=0)
153
+ V['id'] = np.tile([1, -1], len(V) // 2)
154
+ if closed:
155
+ V = V.reshape(itemcount, 2 * (itemsize + 3))
156
+ else:
157
+ V = V.reshape(itemcount, 2 * (itemsize + 2))
158
+ V["id"][:, :2] = 2, -2
159
+ V["id"][:, -2:] = 2, -2
160
+ V = V.ravel()
161
+
162
+ # Uniforms
163
+ if self.utype:
164
+ U = np.zeros(itemcount, dtype=self.utype)
165
+ for name in self.utype.names:
166
+ if name not in ["__unused__"]:
167
+ U[name] = kwargs.get(name, self._defaults[name])
168
+ else:
169
+ U = None
170
+
171
+ Collection.append(self, vertices=V, uniforms=U,
172
+ itemsize=2 * (itemsize + 2 + closed))
173
+
174
+ def bake(self, P, key='curr', closed=False, itemsize=None):
175
+ """
176
+ Given a path P, return the baked vertices as they should be copied in
177
+ the collection if the path has already been appended.
178
+
179
+ Examples
180
+ --------
181
+ >>> paths.append(P)
182
+ >>> P *= 2
183
+ >>> paths['prev'][0] = bake(P,'prev')
184
+ >>> paths['curr'][0] = bake(P,'curr')
185
+ >>> paths['next'][0] = bake(P,'next')
186
+
187
+ """
188
+ itemsize = itemsize or len(P)
189
+ itemcount = len(P) / itemsize # noqa
190
+ n = itemsize
191
+
192
+ if closed:
193
+ idxs = np.arange(n + 3)
194
+ if key == 'prev':
195
+ idxs -= 2
196
+ idxs[0], idxs[1], idxs[-1] = n - 1, n - 1, n - 1
197
+ elif key == 'next':
198
+ idxs[0], idxs[-3], idxs[-2], idxs[-1] = 1, 0, 1, 1
199
+ else:
200
+ idxs -= 1
201
+ idxs[0], idxs[-1], idxs[n + 1] = 0, 0, 0
202
+ else:
203
+ idxs = np.arange(n + 2)
204
+ if key == 'prev':
205
+ idxs -= 2
206
+ idxs[0], idxs[1], idxs[-1] = 0, 0, n - 2
207
+ elif key == 'next':
208
+ idxs[0], idxs[-1], idxs[-2] = 1, n - 1, n - 1
209
+ else:
210
+ idxs -= 1
211
+ idxs[0], idxs[-1] = 0, n - 1
212
+ idxs = np.repeat(idxs, 2)
213
+ return P[idxs]
214
+
215
+ def draw(self, mode="triangle_strip"):
216
+ """Draw collection"""
217
+ gloo.set_depth_mask(0)
218
+ Collection.draw(self, mode)
219
+ gloo.set_depth_mask(1)