vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.whl

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

Potentially problematic release.


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

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,35 @@
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
+ import numpy as np
6
+
7
+ from vispy.util.fourier import stft, fft_freqs
8
+ from vispy.testing import assert_raises, run_tests_if_main
9
+
10
+
11
+ def test_stft():
12
+ """Test STFT calculation"""
13
+ assert_raises(ValueError, stft, 0)
14
+ assert_raises(ValueError, stft, [], window='foo')
15
+ assert_raises(ValueError, stft, [[]])
16
+ result = stft([])
17
+ assert np.allclose(result, np.zeros_like(result))
18
+ n_fft = 256
19
+ step = 128
20
+ for n_samples, n_estimates in ((256, 1),
21
+ (383, 1), (384, 2),
22
+ (511, 2), (512, 3)):
23
+ result = stft(np.ones(n_samples), n_fft=n_fft, step=step, window=None)
24
+ assert result.shape[1] == n_estimates
25
+ expected = np.zeros(n_fft // 2 + 1)
26
+ expected[0] = 1
27
+ for res in result.T:
28
+ assert np.allclose(expected, np.abs(res))
29
+ assert np.allclose(expected, np.abs(res))
30
+ for n_pts, last_freq in zip((256, 255), (500., 498.)):
31
+ freqs = fft_freqs(n_pts, 1000)
32
+ assert freqs[0] == 0
33
+ assert np.allclose(freqs[-1], last_freq, atol=1e-1)
34
+
35
+ run_tests_if_main()
@@ -0,0 +1,112 @@
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
+ """Test the sphinx-gallery custom scraper."""
5
+
6
+ import os
7
+
8
+ from vispy.testing import TestingCanvas, requires_application
9
+
10
+ import pytest
11
+
12
+ try:
13
+ from sphinx_gallery.gen_gallery import DEFAULT_GALLERY_CONF
14
+ except ImportError:
15
+ pytest.skip("Skipping sphinx-gallery tests", allow_module_level=True)
16
+
17
+ from ..gallery_scraper import VisPyGalleryScraper
18
+
19
+ pytest.importorskip("PyQt5", reason="Gallery scraper only supports PyQt5")
20
+
21
+
22
+ def _create_fake_block_vars(canvas):
23
+ block_vars = {
24
+ "example_globals": {
25
+ "canvas": canvas,
26
+ },
27
+ "src_file": "example.py",
28
+ "image_path_iterator": (f"{x}.png" for x in range(10)),
29
+ }
30
+ return block_vars
31
+
32
+
33
+ def _create_fake_gallery_conf(src_dir):
34
+ gallery_conf = {}
35
+ gallery_conf.update(DEFAULT_GALLERY_CONF)
36
+ gallery_conf.update({
37
+ "compress_images": "images",
38
+ "compress_images_args": [],
39
+ "src_dir": src_dir,
40
+ "gallery_dirs": src_dir,
41
+ })
42
+ return gallery_conf
43
+
44
+
45
+ @requires_application()
46
+ @pytest.mark.parametrize("include_gallery_comment", [False, True])
47
+ def test_single_frame(include_gallery_comment, tmpdir):
48
+ canvas = TestingCanvas()
49
+ block_vars = _create_fake_block_vars(canvas)
50
+ gallery_conf = _create_fake_gallery_conf(str(tmpdir))
51
+ script = "\n# vispy: gallery 30\n" if include_gallery_comment else ""
52
+ with tmpdir.as_cwd():
53
+ with open("example.py", "w") as example_file:
54
+ example_file.write(script)
55
+ scraper = VisPyGalleryScraper()
56
+ rst = scraper(None, block_vars, gallery_conf)
57
+ if include_gallery_comment:
58
+ assert "0.png" in rst
59
+ assert os.path.isfile("0.png")
60
+ else:
61
+ assert "0.png" not in rst
62
+ assert not os.path.isfile("0.png")
63
+ assert not os.path.isfile("1.png") # only one file created
64
+
65
+
66
+ @requires_application()
67
+ def test_single_animation(tmpdir):
68
+ canvas = TestingCanvas()
69
+ block_vars = _create_fake_block_vars(canvas)
70
+ gallery_conf = _create_fake_gallery_conf(str(tmpdir))
71
+ with tmpdir.as_cwd():
72
+ with open("example.py", "w") as example_file:
73
+ example_file.write("""# vispy: gallery 10:50:5
74
+ """)
75
+ scraper = VisPyGalleryScraper()
76
+ rst = scraper(None, block_vars, gallery_conf)
77
+ assert "0.gif" in rst
78
+ assert os.path.isfile("0.gif")
79
+ assert not os.path.isfile("0.png") # only gif file created
80
+ assert not os.path.isfile("1.png") # only one file created
81
+
82
+
83
+ @requires_application()
84
+ @pytest.mark.parametrize(
85
+ "exported_files",
86
+ [
87
+ ("example.png",),
88
+ ("example.gif",),
89
+ ("example1.png", "example2.png"),
90
+ ])
91
+ def test_single_export(exported_files, tmpdir):
92
+ canvas = TestingCanvas()
93
+ block_vars = _create_fake_block_vars(canvas)
94
+ gallery_conf = _create_fake_gallery_conf(str(tmpdir))
95
+ with tmpdir.as_cwd():
96
+ # create the files that the example should have created
97
+ for fn in exported_files:
98
+ open(fn, "w").close()
99
+
100
+ with open("example.py", "w") as example_file:
101
+ example_file.write("""# vispy: gallery-exports {}
102
+ """.format(" ".join(exported_files)))
103
+
104
+ scraper = VisPyGalleryScraper()
105
+ rst = scraper(None, block_vars, gallery_conf)
106
+ for idx, fn in enumerate(exported_files):
107
+ # the original file should have been moved
108
+ assert not os.path.isfile(fn)
109
+ # the new name should from the sphinx-gallery iterator
110
+ new_name = str(idx) + os.path.splitext(fn)[1]
111
+ assert os.path.isfile(new_name)
112
+ assert new_name in rst
@@ -0,0 +1,127 @@
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
+ """Test that importing vispy subpackages do not pull
5
+ in any more vispy submodules than strictly necessary.
6
+ """
7
+
8
+ import sys
9
+ import os
10
+
11
+ from vispy.testing import (assert_in, assert_not_in, requires_pyopengl,
12
+ run_tests_if_main, assert_equal)
13
+ from vispy.util import run_subprocess
14
+ import vispy
15
+
16
+
17
+ # minimum that will be imported when importing vispy
18
+ _min_modules = ['vispy', 'vispy.util', 'vispy.ext', 'vispy.version']
19
+
20
+
21
+ def loaded_vispy_modules(import_module, depth=None, all_modules=False):
22
+ """Import the given module in subprocess and return loaded modules
23
+
24
+ Import a certain module in a clean subprocess and return the
25
+ vispy modules that are subsequently loaded. The given depth
26
+ indicates the module level (i.e. depth=1 will only yield 'vispy.app'
27
+ but not 'vispy.app.backends').
28
+ """
29
+ vispy_dir = os.path.dirname(os.path.dirname(vispy.__file__))
30
+
31
+ # Get the loaded modules in a clean interpreter
32
+ code = "import sys, %s; print(', '.join(sys.modules))" % import_module
33
+ res = run_subprocess([sys.executable, '-c', code], cwd=vispy_dir)[0]
34
+ loaded_modules = [name.strip() for name in res.split(',')]
35
+
36
+ if all_modules:
37
+ return loaded_modules
38
+
39
+ # Get only vispy modules at the given depth
40
+ vispy_modules = set()
41
+ for m in loaded_modules:
42
+ # pkg_resources from vispy/__init__.py shows up as vispy.pkg_resources in python 2.7
43
+ if m.startswith('vispy') and '__future__' not in m and 'pkg_resources' not in m:
44
+ if depth:
45
+ parts = m.split('.')
46
+ m = '.'.join(parts[:depth])
47
+ vispy_modules.add(m)
48
+
49
+ return vispy_modules
50
+
51
+
52
+ def test_import_nothing():
53
+ """Not importing vispy should not import any vispy modules."""
54
+ modnames = loaded_vispy_modules('os', 2)
55
+ assert_equal(modnames, set())
56
+
57
+
58
+ def test_import_vispy():
59
+ """Importing vispy should only pull in other vispy.util submodule."""
60
+ modnames = loaded_vispy_modules('vispy', 2)
61
+ assert_equal(modnames, set(_min_modules))
62
+
63
+
64
+ def test_import_vispy_util():
65
+ """Importing vispy.util should not pull in other vispy submodules."""
66
+ modnames = loaded_vispy_modules('vispy.util', 2)
67
+ assert_equal(modnames, set(_min_modules))
68
+
69
+
70
+ def test_import_vispy_app1():
71
+ """Importing vispy.app should not pull in other vispy submodules."""
72
+ # Since the introduction of the GLContext to gloo, app depends on gloo
73
+ modnames = loaded_vispy_modules('vispy.app', 2)
74
+ assert_equal(modnames, set(_min_modules + ['vispy.app', 'vispy.gloo',
75
+ 'vispy.glsl', 'vispy.color']))
76
+
77
+
78
+ def test_import_vispy_app2():
79
+ """Importing vispy.app should not pull in any backend toolkit."""
80
+ allmodnames = loaded_vispy_modules('vispy.app', 2, True)
81
+ assert_not_in('PySide', allmodnames)
82
+ assert_not_in('PySide2', allmodnames)
83
+ assert_not_in('PySide6', allmodnames)
84
+ assert_not_in('PyQt4', allmodnames)
85
+ assert_not_in('PyQt5', allmodnames)
86
+ assert_not_in('PyQt6', allmodnames)
87
+ assert_not_in('pyglet', allmodnames)
88
+
89
+
90
+ def test_import_vispy_gloo():
91
+ """Importing vispy.gloo should not pull in other vispy submodules."""
92
+ modnames = loaded_vispy_modules('vispy.gloo', 2)
93
+ assert_equal(modnames, set(_min_modules + ['vispy.gloo',
94
+ 'vispy.glsl',
95
+ 'vispy.color']))
96
+
97
+
98
+ def test_import_vispy_no_pyopengl():
99
+ """Importing vispy.gloo.gl.gl2 should not import PyOpenGL."""
100
+ # vispy.gloo desktop backend
101
+ allmodnames = loaded_vispy_modules('vispy.gloo.gl.gl2', 2, True)
102
+ assert_not_in('OpenGL', allmodnames)
103
+ # vispy.app
104
+ allmodnames = loaded_vispy_modules('vispy.app', 2, True)
105
+ assert_not_in('OpenGL', allmodnames)
106
+ # vispy.scene
107
+ allmodnames = loaded_vispy_modules('vispy.scene', 2, True)
108
+ assert_not_in('OpenGL', allmodnames)
109
+
110
+
111
+ @requires_pyopengl()
112
+ def test_import_vispy_pyopengl():
113
+ """Importing vispy.gloo.gl.pyopengl2 should import PyOpenGL."""
114
+ allmodnames = loaded_vispy_modules('vispy.gloo.gl.pyopengl2', 2, True)
115
+ assert_in('OpenGL', allmodnames)
116
+
117
+
118
+ def test_import_vispy_scene():
119
+ """Importing vispy.gloo.gl.desktop should not import PyOpenGL."""
120
+ modnames = loaded_vispy_modules('vispy.scene', 2)
121
+ more_modules = ['vispy.app', 'vispy.gloo', 'vispy.glsl', 'vispy.scene',
122
+ 'vispy.color',
123
+ 'vispy.io', 'vispy.geometry', 'vispy.visuals']
124
+ assert_equal(modnames, set(_min_modules + more_modules))
125
+
126
+
127
+ run_tests_if_main()
@@ -0,0 +1,22 @@
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
+ from vispy.util.keys import Key, ENTER
6
+ from vispy.testing import (run_tests_if_main, assert_raises, assert_true,
7
+ assert_equal)
8
+
9
+
10
+ def test_key():
11
+ """Test basic key functionality"""
12
+ def bad():
13
+ return (ENTER == dict())
14
+ assert_raises(ValueError, bad)
15
+ assert_true(not (ENTER == None)) # noqa
16
+ assert_equal('Return', ENTER)
17
+ print(ENTER.name)
18
+ print(ENTER) # __repr__
19
+ assert_equal(Key('1'), 49) # ASCII code
20
+
21
+
22
+ run_tests_if_main()
@@ -0,0 +1,45 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import logging
5
+
6
+ from vispy.util import logger, use_log_level
7
+ from vispy.testing import (assert_in, assert_not_in, run_tests_if_main,
8
+ assert_equal)
9
+
10
+
11
+ def test_logging():
12
+ """Test logging context manager"""
13
+ ll = logger.level
14
+ with use_log_level('warning', print_msg=False):
15
+ assert_equal(logger.level, logging.WARN)
16
+ assert_equal(logger.level, ll)
17
+ with use_log_level('debug', print_msg=False):
18
+ assert_equal(logger.level, logging.DEBUG)
19
+ assert_equal(logger.level, ll)
20
+
21
+
22
+ def test_debug_logging():
23
+ """Test advanced debugging logging"""
24
+ with use_log_level('debug', 'Selected', True, False) as emit_list:
25
+ logger.debug('Selected foo')
26
+ assert_equal(len(emit_list), 1)
27
+ assert_in('test_logging', emit_list[0]) # can't really parse this location
28
+
29
+ with use_log_level('debug', record=True, print_msg=False) as emit_list:
30
+ logger.debug('foo')
31
+ assert_equal(len(emit_list), 1)
32
+ assert_in('test_logging', emit_list[0])
33
+
34
+ with use_log_level('debug', 'foo', True, False) as emit_list:
35
+ logger.debug('bar')
36
+ assert_equal(len(emit_list), 0)
37
+
38
+ with use_log_level('info', record=True, print_msg=False) as emit_list:
39
+ logger.debug('foo')
40
+ logger.info('bar')
41
+ assert_equal(len(emit_list), 1)
42
+ assert_not_in('unknown', emit_list[0])
43
+
44
+
45
+ run_tests_if_main()
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ from vispy.util import run_subprocess
5
+ from vispy.testing import run_tests_if_main, assert_raises
6
+
7
+
8
+ def test_run():
9
+ """Test running subprocesses"""
10
+ bad_name = 'foo_nonexist_test'
11
+ assert_raises(Exception, run_subprocess, [bad_name])
12
+
13
+
14
+ run_tests_if_main()
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import numpy as np
5
+ from numpy.testing import assert_allclose
6
+
7
+ from vispy.util.transforms import (translate, scale, rotate, ortho, frustum,
8
+ perspective)
9
+ from vispy.testing import run_tests_if_main, assert_equal
10
+
11
+
12
+ def test_transforms():
13
+ """Test basic transforms"""
14
+ xfm = np.random.randn(4, 4).astype(np.float32)
15
+
16
+ # Do a series of rotations that should end up into the same orientation
17
+ # again, to ensure the order of computation is all correct
18
+ # i.e. if rotated would return the transposed matrix this would not work
19
+ # out (the translation part would be incorrect)
20
+ new_xfm = xfm.dot(rotate(180, (1, 0, 0)).dot(rotate(-90, (0, 1, 0))))
21
+ new_xfm = new_xfm.dot(rotate(90, (0, 0, 1)).dot(rotate(90, (0, 1, 0))))
22
+ new_xfm = new_xfm.dot(rotate(90, (1, 0, 0)))
23
+ assert_allclose(xfm, new_xfm)
24
+
25
+ new_xfm = translate((1, -1, 1)).dot(translate((-1, 1, -1))).dot(xfm)
26
+ assert_allclose(xfm, new_xfm)
27
+
28
+ new_xfm = scale((1, 2, 3)).dot(scale((1, 1. / 2., 1. / 3.))).dot(xfm)
29
+ assert_allclose(xfm, new_xfm)
30
+
31
+ # These could be more complex...
32
+ xfm = ortho(-1, 1, -1, 1, -1, 1)
33
+ assert_equal(xfm.shape, (4, 4))
34
+
35
+ xfm = frustum(-1, 1, -1, 1, -1, 1)
36
+ assert_equal(xfm.shape, (4, 4))
37
+
38
+ xfm = perspective(1, 1, -1, 1)
39
+ assert_equal(xfm.shape, (4, 4))
40
+
41
+
42
+ run_tests_if_main()
@@ -0,0 +1,48 @@
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
+ """Tests to ensure that base vispy namespace functions correctly,
5
+ including configuration options.
6
+ """
7
+
8
+ import vispy.app
9
+ from vispy.testing import (requires_application, run_tests_if_main,
10
+ assert_raises, assert_equal, assert_not_equal)
11
+
12
+
13
+ @requires_application('pyside')
14
+ def test_use():
15
+
16
+ # Set default app to None, so we can test the use function
17
+ vispy.app.use_app()
18
+ default_app = vispy.app._default_app.default_app
19
+ vispy.app._default_app.default_app = None
20
+
21
+ app_name = default_app.backend_name.split(' ')[0]
22
+
23
+ try:
24
+ # With no arguments, should do nothing
25
+ assert_raises(TypeError, vispy.use)
26
+ assert_equal(vispy.app._default_app.default_app, None)
27
+
28
+ # With only gl args, should do nothing to app
29
+ vispy.use(gl='gl2')
30
+ assert_equal(vispy.app._default_app.default_app, None)
31
+
32
+ # Specify app (one we know works)
33
+ vispy.use(app_name)
34
+ assert_not_equal(vispy.app._default_app.default_app, None)
35
+
36
+ # Again, but now wrong app
37
+ wrong_name = 'glfw' if app_name.lower() != 'glfw' else 'pyqt4'
38
+ assert_raises(RuntimeError, vispy.use, wrong_name)
39
+
40
+ # And both
41
+ vispy.use(app_name, 'gl2')
42
+
43
+ finally:
44
+ # Restore
45
+ vispy.app._default_app.default_app = default_app
46
+
47
+
48
+ run_tests_if_main()
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ """Very simple transformation library that is needed for some examples."""
4
+
5
+ from __future__ import division
6
+
7
+ # Note: we use functions (e.g. sin) from math module because they're faster
8
+
9
+ import math
10
+ import numpy as np
11
+
12
+
13
+ def translate(offset, dtype=None):
14
+ """Translate by an offset (x, y, z) .
15
+
16
+ Parameters
17
+ ----------
18
+ offset : array-like, shape (3,)
19
+ Translation in x, y, z.
20
+ dtype : dtype | None
21
+ Output type (if None, don't cast).
22
+
23
+ Returns
24
+ -------
25
+ M : ndarray
26
+ Transformation matrix describing the translation.
27
+ """
28
+ assert len(offset) == 3
29
+ x, y, z = offset
30
+ M = np.array([[1., 0., 0., 0.],
31
+ [0., 1., 0., 0.],
32
+ [0., 0., 1., 0.],
33
+ [x, y, z, 1.0]], dtype)
34
+ return M
35
+
36
+
37
+ def scale(s, dtype=None):
38
+ """Non-uniform scaling along the x, y, and z axes
39
+
40
+ Parameters
41
+ ----------
42
+ s : array-like, shape (3,)
43
+ Scaling in x, y, z.
44
+ dtype : dtype | None
45
+ Output type (if None, don't cast).
46
+
47
+ Returns
48
+ -------
49
+ M : ndarray
50
+ Transformation matrix describing the scaling.
51
+ """
52
+ assert len(s) == 3
53
+ return np.array(np.diag(np.concatenate([s, (1.,)])), dtype)
54
+
55
+
56
+ def rotate(angle, axis, dtype=None):
57
+ """The 4x4 rotation matrix for rotation about a vector.
58
+
59
+ Parameters
60
+ ----------
61
+ angle : float
62
+ The angle of rotation, in degrees.
63
+ axis : ndarray
64
+ The x, y, z coordinates of the axis direction vector.
65
+
66
+ Returns
67
+ -------
68
+ M : ndarray
69
+ Transformation matrix describing the rotation.
70
+ """
71
+ angle = np.radians(angle)
72
+ assert len(axis) == 3
73
+ x, y, z = axis / np.linalg.norm(axis)
74
+ c, s = math.cos(angle), math.sin(angle)
75
+ cx, cy, cz = (1 - c) * x, (1 - c) * y, (1 - c) * z
76
+ M = np.array([[cx * x + c, cy * x - z * s, cz * x + y * s, .0],
77
+ [cx * y + z * s, cy * y + c, cz * y - x * s, 0.],
78
+ [cx * z - y * s, cy * z + x * s, cz * z + c, 0.],
79
+ [0., 0., 0., 1.]], dtype).T
80
+ return M
81
+
82
+
83
+ def ortho(left, right, bottom, top, znear, zfar):
84
+ """Create orthographic projection matrix
85
+
86
+ Parameters
87
+ ----------
88
+ left : float
89
+ Left coordinate of the field of view.
90
+ right : float
91
+ Right coordinate of the field of view.
92
+ bottom : float
93
+ Bottom coordinate of the field of view.
94
+ top : float
95
+ Top coordinate of the field of view.
96
+ znear : float
97
+ Near coordinate of the field of view.
98
+ zfar : float
99
+ Far coordinate of the field of view.
100
+
101
+ Returns
102
+ -------
103
+ M : ndarray
104
+ Orthographic projection matrix (4x4).
105
+ """
106
+ assert(right != left)
107
+ assert(bottom != top)
108
+ assert(znear != zfar)
109
+
110
+ M = np.zeros((4, 4), dtype=np.float32)
111
+ M[0, 0] = +2.0 / (right - left)
112
+ M[3, 0] = -(right + left) / float(right - left)
113
+ M[1, 1] = +2.0 / (top - bottom)
114
+ M[3, 1] = -(top + bottom) / float(top - bottom)
115
+ M[2, 2] = -2.0 / (zfar - znear)
116
+ M[3, 2] = -(zfar + znear) / float(zfar - znear)
117
+ M[3, 3] = 1.0
118
+ return M
119
+
120
+
121
+ def frustum(left, right, bottom, top, znear, zfar):
122
+ """Create view frustum
123
+
124
+ Parameters
125
+ ----------
126
+ left : float
127
+ Left coordinate of the field of view.
128
+ right : float
129
+ Right coordinate of the field of view.
130
+ bottom : float
131
+ Bottom coordinate of the field of view.
132
+ top : float
133
+ Top coordinate of the field of view.
134
+ znear : float
135
+ Near coordinate of the field of view.
136
+ zfar : float
137
+ Far coordinate of the field of view.
138
+
139
+ Returns
140
+ -------
141
+ M : ndarray
142
+ View frustum matrix (4x4).
143
+ """
144
+ assert(right != left)
145
+ assert(bottom != top)
146
+ assert(znear != zfar)
147
+
148
+ M = np.zeros((4, 4), dtype=np.float32)
149
+ M[0, 0] = +2.0 * znear / float(right - left)
150
+ M[2, 0] = (right + left) / float(right - left)
151
+ M[1, 1] = +2.0 * znear / float(top - bottom)
152
+ M[2, 1] = (top + bottom) / float(top - bottom)
153
+ M[2, 2] = -(zfar + znear) / float(zfar - znear)
154
+ M[3, 2] = -2.0 * znear * zfar / float(zfar - znear)
155
+ M[2, 3] = -1.0
156
+ return M
157
+
158
+
159
+ def perspective(fovy, aspect, znear, zfar):
160
+ """Create perspective projection matrix
161
+
162
+ Parameters
163
+ ----------
164
+ fovy : float
165
+ The field of view along the y axis.
166
+ aspect : float
167
+ Aspect ratio of the view.
168
+ znear : float
169
+ Near coordinate of the field of view.
170
+ zfar : float
171
+ Far coordinate of the field of view.
172
+
173
+ Returns
174
+ -------
175
+ M : ndarray
176
+ Perspective projection matrix (4x4).
177
+ """
178
+ assert(znear != zfar)
179
+ h = math.tan(fovy / 360.0 * math.pi) * znear
180
+ w = h * aspect
181
+ return frustum(-w, w, -h, h, znear, zfar)
182
+
183
+
184
+ def affine_map(points1, points2):
185
+ """Find a 3D transformation matrix that maps points1 onto points2.
186
+
187
+ Arguments are specified as arrays of four 3D coordinates, shape (4, 3).
188
+ """
189
+ A = np.ones((4, 4))
190
+ A[:, :3] = points1
191
+ B = np.ones((4, 4))
192
+ B[:, :3] = points2
193
+
194
+ # solve 3 sets of linear equations to determine
195
+ # transformation matrix elements
196
+ matrix = np.eye(4)
197
+ for i in range(3):
198
+ # solve Ax = B; x is one row of the desired transformation matrix
199
+ matrix[i] = np.linalg.solve(A, B[:, i])
200
+
201
+ return matrix