vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- 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
|