vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

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

Potentially problematic release.


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

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-x86_64-linux-gnu.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ import numpy as np
8
+
9
+
10
+ def compact(vertices, indices, tolerance=1e-3):
11
+ """Compact vertices and indices within given tolerance"""
12
+ # Transform vertices into a structured array for np.unique to work
13
+ n = len(vertices)
14
+ V = np.zeros(n, dtype=[("pos", np.float32, 3)])
15
+ V["pos"][:, 0] = vertices[:, 0]
16
+ V["pos"][:, 1] = vertices[:, 1]
17
+ V["pos"][:, 2] = vertices[:, 2]
18
+
19
+ epsilon = 1e-3
20
+ decimals = int(np.log(epsilon)/np.log(1/10.))
21
+
22
+ # Round all vertices within given decimals
23
+ V_ = np.zeros_like(V)
24
+ X = V["pos"][:, 0].round(decimals=decimals)
25
+ X[np.where(abs(X) < epsilon)] = 0
26
+
27
+ V_["pos"][:, 0] = X
28
+ Y = V["pos"][:, 1].round(decimals=decimals)
29
+ Y[np.where(abs(Y) < epsilon)] = 0
30
+ V_["pos"][:, 1] = Y
31
+
32
+ Z = V["pos"][:, 2].round(decimals=decimals)
33
+ Z[np.where(abs(Z) < epsilon)] = 0
34
+ V_["pos"][:, 2] = Z
35
+
36
+ # Find the unique vertices AND the mapping
37
+ U, RI = np.unique(V_, return_inverse=True)
38
+
39
+ # Translate indices from original vertices into the reduced set (U)
40
+ indices = indices.ravel()
41
+ I_ = indices.copy().ravel()
42
+ for i in range(len(indices)):
43
+ I_[i] = RI[indices[i]]
44
+ I_ = I_.reshape(len(indices)//3, 3)
45
+
46
+ # Return reduced vertices set, transalted indices and mapping that allows
47
+ # to go from U to V
48
+ return U.view(np.float32).reshape(len(U), 3), I_, RI
49
+
50
+
51
+ def normals(vertices, indices):
52
+ """Compute normals over a triangulated surface
53
+
54
+ Parameters
55
+ ----------
56
+ vertices : ndarray (n,3)
57
+ triangles vertices
58
+
59
+ indices : ndarray (p,3)
60
+ triangles indices
61
+ """
62
+ # Compact similar vertices
63
+ vertices, indices, mapping = compact(vertices, indices)
64
+
65
+ T = vertices[indices]
66
+ N = np.cross(T[:, 1] - T[:, 0], T[:, 2]-T[:, 0])
67
+ L = np.sqrt(np.sum(N * N, axis=1))
68
+ L[L == 0] = 1.0 # prevent divide-by-zero
69
+ N /= L[:, np.newaxis]
70
+ normals = np.zeros_like(vertices)
71
+ normals[indices[:, 0]] += N
72
+ normals[indices[:, 1]] += N
73
+ normals[indices[:, 2]] += N
74
+ L = np.sqrt(np.sum(normals*normals, axis=1))
75
+ L[L == 0] = 1.0
76
+ normals /= L[:, np.newaxis]
77
+
78
+ return normals[mapping]
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ import numpy as np
8
+ from .normals import normals
9
+
10
+
11
+ def surface(func, umin=0, umax=2 * np.pi, ucount=64, urepeat=1.0,
12
+ vmin=0, vmax=2 * np.pi, vcount=64, vrepeat=1.0):
13
+ """
14
+ Computes the parameterization of a parametric surface
15
+
16
+ func: function(u,v)
17
+ Parametric function used to build the surface
18
+ """
19
+ vtype = [('position', np.float32, 3),
20
+ ('texcoord', np.float32, 2),
21
+ ('normal', np.float32, 3)]
22
+ itype = np.uint32
23
+
24
+ # umin, umax, ucount = 0, 2*np.pi, 64
25
+ # vmin, vmax, vcount = 0, 2*np.pi, 64
26
+
27
+ vcount += 1
28
+ ucount += 1
29
+ n = vcount * ucount
30
+
31
+ Un = np.repeat(np.linspace(0, 1, ucount, endpoint=True), vcount)
32
+ Vn = np.tile(np.linspace(0, 1, vcount, endpoint=True), ucount)
33
+ U = umin + Un * (umax - umin)
34
+ V = vmin + Vn * (vmax - vmin)
35
+
36
+ vertices = np.zeros(n, dtype=vtype)
37
+ for i, (u, v) in enumerate(zip(U, V)):
38
+ vertices["position"][i] = func(u, v)
39
+
40
+ vertices["texcoord"][:, 0] = Un * urepeat
41
+ vertices["texcoord"][:, 1] = Vn * vrepeat
42
+
43
+ indices = []
44
+ for i in range(ucount - 1):
45
+ for j in range(vcount - 1):
46
+ indices.append(i * (vcount) + j)
47
+ indices.append(i * (vcount) + j + 1)
48
+ indices.append(i * (vcount) + j + vcount + 1)
49
+ indices.append(i * (vcount) + j + vcount)
50
+ indices.append(i * (vcount) + j + vcount + 1)
51
+ indices.append(i * (vcount) + j)
52
+ indices = np.array(indices, dtype=itype)
53
+ vertices["normal"] = normals(vertices["position"],
54
+ indices.reshape(len(indices)//3, 3))
55
+
56
+ return vertices, indices
@@ -0,0 +1,137 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ import numpy as np
8
+
9
+ from .triangulation import Triangulation
10
+
11
+
12
+ class PolygonData(object):
13
+ """Polygon class for data handling
14
+
15
+ Parameters
16
+ ----------
17
+ vertices : (Nv, 3) array
18
+ Vertex coordinates. If faces is not specified, then this will instead
19
+ be interpreted as (Nf, 3, 3) array of coordinates.
20
+ edges : (Nv, 2) array
21
+ Constraining edges specified by vertex indices.
22
+ faces : (Nf, 3) array
23
+ Indexes into the vertex array.
24
+
25
+ Notes
26
+ -----
27
+ All arguments are optional.
28
+ """
29
+
30
+ def __init__(self, vertices=None, edges=None, faces=None):
31
+ self._vertices = vertices
32
+ self._edges = edges
33
+ self._faces = faces
34
+ self._convex_hull = None
35
+
36
+ @property
37
+ def faces(self):
38
+ """Return an array (Nf, 3) of vertex indexes, three per triangular
39
+ face in the mesh.
40
+
41
+ If faces have not been computed for this mesh, the function
42
+ computes them.
43
+ If no vertices or faces are specified, the function returns None.
44
+ """
45
+ if self._faces is None:
46
+ if self._vertices is None:
47
+ return None
48
+ self.triangulate()
49
+ return self._faces
50
+
51
+ @faces.setter
52
+ def faces(self, f):
53
+ """If vertices and faces are incompatible, this will generate vertices
54
+ from these faces and set them.
55
+ """
56
+ self._faces = f
57
+
58
+ @property
59
+ def vertices(self):
60
+ """Return an array (Nf, 3) of vertices.
61
+
62
+ If only faces exist, the function computes the vertices and
63
+ returns them.
64
+ If no vertices or faces are specified, the function returns None.
65
+ """
66
+ if self._faces is None:
67
+ if self._vertices is None:
68
+ return None
69
+ self.triangulate()
70
+ return self._vertices
71
+
72
+ @vertices.setter
73
+ def vertices(self, v):
74
+ """If vertices and faces are incompatible, this will generate faces
75
+ from these vertices and set them.
76
+ """
77
+ self._vertices = v
78
+
79
+ @property
80
+ def edges(self):
81
+ """Return an array (Nv, 2) of vertex indices.
82
+
83
+ If no vertices or faces are specified, the function returns None.
84
+ """
85
+ return self._edges
86
+
87
+ @edges.setter
88
+ def edges(self, e):
89
+ """Ensures that all edges are valid."""
90
+ self._edges = e
91
+
92
+ @property
93
+ def convex_hull(self):
94
+ """Return an array of vertex indexes representing the convex hull.
95
+
96
+ If faces have not been computed for this mesh, the function
97
+ computes them.
98
+ If no vertices or faces are specified, the function returns None.
99
+ """
100
+ if self._faces is None:
101
+ if self._vertices is None:
102
+ return None
103
+ self.triangulate()
104
+ return self._convex_hull
105
+
106
+ def triangulate(self):
107
+ """
108
+ Triangulates the set of vertices and stores the triangles in faces and
109
+ the convex hull in convex_hull.
110
+ """
111
+ npts = self._vertices.shape[0]
112
+ if np.any(self._vertices[0] != self._vertices[1]):
113
+ # start != end, so edges must wrap around to beginning.
114
+ edges = np.empty((npts, 2), dtype=np.uint32)
115
+ edges[:, 0] = np.arange(npts)
116
+ edges[:, 1] = edges[:, 0] + 1
117
+ edges[-1, 1] = 0
118
+ else:
119
+ # start == end; no wrapping required.
120
+ edges = np.empty((npts-1, 2), dtype=np.uint32)
121
+ edges[:, 0] = np.arange(npts)
122
+ edges[:, 1] = edges[:, 0] + 1
123
+
124
+ tri = Triangulation(self._vertices, edges)
125
+ tri.triangulate()
126
+ return tri.pts, tri.tris
127
+
128
+ def add_vertex(self, vertex):
129
+ """
130
+ Adds given vertex and retriangulates to generate new faces.
131
+
132
+ Parameters
133
+ ----------
134
+ vertex : array-like
135
+ The vertex to add.
136
+ """
137
+ raise NotImplementedError
vispy/geometry/rect.py ADDED
@@ -0,0 +1,210 @@
1
+ import numpy as np
2
+
3
+
4
+ class Rect(object):
5
+ """
6
+ Representation of a rectangular area in a 2D coordinate system.
7
+
8
+ Parameters
9
+ ----------
10
+ *args : arguments
11
+ Can be in the form `Rect(x, y, w, h)`, `Rect(pos, size)`, or
12
+ `Rect(Rect)`.
13
+ """
14
+
15
+ def __init__(self, *args, **kwargs):
16
+ self._pos = (0, 0)
17
+ self._size = (0, 0)
18
+
19
+ if len(args) == 1 and isinstance(args[0], Rect):
20
+ self._pos = args[0]._pos[:]
21
+ self._size = args[0]._size[:]
22
+ elif (len(args) == 1 and isinstance(args[0], (list, tuple)) and
23
+ len(args[0]) == 4):
24
+ self._pos = args[0][:2]
25
+ self._size = args[0][2:]
26
+ elif len(args) == 2:
27
+ self._pos = tuple(args[0])
28
+ self._size = tuple(args[1])
29
+ elif len(args) == 4:
30
+ self._pos = tuple(args[:2])
31
+ self._size = tuple(args[2:])
32
+ elif len(args) != 0:
33
+ raise TypeError("Rect must be instantiated with 0, 1, 2, or 4 "
34
+ "non-keyword arguments.")
35
+
36
+ self._pos = kwargs.get('pos', self._pos)
37
+ self._size = kwargs.get('size', self._size)
38
+
39
+ if len(self._pos) != 2 or len(self._size) != 2:
40
+ raise ValueError("Rect pos and size arguments must have 2 "
41
+ "elements.")
42
+
43
+ @property
44
+ def pos(self):
45
+ return tuple(self._pos)
46
+
47
+ @pos.setter
48
+ def pos(self, p):
49
+ assert len(p) == 2
50
+ self._pos = p
51
+
52
+ @property
53
+ def size(self):
54
+ return tuple(self._size)
55
+
56
+ @size.setter
57
+ def size(self, s):
58
+ assert len(s) == 2
59
+ self._size = s
60
+
61
+ @property
62
+ def width(self):
63
+ return self.size[0]
64
+
65
+ @width.setter
66
+ def width(self, w):
67
+ self.size = (w, self.size[1])
68
+
69
+ @property
70
+ def height(self):
71
+ return self.size[1]
72
+
73
+ @height.setter
74
+ def height(self, h):
75
+ self.size = (self.size[0], h)
76
+
77
+ @property
78
+ def left(self):
79
+ return self.pos[0]
80
+
81
+ @left.setter
82
+ def left(self, x):
83
+ self.size = (self.size[0] + (self.pos[0] - x), self.size[1])
84
+ self.pos = (x, self.pos[1])
85
+
86
+ @property
87
+ def right(self):
88
+ return self.pos[0] + self.size[0]
89
+
90
+ @right.setter
91
+ def right(self, x):
92
+ self.size = (x - self.pos[0], self.size[1])
93
+
94
+ @property
95
+ def bottom(self):
96
+ return self.pos[1]
97
+
98
+ @bottom.setter
99
+ def bottom(self, y):
100
+ self.size = (self.size[0], self.size[1] + (self.pos[1] - y))
101
+ self.pos = (self.pos[0], y)
102
+
103
+ @property
104
+ def top(self):
105
+ return self.pos[1] + self.size[1]
106
+
107
+ @top.setter
108
+ def top(self, y):
109
+ self.size = (self.size[0], y - self.pos[1])
110
+
111
+ @property
112
+ def center(self):
113
+ return (self.pos[0] + self.size[0] * 0.5,
114
+ self.pos[1] + self.size[1] * 0.5)
115
+
116
+ @center.setter
117
+ def center(self, value):
118
+ delta_x = value[0] - self.center[0]
119
+ delta_y = value[1] - self.center[1]
120
+ self.pos = (self.pos[0] + delta_x, self.pos[1] + delta_y)
121
+
122
+ def padded(self, padding):
123
+ """Return a new Rect padded (smaller) by padding on all sides
124
+
125
+ Parameters
126
+ ----------
127
+ padding : float
128
+ The padding.
129
+
130
+ Returns
131
+ -------
132
+ rect : instance of Rect
133
+ The padded rectangle.
134
+ """
135
+ return Rect(pos=(self.pos[0]+padding, self.pos[1]+padding),
136
+ size=(self.size[0]-2*padding, self.size[1]-2*padding))
137
+
138
+ def normalized(self):
139
+ """Return a Rect covering the same area, but with height and width
140
+ guaranteed to be positive.
141
+ """
142
+ return Rect(pos=(min(self.left, self.right),
143
+ min(self.top, self.bottom)),
144
+ size=(abs(self.width), abs(self.height)))
145
+
146
+ def flipped(self, x=False, y=True):
147
+ """Return a Rect with the same bounds but with axes inverted
148
+
149
+ Parameters
150
+ ----------
151
+ x : bool
152
+ Flip the X axis.
153
+ y : bool
154
+ Flip the Y axis.
155
+
156
+ Returns
157
+ -------
158
+ rect : instance of Rect
159
+ The flipped rectangle.
160
+ """
161
+ pos = list(self.pos)
162
+ size = list(self.size)
163
+ for i, flip in enumerate((x, y)):
164
+ if flip:
165
+ pos[i] += size[i]
166
+ size[i] *= -1
167
+ return Rect(pos, size)
168
+
169
+ def __eq__(self, r):
170
+ if not isinstance(r, Rect):
171
+ return False
172
+ return (np.all(np.equal(r.pos, self.pos)) and
173
+ np.all(np.equal(r.size, self.size)))
174
+
175
+ def __add__(self, a):
176
+ """Return this Rect translated by *a*."""
177
+ return self._transform_out(self._transform_in()[:, :2] + a[:2])
178
+
179
+ def contains(self, x, y):
180
+ """Query if the rectangle contains points
181
+
182
+ Parameters
183
+ ----------
184
+ x : float
185
+ X coordinate.
186
+ y : float
187
+ Y coordinate.
188
+
189
+ Returns
190
+ -------
191
+ contains : bool
192
+ True if the point is within the rectangle.
193
+ """
194
+ return (x >= self.left and x <= self.right and
195
+ y >= self.bottom and y <= self.top)
196
+
197
+ def __repr__(self):
198
+ return "<Rect (%g, %g) (%g, %g)>" % (self.pos + self.size)
199
+
200
+ def _transform_in(self):
201
+ """Return array of coordinates that can be mapped by Transform
202
+ classes.
203
+ """
204
+ return np.array([
205
+ [self.left, self.bottom, 0, 1],
206
+ [self.right, self.top, 0, 1]])
207
+
208
+ def _transform_out(self, coords):
209
+ """Return a new Rect from coordinates mapped after _transform_in()."""
210
+ return Rect(pos=coords[0, :2], size=coords[1, :2]-coords[0, :2])
File without changes
@@ -0,0 +1,23 @@
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.testing import assert_raises
8
+ from vispy.geometry import resize
9
+
10
+
11
+ def test_resize():
12
+ """Test image resizing algorithms"""
13
+ assert_raises(ValueError, resize, np.zeros(3), (3, 3))
14
+ assert_raises(ValueError, resize, np.zeros((3, 3)), (3,))
15
+ assert_raises(ValueError, resize, np.zeros((3, 3)), (4, 4), kind='foo')
16
+ for kind, tol in (('nearest', 1e-5), ('linear', 2e-1)):
17
+ shape = np.array((10, 11, 3))
18
+ data = np.random.RandomState(0).rand(*shape)
19
+ assert_allclose(data, resize(data, shape[:2], kind=kind),
20
+ rtol=1e-5, atol=1e-5)
21
+ # this won't actually be that close for bilinear interp
22
+ assert_allclose(data, resize(resize(data, 2 * shape[:2], kind=kind),
23
+ shape[:2], kind=kind), atol=tol, rtol=tol)
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import numpy as np
5
+ from numpy.testing import assert_array_equal, assert_allclose
6
+
7
+ from vispy.testing import run_tests_if_main
8
+ from vispy.geometry import (create_box, create_cube, create_cylinder,
9
+ create_sphere, create_plane)
10
+
11
+
12
+ def test_box():
13
+ """Test box function"""
14
+ vertices, filled, outline = create_box()
15
+ assert_array_equal(np.arange(len(vertices)), np.unique(filled))
16
+ assert_array_equal(np.arange(len(vertices)), np.unique(outline))
17
+
18
+
19
+ def test_cube():
20
+ """Test cube function"""
21
+ vertices, filled, outline = create_cube()
22
+ assert_array_equal(np.arange(len(vertices)), np.unique(filled))
23
+ assert_array_equal(np.arange(len(vertices)), np.unique(outline))
24
+
25
+
26
+ def test_sphere():
27
+ """Test sphere function"""
28
+ md = create_sphere(rows=10, cols=20, radius=10, method='latitude')
29
+ radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
30
+ assert radii.dtype.type is np.float32
31
+ assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
32
+ md = create_sphere(subdivisions=5, radius=10, method='ico')
33
+ radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
34
+ assert radii.dtype.type is np.float32
35
+ assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
36
+ md = create_sphere(rows=20, cols=20, depth=20, radius=10, method='cube')
37
+ radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
38
+ assert radii.dtype.type is np.float32
39
+ assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
40
+
41
+
42
+ def test_cylinder():
43
+ """Test cylinder function"""
44
+ md = create_cylinder(10, 20, radius=[10, 10])
45
+ radii = np.sqrt((md.get_vertices()[:, :2] ** 2).sum(axis=1))
46
+ assert_allclose(radii, np.ones_like(radii) * 10)
47
+
48
+
49
+ def test_plane():
50
+ """Test plane function"""
51
+ vertices, filled, outline = create_plane()
52
+ assert_array_equal(np.arange(len(vertices)), np.unique(filled))
53
+ assert_array_equal(np.arange(len(vertices)), np.unique(outline))
54
+
55
+
56
+ run_tests_if_main()
@@ -0,0 +1,106 @@
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
+ from numpy.testing import assert_array_equal
7
+
8
+ from vispy.testing import run_tests_if_main
9
+ from vispy.geometry.meshdata import MeshData
10
+
11
+
12
+ def test_meshdata():
13
+ """Test meshdata Class
14
+ It's a unit square cut in two triangular element
15
+ """
16
+ square_vertices = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]],
17
+ dtype=np.float64)
18
+ square_faces = np.array([[0, 1, 2], [0, 2, 3]], dtype=np.uint8)
19
+ square_normals = np.array([[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]],
20
+ dtype=np.float64)
21
+ square_edges = np.array([[0, 1], [0, 2], [0, 3], [1, 2], [2, 3]],
22
+ dtype=np.uint8)
23
+
24
+ mesh = MeshData(vertices=square_vertices, faces=square_faces)
25
+ # test vertices and faces assignement
26
+ assert_array_equal(square_vertices, mesh.get_vertices())
27
+ assert_array_equal(square_faces, mesh.get_faces())
28
+ # test normals calculus
29
+ assert_array_equal(square_normals, mesh.get_vertex_normals())
30
+ # test edge calculus
31
+ assert_array_equal(square_edges, mesh.get_edges())
32
+
33
+
34
+ def test_vertex_normals_indexed_none():
35
+ dtype_float = np.float32
36
+ dtype_int = np.int64
37
+ vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
38
+ dtype=dtype_float)
39
+ faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
40
+ mesh = MeshData(vertices=vertices, faces=faces)
41
+ vertex_normals_unnormalized = np.array(
42
+ [[-1, -1, -1], [0, -1, -1], [-1, 0, -1], [-1, -1, 0]],
43
+ dtype=dtype_float)
44
+ norms = np.sqrt((vertex_normals_unnormalized**2).sum(axis=1,
45
+ keepdims=True))
46
+ expected_vertex_normals = vertex_normals_unnormalized / norms
47
+
48
+ computed_vertex_normals = mesh.get_vertex_normals(indexed=None)
49
+
50
+ assert_array_equal(expected_vertex_normals, computed_vertex_normals)
51
+
52
+
53
+ def test_vertex_normals_indexed_faces():
54
+ dtype_float = np.float32
55
+ dtype_int = np.int64
56
+ vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
57
+ dtype=dtype_float)
58
+ faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
59
+ mesh = MeshData(vertices=vertices, faces=faces)
60
+ vertex_normals_unnormalized = np.array(
61
+ [[-1, -1, -1], [0, -1, -1], [-1, 0, -1], [-1, -1, 0]],
62
+ dtype=dtype_float)
63
+ norms = np.sqrt((vertex_normals_unnormalized**2).sum(axis=1,
64
+ keepdims=True))
65
+ vertex_normals = vertex_normals_unnormalized / norms
66
+ expected_vertex_normals = vertex_normals[faces]
67
+
68
+ computed_vertex_normals = mesh.get_vertex_normals(indexed="faces")
69
+
70
+ assert_array_equal(expected_vertex_normals, computed_vertex_normals)
71
+
72
+
73
+ def test_face_normals_indexed_none():
74
+ dtype_float = np.float32
75
+ dtype_int = np.int64
76
+ vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
77
+ dtype=dtype_float)
78
+ faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
79
+ mesh = MeshData(vertices=vertices, faces=faces)
80
+ expected_face_normals = np.array([[0, 0, -1], [-1, 0, 0], [0, -1, 0]],
81
+ dtype=dtype_float)
82
+
83
+ computed_face_normals = mesh.get_face_normals(indexed=None)
84
+
85
+ assert_array_equal(expected_face_normals, computed_face_normals)
86
+
87
+
88
+ def test_face_normals_indexed_faces():
89
+ dtype_float = np.float32
90
+ dtype_int = np.int64
91
+ vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
92
+ dtype=dtype_float)
93
+ faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
94
+ mesh = MeshData(vertices=vertices, faces=faces)
95
+ expected_face_normals = np.array([
96
+ [[0, 0, -1], [0, 0, -1], [0, 0, -1]],
97
+ [[-1, 0, 0], [-1, 0, 0], [-1, 0, 0]],
98
+ [[0, -1, 0], [0, -1, 0], [0, -1, 0]]],
99
+ dtype=dtype_float)
100
+
101
+ computed_face_normals = mesh.get_face_normals(indexed="faces")
102
+
103
+ assert_array_equal(expected_face_normals, computed_face_normals)
104
+
105
+
106
+ run_tests_if_main()