vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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

Potentially problematic release.


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

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,643 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+ # Author: Nicolas P .Rougier
7
+ # Date: 04/03/2014
8
+ # -----------------------------------------------------------------------------
9
+ from __future__ import division
10
+
11
+ import numpy as np
12
+
13
+ from .meshdata import MeshData
14
+
15
+
16
+ def create_cube():
17
+ """Generate vertices & indices for a filled and outlined cube
18
+
19
+ Returns
20
+ -------
21
+ vertices : array
22
+ Array of vertices suitable for use as a VertexBuffer.
23
+ filled : array
24
+ Indices to use to produce a filled cube.
25
+ outline : array
26
+ Indices to use to produce an outline of the cube.
27
+ """
28
+ vtype = [('position', np.float32, 3),
29
+ ('texcoord', np.float32, 2),
30
+ ('normal', np.float32, 3),
31
+ ('color', np.float32, 4)]
32
+ itype = np.uint32
33
+
34
+ # Vertices positions
35
+ p = np.array([[1, 1, 1], [-1, 1, 1], [-1, -1, 1], [1, -1, 1],
36
+ [1, -1, -1], [1, 1, -1], [-1, 1, -1], [-1, -1, -1]])
37
+
38
+ # Face Normals
39
+ n = np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0],
40
+ [-1, 0, 0], [0, -1, 0], [0, 0, -1]])
41
+
42
+ # Vertice colors
43
+ c = np.array([[1, 1, 1, 1], [0, 1, 1, 1], [0, 0, 1, 1], [1, 0, 1, 1],
44
+ [1, 0, 0, 1], [1, 1, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1]])
45
+
46
+ # Texture coords
47
+ t = np.array([[0, 0], [0, 1], [1, 1], [1, 0]])
48
+
49
+ faces_p = [0, 1, 2, 3,
50
+ 0, 3, 4, 5,
51
+ 0, 5, 6, 1,
52
+ 1, 6, 7, 2,
53
+ 7, 4, 3, 2,
54
+ 4, 7, 6, 5]
55
+ faces_c = [0, 1, 2, 3,
56
+ 0, 3, 4, 5,
57
+ 0, 5, 6, 1,
58
+ 1, 6, 7, 2,
59
+ 7, 4, 3, 2,
60
+ 4, 7, 6, 5]
61
+ faces_n = [0, 0, 0, 0,
62
+ 1, 1, 1, 1,
63
+ 2, 2, 2, 2,
64
+ 3, 3, 3, 3,
65
+ 4, 4, 4, 4,
66
+ 5, 5, 5, 5]
67
+ faces_t = [0, 1, 2, 3,
68
+ 0, 1, 2, 3,
69
+ 0, 1, 2, 3,
70
+ 3, 2, 1, 0,
71
+ 0, 1, 2, 3,
72
+ 0, 1, 2, 3]
73
+
74
+ vertices = np.zeros(24, vtype)
75
+ vertices['position'] = p[faces_p]
76
+ vertices['normal'] = n[faces_n]
77
+ vertices['color'] = c[faces_c]
78
+ vertices['texcoord'] = t[faces_t]
79
+
80
+ filled = np.resize(
81
+ np.array([0, 1, 2, 0, 2, 3], dtype=itype), 6 * (2 * 3))
82
+ filled += np.repeat(4 * np.arange(6, dtype=itype), 6)
83
+ filled = filled.reshape((len(filled) // 3, 3))
84
+
85
+ outline = np.resize(
86
+ np.array([0, 1, 1, 2, 2, 3, 3, 0], dtype=itype), 6 * (2 * 4))
87
+ outline += np.repeat(4 * np.arange(6, dtype=itype), 8)
88
+
89
+ return vertices, filled, outline
90
+
91
+
92
+ def create_plane(width=1, height=1, width_segments=1, height_segments=1,
93
+ direction='+z'):
94
+ """Generate vertices & indices for a filled and outlined plane.
95
+
96
+ Parameters
97
+ ----------
98
+ width : float
99
+ Plane width.
100
+ height : float
101
+ Plane height.
102
+ width_segments : int
103
+ Plane segments count along the width.
104
+ height_segments : float
105
+ Plane segments count along the height.
106
+ direction: unicode
107
+ ``{'-x', '+x', '-y', '+y', '-z', '+z'}``
108
+ Direction the plane will be facing.
109
+
110
+ Returns
111
+ -------
112
+ vertices : array
113
+ Array of vertices suitable for use as a VertexBuffer.
114
+ faces : array
115
+ Indices to use to produce a filled plane.
116
+ outline : array
117
+ Indices to use to produce an outline of the plane.
118
+
119
+ References
120
+ ----------
121
+ .. [1] Cabello, R. (n.d.). PlaneBufferGeometry.js. Retrieved May 12, 2015,
122
+ from http://git.io/vU1Fh
123
+ """
124
+ x_grid = width_segments
125
+ y_grid = height_segments
126
+
127
+ x_grid1 = x_grid + 1
128
+ y_grid1 = y_grid + 1
129
+
130
+ # Positions, normals and texcoords.
131
+ positions = np.zeros(x_grid1 * y_grid1 * 3)
132
+ normals = np.zeros(x_grid1 * y_grid1 * 3)
133
+ texcoords = np.zeros(x_grid1 * y_grid1 * 2)
134
+
135
+ y = np.arange(y_grid1) * height / y_grid - height / 2
136
+ x = np.arange(x_grid1) * width / x_grid - width / 2
137
+
138
+ positions[::3] = np.tile(x, y_grid1)
139
+ positions[1::3] = -np.repeat(y, x_grid1)
140
+
141
+ normals[2::3] = 1
142
+
143
+ texcoords[::2] = np.tile(np.arange(x_grid1) / x_grid, y_grid1)
144
+ texcoords[1::2] = np.repeat(1 - np.arange(y_grid1) / y_grid, x_grid1)
145
+
146
+ # Faces and outline.
147
+ faces, outline = [], []
148
+ for i_y in range(y_grid):
149
+ for i_x in range(x_grid):
150
+ a = i_x + x_grid1 * i_y
151
+ b = i_x + x_grid1 * (i_y + 1)
152
+ c = (i_x + 1) + x_grid1 * (i_y + 1)
153
+ d = (i_x + 1) + x_grid1 * i_y
154
+
155
+ faces.extend(((a, b, d), (b, c, d)))
156
+ outline.extend(((a, b), (b, c), (c, d), (d, a)))
157
+
158
+ positions = np.reshape(positions, (-1, 3))
159
+ texcoords = np.reshape(texcoords, (-1, 2))
160
+ normals = np.reshape(normals, (-1, 3))
161
+
162
+ faces = np.reshape(faces, (-1, 3)).astype(np.uint32)
163
+ outline = np.reshape(outline, (-1, 2)).astype(np.uint32)
164
+
165
+ direction = direction.lower()
166
+ if direction in ('-x', '+x'):
167
+ shift, neutral_axis = 1, 0
168
+ elif direction in ('-y', '+y'):
169
+ shift, neutral_axis = -1, 1
170
+ elif direction in ('-z', '+z'):
171
+ shift, neutral_axis = 0, 2
172
+
173
+ sign = -1 if '-' in direction else 1
174
+
175
+ positions = np.roll(positions, shift, -1)
176
+ normals = np.roll(normals, shift, -1) * sign
177
+ colors = np.ravel(positions)
178
+ colors = np.hstack((np.reshape(np.interp(colors,
179
+ (np.min(colors),
180
+ np.max(colors)),
181
+ (0, 1)),
182
+ positions.shape),
183
+ np.ones((positions.shape[0], 1))))
184
+ colors[..., neutral_axis] = 0
185
+
186
+ vertices = np.zeros(positions.shape[0],
187
+ [('position', np.float32, 3),
188
+ ('texcoord', np.float32, 2),
189
+ ('normal', np.float32, 3),
190
+ ('color', np.float32, 4)])
191
+
192
+ vertices['position'] = positions
193
+ vertices['texcoord'] = texcoords
194
+ vertices['normal'] = normals
195
+ vertices['color'] = colors
196
+
197
+ return vertices, faces, outline
198
+
199
+
200
+ def create_box(width=1, height=1, depth=1, width_segments=1, height_segments=1,
201
+ depth_segments=1, planes=None):
202
+ """Generate vertices & indices for a filled and outlined box.
203
+
204
+ Parameters
205
+ ----------
206
+ width : float
207
+ Box width.
208
+ height : float
209
+ Box height.
210
+ depth : float
211
+ Box depth.
212
+ width_segments : int
213
+ Box segments count along the width.
214
+ height_segments : float
215
+ Box segments count along the height.
216
+ depth_segments : float
217
+ Box segments count along the depth.
218
+ planes: array_like
219
+ Any combination of ``{'-x', '+x', '-y', '+y', '-z', '+z'}``
220
+ Included planes in the box construction.
221
+
222
+ Returns
223
+ -------
224
+ vertices : array
225
+ Array of vertices suitable for use as a VertexBuffer.
226
+ faces : array
227
+ Indices to use to produce a filled box.
228
+ outline : array
229
+ Indices to use to produce an outline of the box.
230
+ """
231
+ planes = (('+x', '-x', '+y', '-y', '+z', '-z')
232
+ if planes is None else
233
+ [d.lower() for d in planes])
234
+
235
+ w_s, h_s, d_s = width_segments, height_segments, depth_segments
236
+
237
+ planes_m = []
238
+ if '-z' in planes:
239
+ planes_m.append(create_plane(width, depth, w_s, d_s, '-z'))
240
+ planes_m[-1][0]['position'][..., 2] -= height / 2
241
+ if '+z' in planes:
242
+ planes_m.append(create_plane(width, depth, w_s, d_s, '+z'))
243
+ planes_m[-1][0]['position'][..., 2] += height / 2
244
+
245
+ if '-y' in planes:
246
+ planes_m.append(create_plane(height, width, h_s, w_s, '-y'))
247
+ planes_m[-1][0]['position'][..., 1] -= depth / 2
248
+ if '+y' in planes:
249
+ planes_m.append(create_plane(height, width, h_s, w_s, '+y'))
250
+ planes_m[-1][0]['position'][..., 1] += depth / 2
251
+
252
+ if '-x' in planes:
253
+ planes_m.append(create_plane(depth, height, d_s, h_s, '-x'))
254
+ planes_m[-1][0]['position'][..., 0] -= width / 2
255
+ if '+x' in planes:
256
+ planes_m.append(create_plane(depth, height, d_s, h_s, '+x'))
257
+ planes_m[-1][0]['position'][..., 0] += width / 2
258
+
259
+ positions = np.zeros((0, 3), dtype=np.float32)
260
+ texcoords = np.zeros((0, 2), dtype=np.float32)
261
+ normals = np.zeros((0, 3), dtype=np.float32)
262
+
263
+ faces = np.zeros((0, 3), dtype=np.uint32)
264
+ outline = np.zeros((0, 2), dtype=np.uint32)
265
+
266
+ offset = 0
267
+ for vertices_p, faces_p, outline_p in planes_m:
268
+ positions = np.vstack((positions, vertices_p['position']))
269
+ texcoords = np.vstack((texcoords, vertices_p['texcoord']))
270
+ normals = np.vstack((normals, vertices_p['normal']))
271
+
272
+ faces = np.vstack((faces, faces_p + offset))
273
+ outline = np.vstack((outline, outline_p + offset))
274
+ offset += vertices_p['position'].shape[0]
275
+
276
+ vertices = np.zeros(positions.shape[0],
277
+ [('position', np.float32, 3),
278
+ ('texcoord', np.float32, 2),
279
+ ('normal', np.float32, 3),
280
+ ('color', np.float32, 4)])
281
+
282
+ colors = np.ravel(positions)
283
+ colors = np.hstack((np.reshape(np.interp(colors,
284
+ (np.min(colors),
285
+ np.max(colors)),
286
+ (0, 1)),
287
+ positions.shape),
288
+ np.ones((positions.shape[0], 1))))
289
+
290
+ vertices['position'] = positions
291
+ vertices['texcoord'] = texcoords
292
+ vertices['normal'] = normals
293
+ vertices['color'] = colors
294
+
295
+ return vertices, faces, outline
296
+
297
+
298
+ def _latitude(rows, cols, radius, offset):
299
+ verts = np.empty((rows+1, cols, 3), dtype=np.float32)
300
+
301
+ # compute vertices
302
+ phi = (np.arange(rows+1) * np.pi / rows).reshape(rows+1, 1)
303
+ s = radius * np.sin(phi)
304
+ verts[..., 2] = radius * np.cos(phi)
305
+ th = ((np.arange(cols) * 2 * np.pi / cols).reshape(1, cols))
306
+ if offset:
307
+ # rotate each row by 1/2 column
308
+ th = th + ((np.pi / cols) * np.arange(rows+1).reshape(rows+1, 1))
309
+ verts[..., 0] = s * np.cos(th)
310
+ verts[..., 1] = s * np.sin(th)
311
+ # remove redundant vertices from top and bottom
312
+ verts = verts.reshape((rows+1)*cols, 3)[cols-1:-(cols-1)]
313
+
314
+ # compute faces
315
+ faces = np.empty((rows*cols*2, 3), dtype=np.uint32)
316
+ rowtemplate1 = (((np.arange(cols).reshape(cols, 1) +
317
+ np.array([[1, 0, 0]])) % cols) +
318
+ np.array([[0, 0, cols]]))
319
+ rowtemplate2 = (((np.arange(cols).reshape(cols, 1) +
320
+ np.array([[1, 0, 1]])) % cols) +
321
+ np.array([[0, cols, cols]]))
322
+ for row in range(rows):
323
+ start = row * cols * 2
324
+ faces[start:start+cols] = rowtemplate1 + row * cols
325
+ faces[start+cols:start+(cols*2)] = rowtemplate2 + row * cols
326
+ # cut off zero-area triangles at top and bottom
327
+ faces = faces[cols:-cols]
328
+
329
+ # adjust for redundant vertices that were removed from top and bottom
330
+ vmin = cols-1
331
+ faces[faces < vmin] = vmin
332
+ faces -= vmin
333
+ vmax = verts.shape[0]-1
334
+ faces[faces > vmax] = vmax
335
+ return MeshData(vertices=verts, faces=faces)
336
+
337
+
338
+ def _ico(radius, subdivisions):
339
+ # golden ratio
340
+ t = (1.0 + np.sqrt(5.0))/2.0
341
+
342
+ # vertices of a icosahedron
343
+ verts = [(-1, t, 0),
344
+ (1, t, 0),
345
+ (-1, -t, 0),
346
+ (1, -t, 0),
347
+ (0, -1, t),
348
+ (0, 1, t),
349
+ (0, -1, -t),
350
+ (0, 1, -t),
351
+ (t, 0, -1),
352
+ (t, 0, 1),
353
+ (-t, 0, -1),
354
+ (-t, 0, 1)]
355
+
356
+ # faces of the icosahedron
357
+ faces = [(0, 11, 5),
358
+ (0, 5, 1),
359
+ (0, 1, 7),
360
+ (0, 7, 10),
361
+ (0, 10, 11),
362
+ (1, 5, 9),
363
+ (5, 11, 4),
364
+ (11, 10, 2),
365
+ (10, 7, 6),
366
+ (7, 1, 8),
367
+ (3, 9, 4),
368
+ (3, 4, 2),
369
+ (3, 2, 6),
370
+ (3, 6, 8),
371
+ (3, 8, 9),
372
+ (4, 9, 5),
373
+ (2, 4, 11),
374
+ (6, 2, 10),
375
+ (8, 6, 7),
376
+ (9, 8, 1)]
377
+
378
+ def midpoint(v1, v2):
379
+ return ((v1[0]+v2[0])/2, (v1[1]+v2[1])/2, (v1[2]+v2[2])/2)
380
+
381
+ # subdivision
382
+ for _ in range(subdivisions):
383
+ for idx in range(len(faces)):
384
+ i, j, k = faces[idx]
385
+ a, b, c = verts[i], verts[j], verts[k]
386
+ ab, bc, ca = midpoint(a, b), midpoint(b, c), midpoint(c, a)
387
+ verts += [ab, bc, ca]
388
+ ij, jk, ki = len(verts)-3, len(verts)-2, len(verts)-1
389
+ faces.append([i, ij, ki])
390
+ faces.append([ij, j, jk])
391
+ faces.append([ki, jk, k])
392
+ faces[idx] = [jk, ki, ij]
393
+ verts = np.array(verts, dtype=np.float32)
394
+ faces = np.array(faces, dtype=np.uint32)
395
+
396
+ # make each vertex to lie on the sphere
397
+ lengths = np.sqrt((verts*verts).sum(axis=1))
398
+ verts /= lengths[:, np.newaxis]/radius
399
+ return MeshData(vertices=verts, faces=faces)
400
+
401
+
402
+ def _cube(rows, cols, depth, radius):
403
+ # vertices and faces of tessellated cube
404
+ verts, faces, _ = create_box(1, 1, 1, cols, rows, depth)
405
+ verts = verts['position']
406
+
407
+ # make each vertex to lie on the sphere
408
+ lengths = np.sqrt((verts*verts).sum(axis=1))
409
+ verts /= lengths[:, np.newaxis]/radius
410
+ return MeshData(vertices=verts, faces=faces)
411
+
412
+
413
+ def create_sphere(rows=10, cols=10, depth=10, radius=1.0, offset=True,
414
+ subdivisions=3, method='latitude'):
415
+ """Create a sphere
416
+
417
+ Parameters
418
+ ----------
419
+ rows : int
420
+ Number of rows (for method='latitude' and 'cube').
421
+ cols : int
422
+ Number of columns (for method='latitude' and 'cube').
423
+ depth : int
424
+ Number of depth segments (for method='cube').
425
+ radius : float
426
+ Sphere radius.
427
+ offset : bool
428
+ Rotate each row by half a column (for method='latitude').
429
+ subdivisions : int
430
+ Number of subdivisions to perform (for method='ico')
431
+ method : str
432
+ Method for generating sphere. Accepts 'latitude' for latitude-
433
+ longitude, 'ico' for icosahedron, and 'cube' for cube based
434
+ tessellation.
435
+
436
+ Returns
437
+ -------
438
+ sphere : MeshData
439
+ Vertices and faces computed for a spherical surface.
440
+ """
441
+ if method == 'latitude':
442
+ return _latitude(rows, cols, radius, offset)
443
+ elif method == 'ico':
444
+ return _ico(radius, subdivisions)
445
+ elif method == 'cube':
446
+ return _cube(rows, cols, depth, radius)
447
+ else:
448
+ raise Exception("Invalid method. Accepts: 'latitude', 'ico', 'cube'")
449
+
450
+
451
+ def create_cylinder(rows, cols, radius=[1.0, 1.0], length=1.0, offset=False):
452
+ """Create a cylinder
453
+
454
+ Parameters
455
+ ----------
456
+ rows : int
457
+ Number of rows.
458
+ cols : int
459
+ Number of columns.
460
+ radius : tuple of float
461
+ Cylinder radii.
462
+ length : float
463
+ Length of the cylinder.
464
+ offset : bool
465
+ Rotate each row by half a column.
466
+
467
+ Returns
468
+ -------
469
+ cylinder : MeshData
470
+ Vertices and faces computed for a cylindrical surface.
471
+ """
472
+ verts = np.empty((rows+1, cols, 3), dtype=np.float32)
473
+ if isinstance(radius, int):
474
+ radius = [radius, radius] # convert to list
475
+ # compute vertices
476
+ th = np.linspace(2 * np.pi, 0, cols).reshape(1, cols)
477
+ # radius as a function of z
478
+ r = np.linspace(radius[0], radius[1], num=rows+1,
479
+ endpoint=True).reshape(rows+1, 1)
480
+ verts[..., 2] = np.linspace(0, length, num=rows+1,
481
+ endpoint=True).reshape(rows+1, 1) # z
482
+ if offset:
483
+ # rotate each row by 1/2 column
484
+ th = th + ((np.pi / cols) * np.arange(rows+1).reshape(rows+1, 1))
485
+ verts[..., 0] = r * np.cos(th) # x = r cos(th)
486
+ verts[..., 1] = r * np.sin(th) # y = r sin(th)
487
+ # just reshape: no redundant vertices...
488
+ verts = verts.reshape((rows+1)*cols, 3)
489
+ # compute faces
490
+ faces = np.empty((rows*cols*2, 3), dtype=np.uint32)
491
+ rowtemplate1 = (((np.arange(cols).reshape(cols, 1) +
492
+ np.array([[0, 1, 0]])) % cols) +
493
+ np.array([[0, 0, cols]]))
494
+ rowtemplate2 = (((np.arange(cols).reshape(cols, 1) +
495
+ np.array([[0, 1, 1]])) % cols) +
496
+ np.array([[cols, 0, cols]]))
497
+ for row in range(rows):
498
+ start = row * cols * 2
499
+ faces[start:start+cols] = rowtemplate1 + row * cols
500
+ faces[start+cols:start+(cols*2)] = rowtemplate2 + row * cols
501
+
502
+ return MeshData(vertices=verts, faces=faces)
503
+
504
+
505
+ def create_cone(cols, radius=1.0, length=1.0):
506
+ """Create a cone
507
+
508
+ Parameters
509
+ ----------
510
+ cols : int
511
+ Number of faces.
512
+ radius : float
513
+ Base cone radius.
514
+ length : float
515
+ Length of the cone.
516
+
517
+ Returns
518
+ -------
519
+ cone : MeshData
520
+ Vertices and faces computed for a cone surface.
521
+ """
522
+ verts = np.empty((cols+1, 3), dtype=np.float32)
523
+ # compute vertexes
524
+ th = np.linspace(2 * np.pi, 0, cols+1).reshape(1, cols+1)
525
+ verts[:-1, 2] = 0.0
526
+ verts[:-1, 0] = radius * np.cos(th[0, :-1]) # x = r cos(th)
527
+ verts[:-1, 1] = radius * np.sin(th[0, :-1]) # y = r sin(th)
528
+ # Add the extremity
529
+ verts[-1, 0] = 0.0
530
+ verts[-1, 1] = 0.0
531
+ verts[-1, 2] = length
532
+ verts = verts.reshape((cols+1), 3) # just reshape: no redundant vertices
533
+ # compute faces
534
+ faces = np.empty((cols, 3), dtype=np.uint32)
535
+ template = np.array([[0, 1]])
536
+ for pos in range(cols):
537
+ faces[pos, :-1] = template + pos
538
+ faces[:, 2] = cols
539
+ faces[-1, 1] = 0
540
+
541
+ return MeshData(vertices=verts, faces=faces)
542
+
543
+
544
+ def create_arrow(rows, cols, radius=0.1, length=1.0,
545
+ cone_radius=None, cone_length=None):
546
+ """Create a 3D arrow using a cylinder plus cone
547
+
548
+ Parameters
549
+ ----------
550
+ rows : int
551
+ Number of rows.
552
+ cols : int
553
+ Number of columns.
554
+ radius : float
555
+ Base cylinder radius.
556
+ length : float
557
+ Length of the arrow.
558
+ cone_radius : float
559
+ Radius of the cone base.
560
+ If None, then this defaults to 2x the cylinder radius.
561
+ cone_length : float
562
+ Length of the cone.
563
+ If None, then this defaults to 1/3 of the arrow length.
564
+
565
+ Returns
566
+ -------
567
+ arrow : MeshData
568
+ Vertices and faces computed for a cone surface.
569
+ """
570
+ # create the cylinder
571
+ md_cyl = None
572
+ if cone_radius is None:
573
+ cone_radius = radius*2.0
574
+ if cone_length is None:
575
+ con_L = length/3.0
576
+ cyl_L = length*2.0/3.0
577
+ else:
578
+ cyl_L = max(0, length - cone_length)
579
+ con_L = min(cone_length, length)
580
+ if cyl_L != 0:
581
+ md_cyl = create_cylinder(rows, cols, radius=[radius, radius],
582
+ length=cyl_L)
583
+ # create the cone
584
+ md_con = create_cone(cols, radius=cone_radius, length=con_L)
585
+ verts = md_con.get_vertices()
586
+ nbr_verts_con = verts.size//3
587
+ faces = md_con.get_faces()
588
+ if md_cyl is not None:
589
+ trans = np.array([[0.0, 0.0, cyl_L]])
590
+ verts = np.vstack((verts+trans, md_cyl.get_vertices()))
591
+ faces = np.vstack((faces, md_cyl.get_faces()+nbr_verts_con))
592
+
593
+ return MeshData(vertices=verts, faces=faces)
594
+
595
+
596
+ def create_grid_mesh(xs, ys, zs):
597
+ """Generate vertices and indices for an implicitly connected mesh.
598
+
599
+ The intention is that this makes it simple to generate a mesh
600
+ from meshgrid data.
601
+
602
+ Parameters
603
+ ----------
604
+ xs : ndarray
605
+ A 2d array of x coordinates for the vertices of the mesh. Must
606
+ have the same dimensions as ys and zs.
607
+ ys : ndarray
608
+ A 2d array of y coordinates for the vertices of the mesh. Must
609
+ have the same dimensions as xs and zs.
610
+ zs : ndarray
611
+ A 2d array of z coordinates for the vertices of the mesh. Must
612
+ have the same dimensions as xs and ys.
613
+
614
+ Returns
615
+ -------
616
+ vertices : ndarray
617
+ The array of vertices in the mesh.
618
+ indices : ndarray
619
+ The array of indices for the mesh.
620
+ """
621
+ shape = xs.shape
622
+ length = shape[0] * shape[1]
623
+
624
+ vertices = np.zeros((length, 3))
625
+
626
+ vertices[:, 0] = xs.reshape(length)
627
+ vertices[:, 1] = ys.reshape(length)
628
+ vertices[:, 2] = zs.reshape(length)
629
+
630
+ basic_indices = np.array([0, 1, 1 + shape[1], 0,
631
+ 0 + shape[1], 1 + shape[1]],
632
+ dtype=np.uint32)
633
+
634
+ inner_grid_length = (shape[0] - 1) * (shape[1] - 1)
635
+
636
+ offsets = np.arange(inner_grid_length)
637
+ offsets += np.repeat(np.arange(shape[0] - 1), shape[1] - 1)
638
+ offsets = np.repeat(offsets, 6)
639
+ indices = np.resize(basic_indices, len(offsets)) + offsets
640
+
641
+ indices = indices.reshape((len(indices) // 3, 3))
642
+
643
+ return vertices, indices