vispy 0.15.0__cp313-cp313-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 (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-aarch64-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,36 @@
1
+ from vispy.scene.visuals import ComplexImage
2
+ from vispy.visuals.image_complex import CPU_COMPLEX_TRANSFORMS
3
+ from vispy.testing import requires_application, TestingCanvas
4
+ from vispy.testing.image_tester import downsample
5
+
6
+ import numpy as np
7
+ import pytest
8
+
9
+ from vispy.testing.rendered_array_tester import compare_render
10
+
11
+
12
+ # we add the np.float32 case to test that ComplexImage falls back to Image behavior
13
+ # if the data is not complex
14
+ @requires_application()
15
+ @pytest.mark.parametrize("input_dtype", [np.complex64, np.complex128, np.float32])
16
+ @pytest.mark.parametrize("complex_mode", ["magnitude", "real", "imaginary", "phase"])
17
+ def test_image_complex(input_dtype, complex_mode):
18
+ """Test rendering of complex-valued image data."""
19
+ shape = (40, 40)
20
+ np.random.seed(0)
21
+ data = np.random.random(shape).astype(input_dtype)
22
+ if np.iscomplexobj(data):
23
+ data.imag = np.random.random(shape)
24
+
25
+ with TestingCanvas(size=shape, bgcolor="w") as c:
26
+ ComplexImage(data, cmap="grays", complex_mode=complex_mode, parent=c.scene)
27
+ # render to canvas
28
+ rendered = c.render()
29
+ shape_ratio = rendered.shape[0] // data.shape[0]
30
+ rendered = downsample(rendered, shape_ratio, axis=(0, 1))
31
+
32
+ # perform (auto-clim) rendering on cpu
33
+ exp = CPU_COMPLEX_TRANSFORMS[complex_mode](data) if np.iscomplexobj(data) else data
34
+ exp -= exp.min()
35
+ exp /= exp.max()
36
+ compare_render(exp, rendered)
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ """
6
+ Tests for InfiniteLineVisual
7
+ All images are of size (100,100) to keep a small file size
8
+ """
9
+
10
+ import numpy as np
11
+
12
+ from vispy.scene import visuals
13
+ from vispy.testing import (requires_application, TestingCanvas,
14
+ run_tests_if_main)
15
+ from vispy.testing.image_tester import assert_image_approved
16
+ from vispy.testing import assert_raises
17
+
18
+
19
+ @requires_application()
20
+ def test_set_data():
21
+ """Test InfiniteLineVisual"""
22
+ pos = 5.0
23
+ color = [1.0, 1.0, 0.5, 0.5]
24
+ expected_color = np.array(color, dtype=np.float32)
25
+
26
+ for is_vertical, reference_image in [(True, 'infinite_line.png'),
27
+ (False, 'infinite_line_h.png')]:
28
+
29
+ with TestingCanvas() as c:
30
+ # Check set_data is working correctly within visual constructor
31
+ region = visuals.InfiniteLine(pos=pos,
32
+ color=color,
33
+ vertical=is_vertical,
34
+ parent=c.scene)
35
+ assert region.pos == pos
36
+ assert np.all(region.color == expected_color)
37
+ assert region.is_vertical == is_vertical
38
+
39
+ # Check tuple color argument is accepted
40
+ region.set_data(color=tuple(color))
41
+ assert np.all(region.color == expected_color)
42
+
43
+ assert_image_approved(c.render(), 'visuals/%s' % reference_image)
44
+
45
+ # Check only numbers are accepted
46
+ assert_raises(TypeError, region.set_data, pos=[[1, 2], [3, 4]])
47
+
48
+ # Check color argument can be only a 4 length 1D array
49
+ assert_raises(ValueError, region.set_data, color=[[1, 2], [3, 4]])
50
+ assert_raises(ValueError, region.set_data, color=[1, 2])
51
+
52
+
53
+ run_tests_if_main()
@@ -0,0 +1,50 @@
1
+ import numpy as np
2
+ from vispy import scene, use
3
+
4
+ from vispy.testing import (TestingCanvas, requires_application,
5
+ run_tests_if_main, requires_pyopengl)
6
+
7
+
8
+ def setup_module(module):
9
+ use(gl='gl+')
10
+
11
+
12
+ def teardown_module(module):
13
+ use(gl='gl2')
14
+
15
+
16
+ @requires_pyopengl()
17
+ @requires_application()
18
+ def test_mesh_with_vertex_values():
19
+ size = (80, 60)
20
+ with TestingCanvas(size=size) as c:
21
+ use(gl='gl+')
22
+ vert = np.array([[0, 0, 0], [0, 30, 0], [40, 0, 0]])
23
+ faces = np.array([0, 1, 2])
24
+ pos = np.array([[0, 0, 0], [80, 60, 0]])
25
+ # identity and rotate 180
26
+ trans = np.array([
27
+ [
28
+ [1, 0, 0],
29
+ [0, 1, 0],
30
+ [0, 0, 1],
31
+ ],
32
+ [
33
+ [-1, 0, 0],
34
+ [0, -1, 0],
35
+ [0, 0, 1],
36
+ ],
37
+ ])
38
+ colors = ['red', 'blue']
39
+ mesh = scene.visuals.InstancedMesh(
40
+ vertices=vert, faces=faces, instance_positions=pos, instance_transforms=trans, instance_colors=colors
41
+ )
42
+ v = c.central_widget.add_view(border_width=0)
43
+ v.add(mesh)
44
+ render = c.render()
45
+ assert np.allclose(render[10, 10], (255, 0, 0, 255))
46
+ assert np.allclose(render[-10, -10], (0, 0, 255, 255))
47
+ assert np.allclose(render[30, 40], (0, 0, 0, 255))
48
+
49
+
50
+ run_tests_if_main()
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import numpy as np
4
+ from vispy import scene
5
+
6
+ from vispy.testing import run_tests_if_main, requires_pyopengl
7
+
8
+
9
+ @requires_pyopengl()
10
+ def test_isosurface():
11
+
12
+ # Create data
13
+ vol = np.arange(1000).reshape((10, 10, 10)).astype(np.float32)
14
+
15
+ # Create visual
16
+ iso = scene.visuals.Isosurface(vol, level=200)
17
+
18
+ # Change color (regression test for a bug that caused this to crash)
19
+ iso.color = (1.0, 0.8, 0.9, 1.0)
20
+
21
+
22
+ run_tests_if_main()
@@ -0,0 +1,152 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+
5
+ """
6
+ Tests for LinearRegionVisual
7
+ All images are of size (100,100) to keep a small file size
8
+ """
9
+
10
+ import numpy as np
11
+
12
+ from vispy.scene import visuals
13
+ from vispy.testing import (requires_application, TestingCanvas,
14
+ run_tests_if_main)
15
+ from vispy.testing.image_tester import assert_image_approved
16
+ from vispy.testing import assert_raises
17
+
18
+
19
+ @requires_application()
20
+ def test_linear_region_vertical_horizontal():
21
+ """Test vertical and horizontal LinearRegionVisual with a single color"""
22
+ # Definition of the region
23
+ pos = np.array([5, 15, 24, 36, 40, 42], dtype=np.float32)
24
+ # Expected internal pos buffer for vertical region
25
+ expected_pos_v = np.array([[5.0, -1.],
26
+ [5.0, 1.],
27
+ [15.0, -1.],
28
+ [15.0, 1.],
29
+ [24.0, -1.],
30
+ [24.0, 1.],
31
+ [36.0, -1.],
32
+ [36.0, 1.],
33
+ [40.0, -1.],
34
+ [40.0, 1.],
35
+ [42.0, -1.],
36
+ [42.0, 1.]], dtype=np.float32)
37
+ # Expected internal pos buffer for horizontal region
38
+ expected_pos_h = np.array([expected_pos_v[:, 1] * -1,
39
+ expected_pos_v[:, 0]], dtype=np.float32).T
40
+
41
+ # Test both horizontal and vertical region
42
+ for is_vertical, reference_image in [(True, 'linear_region1.png'),
43
+ (False, 'linear_region1_h.png')]:
44
+
45
+ expected_pos = expected_pos_v if is_vertical else expected_pos_h
46
+
47
+ with TestingCanvas() as c:
48
+ # Check set_data is working correctly within visual constructor
49
+ region = visuals.LinearRegion(pos=pos,
50
+ color=[0.0, 1.0, 0.0, 0.5],
51
+ vertical=is_vertical,
52
+ parent=c.scene)
53
+ assert np.all(region._pos == expected_pos)
54
+ assert np.all(region.pos == pos)
55
+ assert region.is_vertical == is_vertical
56
+
57
+ # Check set_data is working as expected when passing a list as
58
+ # pos argument
59
+ region.set_data(pos=list(pos))
60
+ assert np.all(region._pos == expected_pos)
61
+ assert np.all(region.pos == pos)
62
+
63
+ # Check set_data is working as expected when passing a tuple as
64
+ # pos argument
65
+ region.set_data(pos=tuple(pos))
66
+ assert np.all(region._pos == expected_pos)
67
+ assert np.all(region.pos == pos)
68
+
69
+ # Test with different dtypes that must be converted to float32
70
+ for t in [np.int64, np.float64, np.int32]:
71
+ region.set_data(pos=pos.astype(t))
72
+ assert np.all(region._pos == expected_pos)
73
+ assert np.all(region.pos == pos)
74
+
75
+ assert_image_approved(c.render(), 'visuals/%s' % reference_image)
76
+
77
+ # Check ValueError is raised when pos is not 1D
78
+ assert_raises(ValueError, region.set_data, pos=[[1, 2], [3, 4]])
79
+
80
+
81
+ @requires_application()
82
+ def test_linear_region_color():
83
+ """Test the color argument of LinearRegionVisual.set_data() method
84
+ using a single color
85
+ """
86
+ # Definition of the region
87
+ pos1 = [5, 42]
88
+ # Definition of the color of the region
89
+ color1 = np.array([0.0, 1.0, 0.0, 0.5], dtype=np.float32)
90
+ # Expected internal color buffer
91
+ color1_expected = np.array([color1, color1, color1, color1],
92
+ dtype=np.float32)
93
+
94
+ with TestingCanvas() as c:
95
+ # Check set_data is working correctly within visual constructor
96
+ region = visuals.LinearRegion(pos=pos1, color=color1, parent=c.scene)
97
+ assert np.all(region._color == color1_expected)
98
+ assert np.all(region.color == color1)
99
+
100
+ # Check set_data is working as expected when passing a list as
101
+ # color argument
102
+ region.set_data(color=list(color1))
103
+ assert np.all(region._color == color1_expected)
104
+ assert np.all(region.color == color1)
105
+
106
+ # Check set_data is working as expected when passing a tuple as
107
+ # color argument
108
+ region.set_data(color=tuple(color1))
109
+ assert np.all(region._color == color1_expected)
110
+ assert np.all(region.color == color1)
111
+
112
+ # Test with different dtypes that must be converted to float32
113
+ region.set_data(color=color1.astype(np.float64))
114
+ assert np.all(region._color == color1_expected)
115
+ assert np.all(region.color == color1)
116
+
117
+ assert_image_approved(c.render(), 'visuals/linear_region1.png')
118
+
119
+ # Check a ValueError is raised when the length of color argument
120
+ # is not 4.
121
+ assert_raises(ValueError, region.set_data, color=[1.0, 0.5, 0.5])
122
+
123
+ # Check a ValueError is raised when too many colors are provided
124
+ assert_raises(ValueError, region.set_data,
125
+ color=[color1, color1, color1])
126
+
127
+
128
+ @requires_application()
129
+ def test_linear_region_gradient():
130
+ """Test LinearRegionVisual with a gradient as color"""
131
+ # Definition of the region
132
+ pos2 = [5, 42, 80]
133
+ # Definition of the color of the region
134
+ color2 = np.array([[0.0, 1.0, 0.0, 0.5],
135
+ [1.0, 0.0, 0.0, 0.75],
136
+ [0.0, 0.0, 1.0, 1.0]], dtype=np.float32)
137
+ # Expected internal color buffer
138
+ color2_expected = np.array([color2[0], color2[0],
139
+ color2[1], color2[1],
140
+ color2[2], color2[2]],
141
+ dtype=np.float32)
142
+
143
+ with TestingCanvas() as c:
144
+ # Check set_data is working correctly within visual constructor
145
+ region = visuals.LinearRegion(pos=pos2, color=color2, parent=c.scene)
146
+ assert np.all(region._color == color2_expected)
147
+ assert np.all(region.color == color2)
148
+
149
+ assert_image_approved(c.render(), 'visuals/linear_region2.png')
150
+
151
+
152
+ run_tests_if_main()
@@ -0,0 +1,54 @@
1
+ # -*- coding: utf-8 -*-
2
+ import numpy as np
3
+ import pytest
4
+ from vispy.scene.visuals import Markers
5
+ from vispy.testing import (requires_application, TestingCanvas,
6
+ run_tests_if_main)
7
+ from vispy.testing.image_tester import assert_image_approved
8
+
9
+
10
+ @requires_application()
11
+ def test_markers():
12
+ """Test basic marker / point-sprite support"""
13
+ # this is probably too basic, but it at least ensures that point sprites
14
+ # work for people
15
+ np.random.seed(57983)
16
+ data = np.random.normal(size=(30, 2), loc=50, scale=10)
17
+
18
+ with TestingCanvas() as c:
19
+ marker = Markers(parent=c.scene)
20
+ marker.set_data(data)
21
+ assert_image_approved(c.render(), "visuals/markers.png")
22
+
23
+ # Test good correlation at high-dpi
24
+ with TestingCanvas(px_scale=2) as c:
25
+ marker = Markers(parent=c.scene)
26
+ marker.set_data(data)
27
+ assert_image_approved(c.render(), "visuals/markers.png")
28
+
29
+
30
+ def test_markers_edge_width():
31
+ data = np.random.rand(10, 3)
32
+ edge_width = np.random.rand(10)
33
+ marker = Markers()
34
+
35
+ with pytest.raises(ValueError):
36
+ marker.set_data(pos=data, edge_width_rel=1, edge_width=1)
37
+
38
+ marker.set_data(pos=data, edge_width=2)
39
+ marker.set_data(pos=data, edge_width=edge_width)
40
+ with pytest.raises(ValueError):
41
+ marker.set_data(pos=data, edge_width=-1)
42
+
43
+ marker.set_data(pos=data, edge_width_rel=edge_width, edge_width=None)
44
+ marker.set_data(pos=data, edge_width_rel=edge_width + 1, edge_width=None)
45
+ with pytest.raises(ValueError):
46
+ marker.set_data(pos=data, edge_width_rel=edge_width - 1, edge_width=None)
47
+
48
+
49
+ def test_empty_markers_symbol():
50
+ markers = Markers()
51
+ markers.symbol = 'o'
52
+
53
+
54
+ run_tests_if_main()
@@ -0,0 +1,261 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import numpy as np
4
+ from vispy import scene
5
+
6
+ from vispy.color import Color
7
+ from vispy.geometry import create_cube, create_sphere
8
+ from vispy.testing import (TestingCanvas, requires_application,
9
+ run_tests_if_main, requires_pyopengl)
10
+ from vispy.visuals.filters import ShadingFilter, WireframeFilter
11
+ from vispy.visuals.filters.mesh import _as_rgba
12
+
13
+ import pytest
14
+
15
+
16
+ @requires_pyopengl()
17
+ def test_mesh_color():
18
+ # Create visual
19
+ vertices, filled_indices, outline_indices = create_cube()
20
+ axis = scene.visuals.Mesh(vertices['position'], outline_indices,
21
+ color='black', mode='lines')
22
+
23
+ # Change color (regression test for a bug that caused this to reset
24
+ # the vertex data to None)
25
+
26
+ axis.color = (0.1, 0.3, 0.7, 0.9)
27
+
28
+ new_vertices = axis.mesh_data.get_vertices()
29
+
30
+ np.testing.assert_allclose(axis.color.rgba, (0.1, 0.3, 0.7, 0.9))
31
+ np.testing.assert_allclose(vertices['position'], new_vertices)
32
+
33
+
34
+ @requires_pyopengl()
35
+ @requires_application()
36
+ def test_mesh_with_vertex_values():
37
+ size = (45, 40)
38
+ with TestingCanvas(size=size) as c:
39
+ v = c.central_widget.add_view(border_width=0)
40
+ vertices = np.array([(0, 0, 0), (0, 0, 1), (1, 0, 0)], dtype=float)
41
+ faces = np.array([(0, 1, 2)])
42
+ mesh = scene.visuals.Mesh(
43
+ vertices=vertices,
44
+ faces=faces,
45
+ vertex_values=np.ones(len(vertices)),
46
+ )
47
+ v.add(mesh)
48
+ c.render()
49
+
50
+
51
+ @requires_pyopengl()
52
+ @requires_application()
53
+ @pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
54
+ def test_mesh_shading_change_from_none(shading):
55
+ # Regression test for #2041: exception raised when changing the shading
56
+ # mode with shading=None initially.
57
+ size = (45, 40)
58
+ with TestingCanvas(size=size) as c:
59
+ v = c.central_widget.add_view(border_width=0)
60
+ vertices = np.array([(0, 0, 0), (0, 0, 1), (1, 0, 0)], dtype=float)
61
+ faces = np.array([(0, 1, 2)])
62
+ mesh = scene.visuals.Mesh(vertices=vertices, faces=faces, shading=None)
63
+ v.add(mesh)
64
+ c.render()
65
+ # This below should not fail.
66
+ mesh.shading = shading
67
+ c.render()
68
+
69
+
70
+ @requires_pyopengl()
71
+ @requires_application()
72
+ @pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
73
+ def test_mesh_shading_filter(shading):
74
+ size = (45, 40)
75
+ with TestingCanvas(size=size, bgcolor="k") as c:
76
+ v = c.central_widget.add_view(border_width=0)
77
+ v.camera = 'arcball'
78
+ mdata = create_sphere(20, 30, radius=1)
79
+ mesh = scene.visuals.Mesh(meshdata=mdata,
80
+ shading=shading,
81
+ color=(0.2, 0.3, 0.7, 1.0))
82
+ v.add(mesh)
83
+
84
+ rendered = c.render()[..., 0] # R channel only
85
+ if shading in ("flat", "smooth"):
86
+ # there should be a gradient, not solid colors
87
+ assert np.unique(rendered).size >= 28
88
+ # sphere/circle is "dark" on the right and gets brighter as you
89
+ # move to the left, then hits a bright spot and decreases after
90
+ invest_row = rendered[34].astype(np.float64)
91
+ # overall, we should be increasing brightness up to a "bright spot"
92
+ assert (np.diff(invest_row[34:60]) <= 0).all()
93
+ else:
94
+ assert np.unique(rendered).size == 2
95
+
96
+
97
+ def test_intensity_or_color_as_rgba():
98
+ assert _as_rgba(0.3) == Color((1.0, 1.0, 1.0, 0.3))
99
+ assert _as_rgba((0.3, 0.2, 0.1)) == Color((0.3, 0.2, 0.1, 1.0))
100
+ assert _as_rgba((0.3, 0.2, 0.1, 0.5)) == Color((0.3, 0.2, 0.1, 0.5))
101
+
102
+
103
+ @requires_pyopengl()
104
+ @requires_application()
105
+ @pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
106
+ def test_mesh_shading_filter_enabled(shading):
107
+ size = (45, 40)
108
+ with TestingCanvas(size=size, bgcolor="k") as c:
109
+ v = c.central_widget.add_view(border_width=0)
110
+ v.camera = 'arcball'
111
+ mdata = create_sphere(20, 30, radius=1)
112
+ mesh = scene.visuals.Mesh(meshdata=mdata,
113
+ shading=None,
114
+ color=(0.2, 0.3, 0.7, 1.0))
115
+ shading_filter = ShadingFilter(shading=shading)
116
+ mesh.attach(shading_filter)
117
+ v.add(mesh)
118
+
119
+ shading_filter.enabled = False
120
+ rendered_without_shading = c.render()
121
+
122
+ shading_filter.enabled = True
123
+ rendered_with_shading = c.render()
124
+
125
+ if shading is None:
126
+ # There should be no shading applied, regardless of the value of
127
+ # `enabled`.
128
+ assert np.allclose(rendered_without_shading, rendered_with_shading)
129
+ else:
130
+ # The result should be different with shading applied.
131
+ assert not np.allclose(rendered_without_shading,
132
+ rendered_with_shading)
133
+
134
+
135
+ @requires_pyopengl()
136
+ @requires_application()
137
+ @pytest.mark.parametrize('attribute', ['ambient_coefficient',
138
+ 'diffuse_coefficient',
139
+ 'specular_coefficient',
140
+ 'ambient_light',
141
+ 'diffuse_light',
142
+ 'specular_light'])
143
+ def test_mesh_shading_filter_colors(attribute):
144
+ size = (45, 40)
145
+ with TestingCanvas(size=size, bgcolor="k") as c:
146
+ base_color_white = (1.0, 1.0, 1.0, 1.0)
147
+ overlay_color_red = (1.0, 0.0, 0.0, 1.0)
148
+
149
+ v = c.central_widget.add_view(border_width=0)
150
+ v.camera = 'arcball'
151
+ mdata = create_sphere(20, 30, radius=1)
152
+ mesh = scene.visuals.Mesh(meshdata=mdata, color=base_color_white)
153
+ v.add(mesh)
154
+
155
+ shading_filter = ShadingFilter(shading='smooth',
156
+ # Set the light source on the side of
157
+ # and around the camera to get a clearly
158
+ # visible reflection.
159
+ light_dir=(-5, -5, 5),
160
+ # Activate all illumination types as
161
+ # white light but reduce the intensity
162
+ # to prevent saturation.
163
+ ambient_light=0.3,
164
+ diffuse_light=0.3,
165
+ specular_light=0.3,
166
+ # Get a wide highlight.
167
+ shininess=4)
168
+ mesh.attach(shading_filter)
169
+
170
+ rendered_white = c.render()
171
+
172
+ setattr(shading_filter, attribute, overlay_color_red)
173
+ rendered_red = c.render()
174
+
175
+ # The results should be different.
176
+ assert not np.allclose(rendered_white, rendered_red)
177
+
178
+ # There should be an equal amount of all colors in the white rendering.
179
+ color_count_white = rendered_white.sum(axis=(0, 1))
180
+ r, g, b, _ = color_count_white
181
+ assert r == g and r == b
182
+
183
+ color_count_red = rendered_red.sum(axis=(0, 1))
184
+ # There should be more red in the red-colored rendering.
185
+ r, g, b, _ = color_count_red
186
+ assert r > g and r > b
187
+
188
+
189
+ @requires_pyopengl()
190
+ def test_mesh_bounds():
191
+ # Create 3D visual
192
+ vertices, filled_indices, outline_indices = create_cube()
193
+ axis = scene.visuals.Mesh(vertices['position'], outline_indices,
194
+ color='black', mode='lines')
195
+
196
+ # Test bounds for all 3 axes
197
+ for i in range(3):
198
+ np.testing.assert_allclose(axis.bounds(i), (-1.0, 1.0))
199
+
200
+ # Create 2D visual using projection of cube
201
+ axis = scene.visuals.Mesh(vertices['position'][:, :2], outline_indices,
202
+ color='black', mode='lines')
203
+
204
+ # Test bounds for first 2 axes
205
+ for i in range(2):
206
+ np.testing.assert_allclose(axis.bounds(i), (-1.0, 1.0))
207
+ # Test bounds for 3rd axis
208
+ np.testing.assert_allclose(axis.bounds(2), (0.0, 0.0))
209
+
210
+
211
+ @requires_pyopengl()
212
+ @requires_application()
213
+ def test_mesh_wireframe_filter():
214
+ size = (45, 40)
215
+ with TestingCanvas(size=size, bgcolor="k") as c:
216
+ v = c.central_widget.add_view(border_width=0)
217
+ # Create visual
218
+ mdata = create_sphere(20, 40, radius=20)
219
+ mesh = scene.visuals.Mesh(meshdata=mdata,
220
+ shading=None,
221
+ color=(0.1, 0.3, 0.7, 0.9))
222
+ wireframe_filter = WireframeFilter(color='red')
223
+ mesh.attach(wireframe_filter)
224
+ v.add(mesh)
225
+ from vispy.visuals.transforms import STTransform
226
+ mesh.transform = STTransform(translate=(20, 20))
227
+ mesh.transforms.scene_transform = STTransform(scale=(1, 1, 0.01))
228
+
229
+ rendered_with_wf = c.render()
230
+ assert np.unique(rendered_with_wf[..., 0]).size >= 50
231
+
232
+ wireframe_filter.enabled = False
233
+ rendered_wo_wf = c.render()
234
+ # the result should be completely different
235
+ # assert not allclose
236
+ pytest.raises(AssertionError, np.testing.assert_allclose,
237
+ rendered_with_wf, rendered_wo_wf)
238
+
239
+ wireframe_filter.enabled = True
240
+ wireframe_filter.wireframe_only = True
241
+ rendered_with_wf_only = c.render()
242
+ # the result should be different from the two cases above
243
+ pytest.raises(AssertionError, np.testing.assert_allclose,
244
+ rendered_with_wf_only, rendered_with_wf)
245
+ pytest.raises(AssertionError, np.testing.assert_allclose,
246
+ rendered_with_wf_only, rendered_wo_wf)
247
+
248
+ wireframe_filter.enabled = True
249
+ wireframe_filter.wireframe_only = False
250
+ wireframe_filter.faces_only = True
251
+ rendered_with_faces_only = c.render()
252
+ # the result should be different from the cases above
253
+ pytest.raises(AssertionError, np.testing.assert_allclose,
254
+ rendered_with_faces_only, rendered_with_wf)
255
+ pytest.raises(AssertionError, np.testing.assert_allclose,
256
+ rendered_with_faces_only, rendered_wo_wf)
257
+ pytest.raises(AssertionError, np.testing.assert_allclose,
258
+ rendered_with_faces_only, rendered_with_wf_only)
259
+
260
+
261
+ run_tests_if_main()