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,482 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+ """
7
+ A collection is a container for several (optionally indexed) objects having
8
+ the same vertex structure (vtype) and same uniforms type (utype). A collection
9
+ allows to manipulate objects individually and each object can have its own set
10
+ of uniforms provided they are a combination of floats.
11
+ """
12
+
13
+ from __future__ import division
14
+
15
+ import math
16
+ import numpy as np
17
+ from ...gloo import Texture2D, VertexBuffer, IndexBuffer
18
+ from . util import dtype_reduce
19
+ from . array_list import ArrayList
20
+
21
+
22
+ def next_power_of_2(n):
23
+ """Return next power of 2 greater than or equal to n"""
24
+ n -= 1 # greater than OR EQUAL TO n
25
+ shift = 1
26
+ while (n + 1) & n: # n+1 is not a power of 2 yet
27
+ n |= n >> shift
28
+ shift *= 2
29
+ return max(4, n + 1)
30
+
31
+
32
+ class Item(object):
33
+ """
34
+ An item represent an object within a collection and is created on demand
35
+ when accessing a specific object of the collection.
36
+ """
37
+
38
+ def __init__(self, parent, key, vertices, indices, uniforms):
39
+ """
40
+ Create an item from an existing collection.
41
+
42
+ Parameters
43
+ ----------
44
+ parent : Collection
45
+ Collection this item belongs to
46
+
47
+ key : int
48
+ Collection index of this item
49
+
50
+ vertices: array-like
51
+ Vertices of the item
52
+
53
+ indices: array-like
54
+ Indices of the item
55
+
56
+ uniforms: array-like
57
+ Uniform parameters of the item
58
+ """
59
+ self._parent = parent
60
+ self._key = key
61
+ self._vertices = vertices
62
+ self._indices = indices
63
+ self._uniforms = uniforms
64
+
65
+ @property
66
+ def vertices(self):
67
+ return self._vertices
68
+
69
+ @vertices.setter
70
+ def vertices(self, data):
71
+ self._vertices[...] = np.array(data)
72
+
73
+ @property
74
+ def indices(self):
75
+ return self._indices
76
+
77
+ @indices.setter
78
+ def indices(self, data):
79
+ if self._indices is None:
80
+ raise ValueError("Item has no indices")
81
+ start = self._parent.vertices._items[self._key][0]
82
+ self._indices[...] = np.array(data) + start
83
+
84
+ @property
85
+ def uniforms(self):
86
+ return self._uniforms
87
+
88
+ @uniforms.setter
89
+ def uniforms(self, data):
90
+ if self._uniforms is None:
91
+ raise ValueError("Item has no associated uniform")
92
+ self._uniforms[...] = data
93
+
94
+ def __getitem__(self, key):
95
+ """Get a specific uniforms value"""
96
+ if key in self._vertices.dtype.names:
97
+ return self._vertices[key]
98
+ elif key in self._uniforms.dtype.names:
99
+ return self._uniforms[key]
100
+ else:
101
+ raise IndexError("Unknown key ('%s')" % key)
102
+
103
+ def __setitem__(self, key, value):
104
+ """Set a specific uniforms value"""
105
+ if key in self._vertices.dtype.names:
106
+ self._vertices[key] = value
107
+ elif key in self._uniforms.dtype.names:
108
+ self._uniforms[key] = value
109
+ else:
110
+ raise IndexError("Unknown key")
111
+
112
+ def __str__(self):
113
+ return "Item (%s, %s, %s)" % (self._vertices,
114
+ self._indices,
115
+ self._uniforms)
116
+
117
+
118
+ class BaseCollection(object):
119
+
120
+ def __init__(self, vtype, utype=None, itype=None):
121
+
122
+ # Vertices and type (mandatory)
123
+ self._vertices_list = None
124
+ self._vertices_buffer = None
125
+
126
+ # Vertex indices and type (optional)
127
+ self._indices_list = None
128
+ self._indices_buffer = None
129
+
130
+ # Uniforms and type (optional)
131
+ self._uniforms_list = None
132
+ self._uniforms_texture = None
133
+
134
+ # Make sure types are np.dtype (or None)
135
+ vtype = np.dtype(vtype) if vtype is not None else None
136
+ itype = np.dtype(itype) if itype is not None else None
137
+ utype = np.dtype(utype) if utype is not None else None
138
+
139
+ # Vertices type (mandatory)
140
+ # -------------------------
141
+ if vtype.names is None:
142
+ raise ValueError("vtype must be a structured dtype")
143
+
144
+ # Indices type (optional)
145
+ # -----------------------
146
+ if itype is not None:
147
+ if itype not in [np.uint8, np.uint16, np.uint32]:
148
+ raise ValueError("itype must be unsigned integer or None")
149
+ self._indices_list = ArrayList(dtype=itype)
150
+
151
+ # No program yet
152
+ self._programs = []
153
+
154
+ # Need to update buffers & texture
155
+ self._need_update = True
156
+
157
+ # Uniforms type (optional)
158
+ # -------------------------
159
+ if utype is not None:
160
+
161
+ if utype.names is None:
162
+ raise ValueError("utype must be a structured dtype")
163
+
164
+ # Convert types to lists (in case they were already dtypes) such
165
+ # that we can append new fields
166
+ vtype = eval(str(np.dtype(vtype)))
167
+ # We add a uniform index to access uniform data
168
+ vtype.append(('collection_index', np.float32))
169
+ vtype = np.dtype(vtype)
170
+
171
+ # Check utype is made of float32 only
172
+ utype = eval(str(np.dtype(utype)))
173
+ r_utype = dtype_reduce(utype)
174
+ if not isinstance(r_utype[0], str) or r_utype[2] != 'float32':
175
+ raise RuntimeError("utype cannot be reduced to float32 only")
176
+
177
+ # Make utype divisible by 4
178
+ # count = ((r_utype[1]-1)//4+1)*4
179
+
180
+ # Make utype a power of two
181
+ count = next_power_of_2(r_utype[1])
182
+ if (count - r_utype[1]) > 0:
183
+ utype.append(('__unused__', np.float32, count - r_utype[1]))
184
+
185
+ self._uniforms_list = ArrayList(dtype=utype)
186
+ self._uniforms_float_count = count
187
+
188
+ # Reserve some space in texture such that we have
189
+ # at least one full line
190
+ shape = self._compute_texture_shape(1)
191
+ self._uniforms_list.reserve(shape[1] / (count / 4))
192
+
193
+ # Last since utype may add a new field in vtype (collecion_index)
194
+ self._vertices_list = ArrayList(dtype=vtype)
195
+
196
+ # Record all types
197
+ self._vtype = np.dtype(vtype)
198
+ self._itype = np.dtype(itype) if itype is not None else None
199
+ self._utype = np.dtype(utype) if utype is not None else None
200
+
201
+ def __len__(self):
202
+ """x.__len__() <==> len(x)"""
203
+ return len(self._vertices_list)
204
+
205
+ @property
206
+ def vtype(self):
207
+ """Vertices dtype"""
208
+ return self._vtype
209
+
210
+ @property
211
+ def itype(self):
212
+ """Indices dtype"""
213
+ return self._itype
214
+
215
+ @property
216
+ def utype(self):
217
+ """Uniforms dtype"""
218
+ return self._utype
219
+
220
+ def append(self, vertices, uniforms=None, indices=None, itemsize=None):
221
+ """
222
+ Parameters
223
+ ----------
224
+ vertices : numpy array
225
+ An array whose dtype is compatible with self.vdtype
226
+
227
+ uniforms: numpy array
228
+ An array whose dtype is compatible with self.utype
229
+
230
+ indices : numpy array
231
+ An array whose dtype is compatible with self.idtype
232
+ All index values must be between 0 and len(vertices)
233
+
234
+ itemsize: int, tuple or 1-D array
235
+ If `itemsize` is an integer, N, the array will be divided
236
+ into elements of size N. If such partition is not possible,
237
+ an error is raised.
238
+
239
+ If `itemsize` is 1-D array, the array will be divided into
240
+ elements whose successive sizes will be picked from itemsize.
241
+ If the sum of itemsize values is different from array size,
242
+ an error is raised.
243
+ """
244
+ # Vertices
245
+ # -----------------------------
246
+ vertices = np.array(vertices).astype(self.vtype).ravel()
247
+ vsize = self._vertices_list.size
248
+
249
+ # No itemsize given
250
+ # -----------------
251
+ if itemsize is None:
252
+ index = 0
253
+ count = 1
254
+
255
+ # Uniform itemsize (int)
256
+ # ----------------------
257
+ elif isinstance(itemsize, int):
258
+ count = len(vertices) / itemsize
259
+ index = np.repeat(np.arange(count), itemsize)
260
+
261
+ # Individual itemsize (array)
262
+ # ---------------------------
263
+ elif isinstance(itemsize, (np.ndarray, list)):
264
+ count = len(itemsize)
265
+ index = np.repeat(np.arange(count), itemsize)
266
+ else:
267
+ raise ValueError("Itemsize not understood")
268
+
269
+ if self.utype:
270
+ vertices["collection_index"] = index + len(self)
271
+ self._vertices_list.append(vertices, itemsize)
272
+
273
+ # Indices
274
+ # -----------------------------
275
+ if self.itype is not None:
276
+ # No indices given (-> automatic generation)
277
+ if indices is None:
278
+ indices = vsize + np.arange(len(vertices))
279
+ self._indices_list.append(indices, itemsize)
280
+
281
+ # Indices given
282
+ # FIXME: variables indices (list of list or ArrayList)
283
+ else:
284
+ if itemsize is None:
285
+ idxs = np.array(indices) + vsize
286
+ elif isinstance(itemsize, int):
287
+ idxs = vsize + (np.tile(indices, count) +
288
+ itemsize * np.repeat(np.arange(count), len(indices))) # noqa
289
+ else:
290
+ raise ValueError("Indices not compatible with items")
291
+ self._indices_list.append(idxs, len(indices))
292
+
293
+ # Uniforms
294
+ # -----------------------------
295
+ if self.utype:
296
+ if uniforms is None:
297
+ uniforms = np.zeros(count, dtype=self.utype)
298
+ else:
299
+ uniforms = np.array(uniforms).astype(self.utype).ravel()
300
+ self._uniforms_list.append(uniforms, itemsize=1)
301
+
302
+ self._need_update = True
303
+
304
+ def __delitem__(self, index):
305
+ """x.__delitem__(y) <==> del x[y]"""
306
+ # Deleting one item
307
+ if isinstance(index, int):
308
+ if index < 0:
309
+ index += len(self)
310
+ if index < 0 or index > len(self):
311
+ raise IndexError("Collection deletion index out of range")
312
+ istart, istop = index, index + 1
313
+ # Deleting several items
314
+ elif isinstance(index, slice):
315
+ istart, istop, _ = index.indices(len(self))
316
+ if istart > istop:
317
+ istart, istop = istop, istart
318
+ if istart == istop:
319
+ return
320
+ # Deleting everything
321
+ elif index is Ellipsis:
322
+ istart, istop = 0, len(self)
323
+ # Error
324
+ else:
325
+ raise TypeError("Collection deletion indices must be integers")
326
+
327
+ vsize = len(self._vertices_list[index])
328
+ if self.itype is not None:
329
+ del self._indices_list[index]
330
+ self._indices_list[index:] -= vsize
331
+
332
+ if self.utype:
333
+ self._vertices_list[index:]["collection_index"] -= istop - istart
334
+ del self._vertices_list[index]
335
+
336
+ if self.utype is not None:
337
+ del self._uniforms_list[index]
338
+
339
+ self._need_update = True
340
+
341
+ def __getitem__(self, key):
342
+ """ """
343
+ # WARNING
344
+ # Here we want to make sure to use buffers and texture (instead of
345
+ # lists) since only them are aware of any external modification.
346
+ if self._need_update:
347
+ self._update()
348
+
349
+ V = self._vertices_buffer
350
+ idxs = None
351
+ U = None
352
+ if self._indices_list is not None:
353
+ idxs = self._indices_buffer
354
+ if self._uniforms_list is not None:
355
+ U = self._uniforms_texture.data.ravel().view(self.utype)
356
+
357
+ # Getting a whole field
358
+ if isinstance(key, str):
359
+ # Getting a named field from vertices
360
+ if key in V.dtype.names:
361
+ return V[key]
362
+ # Getting a named field from uniforms
363
+ elif U is not None and key in U.dtype.names:
364
+ # Careful, U is the whole texture that can be bigger than list
365
+ # return U[key]
366
+ return U[key][:len(self._uniforms_list)]
367
+ else:
368
+ raise IndexError("Unknown field name ('%s')" % key)
369
+
370
+ # Getting individual item
371
+ elif isinstance(key, int):
372
+ vstart, vend = self._vertices_list._items[key]
373
+ vertices = V[vstart:vend]
374
+ indices = None
375
+ uniforms = None
376
+ if idxs is not None:
377
+ istart, iend = self._indices_list._items[key]
378
+ indices = idxs[istart:iend]
379
+
380
+ if U is not None:
381
+ ustart, uend = self._uniforms_list._items[key]
382
+ uniforms = U[ustart:uend]
383
+
384
+ return Item(self, key, vertices, indices, uniforms)
385
+
386
+ # Error
387
+ else:
388
+ raise IndexError("Cannot get more than one item at once")
389
+
390
+ def __setitem__(self, key, data):
391
+ """x.__setitem__(i, y) <==> x[i]=y"""
392
+ # if len(self._programs):
393
+ # found = False
394
+ # for program in self._programs:
395
+ # if key in program.hooks:
396
+ # program[key] = data
397
+ # found = True
398
+ # if found: return
399
+
400
+ # WARNING
401
+ # Here we want to make sure to use buffers and texture (instead of
402
+ # lists) since only them are aware of any external modification.
403
+ if self._need_update:
404
+ self._update()
405
+
406
+ V = self._vertices_buffer
407
+ # I = None
408
+ U = None
409
+ # if self._indices_list is not None:
410
+ # I = self._indices_buffer # noqa
411
+ if self._uniforms_list is not None:
412
+ U = self._uniforms_texture.data.ravel().view(self.utype)
413
+
414
+ # Setting a whole field
415
+ if isinstance(key, str):
416
+ # Setting a named field in vertices
417
+ if key in self.vtype.names:
418
+ V[key] = data
419
+ # Setting a named field in uniforms
420
+ elif self.utype and key in self.utype.names:
421
+ # Careful, U is the whole texture that can be bigger than list
422
+ # U[key] = data
423
+ U[key][:len(self._uniforms_list)] = data
424
+ else:
425
+ raise IndexError("Unknown field name ('%s')" % key)
426
+
427
+ # # Setting individual item
428
+ # elif isinstance(key, int):
429
+ # #vstart, vend = self._vertices_list._items[key]
430
+ # #istart, iend = self._indices_list._items[key]
431
+ # #ustart, uend = self._uniforms_list._items[key]
432
+ # vertices, indices, uniforms = data
433
+ # del self[key]
434
+ # self.insert(key, vertices, indices, uniforms)
435
+
436
+ else:
437
+ raise IndexError("Cannot set more than one item")
438
+
439
+ def _compute_texture_shape(self, size=1):
440
+ """Compute uniform texture shape"""
441
+ # We should use this line but we may not have a GL context yet
442
+ # linesize = gl.glGetInteger(gl.GL_MAX_TEXTURE_SIZE)
443
+ linesize = 1024
444
+ count = self._uniforms_float_count
445
+ cols = 4 * linesize // int(count)
446
+ rows = max(1, int(math.ceil(size / float(cols))))
447
+ shape = rows, cols * (count // 4), count
448
+ self._ushape = shape
449
+ return shape
450
+
451
+ def _update(self):
452
+ """Update vertex buffers & texture"""
453
+ if self._vertices_buffer is not None:
454
+ self._vertices_buffer.delete()
455
+ self._vertices_buffer = VertexBuffer(self._vertices_list.data)
456
+
457
+ if self.itype is not None:
458
+ if self._indices_buffer is not None:
459
+ self._indices_buffer.delete()
460
+ self._indices_buffer = IndexBuffer(self._indices_list.data)
461
+
462
+ if self.utype is not None:
463
+ if self._uniforms_texture is not None:
464
+ self._uniforms_texture.delete()
465
+
466
+ # We take the whole array (_data), not the data one
467
+ texture = self._uniforms_list._data.view(np.float32)
468
+ size = len(texture) / self._uniforms_float_count
469
+ shape = self._compute_texture_shape(size)
470
+
471
+ # shape[2] = float count is only used in vertex shader code
472
+ texture = texture.reshape(shape[0], shape[1], 4)
473
+ self._uniforms_texture = Texture2D(texture)
474
+ self._uniforms_texture.data = texture
475
+ self._uniforms_texture.interpolation = 'nearest'
476
+
477
+ if len(self._programs):
478
+ for program in self._programs:
479
+ program.bind(self._vertices_buffer)
480
+ if self._uniforms_list is not None:
481
+ program["uniforms"] = self._uniforms_texture
482
+ program["uniforms_shape"] = self._ushape