vispy 0.15.0__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

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

Potentially problematic release.


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

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-aarch64-linux-gnu.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,564 @@
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 __future__ import division
6
+
7
+ import numpy as np
8
+
9
+ from ...util import transforms
10
+ from ...geometry import Rect
11
+ from ._util import arg_to_vec4, as_vec4
12
+ from .base_transform import BaseTransform
13
+
14
+
15
+ class NullTransform(BaseTransform):
16
+ """Transform having no effect on coordinates (identity transform)."""
17
+
18
+ glsl_map = "vec4 null_transform_map(vec4 pos) {return pos;}"
19
+ glsl_imap = "vec4 null_transform_imap(vec4 pos) {return pos;}"
20
+
21
+ Linear = True
22
+ Orthogonal = True
23
+ NonScaling = True
24
+ Isometric = True
25
+
26
+ @arg_to_vec4
27
+ def map(self, coords):
28
+ """Map coordinates
29
+
30
+ Parameters
31
+ ----------
32
+ coords : array-like
33
+ Coordinates to map.
34
+ """
35
+ return coords
36
+
37
+ def imap(self, coords):
38
+ """Inverse map coordinates
39
+
40
+ Parameters
41
+ ----------
42
+ coords : array-like
43
+ Coordinates to inverse map.
44
+ """
45
+ return coords
46
+
47
+ def __mul__(self, tr):
48
+ return tr
49
+
50
+ def __rmul__(self, tr):
51
+ return tr
52
+
53
+
54
+ class STTransform(BaseTransform):
55
+ """Transform performing only scale and translate, in that order.
56
+
57
+ Parameters
58
+ ----------
59
+ scale : array-like
60
+ Scale factors for X, Y, Z axes.
61
+ translate : array-like
62
+ Scale factors for X, Y, Z axes.
63
+ """
64
+
65
+ glsl_map = """
66
+ vec4 st_transform_map(vec4 pos) {
67
+ return vec4(pos.xyz * $scale.xyz + $translate.xyz * pos.w, pos.w);
68
+ }
69
+ """
70
+
71
+ glsl_imap = """
72
+ vec4 st_transform_imap(vec4 pos) {
73
+ return vec4((pos.xyz - $translate.xyz * pos.w) / $scale.xyz,
74
+ pos.w);
75
+ }
76
+ """
77
+
78
+ Linear = True
79
+ Orthogonal = True
80
+ NonScaling = False
81
+ Isometric = False
82
+
83
+ def __init__(self, scale=None, translate=None):
84
+ super(STTransform, self).__init__()
85
+
86
+ self._scale = np.ones(4, dtype=np.float32)
87
+ self._translate = np.zeros(4, dtype=np.float32)
88
+
89
+ s = ((1.0, 1.0, 1.0, 1.0) if scale is None else
90
+ as_vec4(scale, default=(1., 1., 1., 1.)))
91
+ t = ((0.0, 0.0, 0.0, 0.0) if translate is None else
92
+ as_vec4(translate, default=(0., 0., 0., 0.)))
93
+ self._set_st(s, t)
94
+ self._update_shaders()
95
+
96
+ @arg_to_vec4
97
+ def map(self, coords):
98
+ """Map coordinates
99
+
100
+ Parameters
101
+ ----------
102
+ coords : array-like
103
+ Coordinates to map.
104
+
105
+ Returns
106
+ -------
107
+ coords : ndarray
108
+ Coordinates.
109
+ """
110
+ m = np.empty(coords.shape)
111
+ m[:, :3] = (coords[:, :3] * self.scale[np.newaxis, :3] +
112
+ coords[:, 3:] * self.translate[np.newaxis, :3])
113
+ m[:, 3] = coords[:, 3]
114
+ return m
115
+
116
+ @arg_to_vec4
117
+ def imap(self, coords):
118
+ """Invert map coordinates
119
+
120
+ Parameters
121
+ ----------
122
+ coords : array-like
123
+ Coordinates to inverse map.
124
+
125
+ Returns
126
+ -------
127
+ coords : ndarray
128
+ Coordinates.
129
+ """
130
+ m = np.empty(coords.shape)
131
+ m[:, :3] = ((coords[:, :3] -
132
+ coords[:, 3:] * self.translate[np.newaxis, :3]) /
133
+ self.scale[np.newaxis, :3])
134
+ m[:, 3] = coords[:, 3]
135
+ return m
136
+
137
+ def shader_map(self):
138
+ return self._shader_map
139
+
140
+ def shader_imap(self):
141
+ return self._shader_imap
142
+
143
+ @property
144
+ def scale(self):
145
+ return self._scale.copy()
146
+
147
+ @scale.setter
148
+ def scale(self, s):
149
+ s = as_vec4(s, default=(1, 1, 1, 1))
150
+ self._set_st(scale=s)
151
+
152
+ @property
153
+ def translate(self):
154
+ return self._translate.copy()
155
+
156
+ @translate.setter
157
+ def translate(self, t):
158
+ t = as_vec4(t, default=(0, 0, 0, 0))
159
+ self._set_st(translate=t)
160
+
161
+ def _set_st(self, scale=None, translate=None, update=True):
162
+ need_update = False
163
+
164
+ if scale is not None and not np.all(scale == self._scale):
165
+ self._scale[:] = scale
166
+ need_update = True
167
+
168
+ if translate is not None and not np.all(translate == self._translate):
169
+ self._translate[:] = translate
170
+ need_update = True
171
+
172
+ if update and need_update:
173
+ self._update_shaders()
174
+ self.update() # inform listeners there has been a change
175
+
176
+ def _update_shaders(self):
177
+ self._shader_map['scale'] = self.scale
178
+ self._shader_map['translate'] = self.translate
179
+ self._shader_imap['scale'] = self.scale
180
+ self._shader_imap['translate'] = self.translate
181
+
182
+ def move(self, move):
183
+ """Change the translation of this transform by the amount given.
184
+
185
+ Parameters
186
+ ----------
187
+ move : array-like
188
+ The values to be added to the current translation of the transform.
189
+ """
190
+ move = as_vec4(move, default=(0, 0, 0, 0))
191
+ self.translate = self.translate + move
192
+
193
+ def zoom(self, zoom, center=(0, 0, 0), mapped=True):
194
+ """Update the transform such that its scale factor is changed, but
195
+ the specified center point is left unchanged.
196
+
197
+ Parameters
198
+ ----------
199
+ zoom : array-like
200
+ Values to multiply the transform's current scale
201
+ factors.
202
+ center : array-like
203
+ The center point around which the scaling will take place.
204
+ mapped : bool
205
+ Whether *center* is expressed in mapped coordinates (True) or
206
+ unmapped coordinates (False).
207
+ """
208
+ zoom = as_vec4(zoom, default=(1, 1, 1, 1))
209
+ center = as_vec4(center, default=(0, 0, 0, 0))
210
+ scale = self.scale * zoom
211
+ if mapped:
212
+ trans = center - (center - self.translate) * zoom
213
+ else:
214
+ trans = self.scale * (1 - zoom) * center + self.translate
215
+ self._set_st(scale=scale, translate=trans)
216
+
217
+ def as_matrix(self):
218
+ m = MatrixTransform()
219
+ m.scale(self.scale)
220
+ m.translate(self.translate)
221
+ return m
222
+
223
+ @classmethod
224
+ def from_mapping(cls, x0, x1):
225
+ """Create an STTransform from the given mapping
226
+
227
+ See `set_mapping` for details.
228
+
229
+ Parameters
230
+ ----------
231
+ x0 : array-like
232
+ Start.
233
+ x1 : array-like
234
+ End.
235
+
236
+ Returns
237
+ -------
238
+ t : instance of STTransform
239
+ The transform.
240
+ """
241
+ t = cls()
242
+ t.set_mapping(x0, x1)
243
+ return t
244
+
245
+ def set_mapping(self, x0, x1, update=True):
246
+ """Configure this transform such that it maps points x0 => x1
247
+
248
+ Parameters
249
+ ----------
250
+ x0 : array-like, shape (2, 2) or (2, 3)
251
+ Start location.
252
+ x1 : array-like, shape (2, 2) or (2, 3)
253
+ End location.
254
+ update : bool
255
+ If False, then the update event is not emitted.
256
+
257
+ Examples
258
+ --------
259
+ For example, if we wish to map the corners of a rectangle::
260
+
261
+ >>> p1 = [[0, 0], [200, 300]]
262
+
263
+ onto a unit cube::
264
+
265
+ >>> p2 = [[-1, -1], [1, 1]]
266
+
267
+ then we can generate the transform as follows::
268
+
269
+ >>> tr = STTransform()
270
+ >>> tr.set_mapping(p1, p2)
271
+ >>> assert tr.map(p1)[:,:2] == p2 # test
272
+ """
273
+ # if args are Rect, convert to array first
274
+ if isinstance(x0, Rect):
275
+ x0 = x0._transform_in()[:3]
276
+ if isinstance(x1, Rect):
277
+ x1 = x1._transform_in()[:3]
278
+
279
+ x0 = np.asarray(x0)
280
+ x1 = np.asarray(x1)
281
+ if (x0.ndim != 2 or x0.shape[0] != 2 or x1.ndim != 2 or
282
+ x1.shape[0] != 2):
283
+ raise TypeError("set_mapping requires array inputs of shape "
284
+ "(2, N).")
285
+ denom = x0[1] - x0[0]
286
+ mask = denom == 0
287
+ denom[mask] = 1.0
288
+ s = (x1[1] - x1[0]) / denom
289
+ s[mask] = 1.0
290
+ s[x0[1] == x0[0]] = 1.0
291
+ t = x1[0] - s * x0[0]
292
+ s = as_vec4(s, default=(1, 1, 1, 1))
293
+ t = as_vec4(t, default=(0, 0, 0, 0))
294
+ self._set_st(scale=s, translate=t, update=update)
295
+
296
+ def __mul__(self, tr):
297
+ if isinstance(tr, STTransform):
298
+ s = self.scale * tr.scale
299
+ t = self.translate + (tr.translate * self.scale)
300
+ return STTransform(scale=s, translate=t)
301
+ elif isinstance(tr, MatrixTransform):
302
+ return self.as_matrix() * tr
303
+ else:
304
+ return super(STTransform, self).__mul__(tr)
305
+
306
+ def __rmul__(self, tr):
307
+ if isinstance(tr, MatrixTransform):
308
+ return tr * self.as_matrix()
309
+ return super(STTransform, self).__rmul__(tr)
310
+
311
+ def __repr__(self):
312
+ return ("<STTransform scale=%s translate=%s at 0x%s>"
313
+ % (self.scale, self.translate, id(self)))
314
+
315
+
316
+ class MatrixTransform(BaseTransform):
317
+ """Affine transformation class
318
+
319
+ Parameters
320
+ ----------
321
+ matrix : array-like | None
322
+ 4x4 array to use for the transform.
323
+ """
324
+
325
+ glsl_map = """
326
+ vec4 affine_transform_map(vec4 pos) {
327
+ return $matrix * pos;
328
+ }
329
+ """
330
+
331
+ glsl_imap = """
332
+ vec4 affine_transform_imap(vec4 pos) {
333
+ return $inv_matrix * pos;
334
+ }
335
+ """
336
+
337
+ Linear = True
338
+ Orthogonal = False
339
+ NonScaling = False
340
+ Isometric = False
341
+
342
+ def __init__(self, matrix=None):
343
+ super(MatrixTransform, self).__init__()
344
+ if matrix is not None:
345
+ self.matrix = matrix
346
+ else:
347
+ self.reset()
348
+
349
+ @arg_to_vec4
350
+ def map(self, coords):
351
+ """Map coordinates
352
+
353
+ Parameters
354
+ ----------
355
+ coords : array-like
356
+ Coordinates to map.
357
+
358
+ Returns
359
+ -------
360
+ coords : ndarray
361
+ Coordinates.
362
+ """
363
+ # looks backwards, but both matrices are transposed.
364
+ return np.dot(coords, self.matrix)
365
+
366
+ @arg_to_vec4
367
+ def imap(self, coords):
368
+ """Inverse map coordinates
369
+
370
+ Parameters
371
+ ----------
372
+ coords : array-like
373
+ Coordinates to inverse map.
374
+
375
+ Returns
376
+ -------
377
+ coords : ndarray
378
+ Coordinates.
379
+ """
380
+ return np.dot(coords, self.inv_matrix)
381
+
382
+ def shader_map(self):
383
+ fn = super(MatrixTransform, self).shader_map()
384
+ fn['matrix'] = self.matrix # uniform mat4
385
+ return fn
386
+
387
+ def shader_imap(self):
388
+ fn = super(MatrixTransform, self).shader_imap()
389
+ fn['inv_matrix'] = self.inv_matrix # uniform mat4
390
+ return fn
391
+
392
+ @property
393
+ def matrix(self):
394
+ return self._matrix
395
+
396
+ @matrix.setter
397
+ def matrix(self, m):
398
+ self._matrix = m
399
+ self._inv_matrix = None
400
+ self.shader_map()
401
+ self.shader_imap()
402
+ self.update()
403
+
404
+ @property
405
+ def inv_matrix(self):
406
+ if self._inv_matrix is None:
407
+ self._inv_matrix = np.linalg.inv(self.matrix)
408
+ return self._inv_matrix
409
+
410
+ @arg_to_vec4
411
+ def translate(self, pos):
412
+ """
413
+ Translate the matrix
414
+
415
+ The translation is applied *after* the transformations already present
416
+ in the matrix.
417
+
418
+ Parameters
419
+ ----------
420
+ pos : arrayndarray
421
+ Position to translate by.
422
+ """
423
+ self.matrix = np.dot(self.matrix, transforms.translate(pos[0, :3]))
424
+
425
+ def scale(self, scale, center=None):
426
+ """
427
+ Scale the matrix about a given origin.
428
+
429
+ The scaling is applied *after* the transformations already present
430
+ in the matrix.
431
+
432
+ Parameters
433
+ ----------
434
+ scale : array-like
435
+ Scale factors along x, y and z axes.
436
+ center : array-like or None
437
+ The x, y and z coordinates to scale around. If None,
438
+ (0, 0, 0) will be used.
439
+ """
440
+ scale = transforms.scale(as_vec4(scale, default=(1, 1, 1, 1))[0, :3])
441
+ if center is not None:
442
+ center = as_vec4(center)[0, :3]
443
+ scale = np.dot(np.dot(transforms.translate(-center), scale),
444
+ transforms.translate(center))
445
+ self.matrix = np.dot(self.matrix, scale)
446
+
447
+ def rotate(self, angle, axis):
448
+ """
449
+ Rotate the matrix by some angle about a given axis.
450
+
451
+ The rotation is applied *after* the transformations already present
452
+ in the matrix.
453
+
454
+ Parameters
455
+ ----------
456
+ angle : float
457
+ The angle of rotation, in degrees.
458
+ axis : array-like
459
+ The x, y and z coordinates of the axis vector to rotate around.
460
+ """
461
+ self.matrix = np.dot(self.matrix, transforms.rotate(angle, axis))
462
+
463
+ def set_mapping(self, points1, points2):
464
+ """Set to a 3D transformation matrix that maps points1 onto points2.
465
+
466
+ Parameters
467
+ ----------
468
+ points1 : array-like, shape (4, 3)
469
+ Four starting 3D coordinates.
470
+ points2 : array-like, shape (4, 3)
471
+ Four ending 3D coordinates.
472
+ """
473
+ # note: need to transpose because util.functions uses opposite
474
+ # of standard linear algebra order.
475
+ self.matrix = transforms.affine_map(points1, points2).T
476
+
477
+ def set_ortho(self, l, r, b, t, n, f): # noqa
478
+ """Set ortho transform
479
+
480
+ Parameters
481
+ ----------
482
+ l : float
483
+ Left.
484
+ r : float
485
+ Right.
486
+ b : float
487
+ Bottom.
488
+ t : float
489
+ Top.
490
+ n : float
491
+ Near.
492
+ f : float
493
+ Far.
494
+ """
495
+ self.matrix = transforms.ortho(l, r, b, t, n, f)
496
+
497
+ def reset(self):
498
+ self.matrix = np.eye(4)
499
+
500
+ def __mul__(self, tr):
501
+ if (isinstance(tr, MatrixTransform) and not
502
+ any(tr.matrix[:3, 3] != 0)):
503
+ # don't multiply if the perspective column is used
504
+ return MatrixTransform(matrix=np.dot(tr.matrix, self.matrix))
505
+ else:
506
+ return tr.__rmul__(self)
507
+
508
+ def __repr__(self):
509
+ s = "%s(matrix=[" % self.__class__.__name__
510
+ indent = " "*len(s)
511
+ s += str(list(self.matrix[0])) + ",\n"
512
+ s += indent + str(list(self.matrix[1])) + ",\n"
513
+ s += indent + str(list(self.matrix[2])) + ",\n"
514
+ s += indent + str(list(self.matrix[3])) + "] at 0x%x)" % id(self)
515
+ return s
516
+
517
+ def set_perspective(self, fov, aspect, near, far):
518
+ """Set the perspective
519
+
520
+ Parameters
521
+ ----------
522
+ fov : float
523
+ Field of view.
524
+ aspect : float
525
+ Aspect ratio.
526
+ near : float
527
+ Near location.
528
+ far : float
529
+ Far location.
530
+ """
531
+ self.matrix = transforms.perspective(fov, aspect, near, far)
532
+
533
+ def set_frustum(self, l, r, b, t, n, f): # noqa
534
+ """Set the frustum
535
+
536
+ Parameters
537
+ ----------
538
+ l : float
539
+ Left.
540
+ r : float
541
+ Right.
542
+ b : float
543
+ Bottom.
544
+ t : float
545
+ Top.
546
+ n : float
547
+ Near.
548
+ f : float
549
+ Far.
550
+ """
551
+ self.matrix = transforms.frustum(l, r, b, t, n, f)
552
+
553
+
554
+ # class SRTTransform(BaseTransform):
555
+ # """ Transform performing scale, rotate, and translate, in that order.
556
+ #
557
+ # This transformation allows objects to be placed arbitrarily in a scene
558
+ # much the same way MatrixTransform does. However, an incorrect order of
559
+ # operations in MatrixTransform may result in shearing the object (if scale
560
+ # is applied after rotate) or in unpredictable translation (if scale/rotate
561
+ # is applied after translation). SRTTransform avoids these problems by
562
+ # enforcing the correct order of operations.
563
+ # """
564
+ # # TODO