vispy 0.14.0__cp311-cp311-macosx_11_0_arm64.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 +968 -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 +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -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 +134 -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 +698 -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 +506 -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 +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -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 +1045 -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 +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -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 +173 -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 +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -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 +17 -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 +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -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 +163 -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 +796 -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 +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -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 +810 -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_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -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 +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -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-311-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -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 +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +5 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
vispy/visuals/border.py
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
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
|
+
# Author: Siddharth Bhat
|
|
7
|
+
# -----------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
from . import Visual
|
|
12
|
+
from ..color import Color
|
|
13
|
+
|
|
14
|
+
_VERTEX_SHADER = """
|
|
15
|
+
attribute vec2 a_position;
|
|
16
|
+
attribute vec2 a_adjust_dir;
|
|
17
|
+
|
|
18
|
+
void main() {
|
|
19
|
+
// First map the vertex to document coordinates
|
|
20
|
+
vec4 doc_pos = $visual_to_doc(vec4(a_position, 0, 1));
|
|
21
|
+
|
|
22
|
+
// Also need to map the adjustment direction vector, but this is tricky!
|
|
23
|
+
// We need to adjust separately for each component of the vector:
|
|
24
|
+
vec4 adjusted;
|
|
25
|
+
if ( a_adjust_dir.x == 0. ) {
|
|
26
|
+
// If this is an outer vertex, no adjustment for line weight is needed.
|
|
27
|
+
// (In fact, trying to make the adjustment would result in no
|
|
28
|
+
// triangles being drawn, hence the if/else block)
|
|
29
|
+
adjusted = doc_pos;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// Inner vertexes must be adjusted for line width, but this is
|
|
33
|
+
// surprisingly tricky given that the rectangle may have been scaled
|
|
34
|
+
// and rotated!
|
|
35
|
+
vec4 doc_x = $visual_to_doc(vec4(a_adjust_dir.x, 0., 0., 0.)) -
|
|
36
|
+
$visual_to_doc(vec4(0., 0., 0., 0.));
|
|
37
|
+
vec4 doc_y = $visual_to_doc(vec4(0, a_adjust_dir.y, 0., 0.)) -
|
|
38
|
+
$visual_to_doc(vec4(0., 0., 0., 0.));
|
|
39
|
+
doc_x = normalize(doc_x);
|
|
40
|
+
doc_y = normalize(doc_y);
|
|
41
|
+
|
|
42
|
+
// Now doc_x + doc_y points in the direction we need in order to
|
|
43
|
+
// correct the line weight of _both_ segments, but the magnitude of
|
|
44
|
+
// that correction is wrong. To correct it we first need to
|
|
45
|
+
// measure the width that would result from using doc_x + doc_y:
|
|
46
|
+
vec4 proj_y_x = dot(doc_x, doc_y) * doc_x; // project y onto x
|
|
47
|
+
float cur_width = length(doc_y - proj_y_x); // measure current weight
|
|
48
|
+
|
|
49
|
+
// And now we can adjust vertex position for line width:
|
|
50
|
+
adjusted = doc_pos + ($border_width / cur_width) * (doc_x + doc_y);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Finally map the remainder of the way to render coordinates
|
|
54
|
+
gl_Position = $doc_to_render(adjusted);
|
|
55
|
+
}
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
_FRAGMENT_SHADER = """
|
|
59
|
+
void main() {
|
|
60
|
+
gl_FragColor = $border_color;
|
|
61
|
+
}
|
|
62
|
+
""" # noqa
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class _BorderVisual(Visual):
|
|
66
|
+
"""
|
|
67
|
+
Visual subclass to display 2D pixel-width borders.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
pos : tuple (x, y)
|
|
72
|
+
Position where the colorbar is to be placed with
|
|
73
|
+
respect to the center of the colorbar
|
|
74
|
+
halfdim : tuple (half_width, half_height)
|
|
75
|
+
Half the dimensions of the colorbar measured
|
|
76
|
+
from the center. That way, the total dimensions
|
|
77
|
+
of the colorbar is (x - half_width) to (x + half_width)
|
|
78
|
+
and (y - half_height) to (y + half_height)
|
|
79
|
+
border_width : float (in px)
|
|
80
|
+
The width of the border the colormap should have. This measurement
|
|
81
|
+
is given in pixels
|
|
82
|
+
border_color : str | vispy.color.Color
|
|
83
|
+
The color of the border of the colormap. This can either be a
|
|
84
|
+
str as the color's name or an actual instace of a vipy.color.Color
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
_shaders = {
|
|
88
|
+
'vertex': _VERTEX_SHADER,
|
|
89
|
+
'fragment': _FRAGMENT_SHADER,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
def __init__(self, pos, halfdim,
|
|
93
|
+
border_width=1.0,
|
|
94
|
+
border_color=None,
|
|
95
|
+
**kwargs):
|
|
96
|
+
|
|
97
|
+
self._pos = pos
|
|
98
|
+
self._halfdim = halfdim
|
|
99
|
+
self._border_width = border_width
|
|
100
|
+
self._border_color = Color(border_color)
|
|
101
|
+
|
|
102
|
+
Visual.__init__(self, vcode=self._shaders['vertex'], fcode=self._shaders['fragment'])
|
|
103
|
+
|
|
104
|
+
@staticmethod
|
|
105
|
+
def _prepare_transforms(view):
|
|
106
|
+
|
|
107
|
+
program = view.shared_program
|
|
108
|
+
program.vert['visual_to_doc'] = \
|
|
109
|
+
view.transforms.get_transform('visual', 'document')
|
|
110
|
+
program.vert['doc_to_render'] = \
|
|
111
|
+
view.transforms.get_transform('document', 'render')
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def visual_border_width(self):
|
|
115
|
+
"""The border width in visual coordinates"""
|
|
116
|
+
render_to_doc = \
|
|
117
|
+
self.transforms.get_transform('document', 'visual')
|
|
118
|
+
|
|
119
|
+
vec = render_to_doc.map([self.border_width, self.border_width, 0])
|
|
120
|
+
origin = render_to_doc.map([0, 0, 0])
|
|
121
|
+
|
|
122
|
+
visual_border_width = [vec[0] - origin[0], vec[1] - origin[1]]
|
|
123
|
+
|
|
124
|
+
# we need to flip the y axis because coordinate systems are inverted
|
|
125
|
+
visual_border_width[1] *= -1
|
|
126
|
+
|
|
127
|
+
return visual_border_width
|
|
128
|
+
|
|
129
|
+
def _update(self):
|
|
130
|
+
x, y = self._pos
|
|
131
|
+
halfw, halfh = self._halfdim
|
|
132
|
+
|
|
133
|
+
border_vertices = np.array([
|
|
134
|
+
[x - halfw, y - halfh],
|
|
135
|
+
[x - halfw, y - halfh],
|
|
136
|
+
|
|
137
|
+
[x + halfw, y - halfh],
|
|
138
|
+
[x + halfw, y - halfh],
|
|
139
|
+
|
|
140
|
+
[x + halfw, y + halfh],
|
|
141
|
+
[x + halfw, y + halfh],
|
|
142
|
+
|
|
143
|
+
[x - halfw, y + halfh],
|
|
144
|
+
[x - halfw, y + halfh],
|
|
145
|
+
|
|
146
|
+
[x - halfw, y - halfh],
|
|
147
|
+
[x - halfw, y - halfh],
|
|
148
|
+
], dtype=np.float32)
|
|
149
|
+
|
|
150
|
+
# Direction each vertex should move to correct for line width
|
|
151
|
+
adjust_dir = np.array([
|
|
152
|
+
[0, 0], [-1, -1],
|
|
153
|
+
[0, 0], [1, -1],
|
|
154
|
+
[0, 0], [1, 1],
|
|
155
|
+
[0, 0], [-1, 1],
|
|
156
|
+
[0, 0], [-1, -1],
|
|
157
|
+
], dtype=np.float32)
|
|
158
|
+
|
|
159
|
+
self.shared_program['a_position'] = border_vertices
|
|
160
|
+
self.shared_program['a_adjust_dir'] = adjust_dir
|
|
161
|
+
self.shared_program.vert['border_width'] = float(self._border_width)
|
|
162
|
+
self.shared_program.frag['border_color'] = self._border_color.rgba
|
|
163
|
+
|
|
164
|
+
def _prepare_draw(self, view=None):
|
|
165
|
+
self._update()
|
|
166
|
+
self._draw_mode = "triangle_strip"
|
|
167
|
+
return True
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def border_width(self):
|
|
171
|
+
"""The width of the border"""
|
|
172
|
+
return self._border_width
|
|
173
|
+
|
|
174
|
+
@border_width.setter
|
|
175
|
+
def border_width(self, border_width):
|
|
176
|
+
self._border_width = border_width
|
|
177
|
+
# positions of text need to be changed accordingly
|
|
178
|
+
self._update()
|
|
179
|
+
|
|
180
|
+
@property
|
|
181
|
+
def border_color(self):
|
|
182
|
+
"""The color of the border in pixels"""
|
|
183
|
+
return self._border_color
|
|
184
|
+
|
|
185
|
+
@border_color.setter
|
|
186
|
+
def border_color(self, border_color):
|
|
187
|
+
self._border_color = Color(border_color)
|
|
188
|
+
self.shared_program.frag['border_color'] = self._border_color.rgba
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def pos(self):
|
|
192
|
+
"""The center of the BorderVisual"""
|
|
193
|
+
return self._pos
|
|
194
|
+
|
|
195
|
+
@pos.setter
|
|
196
|
+
def pos(self, pos):
|
|
197
|
+
self._pos = pos
|
|
198
|
+
self._update()
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def halfdim(self):
|
|
202
|
+
"""The half-dimensions measured from the center of the BorderVisual"""
|
|
203
|
+
return self._halfdim
|
|
204
|
+
|
|
205
|
+
@halfdim.setter
|
|
206
|
+
def halfdim(self, halfdim):
|
|
207
|
+
self._halfdim = halfdim
|
|
208
|
+
self._update()
|
vispy/visuals/box.py
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
from ..geometry import create_box
|
|
8
|
+
from .mesh import MeshVisual
|
|
9
|
+
from .visual import CompoundVisual
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BoxVisual(CompoundVisual):
|
|
13
|
+
"""Visual that displays a box.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
width : float
|
|
18
|
+
Box width.
|
|
19
|
+
height : float
|
|
20
|
+
Box height.
|
|
21
|
+
depth : float
|
|
22
|
+
Box depth.
|
|
23
|
+
width_segments : int
|
|
24
|
+
Box segments count along the width.
|
|
25
|
+
height_segments : float
|
|
26
|
+
Box segments count along the height.
|
|
27
|
+
depth_segments : float
|
|
28
|
+
Box segments count along the depth.
|
|
29
|
+
planes: array_like
|
|
30
|
+
Any combination of ``{'-x', '+x', '-y', '+y', '-z', '+z'}``
|
|
31
|
+
Included planes in the box construction.
|
|
32
|
+
vertex_colors : ndarray
|
|
33
|
+
Same as for `MeshVisual` class. See `create_plane` for vertex ordering.
|
|
34
|
+
face_colors : ndarray
|
|
35
|
+
Same as for `MeshVisual` class. See `create_plane` for vertex ordering.
|
|
36
|
+
color : Color
|
|
37
|
+
The `Color` to use when drawing the cube faces.
|
|
38
|
+
edge_color : tuple or Color
|
|
39
|
+
The `Color` to use when drawing the cube edges. If `None`, then no
|
|
40
|
+
cube edges are drawn.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, width=1, height=1, depth=1, width_segments=1,
|
|
44
|
+
height_segments=1, depth_segments=1, planes=None,
|
|
45
|
+
vertex_colors=None, face_colors=None,
|
|
46
|
+
color=(0.5, 0.5, 1, 1), edge_color=None, **kwargs):
|
|
47
|
+
vertices, filled_indices, outline_indices = create_box(
|
|
48
|
+
width, height, depth, width_segments, height_segments,
|
|
49
|
+
depth_segments, planes)
|
|
50
|
+
|
|
51
|
+
self._mesh = MeshVisual(vertices['position'], filled_indices,
|
|
52
|
+
vertex_colors, face_colors, color)
|
|
53
|
+
if edge_color:
|
|
54
|
+
self._border = MeshVisual(vertices['position'], outline_indices,
|
|
55
|
+
color=edge_color, mode='lines')
|
|
56
|
+
else:
|
|
57
|
+
self._border = MeshVisual()
|
|
58
|
+
|
|
59
|
+
CompoundVisual.__init__(self, [self._mesh, self._border], **kwargs)
|
|
60
|
+
self.mesh.set_gl_state(polygon_offset_fill=True,
|
|
61
|
+
polygon_offset=(1, 1), depth_test=True)
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def mesh(self):
|
|
65
|
+
"""The vispy.visuals.MeshVisual that used to fill in."""
|
|
66
|
+
return self._mesh
|
|
67
|
+
|
|
68
|
+
@mesh.setter
|
|
69
|
+
def mesh(self, mesh):
|
|
70
|
+
self._mesh = mesh
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def border(self):
|
|
74
|
+
"""The vispy.visuals.MeshVisual that used to draw the border."""
|
|
75
|
+
return self._border
|
|
76
|
+
|
|
77
|
+
@border.setter
|
|
78
|
+
def border(self, border):
|
|
79
|
+
self._border = border
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
Collections allow batch rendering of object of the same type:
|
|
8
|
+
|
|
9
|
+
- Points
|
|
10
|
+
- Line segments
|
|
11
|
+
- Polylines (paths)
|
|
12
|
+
- Raw Triangles
|
|
13
|
+
- Polygons
|
|
14
|
+
|
|
15
|
+
Each collection has several modes:
|
|
16
|
+
|
|
17
|
+
- raw (point, segment, path, triangle, polygon)
|
|
18
|
+
- agg (point, segment, path, polygon)
|
|
19
|
+
- agg+ (path, polygon)
|
|
20
|
+
|
|
21
|
+
Note: Storage of shared attributes requires non-clamped textures which is not
|
|
22
|
+
the case on all graphic cards. This means such shared attributes must be
|
|
23
|
+
normalized on CPU and scales back on GPU (in shader code).
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from . path_collection import PathCollection # noqa
|
|
27
|
+
from . point_collection import PointCollection # noqa
|
|
28
|
+
from . polygon_collection import PolygonCollection # noqa
|
|
29
|
+
from . segment_collection import SegmentCollection # noqa
|
|
30
|
+
from . triangle_collection import TriangleCollection # noqa
|
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
Antigrain Geometry Fast Path Collection
|
|
8
|
+
|
|
9
|
+
This collection provides antialiased and accurate paths with caps and miter
|
|
10
|
+
joins. It consume x4 more memory than regular lines and is a bit slower, but
|
|
11
|
+
the quality of the output is worth the cost. Note that no control can be made
|
|
12
|
+
on miter joins which may result in some glitches on screen.
|
|
13
|
+
"""
|
|
14
|
+
import numpy as np
|
|
15
|
+
from ... import glsl
|
|
16
|
+
from ... import gloo
|
|
17
|
+
from . collection import Collection
|
|
18
|
+
from ..transforms import NullTransform
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AggFastPathCollection(Collection):
|
|
22
|
+
"""
|
|
23
|
+
Antigrain Geometry Fast Path Collection
|
|
24
|
+
|
|
25
|
+
This collection provides antialiased and accurate paths with caps and miter
|
|
26
|
+
joins. It consume x4 more memory than regular lines and is a bit slower,
|
|
27
|
+
but the quality of the output is worth the cost. Note that no control can
|
|
28
|
+
be made on miter joins which may result in some glitches on screen.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, user_dtype=None, transform=None,
|
|
32
|
+
vertex=None, fragment=None, **kwargs):
|
|
33
|
+
"""
|
|
34
|
+
Initialize the collection.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
user_dtype: list
|
|
39
|
+
The base dtype can be completed (appended) by the used_dtype. It
|
|
40
|
+
only make sense if user also provide vertex and/or fragment shaders
|
|
41
|
+
|
|
42
|
+
transform : string
|
|
43
|
+
GLSL Transform code defining the vec4 transform(vec3) function
|
|
44
|
+
|
|
45
|
+
vertex: string
|
|
46
|
+
Vertex shader code
|
|
47
|
+
|
|
48
|
+
fragment: string
|
|
49
|
+
Fragment shader code
|
|
50
|
+
|
|
51
|
+
caps : string
|
|
52
|
+
'local', 'shared' or 'global'
|
|
53
|
+
|
|
54
|
+
color : string
|
|
55
|
+
'local', 'shared' or 'global'
|
|
56
|
+
|
|
57
|
+
linewidth : string
|
|
58
|
+
'local', 'shared' or 'global'
|
|
59
|
+
|
|
60
|
+
antialias : string
|
|
61
|
+
'local', 'shared' or 'global'
|
|
62
|
+
"""
|
|
63
|
+
base_dtype = [('prev', (np.float32, 3), '!local', (0, 0, 0)),
|
|
64
|
+
('curr', (np.float32, 3), '!local', (0, 0, 0)),
|
|
65
|
+
('next', (np.float32, 3), '!local', (0, 0, 0)),
|
|
66
|
+
('id', (np.float32, 1), '!local', 0),
|
|
67
|
+
('color', (np.float32, 4), 'global', (0, 0, 0, 1)),
|
|
68
|
+
('linewidth', (np.float32, 1), 'global', 1),
|
|
69
|
+
('antialias', (np.float32, 1), 'global', 1),
|
|
70
|
+
("viewport", (np.float32, 4), 'global', (0, 0, 512, 512))] # noqa
|
|
71
|
+
dtype = base_dtype
|
|
72
|
+
if user_dtype:
|
|
73
|
+
dtype.extend(user_dtype)
|
|
74
|
+
|
|
75
|
+
if vertex is None:
|
|
76
|
+
vertex = glsl.get('collections/agg-fast-path.vert')
|
|
77
|
+
if transform is None:
|
|
78
|
+
transform = NullTransform()
|
|
79
|
+
self.transform = transform
|
|
80
|
+
if fragment is None:
|
|
81
|
+
fragment = glsl.get('collections/agg-fast-path.frag')
|
|
82
|
+
|
|
83
|
+
Collection.__init__(self, dtype=dtype, itype=None,
|
|
84
|
+
mode="triangle_strip",
|
|
85
|
+
vertex=vertex, fragment=fragment, **kwargs)
|
|
86
|
+
|
|
87
|
+
program = self._programs[0]
|
|
88
|
+
program.vert['transform'] = self.transform
|
|
89
|
+
|
|
90
|
+
def append(self, P, closed=False, itemsize=None, **kwargs):
|
|
91
|
+
"""
|
|
92
|
+
Append a new set of vertices to the collection.
|
|
93
|
+
|
|
94
|
+
For kwargs argument, n is the number of vertices (local) or the number
|
|
95
|
+
of item (shared)
|
|
96
|
+
|
|
97
|
+
Parameters
|
|
98
|
+
----------
|
|
99
|
+
P : np.array
|
|
100
|
+
Vertices positions of the path(s) to be added
|
|
101
|
+
|
|
102
|
+
closed: bool
|
|
103
|
+
Whether path(s) is/are closed
|
|
104
|
+
|
|
105
|
+
itemsize: int or None
|
|
106
|
+
Size of an individual path
|
|
107
|
+
|
|
108
|
+
caps : list, array or 2-tuple
|
|
109
|
+
Path start /end cap
|
|
110
|
+
|
|
111
|
+
color : list, array or 4-tuple
|
|
112
|
+
Path color
|
|
113
|
+
|
|
114
|
+
linewidth : list, array or float
|
|
115
|
+
Path linewidth
|
|
116
|
+
|
|
117
|
+
antialias : list, array or float
|
|
118
|
+
Path antialias area
|
|
119
|
+
"""
|
|
120
|
+
itemsize = int(itemsize or len(P))
|
|
121
|
+
itemcount = len(P) // itemsize
|
|
122
|
+
|
|
123
|
+
P = P.reshape(itemcount, itemsize, 3)
|
|
124
|
+
if closed:
|
|
125
|
+
V = np.empty((itemcount, itemsize + 3), dtype=self.vtype)
|
|
126
|
+
# Apply default values on vertices
|
|
127
|
+
for name in self.vtype.names:
|
|
128
|
+
if name not in ['collection_index', 'prev', 'curr', 'next']:
|
|
129
|
+
V[name][1:-2] = kwargs.get(name, self._defaults[name])
|
|
130
|
+
V['prev'][:, 2:-1] = P
|
|
131
|
+
V['prev'][:, 1] = V['prev'][:, -2]
|
|
132
|
+
V['curr'][:, 1:-2] = P
|
|
133
|
+
V['curr'][:, -2] = V['curr'][:, 1]
|
|
134
|
+
V['next'][:, 0:-3] = P
|
|
135
|
+
V['next'][:, -3] = V['next'][:, 0]
|
|
136
|
+
V['next'][:, -2] = V['next'][:, 1]
|
|
137
|
+
else:
|
|
138
|
+
V = np.empty((itemcount, itemsize + 2), dtype=self.vtype)
|
|
139
|
+
# Apply default values on vertices
|
|
140
|
+
for name in self.vtype.names:
|
|
141
|
+
if name not in ['collection_index', 'prev', 'curr', 'next']:
|
|
142
|
+
V[name][1:-1] = kwargs.get(name, self._defaults[name])
|
|
143
|
+
V['prev'][:, 2:] = P
|
|
144
|
+
V['prev'][:, 1] = V['prev'][:, 2]
|
|
145
|
+
V['curr'][:, 1:-1] = P
|
|
146
|
+
V['next'][:, :-2] = P
|
|
147
|
+
V['next'][:, -2] = V['next'][:, -3]
|
|
148
|
+
|
|
149
|
+
V[:, 0] = V[:, 1]
|
|
150
|
+
V[:, -1] = V[:, -2]
|
|
151
|
+
V = V.ravel()
|
|
152
|
+
V = np.repeat(V, 2, axis=0)
|
|
153
|
+
V['id'] = np.tile([1, -1], len(V) // 2)
|
|
154
|
+
if closed:
|
|
155
|
+
V = V.reshape(itemcount, 2 * (itemsize + 3))
|
|
156
|
+
else:
|
|
157
|
+
V = V.reshape(itemcount, 2 * (itemsize + 2))
|
|
158
|
+
V["id"][:, :2] = 2, -2
|
|
159
|
+
V["id"][:, -2:] = 2, -2
|
|
160
|
+
V = V.ravel()
|
|
161
|
+
|
|
162
|
+
# Uniforms
|
|
163
|
+
if self.utype:
|
|
164
|
+
U = np.zeros(itemcount, dtype=self.utype)
|
|
165
|
+
for name in self.utype.names:
|
|
166
|
+
if name not in ["__unused__"]:
|
|
167
|
+
U[name] = kwargs.get(name, self._defaults[name])
|
|
168
|
+
else:
|
|
169
|
+
U = None
|
|
170
|
+
|
|
171
|
+
Collection.append(self, vertices=V, uniforms=U,
|
|
172
|
+
itemsize=2 * (itemsize + 2 + closed))
|
|
173
|
+
|
|
174
|
+
def bake(self, P, key='curr', closed=False, itemsize=None):
|
|
175
|
+
"""
|
|
176
|
+
Given a path P, return the baked vertices as they should be copied in
|
|
177
|
+
the collection if the path has already been appended.
|
|
178
|
+
|
|
179
|
+
Examples
|
|
180
|
+
--------
|
|
181
|
+
>>> paths.append(P)
|
|
182
|
+
>>> P *= 2
|
|
183
|
+
>>> paths['prev'][0] = bake(P,'prev')
|
|
184
|
+
>>> paths['curr'][0] = bake(P,'curr')
|
|
185
|
+
>>> paths['next'][0] = bake(P,'next')
|
|
186
|
+
|
|
187
|
+
"""
|
|
188
|
+
itemsize = itemsize or len(P)
|
|
189
|
+
itemcount = len(P) / itemsize # noqa
|
|
190
|
+
n = itemsize
|
|
191
|
+
|
|
192
|
+
if closed:
|
|
193
|
+
idxs = np.arange(n + 3)
|
|
194
|
+
if key == 'prev':
|
|
195
|
+
idxs -= 2
|
|
196
|
+
idxs[0], idxs[1], idxs[-1] = n - 1, n - 1, n - 1
|
|
197
|
+
elif key == 'next':
|
|
198
|
+
idxs[0], idxs[-3], idxs[-2], idxs[-1] = 1, 0, 1, 1
|
|
199
|
+
else:
|
|
200
|
+
idxs -= 1
|
|
201
|
+
idxs[0], idxs[-1], idxs[n + 1] = 0, 0, 0
|
|
202
|
+
else:
|
|
203
|
+
idxs = np.arange(n + 2)
|
|
204
|
+
if key == 'prev':
|
|
205
|
+
idxs -= 2
|
|
206
|
+
idxs[0], idxs[1], idxs[-1] = 0, 0, n - 2
|
|
207
|
+
elif key == 'next':
|
|
208
|
+
idxs[0], idxs[-1], idxs[-2] = 1, n - 1, n - 1
|
|
209
|
+
else:
|
|
210
|
+
idxs -= 1
|
|
211
|
+
idxs[0], idxs[-1] = 0, n - 1
|
|
212
|
+
idxs = np.repeat(idxs, 2)
|
|
213
|
+
return P[idxs]
|
|
214
|
+
|
|
215
|
+
def draw(self, mode="triangle_strip"):
|
|
216
|
+
"""Draw collection"""
|
|
217
|
+
gloo.set_depth_mask(0)
|
|
218
|
+
Collection.draw(self, mode)
|
|
219
|
+
gloo.set_depth_mask(1)
|