vispy 0.15.0__cp313-cp313-win_amd64.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.cp313-win_amd64.pyd +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 +5 -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,398 @@
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 arg_to_array, arg_to_vec4, as_vec4
10
+ from .base_transform import BaseTransform
11
+ from ... import gloo
12
+
13
+
14
+ class LogTransform(BaseTransform):
15
+ """Transform perfoming logarithmic transformation on three axes.
16
+
17
+ Maps (x, y, z) => (log(base.x, x), log(base.y, y), log(base.z, z))
18
+
19
+ No transformation is applied for axes with base == 0.
20
+
21
+ If base < 0, then the inverse function is applied: x => base.x ** x
22
+
23
+ Parameters
24
+ ----------
25
+ base : array-like
26
+ Base for the X, Y, Z axes.
27
+ """
28
+
29
+ # TODO: Evaluate the performance costs of using conditionals.
30
+ # An alternative approach is to transpose the vector before
31
+ # log-transforming, and then transpose back afterward.
32
+ glsl_map = """
33
+ vec4 LogTransform_map(vec4 pos) {
34
+ if($base.x > 1.0)
35
+ pos.x = log(pos.x) / log($base.x);
36
+ else if($base.x < -1.0)
37
+ pos.x = pow(-$base.x, pos.x);
38
+
39
+ if($base.y > 1.0)
40
+ pos.y = log(pos.y) / log($base.y);
41
+ else if($base.y < -1.0)
42
+ pos.y = pow(-$base.y, pos.y);
43
+
44
+ if($base.z > 1.0)
45
+ pos.z = log(pos.z) / log($base.z);
46
+ else if($base.z < -1.0)
47
+ pos.z = pow(-$base.z, pos.z);
48
+ return pos;
49
+ }
50
+ """
51
+
52
+ glsl_imap = glsl_map
53
+
54
+ Linear = False
55
+ Orthogonal = True
56
+ NonScaling = False
57
+ Isometric = False
58
+
59
+ def __init__(self, base=None):
60
+ super(LogTransform, self).__init__()
61
+ self._base = np.zeros(3, dtype=np.float32)
62
+ self.base = (0.0, 0.0, 0.0) if base is None else base
63
+
64
+ @property
65
+ def base(self):
66
+ """
67
+ *base* is a tuple (x, y, z) containing the log base that should be
68
+ applied to each axis of the input vector. If any axis has a base <= 0,
69
+ then that axis is not affected.
70
+ """
71
+ return self._base.copy()
72
+
73
+ @base.setter
74
+ def base(self, s):
75
+ self._base[:len(s)] = s
76
+ self._base[len(s):] = 0.0
77
+
78
+ @arg_to_array
79
+ def map(self, coords, base=None):
80
+ ret = np.empty(coords.shape, coords.dtype)
81
+ if base is None:
82
+ base = self.base
83
+ for i in range(min(ret.shape[-1], 3)):
84
+ if base[i] > 1.0:
85
+ ret[..., i] = np.log(coords[..., i]) / np.log(base[i])
86
+ elif base[i] < -1.0:
87
+ ret[..., i] = -base[i] ** coords[..., i]
88
+ else:
89
+ ret[..., i] = coords[..., i]
90
+ return ret
91
+
92
+ @arg_to_array
93
+ def imap(self, coords):
94
+ return self.map(coords, -self.base)
95
+
96
+ def shader_map(self):
97
+ fn = super(LogTransform, self).shader_map()
98
+ fn['base'] = self.base # uniform vec3
99
+ return fn
100
+
101
+ def shader_imap(self):
102
+ fn = super(LogTransform, self).shader_imap()
103
+ fn['base'] = -self.base # uniform vec3
104
+ return fn
105
+
106
+ def __repr__(self):
107
+ return "<LogTransform base=%s>" % (self.base)
108
+
109
+
110
+ class PolarTransform(BaseTransform):
111
+ """Polar transform
112
+
113
+ Maps (theta, r, z) to (x, y, z), where `x = r*cos(theta)`
114
+ and `y = r*sin(theta)`.
115
+ """
116
+
117
+ glsl_map = """
118
+ vec4 polar_transform_map(vec4 pos) {
119
+ return vec4(pos.y * cos(pos.x), pos.y * sin(pos.x), pos.z, 1.);
120
+ }
121
+ """
122
+
123
+ glsl_imap = """
124
+ vec4 polar_transform_map(vec4 pos) {
125
+ // TODO: need some modulo math to handle larger theta values..?
126
+ float theta = atan(pos.y, pos.x);
127
+ float r = length(pos.xy);
128
+ return vec4(theta, r, pos.z, 1.);
129
+ }
130
+ """
131
+
132
+ Linear = False
133
+ Orthogonal = False
134
+ NonScaling = False
135
+ Isometric = False
136
+
137
+ @arg_to_array
138
+ def map(self, coords):
139
+ ret = np.empty(coords.shape, coords.dtype)
140
+ ret[..., 0] = coords[..., 1] * np.cos(coords[..., 0])
141
+ ret[..., 1] = coords[..., 1] * np.sin(coords[..., 0])
142
+ for i in range(2, coords.shape[-1]): # copy any further axes
143
+ ret[..., i] = coords[..., i]
144
+ return ret
145
+
146
+ @arg_to_array
147
+ def imap(self, coords):
148
+ ret = np.empty(coords.shape, coords.dtype)
149
+ ret[..., 0] = np.arctan2(coords[..., 0], coords[..., 1])
150
+ ret[..., 1] = (coords[..., 0]**2 + coords[..., 1]**2) ** 0.5
151
+ for i in range(2, coords.shape[-1]): # copy any further axes
152
+ ret[..., i] = coords[..., i]
153
+ return ret
154
+
155
+
156
+ # class BilinearTransform(BaseTransform):
157
+ # # TODO
158
+ # pass
159
+
160
+
161
+ # class WarpTransform(BaseTransform):
162
+ # """ Multiple bilinear transforms in a grid arrangement.
163
+ # """
164
+ # # TODO
165
+
166
+
167
+ class MagnifyTransform(BaseTransform):
168
+ """Magnifying lens transform.
169
+
170
+ This transform causes a circular region to appear with larger scale around
171
+ its center point.
172
+
173
+ Parameters
174
+ ----------
175
+ mag : float
176
+ Magnification factor. Objects around the transform's center point will
177
+ appear scaled by this amount relative to objects outside the circle.
178
+ radii : (float, float)
179
+ Inner and outer radii of the "lens". Objects inside the inner radius
180
+ appear scaled, whereas objects outside the outer radius are unscaled,
181
+ and the scale factor transitions smoothly between the two radii.
182
+ center: (float, float)
183
+ The center (x, y) point of the "lens".
184
+
185
+ Notes
186
+ -----
187
+ This transform works by segmenting its input coordinates into three
188
+ regions--inner, outer, and transition. Coordinates in the inner region are
189
+ multiplied by a constant scale factor around the center point, and
190
+ coordinates in the transition region are scaled by a factor that
191
+ transitions smoothly from the inner radius to the outer radius.
192
+
193
+ Smooth functions that are appropriate for the transition region also tend
194
+ to be difficult to invert analytically, so this transform instead samples
195
+ the function numerically to allow trivial inversion. In OpenGL, the
196
+ sampling is implemented as a texture holding a lookup table.
197
+ """
198
+
199
+ glsl_map = """
200
+ vec4 mag_transform(vec4 pos) {
201
+ vec2 d = vec2(pos.x - $center.x, pos.y - $center.y);
202
+ float dist = length(d);
203
+ if (dist == 0. || dist > $radii.y || ($mag<1.01 && $mag>0.99)) {
204
+ return pos;
205
+ }
206
+ vec2 dir = d / dist;
207
+
208
+ if( dist < $radii.x ) {
209
+ dist = dist * $mag;
210
+ }
211
+ else {
212
+
213
+ float r1 = $radii.x;
214
+ float r2 = $radii.y;
215
+ float x = (dist - r1) / (r2 - r1);
216
+ float s = texture2D($trans, vec2(0., x)).r * $trans_max;
217
+
218
+ dist = s;
219
+ }
220
+
221
+ d = $center + dir * dist;
222
+ return vec4(d, pos.z, pos.w);
223
+ }"""
224
+
225
+ glsl_imap = glsl_map
226
+
227
+ Linear = False
228
+
229
+ _trans_resolution = 1000
230
+
231
+ def __init__(self, mag=3, radii=(7, 10), center=(0, 0)):
232
+ self._center = center
233
+ self._mag = mag
234
+ self._radii = radii
235
+ self._trans = None
236
+ res = self._trans_resolution
237
+ self._trans_tex = (gloo.Texture2D((res, 1, 1), interpolation='linear'),
238
+ gloo.Texture2D((res, 1, 1), interpolation='linear'))
239
+ self._trans_tex_max = None
240
+ super(MagnifyTransform, self).__init__()
241
+
242
+ @property
243
+ def center(self):
244
+ """The (x, y) center point of the transform."""
245
+ return self._center
246
+
247
+ @center.setter
248
+ def center(self, center):
249
+ if np.allclose(self._center, center):
250
+ return
251
+ self._center = center
252
+ self.shader_map()
253
+ self.shader_imap()
254
+
255
+ @property
256
+ def mag(self):
257
+ """The scale factor used in the central region of the transform."""
258
+ return self._mag
259
+
260
+ @mag.setter
261
+ def mag(self, mag):
262
+ if self._mag == mag:
263
+ return
264
+ self._mag = mag
265
+ self._trans = None
266
+ self.shader_map()
267
+ self.shader_imap()
268
+
269
+ @property
270
+ def radii(self):
271
+ """The inner and outer radii of the circular area bounding the transform."""
272
+ return self._radii
273
+
274
+ @radii.setter
275
+ def radii(self, radii):
276
+ if np.allclose(self._radii, radii):
277
+ return
278
+ self._radii = radii
279
+ self._trans = None
280
+ self.shader_map()
281
+ self.shader_imap()
282
+
283
+ def shader_map(self):
284
+ fn = super(MagnifyTransform, self).shader_map()
285
+ fn['center'] = self._center # uniform vec2
286
+ fn['mag'] = float(self._mag)
287
+ fn['radii'] = (self._radii[0] / float(self._mag), self._radii[1])
288
+ self._get_transition() # make sure transition texture is up to date
289
+ fn['trans'] = self._trans_tex[0]
290
+ fn['trans_max'] = self._trans_tex_max[0]
291
+ return fn
292
+
293
+ def shader_imap(self):
294
+ fn = super(MagnifyTransform, self).shader_imap()
295
+ fn['center'] = self._center # uniform vec2
296
+ fn['mag'] = 1. / self._mag
297
+ fn['radii'] = self._radii
298
+ self._get_transition() # make sure transition texture is up to date
299
+ fn['trans'] = self._trans_tex[1]
300
+ fn['trans_max'] = self._trans_tex_max[1]
301
+ return fn
302
+
303
+ @arg_to_vec4
304
+ def map(self, x, _inverse=False):
305
+ c = as_vec4(self.center)[0]
306
+ m = self.mag
307
+ r1, r2 = self.radii
308
+
309
+ xm = np.empty(x.shape, dtype=x.dtype)
310
+
311
+ dx = (x - c)
312
+ dist = (((dx**2).sum(axis=-1)) ** 0.5)[..., np.newaxis]
313
+ dist[np.isnan(dist)] = 0
314
+ unit = dx / np.where(dist != 0, dist, 1)
315
+ # magnified center region
316
+ if _inverse:
317
+ inner = (dist < r1)[:, 0]
318
+ s = dist / m
319
+ else:
320
+ inner = (dist < (r1 / m))[:, 0]
321
+ s = dist * m
322
+ xm[inner] = c + unit[inner] * s[inner]
323
+
324
+ # unmagnified outer region
325
+ outer = (dist > r2)[:, 0]
326
+ xm[outer] = x[outer]
327
+
328
+ # smooth transition region, interpolated from trans
329
+ trans = ~(inner | outer)
330
+
331
+ # look up scale factor from trans
332
+ temp, itemp = self._get_transition()
333
+ if _inverse:
334
+ tind = (dist[trans] - r1) * len(itemp) / (r2 - r1)
335
+ temp = itemp
336
+ else:
337
+ tind = (dist[trans] - (r1/m)) * len(temp) / (r2 - (r1/m))
338
+ tind = np.clip(tind, 0, temp.shape[0]-1)
339
+ s = temp[tind.astype(int)]
340
+
341
+ xm[trans] = c + unit[trans] * s
342
+ return xm
343
+
344
+ def imap(self, coords):
345
+ return self.map(coords, _inverse=True)
346
+
347
+ def _get_transition(self):
348
+ # Generate forward/reverse transition templates.
349
+ # We would prefer to express this with an invertible function, but that
350
+ # turns out to be tricky. The templates make any function invertible.
351
+
352
+ if self._trans is None:
353
+ m, r1, r2 = self.mag, self.radii[0], self.radii[1]
354
+ res = self._trans_resolution
355
+
356
+ xi = np.linspace(r1, r2, res)
357
+ t = 0.5 * (1 + np.cos((xi - r2) * np.pi / (r2 - r1)))
358
+ yi = (xi * t + xi * (1-t) / m).astype(np.float32)
359
+ x = np.linspace(r1 / m, r2, res)
360
+ y = np.interp(x, yi, xi).astype(np.float32)
361
+
362
+ self._trans = (y, yi)
363
+ # scale to 0.0-1.0 to prevent clipping (is this necessary?)
364
+ mx = y.max(), yi.max()
365
+ self._trans_tex_max = mx
366
+ self._trans_tex[0].set_data((y/mx[0])[:, np.newaxis, np.newaxis])
367
+ self._trans_tex[1].set_data((yi/mx[1])[:, np.newaxis, np.newaxis])
368
+
369
+ return self._trans
370
+
371
+
372
+ class Magnify1DTransform(MagnifyTransform):
373
+ """A 1-dimensional analog of MagnifyTransform. This transform expands
374
+ its input along the x-axis, around a center x value.
375
+ """
376
+
377
+ glsl_map = """
378
+ vec4 mag_transform(vec4 pos) {
379
+ float dist = pos.x - $center.x;
380
+ if (dist == 0. || abs(dist) > $radii.y || $mag == 1) {
381
+ return pos;
382
+ }
383
+ float dir = dist / abs(dist);
384
+
385
+ if( abs(dist) < $radii.x ) {
386
+ dist = dist * $mag;
387
+ }
388
+ else {
389
+ float r1 = $radii.x;
390
+ float r2 = $radii.y;
391
+ float x = (abs(dist) - r1) / (r2 - r1);
392
+ dist = dir * texture2D($trans, vec2(0., x)).r * $trans_max;
393
+ }
394
+
395
+ return vec4($center.x + dist, pos.y, pos.z, pos.w);
396
+ }"""
397
+
398
+ glsl_imap = glsl_map
File without changes
@@ -0,0 +1,243 @@
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_allclose
7
+ import pytest
8
+
9
+ import vispy.visuals.transforms as tr
10
+ from vispy.geometry import Rect
11
+ from vispy.testing import run_tests_if_main
12
+
13
+ NT = tr.NullTransform
14
+ ST = tr.STTransform
15
+ AT = tr.MatrixTransform
16
+ RT = tr.MatrixTransform
17
+ PT = tr.PolarTransform
18
+ LT = tr.LogTransform
19
+ CT = tr.ChainTransform
20
+
21
+
22
+ def assert_chain_types(chain, types):
23
+ assert list(map(type, chain.transforms)) == types
24
+
25
+
26
+ def assert_chain_objects(chain1, chain2):
27
+ assert chain1.transforms == chain2.transforms
28
+
29
+
30
+ def test_multiplication():
31
+ n = NT()
32
+ s = ST()
33
+ a = AT()
34
+ p = PT()
35
+ log_trans = LT()
36
+ c1 = CT([s, a, p])
37
+ assert c1
38
+ c2 = CT([s, a, s])
39
+
40
+ assert isinstance(n * n, NT)
41
+ assert isinstance(n * s, ST)
42
+ assert isinstance(s * s, ST)
43
+ assert isinstance(a * s, AT)
44
+ assert isinstance(a * a, AT)
45
+ assert isinstance(s * a, AT)
46
+ assert isinstance(n * p, PT)
47
+ assert isinstance(s * p, CT)
48
+ assert isinstance(a * p, CT)
49
+ assert isinstance(p * a, CT)
50
+ assert isinstance(p * s, CT)
51
+ assert_chain_types(p * a, [PT, AT])
52
+ assert_chain_types(p * s, [PT, ST])
53
+ assert_chain_types(s * p, [ST, PT])
54
+ assert_chain_types(s * p * a, [ST, PT, AT])
55
+ assert_chain_types(s * a * p, [AT, PT])
56
+ assert_chain_types(p * s * a, [PT, ST, AT])
57
+ assert_chain_types(s * p * s, [ST, PT, ST])
58
+ assert_chain_types(s * a * p * s * a, [AT, PT, ST, AT])
59
+ assert_chain_types(c2 * a, [ST, AT, ST, AT])
60
+ assert_chain_types(p * log_trans * s, [PT, LT, ST])
61
+
62
+
63
+ def test_transform_chain():
64
+ # Make dummy classes for easier distinguishing the transforms
65
+
66
+ class DummyTrans(tr.BaseTransform):
67
+ glsl_map = "vec4 trans(vec4 pos) {return pos;}"
68
+ glsl_imap = "vec4 trans(vec4 pos) {return pos;}"
69
+
70
+ class TransA(DummyTrans):
71
+ pass
72
+
73
+ class TransB(DummyTrans):
74
+ pass
75
+
76
+ class TransC(DummyTrans):
77
+ pass
78
+
79
+ # Create test transforms
80
+ a, b, c = TransA(), TransB(), TransC()
81
+
82
+ # Test Chain creation
83
+ assert tr.ChainTransform().transforms == []
84
+ assert tr.ChainTransform(a).transforms == [a]
85
+ assert tr.ChainTransform(a, b).transforms == [a, b]
86
+ assert tr.ChainTransform(a, b, c, a).transforms == [a, b, c, a]
87
+
88
+ # Test composition by multiplication
89
+ assert_chain_objects(a * b, tr.ChainTransform(a, b))
90
+ assert_chain_objects(a * b * c, tr.ChainTransform(a, b, c))
91
+ assert_chain_objects(a * b * c * a, tr.ChainTransform(a, b, c, a))
92
+
93
+ # Test adding/prepending to transform
94
+ chain = tr.ChainTransform()
95
+ chain.append(a)
96
+ assert chain.transforms == [a]
97
+ chain.append(b)
98
+ assert chain.transforms == [a, b]
99
+ chain.append(c)
100
+ assert chain.transforms == [a, b, c]
101
+ chain.prepend(b)
102
+ assert chain.transforms == [b, a, b, c]
103
+ chain.prepend(c)
104
+ assert chain.transforms == [c, b, a, b, c]
105
+
106
+ # Test simplifying
107
+ t1 = tr.STTransform(scale=(2, 3))
108
+ t2 = tr.STTransform(translate=(3, 4))
109
+ t3 = tr.STTransform(translate=(3, 4))
110
+ # Create multiplied versions
111
+ t123 = t1*t2*t3
112
+ t321 = t3*t2*t1
113
+ c123 = tr.ChainTransform(t1, t2, t3)
114
+ c321 = tr.ChainTransform(t3, t2, t1)
115
+ c123s = c123.simplified
116
+ c321s = c321.simplified
117
+ #
118
+ assert isinstance(t123, tr.STTransform) # or the test is useless
119
+ assert isinstance(t321, tr.STTransform) # or the test is useless
120
+ assert isinstance(c123s, tr.ChainTransform) # or the test is useless
121
+ assert isinstance(c321s, tr.ChainTransform) # or the test is useless
122
+
123
+ # Test Mapping
124
+ t1 = tr.STTransform(scale=(2, 3))
125
+ t2 = tr.STTransform(translate=(3, 4))
126
+ chain1 = tr.ChainTransform(t1, t2)
127
+ chain2 = tr.ChainTransform(t2, t1)
128
+ #
129
+ assert chain1.transforms == [t1, t2] # or the test is useless
130
+ assert chain2.transforms == [t2, t1] # or the test is useless
131
+ #
132
+ m12 = (t1*t2).map((1, 1)).tolist()
133
+ m21 = (t2*t1).map((1, 1)).tolist()
134
+ m12_ = chain1.map((1, 1)).tolist()
135
+ m21_ = chain2.map((1, 1)).tolist()
136
+ #
137
+ # print(m12, m21, m12_, m21_)
138
+ assert m12 != m21
139
+ assert m12 == m12_
140
+ assert m21 == m21_
141
+
142
+ # Test shader map
143
+ t1 = tr.STTransform(scale=(2, 3))
144
+ t2 = tr.STTransform(translate=(3, 4))
145
+ chain = tr.ChainTransform(t1, t2)
146
+ #
147
+ funcs = chain.shader_map().dependencies()
148
+ funcsi = chain.shader_imap().dependencies()
149
+ #
150
+ assert t1.shader_map() in funcs
151
+ assert t2.shader_map() in funcs
152
+ assert t1.shader_imap() in funcsi
153
+ assert t2.shader_imap() in funcsi
154
+
155
+
156
+ def test_map_rect():
157
+ r = Rect((2, 7), (13, 19))
158
+ r1 = ST(scale=(2, 2), translate=(-10, 10)).map(r)
159
+ assert r1 == Rect((-6, 24), (26, 38))
160
+
161
+
162
+ def test_st_transform():
163
+ # Check that STTransform maps exactly like MatrixTransform
164
+ pts = np.random.normal(size=(10, 4))
165
+
166
+ scale = (1, 7.5, -4e-8)
167
+ translate = (1e6, 0.2, 0)
168
+ st = tr.STTransform(scale=scale, translate=translate)
169
+ at = tr.MatrixTransform()
170
+ at.scale(scale)
171
+ at.translate(translate)
172
+
173
+ assert np.allclose(st.map(pts), at.map(pts))
174
+ assert np.allclose(st.inverse.map(pts), at.inverse.map(pts))
175
+
176
+
177
+ def test_st_mapping():
178
+ p1 = [[5., 7.], [23., 8.]]
179
+ p2 = [[-1.3, -1.4], [1.1, 1.2]]
180
+
181
+ t = tr.STTransform()
182
+ t.set_mapping(p1, p2)
183
+
184
+ assert np.allclose(t.map(p1)[:, :len(p2)], p2)
185
+
186
+
187
+ def test_affine_mapping():
188
+ t = tr.MatrixTransform()
189
+ p1 = np.array([[0, 0, 0],
190
+ [1, 0, 0],
191
+ [0, 1, 0],
192
+ [0, 0, 1]])
193
+
194
+ # test pure translation
195
+ p2 = p1 + 5.5
196
+ t.set_mapping(p1, p2)
197
+ assert np.allclose(t.map(p1)[:, :p2.shape[1]], p2)
198
+
199
+ # test pure scaling
200
+ p2 = p1 * 5.5
201
+ t.set_mapping(p1, p2)
202
+ assert np.allclose(t.map(p1)[:, :p2.shape[1]], p2)
203
+
204
+ # test scale + translate
205
+ p2 = (p1 * 5.5) + 3.5
206
+ t.set_mapping(p1, p2)
207
+ assert np.allclose(t.map(p1)[:, :p2.shape[1]], p2)
208
+
209
+ # test SRT
210
+ p2 = np.array([[10, 5, 3],
211
+ [10, 15, 3],
212
+ [30, 5, 3],
213
+ [10, 5, 3.5]])
214
+ t.set_mapping(p1, p2)
215
+ assert np.allclose(t.map(p1)[:, :p2.shape[1]], p2)
216
+
217
+
218
+ m = np.random.RandomState(0).normal(size=(4, 4))
219
+ transforms = [
220
+ NT(),
221
+ ST(scale=(1e-4, 2e5), translate=(10, -6e9)),
222
+ AT(m),
223
+ RT(m),
224
+ ]
225
+
226
+
227
+ @pytest.mark.parametrize('trn', transforms)
228
+ def test_inverse(trn):
229
+ rng = np.random.RandomState(0)
230
+ N = 20
231
+ x = rng.normal(size=(N, 3))
232
+ pw = rng.normal(size=(N, 3), scale=3)
233
+ pos = x * 10 ** pw
234
+
235
+ assert_allclose(pos, trn.inverse.map(trn.map(pos))[:, :3], atol=1e-7)
236
+
237
+ # log transform only works on positive values
238
+ # abs_pos = np.abs(pos)
239
+ # tr = LT(base=(2, 4.5, 0))
240
+ # assert np.allclose(abs_pos, tr.inverse.map(tr.map(abs_pos))[:,:3])
241
+
242
+
243
+ run_tests_if_main()