vispy 0.15.0__cp312-cp312-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-312-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
vispy/gloo/wrappers.py
ADDED
|
@@ -0,0 +1,762 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
from copy import deepcopy
|
|
9
|
+
|
|
10
|
+
from . import gl
|
|
11
|
+
from ..color import Color
|
|
12
|
+
from ..util import logger
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ('set_viewport', 'set_depth_range', 'set_front_face', # noqa
|
|
16
|
+
'set_cull_face', 'set_line_width', 'set_polygon_offset', # noqa
|
|
17
|
+
'clear', 'set_clear_color', 'set_clear_depth', 'set_clear_stencil', # noqa
|
|
18
|
+
'set_blend_func', 'set_blend_color', 'set_blend_equation', # noqa
|
|
19
|
+
'set_scissor', 'set_stencil_func', 'set_stencil_mask', # noqa
|
|
20
|
+
'set_stencil_op', 'set_depth_func', 'set_depth_mask', # noqa
|
|
21
|
+
'set_color_mask', 'set_sample_coverage', # noqa
|
|
22
|
+
'get_state_presets', 'set_state', 'finish', 'flush', # noqa
|
|
23
|
+
'read_pixels', 'set_hint', # noqa
|
|
24
|
+
'get_gl_configuration', '_check_valid',
|
|
25
|
+
'GL_PRESETS',
|
|
26
|
+
'GlooFunctions', 'global_gloo_functions', )
|
|
27
|
+
|
|
28
|
+
_setters = [s[4:] for s in __all__
|
|
29
|
+
if s.startswith('set_') and s != 'set_state']
|
|
30
|
+
|
|
31
|
+
# NOTE: If these are updated to have things beyond glEnable/glBlendFunc
|
|
32
|
+
# calls, set_state will need to be updated to deal with it.
|
|
33
|
+
#: Some OpenGL state presets for common use cases: 'opaque', 'translucent',
|
|
34
|
+
#: 'additive'.
|
|
35
|
+
#:
|
|
36
|
+
#: To be used in :func:`.set_state`.
|
|
37
|
+
GL_PRESETS = {
|
|
38
|
+
'opaque': dict(
|
|
39
|
+
depth_test=True,
|
|
40
|
+
cull_face=False,
|
|
41
|
+
blend=False),
|
|
42
|
+
'translucent': dict(
|
|
43
|
+
depth_test=True,
|
|
44
|
+
cull_face=False,
|
|
45
|
+
blend=True,
|
|
46
|
+
blend_func=('src_alpha', 'one_minus_src_alpha', 'zero', 'one'),
|
|
47
|
+
blend_equation='func_add'),
|
|
48
|
+
'additive': dict(
|
|
49
|
+
depth_test=False,
|
|
50
|
+
cull_face=False,
|
|
51
|
+
blend=True,
|
|
52
|
+
blend_func=('src_alpha', 'one'),
|
|
53
|
+
blend_equation='func_add'),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_current_canvas():
|
|
58
|
+
"""Proxy for context.get_current_canvas to avoud circular import.
|
|
59
|
+
This function replaces itself with the real function the first
|
|
60
|
+
time it is called. (Bah)
|
|
61
|
+
"""
|
|
62
|
+
from .context import get_current_canvas
|
|
63
|
+
globals()['get_current_canvas'] = get_current_canvas
|
|
64
|
+
return get_current_canvas()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# Helpers that are needed for efficient wrapping
|
|
68
|
+
|
|
69
|
+
def _check_valid(key, val, valid):
|
|
70
|
+
"""Helper to check valid options"""
|
|
71
|
+
if val not in valid:
|
|
72
|
+
raise ValueError('%s must be one of %s, not "%s"'
|
|
73
|
+
% (key, valid, val))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _to_args(x):
|
|
77
|
+
"""Convert to args representation"""
|
|
78
|
+
if not isinstance(x, (list, tuple, np.ndarray)):
|
|
79
|
+
x = [x]
|
|
80
|
+
return x
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _check_conversion(key, valid_dict):
|
|
84
|
+
"""Check for existence of key in dict, return value or raise error"""
|
|
85
|
+
if key not in valid_dict and key not in valid_dict.values():
|
|
86
|
+
# Only show users the nice string values
|
|
87
|
+
keys = [v for v in valid_dict.keys() if isinstance(v, str)]
|
|
88
|
+
raise ValueError('value must be one of %s, not %s' % (keys, key))
|
|
89
|
+
return valid_dict[key] if key in valid_dict else key
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class BaseGlooFunctions(object):
|
|
93
|
+
"""Class that provides a series of GL functions that do not fit
|
|
94
|
+
in the object oriented part of gloo. An instance of this class is
|
|
95
|
+
associated with each canvas.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
##########################################################################
|
|
99
|
+
# PRIMITIVE/VERTEX
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# Viewport, DepthRangef, CullFace, FrontFace, LineWidth, PolygonOffset
|
|
103
|
+
#
|
|
104
|
+
|
|
105
|
+
def set_viewport(self, *args):
|
|
106
|
+
"""Set the OpenGL viewport
|
|
107
|
+
|
|
108
|
+
This is a wrapper for gl.glViewport.
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
*args : tuple
|
|
113
|
+
X and Y coordinates, plus width and height. Can be passed in as
|
|
114
|
+
individual components, or as a single tuple with four values.
|
|
115
|
+
"""
|
|
116
|
+
x, y, w, h = args[0] if len(args) == 1 else args
|
|
117
|
+
self.glir.command('FUNC', 'glViewport', int(x), int(y), int(w), int(h))
|
|
118
|
+
|
|
119
|
+
def set_depth_range(self, near=0., far=1.):
|
|
120
|
+
"""Set depth values
|
|
121
|
+
|
|
122
|
+
Parameters
|
|
123
|
+
----------
|
|
124
|
+
near : float
|
|
125
|
+
Near clipping plane.
|
|
126
|
+
far : float
|
|
127
|
+
Far clipping plane.
|
|
128
|
+
"""
|
|
129
|
+
self.glir.command('FUNC', 'glDepthRange', float(near), float(far))
|
|
130
|
+
|
|
131
|
+
def set_front_face(self, mode='ccw'):
|
|
132
|
+
"""Set which faces are front-facing
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
mode : str
|
|
137
|
+
Can be 'cw' for clockwise or 'ccw' for counter-clockwise.
|
|
138
|
+
"""
|
|
139
|
+
self.glir.command('FUNC', 'glFrontFace', mode)
|
|
140
|
+
|
|
141
|
+
def set_cull_face(self, mode='back'):
|
|
142
|
+
"""Set front, back, or both faces to be culled
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
mode : str
|
|
147
|
+
Culling mode. Can be "front", "back", or "front_and_back".
|
|
148
|
+
"""
|
|
149
|
+
self.glir.command('FUNC', 'glCullFace', mode)
|
|
150
|
+
|
|
151
|
+
def set_line_width(self, width=1.):
|
|
152
|
+
"""Set line width
|
|
153
|
+
|
|
154
|
+
Parameters
|
|
155
|
+
----------
|
|
156
|
+
width : float
|
|
157
|
+
The line width.
|
|
158
|
+
"""
|
|
159
|
+
width = float(width)
|
|
160
|
+
if width < 0:
|
|
161
|
+
raise RuntimeError('Cannot have width < 0')
|
|
162
|
+
self.glir.command('FUNC', 'glLineWidth', width)
|
|
163
|
+
|
|
164
|
+
def set_polygon_offset(self, factor=0., units=0.):
|
|
165
|
+
"""Set the scale and units used to calculate depth values
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
factor : float
|
|
170
|
+
Scale factor used to create a variable depth offset for
|
|
171
|
+
each polygon.
|
|
172
|
+
units : float
|
|
173
|
+
Multiplied by an implementation-specific value to create a
|
|
174
|
+
constant depth offset.
|
|
175
|
+
"""
|
|
176
|
+
self.glir.command('FUNC', 'glPolygonOffset', float(factor),
|
|
177
|
+
float(units))
|
|
178
|
+
|
|
179
|
+
##########################################################################
|
|
180
|
+
# FRAGMENT/SCREEN
|
|
181
|
+
|
|
182
|
+
#
|
|
183
|
+
# glClear, glClearColor, glClearDepthf, glClearStencil
|
|
184
|
+
#
|
|
185
|
+
|
|
186
|
+
def clear(self, color=True, depth=True, stencil=True):
|
|
187
|
+
"""Clear the screen buffers
|
|
188
|
+
|
|
189
|
+
This is a wrapper for gl.glClear.
|
|
190
|
+
|
|
191
|
+
Parameters
|
|
192
|
+
----------
|
|
193
|
+
color : bool | str | tuple | instance of Color
|
|
194
|
+
Clear the color buffer bit. If not bool, ``set_clear_color`` will
|
|
195
|
+
be used to set the color clear value.
|
|
196
|
+
depth : bool | float
|
|
197
|
+
Clear the depth buffer bit. If float, ``set_clear_depth`` will
|
|
198
|
+
be used to set the depth clear value.
|
|
199
|
+
stencil : bool | int
|
|
200
|
+
Clear the stencil buffer bit. If int, ``set_clear_stencil`` will
|
|
201
|
+
be used to set the stencil clear index.
|
|
202
|
+
"""
|
|
203
|
+
bits = 0
|
|
204
|
+
if isinstance(color, np.ndarray) or bool(color):
|
|
205
|
+
if not isinstance(color, bool):
|
|
206
|
+
self.set_clear_color(color)
|
|
207
|
+
bits |= gl.GL_COLOR_BUFFER_BIT
|
|
208
|
+
if depth:
|
|
209
|
+
if not isinstance(depth, bool):
|
|
210
|
+
self.set_clear_depth(depth)
|
|
211
|
+
bits |= gl.GL_DEPTH_BUFFER_BIT
|
|
212
|
+
if stencil:
|
|
213
|
+
if not isinstance(stencil, bool):
|
|
214
|
+
self.set_clear_stencil(stencil)
|
|
215
|
+
bits |= gl.GL_STENCIL_BUFFER_BIT
|
|
216
|
+
self.glir.command('FUNC', 'glClear', bits)
|
|
217
|
+
|
|
218
|
+
def set_clear_color(self, color='black', alpha=None):
|
|
219
|
+
"""Set the screen clear color
|
|
220
|
+
|
|
221
|
+
This is a wrapper for gl.glClearColor.
|
|
222
|
+
|
|
223
|
+
Parameters
|
|
224
|
+
----------
|
|
225
|
+
color : str | tuple | instance of Color
|
|
226
|
+
Color to use. See vispy.color.Color for options.
|
|
227
|
+
alpha : float | None
|
|
228
|
+
Alpha to use.
|
|
229
|
+
"""
|
|
230
|
+
self.glir.command('FUNC', 'glClearColor', *Color(color, alpha).rgba)
|
|
231
|
+
|
|
232
|
+
def set_clear_depth(self, depth=1.0):
|
|
233
|
+
"""Set the clear value for the depth buffer
|
|
234
|
+
|
|
235
|
+
This is a wrapper for gl.glClearDepth.
|
|
236
|
+
|
|
237
|
+
Parameters
|
|
238
|
+
----------
|
|
239
|
+
depth : float
|
|
240
|
+
The depth to use.
|
|
241
|
+
"""
|
|
242
|
+
self.glir.command('FUNC', 'glClearDepth', float(depth))
|
|
243
|
+
|
|
244
|
+
def set_clear_stencil(self, index=0):
|
|
245
|
+
"""Set the clear value for the stencil buffer
|
|
246
|
+
|
|
247
|
+
This is a wrapper for gl.glClearStencil.
|
|
248
|
+
|
|
249
|
+
Parameters
|
|
250
|
+
----------
|
|
251
|
+
index : int
|
|
252
|
+
The index to use when the stencil buffer is cleared.
|
|
253
|
+
"""
|
|
254
|
+
self.glir.command('FUNC', 'glClearStencil', int(index))
|
|
255
|
+
|
|
256
|
+
# glBlendFunc(Separate), glBlendColor, glBlendEquation(Separate)
|
|
257
|
+
|
|
258
|
+
def set_blend_func(self, srgb='one', drgb='zero',
|
|
259
|
+
salpha=None, dalpha=None):
|
|
260
|
+
"""Specify pixel arithmetic for RGB and alpha
|
|
261
|
+
|
|
262
|
+
Parameters
|
|
263
|
+
----------
|
|
264
|
+
srgb : str
|
|
265
|
+
Source RGB factor.
|
|
266
|
+
drgb : str
|
|
267
|
+
Destination RGB factor.
|
|
268
|
+
salpha : str | None
|
|
269
|
+
Source alpha factor. If None, ``srgb`` is used.
|
|
270
|
+
dalpha : str
|
|
271
|
+
Destination alpha factor. If None, ``drgb`` is used.
|
|
272
|
+
"""
|
|
273
|
+
salpha = srgb if salpha is None else salpha
|
|
274
|
+
dalpha = drgb if dalpha is None else dalpha
|
|
275
|
+
self.glir.command('FUNC', 'glBlendFuncSeparate',
|
|
276
|
+
srgb, drgb, salpha, dalpha)
|
|
277
|
+
|
|
278
|
+
def set_blend_color(self, color):
|
|
279
|
+
"""Set the blend color
|
|
280
|
+
|
|
281
|
+
Parameters
|
|
282
|
+
----------
|
|
283
|
+
color : str | tuple | instance of Color
|
|
284
|
+
Color to use. See vispy.color.Color for options.
|
|
285
|
+
"""
|
|
286
|
+
self.glir.command('FUNC', 'glBlendColor', *Color(color).rgba)
|
|
287
|
+
|
|
288
|
+
def set_blend_equation(self, mode_rgb, mode_alpha=None):
|
|
289
|
+
"""Specify the equation for RGB and alpha blending
|
|
290
|
+
|
|
291
|
+
Parameters
|
|
292
|
+
----------
|
|
293
|
+
mode_rgb : str
|
|
294
|
+
Mode for RGB.
|
|
295
|
+
mode_alpha : str | None
|
|
296
|
+
Mode for Alpha. If None, ``mode_rgb`` is used.
|
|
297
|
+
|
|
298
|
+
Notes
|
|
299
|
+
-----
|
|
300
|
+
See ``set_blend_equation`` for valid modes.
|
|
301
|
+
"""
|
|
302
|
+
mode_alpha = mode_rgb if mode_alpha is None else mode_alpha
|
|
303
|
+
self.glir.command('FUNC', 'glBlendEquationSeparate',
|
|
304
|
+
mode_rgb, mode_alpha)
|
|
305
|
+
|
|
306
|
+
# glScissor, glStencilFunc(Separate), glStencilMask(Separate),
|
|
307
|
+
# glStencilOp(Separate),
|
|
308
|
+
|
|
309
|
+
def set_scissor(self, x, y, w, h):
|
|
310
|
+
"""Define the scissor box
|
|
311
|
+
|
|
312
|
+
Parameters
|
|
313
|
+
----------
|
|
314
|
+
x : int
|
|
315
|
+
Left corner of the box.
|
|
316
|
+
y : int
|
|
317
|
+
Lower corner of the box.
|
|
318
|
+
w : int
|
|
319
|
+
The width of the box.
|
|
320
|
+
h : int
|
|
321
|
+
The height of the box.
|
|
322
|
+
"""
|
|
323
|
+
self.glir.command('FUNC', 'glScissor', int(x), int(y), int(w), int(h))
|
|
324
|
+
|
|
325
|
+
def set_stencil_func(self, func='always', ref=0, mask=8,
|
|
326
|
+
face='front_and_back'):
|
|
327
|
+
"""Set front or back function and reference value
|
|
328
|
+
|
|
329
|
+
Parameters
|
|
330
|
+
----------
|
|
331
|
+
func : str
|
|
332
|
+
See set_stencil_func.
|
|
333
|
+
ref : int
|
|
334
|
+
Reference value for the stencil test.
|
|
335
|
+
mask : int
|
|
336
|
+
Mask that is ANDed with ref and stored stencil value.
|
|
337
|
+
face : str
|
|
338
|
+
Can be 'front', 'back', or 'front_and_back'.
|
|
339
|
+
"""
|
|
340
|
+
self.glir.command('FUNC', 'glStencilFuncSeparate',
|
|
341
|
+
face, func, int(ref), int(mask))
|
|
342
|
+
|
|
343
|
+
def set_stencil_mask(self, mask=8, face='front_and_back'):
|
|
344
|
+
"""Control the front or back writing of individual bits in the stencil
|
|
345
|
+
|
|
346
|
+
Parameters
|
|
347
|
+
----------
|
|
348
|
+
mask : int
|
|
349
|
+
Mask that is ANDed with ref and stored stencil value.
|
|
350
|
+
face : str
|
|
351
|
+
Can be 'front', 'back', or 'front_and_back'.
|
|
352
|
+
"""
|
|
353
|
+
self.glir.command('FUNC', 'glStencilMaskSeparate', face, int(mask))
|
|
354
|
+
|
|
355
|
+
def set_stencil_op(self, sfail='keep', dpfail='keep', dppass='keep',
|
|
356
|
+
face='front_and_back'):
|
|
357
|
+
"""Set front or back stencil test actions
|
|
358
|
+
|
|
359
|
+
Parameters
|
|
360
|
+
----------
|
|
361
|
+
sfail : str
|
|
362
|
+
Action to take when the stencil fails. Must be one of
|
|
363
|
+
'keep', 'zero', 'replace', 'incr', 'incr_wrap',
|
|
364
|
+
'decr', 'decr_wrap', or 'invert'.
|
|
365
|
+
dpfail : str
|
|
366
|
+
Action to take when the stencil passes.
|
|
367
|
+
dppass : str
|
|
368
|
+
Action to take when both the stencil and depth tests pass,
|
|
369
|
+
or when the stencil test passes and either there is no depth
|
|
370
|
+
buffer or depth testing is not enabled.
|
|
371
|
+
face : str
|
|
372
|
+
Can be 'front', 'back', or 'front_and_back'.
|
|
373
|
+
"""
|
|
374
|
+
self.glir.command('FUNC', 'glStencilOpSeparate',
|
|
375
|
+
face, sfail, dpfail, dppass)
|
|
376
|
+
|
|
377
|
+
# glDepthFunc, glDepthMask, glColorMask, glSampleCoverage
|
|
378
|
+
|
|
379
|
+
def set_depth_func(self, func='less'):
|
|
380
|
+
"""Specify the value used for depth buffer comparisons
|
|
381
|
+
|
|
382
|
+
Parameters
|
|
383
|
+
----------
|
|
384
|
+
func : str
|
|
385
|
+
The depth comparison function. Must be one of 'never', 'less',
|
|
386
|
+
'equal', 'lequal', 'greater', 'gequal', 'notequal', or 'always'.
|
|
387
|
+
"""
|
|
388
|
+
self.glir.command('FUNC', 'glDepthFunc', func)
|
|
389
|
+
|
|
390
|
+
def set_depth_mask(self, flag):
|
|
391
|
+
"""Toggle writing into the depth buffer
|
|
392
|
+
|
|
393
|
+
Parameters
|
|
394
|
+
----------
|
|
395
|
+
flag : bool
|
|
396
|
+
Whether depth writing should be enabled.
|
|
397
|
+
"""
|
|
398
|
+
self.glir.command('FUNC', 'glDepthMask', bool(flag))
|
|
399
|
+
|
|
400
|
+
def set_color_mask(self, red, green, blue, alpha):
|
|
401
|
+
"""Toggle writing of frame buffer color components
|
|
402
|
+
|
|
403
|
+
Parameters
|
|
404
|
+
----------
|
|
405
|
+
red : bool
|
|
406
|
+
Red toggle.
|
|
407
|
+
green : bool
|
|
408
|
+
Green toggle.
|
|
409
|
+
blue : bool
|
|
410
|
+
Blue toggle.
|
|
411
|
+
alpha : bool
|
|
412
|
+
Alpha toggle.
|
|
413
|
+
"""
|
|
414
|
+
self.glir.command('FUNC', 'glColorMask', bool(red), bool(green),
|
|
415
|
+
bool(blue), bool(alpha))
|
|
416
|
+
|
|
417
|
+
def set_sample_coverage(self, value=1.0, invert=False):
|
|
418
|
+
"""Specify multisample coverage parameters
|
|
419
|
+
|
|
420
|
+
Parameters
|
|
421
|
+
----------
|
|
422
|
+
value : float
|
|
423
|
+
Sample coverage value (will be clamped between 0. and 1.).
|
|
424
|
+
invert : bool
|
|
425
|
+
Specify if the coverage masks should be inverted.
|
|
426
|
+
"""
|
|
427
|
+
self.glir.command('FUNC', 'glSampleCoverage', float(value),
|
|
428
|
+
bool(invert))
|
|
429
|
+
|
|
430
|
+
##########################################################################
|
|
431
|
+
# STATE
|
|
432
|
+
|
|
433
|
+
#
|
|
434
|
+
# glEnable/Disable
|
|
435
|
+
#
|
|
436
|
+
|
|
437
|
+
def get_state_presets(self):
|
|
438
|
+
"""The available GL state :data:`presets <.GL_PRESETS>`.
|
|
439
|
+
|
|
440
|
+
Returns
|
|
441
|
+
-------
|
|
442
|
+
presets : dict
|
|
443
|
+
The dictionary of presets usable with :func:`.set_state`.
|
|
444
|
+
"""
|
|
445
|
+
return deepcopy(GL_PRESETS)
|
|
446
|
+
|
|
447
|
+
def set_state(self, preset=None, **kwargs):
|
|
448
|
+
"""Set the OpenGL rendering state, optionally using a preset.
|
|
449
|
+
|
|
450
|
+
Parameters
|
|
451
|
+
----------
|
|
452
|
+
preset : {'opaque', 'translucent', 'additive'}, optional
|
|
453
|
+
A named state :data:`preset <.GL_PRESETS>` for typical use cases.
|
|
454
|
+
|
|
455
|
+
**kwargs : keyword arguments
|
|
456
|
+
Other supplied keyword arguments will override any preset defaults.
|
|
457
|
+
Options to be enabled or disabled should be supplied as booleans
|
|
458
|
+
(e.g., ``'depth_test=True'``, ``cull_face=False``), non-boolean
|
|
459
|
+
entries will be passed as arguments to ``set_*`` functions (e.g.,
|
|
460
|
+
``blend_func=('src_alpha', 'one')`` will call :func:`.set_blend_func`).
|
|
461
|
+
|
|
462
|
+
Notes
|
|
463
|
+
-----
|
|
464
|
+
This serves three purposes:
|
|
465
|
+
|
|
466
|
+
1. Set GL state using reasonable presets.
|
|
467
|
+
2. Wrapping glEnable/glDisable functionality.
|
|
468
|
+
3. Convienence wrapping of other ``gloo.set_*`` functions.
|
|
469
|
+
|
|
470
|
+
For example, one could do the following:
|
|
471
|
+
|
|
472
|
+
>>> from vispy import gloo
|
|
473
|
+
>>> gloo.set_state('translucent', depth_test=False, clear_color=(1, 1, 1, 1)) # noqa, doctest:+SKIP
|
|
474
|
+
|
|
475
|
+
This would take the preset defaults for 'translucent', turn
|
|
476
|
+
depth testing off (which would normally be on for that preset),
|
|
477
|
+
and additionally set the glClearColor parameter to be white.
|
|
478
|
+
|
|
479
|
+
Another example to showcase glEnable/glDisable wrapping:
|
|
480
|
+
|
|
481
|
+
>>> gloo.set_state(blend=True, depth_test=True, polygon_offset_fill=False) # noqa, doctest:+SKIP
|
|
482
|
+
|
|
483
|
+
This would be equivalent to calling
|
|
484
|
+
|
|
485
|
+
>>> from vispy.gloo import gl
|
|
486
|
+
>>> gl.glDisable(gl.GL_BLEND)
|
|
487
|
+
>>> gl.glEnable(gl.GL_DEPTH_TEST)
|
|
488
|
+
>>> gl.glEnable(gl.GL_POLYGON_OFFSET_FILL)
|
|
489
|
+
|
|
490
|
+
Or here's another example:
|
|
491
|
+
|
|
492
|
+
>>> gloo.set_state(clear_color=(0, 0, 0, 1), blend=True, blend_func=('src_alpha', 'one')) # noqa, doctest:+SKIP
|
|
493
|
+
|
|
494
|
+
Thus arbitrary GL state components can be set directly using
|
|
495
|
+
``set_state``. Note that individual functions are exposed e.g.,
|
|
496
|
+
as ``set_clear_color``, with some more informative docstrings
|
|
497
|
+
about those particular functions.
|
|
498
|
+
"""
|
|
499
|
+
kwargs = deepcopy(kwargs)
|
|
500
|
+
|
|
501
|
+
# Load preset, if supplied
|
|
502
|
+
if preset is not None:
|
|
503
|
+
_check_valid('preset', preset, tuple(list(GL_PRESETS.keys())))
|
|
504
|
+
for key, val in GL_PRESETS[preset].items():
|
|
505
|
+
# only overwrite user input with preset if user's input is None
|
|
506
|
+
if key not in kwargs:
|
|
507
|
+
kwargs[key] = val
|
|
508
|
+
|
|
509
|
+
# cull_face is an exception because GL_CULL_FACE, glCullFace both exist
|
|
510
|
+
if 'cull_face' in kwargs:
|
|
511
|
+
cull_face = kwargs.pop('cull_face')
|
|
512
|
+
if isinstance(cull_face, bool):
|
|
513
|
+
funcname = 'glEnable' if cull_face else 'glDisable'
|
|
514
|
+
self.glir.command('FUNC', funcname, 'cull_face')
|
|
515
|
+
else:
|
|
516
|
+
self.glir.command('FUNC', 'glEnable', 'cull_face')
|
|
517
|
+
self.set_cull_face(*_to_args(cull_face))
|
|
518
|
+
|
|
519
|
+
# Line width needs some special care ...
|
|
520
|
+
if 'line_width' in kwargs:
|
|
521
|
+
line_width = kwargs.pop('line_width')
|
|
522
|
+
self.glir.command('FUNC', 'glLineWidth', line_width)
|
|
523
|
+
if 'line_smooth' in kwargs:
|
|
524
|
+
line_smooth = kwargs.pop('line_smooth')
|
|
525
|
+
funcname = 'glEnable' if line_smooth else 'glDisable'
|
|
526
|
+
line_smooth_enum_value = 2848 # int(GL.GL_LINE_SMOOTH)
|
|
527
|
+
self.glir.command('FUNC', funcname, line_smooth_enum_value)
|
|
528
|
+
|
|
529
|
+
# Iterate over kwargs
|
|
530
|
+
for key, val in kwargs.items():
|
|
531
|
+
if key in _setters:
|
|
532
|
+
# Setter
|
|
533
|
+
args = _to_args(val)
|
|
534
|
+
# these actually need tuples
|
|
535
|
+
if key in ('blend_color', 'clear_color') and \
|
|
536
|
+
not isinstance(args[0], str):
|
|
537
|
+
args = [args]
|
|
538
|
+
getattr(self, 'set_' + key)(*args)
|
|
539
|
+
else:
|
|
540
|
+
# Enable / disable
|
|
541
|
+
funcname = 'glEnable' if val else 'glDisable'
|
|
542
|
+
self.glir.command('FUNC', funcname, key)
|
|
543
|
+
|
|
544
|
+
#
|
|
545
|
+
# glFinish, glFlush, glReadPixels, glHint
|
|
546
|
+
#
|
|
547
|
+
|
|
548
|
+
def finish(self):
|
|
549
|
+
"""Wait for GL commands to to finish
|
|
550
|
+
|
|
551
|
+
This creates a GLIR command for glFinish and then processes the
|
|
552
|
+
GLIR commands. If the GLIR interpreter is remote (e.g. WebGL), this
|
|
553
|
+
function will return before GL has finished processing the commands.
|
|
554
|
+
"""
|
|
555
|
+
if hasattr(self, 'flush_commands'):
|
|
556
|
+
context = self
|
|
557
|
+
else:
|
|
558
|
+
context = get_current_canvas().context
|
|
559
|
+
context.glir.command('FUNC', 'glFinish')
|
|
560
|
+
context.flush_commands() # Process GLIR commands
|
|
561
|
+
|
|
562
|
+
def flush(self):
|
|
563
|
+
"""Flush GL commands
|
|
564
|
+
|
|
565
|
+
This is a wrapper for glFlush(). This also flushes the GLIR
|
|
566
|
+
command queue.
|
|
567
|
+
"""
|
|
568
|
+
if hasattr(self, 'flush_commands'):
|
|
569
|
+
context = self
|
|
570
|
+
else:
|
|
571
|
+
context = get_current_canvas().context
|
|
572
|
+
context.glir.command('FUNC', 'glFlush')
|
|
573
|
+
context.flush_commands() # Process GLIR commands
|
|
574
|
+
|
|
575
|
+
def set_hint(self, target, mode):
|
|
576
|
+
"""Set OpenGL drawing hint
|
|
577
|
+
|
|
578
|
+
Parameters
|
|
579
|
+
----------
|
|
580
|
+
target : str
|
|
581
|
+
The target, e.g. 'fog_hint', 'line_smooth_hint',
|
|
582
|
+
'point_smooth_hint'.
|
|
583
|
+
mode : str
|
|
584
|
+
The mode to set (e.g., 'fastest', 'nicest', 'dont_care').
|
|
585
|
+
"""
|
|
586
|
+
if not all(isinstance(tm, str) for tm in (target, mode)):
|
|
587
|
+
raise TypeError('target and mode must both be strings')
|
|
588
|
+
self.glir.command('FUNC', 'glHint', target, mode)
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
class GlooFunctions(BaseGlooFunctions):
|
|
592
|
+
|
|
593
|
+
@property
|
|
594
|
+
def glir(self):
|
|
595
|
+
"""The GLIR queue corresponding to the current canvas"""
|
|
596
|
+
canvas = get_current_canvas()
|
|
597
|
+
if canvas is None:
|
|
598
|
+
msg = ("If you want to use gloo without vispy.app, " +
|
|
599
|
+
"use a gloo.context.FakeCanvas.")
|
|
600
|
+
raise RuntimeError('Gloo requires a Canvas to run.\n' + msg)
|
|
601
|
+
return canvas.context.glir
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
# Create global functions object and inject names here
|
|
605
|
+
|
|
606
|
+
# GlooFunctions without queue: use queue of canvas that is current at call-time
|
|
607
|
+
global_gloo_functions = GlooFunctions()
|
|
608
|
+
|
|
609
|
+
for name in dir(global_gloo_functions):
|
|
610
|
+
if name.startswith('_') or name in ('glir'):
|
|
611
|
+
continue
|
|
612
|
+
fun = getattr(global_gloo_functions, name)
|
|
613
|
+
if callable(fun):
|
|
614
|
+
globals()[name] = fun
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
# Functions that do not use the glir queue
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
def read_pixels(viewport=None, alpha=True, mode='color', out_type='unsigned_byte'):
|
|
621
|
+
"""Read pixels from the currently selected buffer.
|
|
622
|
+
|
|
623
|
+
Under most circumstances, this function reads from the front buffer.
|
|
624
|
+
Unlike all other functions in vispy.gloo, this function directly executes
|
|
625
|
+
an OpenGL command.
|
|
626
|
+
|
|
627
|
+
Parameters
|
|
628
|
+
----------
|
|
629
|
+
viewport : array-like | None
|
|
630
|
+
4-element list of x, y, w, h parameters. If None (default),
|
|
631
|
+
the current GL viewport will be queried and used.
|
|
632
|
+
alpha : bool
|
|
633
|
+
If True (default), the returned array has 4 elements (RGBA).
|
|
634
|
+
If False, it has 3 (RGB). This only effects the color mode.
|
|
635
|
+
mode : str
|
|
636
|
+
Type of buffer data to read. Can be one of 'colors', 'depth',
|
|
637
|
+
or 'stencil'. See returns for more information.
|
|
638
|
+
out_type : str | dtype
|
|
639
|
+
Can be 'unsigned_byte' or 'float'. Note that this does not
|
|
640
|
+
use casting, but instead determines how values are read from
|
|
641
|
+
the current buffer. Can also be numpy dtypes ``np.uint8``,
|
|
642
|
+
``np.ubyte``, or ``np.float32``.
|
|
643
|
+
|
|
644
|
+
Returns
|
|
645
|
+
-------
|
|
646
|
+
pixels : array
|
|
647
|
+
3D array of pixels in np.uint8 or np.float32 format.
|
|
648
|
+
The array shape is (h, w, 3) or (h, w, 4) for colors mode,
|
|
649
|
+
with the top-left corner of the framebuffer at index [0, 0] in the
|
|
650
|
+
returned array. If 'mode' is depth or stencil then the last dimension
|
|
651
|
+
is 1.
|
|
652
|
+
"""
|
|
653
|
+
_check_valid('mode', mode, ['color', 'depth', 'stencil'])
|
|
654
|
+
|
|
655
|
+
# Check whether the GL context is direct or remote
|
|
656
|
+
context = get_current_canvas().context
|
|
657
|
+
if context.shared.parser.is_remote():
|
|
658
|
+
raise RuntimeError('Cannot use read_pixels() with remote GLIR parser')
|
|
659
|
+
|
|
660
|
+
finish() # noqa - finish first, also flushes GLIR commands
|
|
661
|
+
type_dict = {'unsigned_byte': gl.GL_UNSIGNED_BYTE,
|
|
662
|
+
np.uint8: gl.GL_UNSIGNED_BYTE,
|
|
663
|
+
'float': gl.GL_FLOAT,
|
|
664
|
+
np.float32: gl.GL_FLOAT}
|
|
665
|
+
type_ = _check_conversion(out_type, type_dict)
|
|
666
|
+
if viewport is None:
|
|
667
|
+
viewport = gl.glGetParameter(gl.GL_VIEWPORT)
|
|
668
|
+
viewport = np.array(viewport, int)
|
|
669
|
+
if viewport.ndim != 1 or viewport.size != 4:
|
|
670
|
+
raise ValueError('viewport should be 1D 4-element array-like, not %s'
|
|
671
|
+
% (viewport,))
|
|
672
|
+
x, y, w, h = viewport
|
|
673
|
+
gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1) # PACK, not UNPACK
|
|
674
|
+
if mode == 'depth':
|
|
675
|
+
fmt = gl.GL_DEPTH_COMPONENT
|
|
676
|
+
shape = (h, w, 1)
|
|
677
|
+
elif mode == 'stencil':
|
|
678
|
+
fmt = gl.GL_STENCIL_INDEX8
|
|
679
|
+
shape = (h, w, 1)
|
|
680
|
+
elif alpha:
|
|
681
|
+
fmt = gl.GL_RGBA
|
|
682
|
+
shape = (h, w, 4)
|
|
683
|
+
else:
|
|
684
|
+
fmt = gl.GL_RGB
|
|
685
|
+
shape = (h, w, 3)
|
|
686
|
+
im = gl.glReadPixels(x, y, w, h, fmt, type_)
|
|
687
|
+
gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 4)
|
|
688
|
+
# reshape, flip, and return
|
|
689
|
+
if not isinstance(im, np.ndarray):
|
|
690
|
+
np_dtype = np.uint8 if type_ == gl.GL_UNSIGNED_BYTE else np.float32
|
|
691
|
+
im = np.frombuffer(im, np_dtype)
|
|
692
|
+
|
|
693
|
+
im.shape = shape
|
|
694
|
+
im = im[::-1, ...] # flip the image
|
|
695
|
+
return im
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def get_gl_configuration():
|
|
699
|
+
"""Read the current gl configuration
|
|
700
|
+
|
|
701
|
+
This function uses constants that are not in the OpenGL ES 2.1
|
|
702
|
+
namespace, so only use this on desktop systems.
|
|
703
|
+
|
|
704
|
+
Returns
|
|
705
|
+
-------
|
|
706
|
+
config : dict
|
|
707
|
+
The currently active OpenGL configuration.
|
|
708
|
+
"""
|
|
709
|
+
# XXX eventually maybe we can ask `gl` whether or not we can access these
|
|
710
|
+
gl.check_error('pre-config check')
|
|
711
|
+
config = dict()
|
|
712
|
+
canvas = get_current_canvas()
|
|
713
|
+
fbo = 0 if canvas is None else canvas._backend._vispy_get_fb_bind_location()
|
|
714
|
+
gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)
|
|
715
|
+
fb_param = gl.glGetFramebufferAttachmentParameter
|
|
716
|
+
# copied since they aren't in ES:
|
|
717
|
+
GL_FRONT_LEFT = 1024
|
|
718
|
+
GL_DEPTH = 6145
|
|
719
|
+
GL_STENCIL = 6146
|
|
720
|
+
GL_SRGB = 35904
|
|
721
|
+
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 33296
|
|
722
|
+
GL_STEREO = 3123
|
|
723
|
+
GL_DOUBLEBUFFER = 3122
|
|
724
|
+
sizes = dict(red=(GL_FRONT_LEFT, 33298),
|
|
725
|
+
green=(GL_FRONT_LEFT, 33299),
|
|
726
|
+
blue=(GL_FRONT_LEFT, 33300),
|
|
727
|
+
alpha=(GL_FRONT_LEFT, 33301),
|
|
728
|
+
depth=(GL_DEPTH, 33302),
|
|
729
|
+
stencil=(GL_STENCIL, 33303))
|
|
730
|
+
for key, val in sizes.items():
|
|
731
|
+
try:
|
|
732
|
+
param = fb_param(gl.GL_FRAMEBUFFER, val[0], val[1])
|
|
733
|
+
gl.check_error('post-config check')
|
|
734
|
+
except RuntimeError as exp:
|
|
735
|
+
logger.warning('Failed to get size %s: %s' % (key, exp))
|
|
736
|
+
else:
|
|
737
|
+
config[key + '_size'] = param
|
|
738
|
+
|
|
739
|
+
try:
|
|
740
|
+
val = fb_param(gl.GL_FRAMEBUFFER, GL_FRONT_LEFT,
|
|
741
|
+
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING)
|
|
742
|
+
gl.check_error('post-config check')
|
|
743
|
+
except RuntimeError as exp:
|
|
744
|
+
logger.warning('Failed to get sRGB: %s' % (exp,))
|
|
745
|
+
else:
|
|
746
|
+
if val not in (gl.GL_LINEAR, GL_SRGB):
|
|
747
|
+
logger.warning('unknown value for SRGB: %s' % val)
|
|
748
|
+
else:
|
|
749
|
+
config['srgb'] = (val == GL_SRGB)
|
|
750
|
+
|
|
751
|
+
for key, enum in (('stereo', GL_STEREO),
|
|
752
|
+
('double_buffer', GL_DOUBLEBUFFER)):
|
|
753
|
+
val = gl.glGetParameter(enum)
|
|
754
|
+
try:
|
|
755
|
+
gl.check_error('post-config check')
|
|
756
|
+
except RuntimeError as exp:
|
|
757
|
+
logger.warning('Failed to get %s: %s' % (key, exp))
|
|
758
|
+
else:
|
|
759
|
+
config[key] = bool(val)
|
|
760
|
+
config['samples'] = gl.glGetParameter(gl.GL_SAMPLES)
|
|
761
|
+
gl.check_error('post-config check')
|
|
762
|
+
return config
|