vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
vispy/visuals/polygon.py
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
"""Simple polygon visual based on MeshVisual and LineVisual"""
|
|
7
|
+
|
|
8
|
+
from __future__ import division
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from .visual import CompoundVisual
|
|
13
|
+
from .mesh import MeshVisual
|
|
14
|
+
from .line import LineVisual
|
|
15
|
+
from ..color import Color
|
|
16
|
+
from ..geometry import PolygonData
|
|
17
|
+
from ..gloo import set_state
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PolygonVisual(CompoundVisual):
|
|
21
|
+
"""
|
|
22
|
+
Displays a 2D polygon
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
pos : array
|
|
27
|
+
Set of vertices defining the polygon.
|
|
28
|
+
color : str | tuple | list of colors
|
|
29
|
+
Fill color of the polygon.
|
|
30
|
+
border_color : str | tuple | list of colors
|
|
31
|
+
Border color of the polygon.
|
|
32
|
+
border_width : int
|
|
33
|
+
Border width in pixels.
|
|
34
|
+
Line widths > 1px are only
|
|
35
|
+
guaranteed to work when using `border_method='agg'` method.
|
|
36
|
+
border_method : str
|
|
37
|
+
Mode to use for drawing the border line (see `LineVisual`).
|
|
38
|
+
|
|
39
|
+
* "agg" uses anti-grain geometry to draw nicely antialiased lines
|
|
40
|
+
with proper joins and endcaps.
|
|
41
|
+
* "gl" uses OpenGL's built-in line rendering. This is much faster,
|
|
42
|
+
but produces much lower-quality results and is not guaranteed to
|
|
43
|
+
obey the requested line width or join/endcap styles.
|
|
44
|
+
|
|
45
|
+
triangulate : boolean
|
|
46
|
+
Triangulate the set of vertices
|
|
47
|
+
**kwargs : dict
|
|
48
|
+
Keyword arguments to pass to `CompoundVisual`.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(self, pos=None, color='black',
|
|
52
|
+
border_color=None, border_width=1, border_method='gl',
|
|
53
|
+
triangulate=True, **kwargs):
|
|
54
|
+
self._mesh = MeshVisual()
|
|
55
|
+
self._border = LineVisual(method=border_method)
|
|
56
|
+
self._pos = pos
|
|
57
|
+
self._color = Color(color)
|
|
58
|
+
self._border_width = border_width
|
|
59
|
+
self._border_color = Color(border_color)
|
|
60
|
+
self._triangulate = triangulate
|
|
61
|
+
|
|
62
|
+
self._update()
|
|
63
|
+
CompoundVisual.__init__(self, [self._mesh, self._border], **kwargs)
|
|
64
|
+
self._mesh.set_gl_state(polygon_offset_fill=True,
|
|
65
|
+
polygon_offset=(1, 1), cull_face=False)
|
|
66
|
+
self.freeze()
|
|
67
|
+
|
|
68
|
+
def _update(self):
|
|
69
|
+
if self._pos is None:
|
|
70
|
+
return
|
|
71
|
+
if not self._color.is_blank and self._triangulate:
|
|
72
|
+
data = PolygonData(vertices=np.array(self._pos, dtype=np.float32))
|
|
73
|
+
pts, tris = data.triangulate()
|
|
74
|
+
set_state(polygon_offset_fill=False)
|
|
75
|
+
self._mesh.set_data(vertices=pts, faces=tris.astype(np.uint32),
|
|
76
|
+
color=self._color.rgba)
|
|
77
|
+
elif not self._color.is_blank:
|
|
78
|
+
self.mesh.set_data(vertices=self._pos,
|
|
79
|
+
color=self._color.rgba)
|
|
80
|
+
|
|
81
|
+
if not self._border_color.is_blank:
|
|
82
|
+
# Close border if it is not already.
|
|
83
|
+
border_pos = self._pos
|
|
84
|
+
if np.any(border_pos[0] != border_pos[-1]):
|
|
85
|
+
border_pos = np.concatenate([border_pos, border_pos[:1]],
|
|
86
|
+
axis=0)
|
|
87
|
+
self._border.set_data(pos=border_pos,
|
|
88
|
+
color=self._border_color.rgba,
|
|
89
|
+
width=self._border_width)
|
|
90
|
+
|
|
91
|
+
self._border.update()
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def pos(self):
|
|
95
|
+
"""The vertex position of the polygon."""
|
|
96
|
+
return self._pos
|
|
97
|
+
|
|
98
|
+
@pos.setter
|
|
99
|
+
def pos(self, pos):
|
|
100
|
+
self._pos = pos
|
|
101
|
+
self._update()
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def color(self):
|
|
105
|
+
"""The color of the polygon."""
|
|
106
|
+
return self._color
|
|
107
|
+
|
|
108
|
+
@color.setter
|
|
109
|
+
def color(self, color):
|
|
110
|
+
self._color = Color(color, clip=True)
|
|
111
|
+
self._update()
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def border_color(self):
|
|
115
|
+
"""The border color of the polygon."""
|
|
116
|
+
return self._border_color
|
|
117
|
+
|
|
118
|
+
@border_color.setter
|
|
119
|
+
def border_color(self, border_color):
|
|
120
|
+
self._border_color = Color(border_color)
|
|
121
|
+
self._update()
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def mesh(self):
|
|
125
|
+
"""The vispy.visuals.MeshVisual that is owned by the PolygonVisual.
|
|
126
|
+
It is used to fill in the polygon
|
|
127
|
+
"""
|
|
128
|
+
return self._mesh
|
|
129
|
+
|
|
130
|
+
@mesh.setter
|
|
131
|
+
def mesh(self, mesh):
|
|
132
|
+
self._mesh = mesh
|
|
133
|
+
self._update()
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def border(self):
|
|
137
|
+
"""The vispy.visuals.LineVisual that is owned by the PolygonVisual.
|
|
138
|
+
It is used to draw the border of the polygon
|
|
139
|
+
"""
|
|
140
|
+
return self._border
|
|
141
|
+
|
|
142
|
+
@border.setter
|
|
143
|
+
def border(self, border):
|
|
144
|
+
self._border = border
|
|
145
|
+
self._update()
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copradiusight (c) 2014, Vispy Development Team.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
"""Simple ellipse visual based on PolygonVisual"""
|
|
7
|
+
|
|
8
|
+
from __future__ import division
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from ..color import Color
|
|
12
|
+
from .polygon import PolygonVisual
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RectangleVisual(PolygonVisual):
|
|
16
|
+
"""
|
|
17
|
+
Displays a 2D rectangle with optional rounded corners
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
center : array
|
|
22
|
+
Center of the rectangle
|
|
23
|
+
color : instance of Color
|
|
24
|
+
The fill color to use.
|
|
25
|
+
border_color : instance of Color
|
|
26
|
+
The border color to use.
|
|
27
|
+
border_width : int
|
|
28
|
+
Border width in pixels.
|
|
29
|
+
Line widths > 1px are only
|
|
30
|
+
guaranteed to work when using `border_method='agg'` method.
|
|
31
|
+
height : float
|
|
32
|
+
Length of the rectangle along y-axis
|
|
33
|
+
Defaults to 1.0
|
|
34
|
+
width : float
|
|
35
|
+
Length of the rectangle along x-axis
|
|
36
|
+
Defaults to 1.0
|
|
37
|
+
radius : float | array
|
|
38
|
+
Radii of curvatures of corners in clockwise order from top-left
|
|
39
|
+
Defaults to 0.
|
|
40
|
+
**kwargs : dict
|
|
41
|
+
Keyword arguments to pass to `PolygonVisual`.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, center=None, color='black', border_color=None,
|
|
45
|
+
border_width=1, height=1.0, width=1.0,
|
|
46
|
+
radius=[0., 0., 0., 0.], **kwargs):
|
|
47
|
+
|
|
48
|
+
self._height = height
|
|
49
|
+
self._width = width
|
|
50
|
+
self._color = Color(color)
|
|
51
|
+
self._border_color = Color(border_color)
|
|
52
|
+
self._border_width = border_width
|
|
53
|
+
self._radius = radius
|
|
54
|
+
self._center = center
|
|
55
|
+
|
|
56
|
+
# triangulation can be very slow
|
|
57
|
+
kwargs.setdefault('triangulate', False)
|
|
58
|
+
PolygonVisual.__init__(self, pos=None, color=color,
|
|
59
|
+
border_color=border_color,
|
|
60
|
+
border_width=border_width, **kwargs)
|
|
61
|
+
|
|
62
|
+
self._mesh.mode = 'triangle_fan'
|
|
63
|
+
self._regen_pos()
|
|
64
|
+
self._update()
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def _generate_vertices(center, radius, height, width):
|
|
68
|
+
half_height = height / 2.
|
|
69
|
+
half_width = width / 2.
|
|
70
|
+
hw = min(half_height, half_width)
|
|
71
|
+
|
|
72
|
+
if isinstance(radius, (list, tuple)):
|
|
73
|
+
if len(radius) != 4:
|
|
74
|
+
raise ValueError("radius must be float or 4 value tuple/list"
|
|
75
|
+
" (got %s of length %d)" % (type(radius),
|
|
76
|
+
len(radius)))
|
|
77
|
+
|
|
78
|
+
if (radius > np.ones(4) * hw).all():
|
|
79
|
+
raise ValueError('Radius of curvature cannot be greater than\
|
|
80
|
+
half of min(width, height)')
|
|
81
|
+
radius = np.array(radius, dtype=np.float32)
|
|
82
|
+
|
|
83
|
+
else:
|
|
84
|
+
if radius > hw:
|
|
85
|
+
raise ValueError('Radius of curvature cannot be greater than\
|
|
86
|
+
half of min(width, height)')
|
|
87
|
+
radius = np.ones(4) * radius
|
|
88
|
+
|
|
89
|
+
num_segments = (radius / hw * 500.).astype(int)
|
|
90
|
+
|
|
91
|
+
bias1 = np.ones(4) * half_width - radius
|
|
92
|
+
bias2 = np.ones(4) * half_height - radius
|
|
93
|
+
|
|
94
|
+
corner1 = np.empty([num_segments[0]+1, 3], dtype=np.float32)
|
|
95
|
+
corner2 = np.empty([num_segments[1]+1, 3], dtype=np.float32)
|
|
96
|
+
corner3 = np.empty([num_segments[2]+1, 3], dtype=np.float32)
|
|
97
|
+
corner4 = np.empty([num_segments[3]+1, 3], dtype=np.float32)
|
|
98
|
+
|
|
99
|
+
start_angle = 0.
|
|
100
|
+
end_angle = np.pi / 2.
|
|
101
|
+
|
|
102
|
+
theta = np.linspace(end_angle, start_angle, num_segments[0]+1)
|
|
103
|
+
|
|
104
|
+
corner1[:, 0] = center[0] - bias1[0] - radius[0] * np.sin(theta)
|
|
105
|
+
corner1[:, 1] = center[1] - bias2[0] - radius[0] * np.cos(theta)
|
|
106
|
+
corner1[:, 2] = 0
|
|
107
|
+
|
|
108
|
+
theta = np.linspace(start_angle, end_angle, num_segments[1]+1)
|
|
109
|
+
|
|
110
|
+
corner2[:, 0] = center[0] + bias1[1] + radius[1] * np.sin(theta)
|
|
111
|
+
corner2[:, 1] = center[1] - bias2[1] - radius[1] * np.cos(theta)
|
|
112
|
+
corner2[:, 2] = 0
|
|
113
|
+
|
|
114
|
+
theta = np.linspace(end_angle, start_angle, num_segments[2]+1)
|
|
115
|
+
|
|
116
|
+
corner3[:, 0] = center[0] + bias1[2] + radius[2] * np.sin(theta)
|
|
117
|
+
corner3[:, 1] = center[1] + bias2[2] + radius[2] * np.cos(theta)
|
|
118
|
+
corner3[:, 2] = 0
|
|
119
|
+
|
|
120
|
+
theta = np.linspace(start_angle, end_angle, num_segments[3]+1)
|
|
121
|
+
|
|
122
|
+
corner4[:, 0] = center[0] - bias1[3] - radius[3] * np.sin(theta)
|
|
123
|
+
corner4[:, 1] = center[1] + bias2[3] + radius[3] * np.cos(theta)
|
|
124
|
+
corner4[:, 2] = 0
|
|
125
|
+
|
|
126
|
+
output = np.concatenate(([[center[0], center[1], 0.]],
|
|
127
|
+
[[center[0] - half_width, center[1], 0.]],
|
|
128
|
+
corner1,
|
|
129
|
+
[[center[0], center[1] - half_height, 0.]],
|
|
130
|
+
corner2,
|
|
131
|
+
[[center[0] + half_width, center[1], 0.]],
|
|
132
|
+
corner3,
|
|
133
|
+
[[center[0], center[1] + half_height, 0.]],
|
|
134
|
+
corner4,
|
|
135
|
+
[[center[0] - half_width, center[1], 0.]]))
|
|
136
|
+
|
|
137
|
+
vertices = np.array(output, dtype=np.float32)
|
|
138
|
+
return vertices
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def center(self):
|
|
142
|
+
"""The center of the ellipse"""
|
|
143
|
+
return self._center
|
|
144
|
+
|
|
145
|
+
@center.setter
|
|
146
|
+
def center(self, center):
|
|
147
|
+
"""The center of the ellipse"""
|
|
148
|
+
self._center = center
|
|
149
|
+
self._regen_pos()
|
|
150
|
+
self._update()
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def height(self):
|
|
154
|
+
"""The height of the rectangle."""
|
|
155
|
+
return self._height
|
|
156
|
+
|
|
157
|
+
@height.setter
|
|
158
|
+
def height(self, height):
|
|
159
|
+
if height <= 0.:
|
|
160
|
+
raise ValueError('Height must be positive')
|
|
161
|
+
self._height = height
|
|
162
|
+
self._regen_pos()
|
|
163
|
+
self._update()
|
|
164
|
+
|
|
165
|
+
@property
|
|
166
|
+
def width(self):
|
|
167
|
+
"""The width of the rectangle."""
|
|
168
|
+
return self._width
|
|
169
|
+
|
|
170
|
+
@width.setter
|
|
171
|
+
def width(self, width):
|
|
172
|
+
if width <= 0.:
|
|
173
|
+
raise ValueError('Width must be positive')
|
|
174
|
+
self._width = width
|
|
175
|
+
self._regen_pos()
|
|
176
|
+
self._update()
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def radius(self):
|
|
180
|
+
"""The radius of curvature of rounded corners."""
|
|
181
|
+
return self._radius
|
|
182
|
+
|
|
183
|
+
@radius.setter
|
|
184
|
+
def radius(self, radius):
|
|
185
|
+
self._radius = radius
|
|
186
|
+
self._regen_pos()
|
|
187
|
+
self._update()
|
|
188
|
+
|
|
189
|
+
def _regen_pos(self):
|
|
190
|
+
vertices = self._generate_vertices(center=self._center,
|
|
191
|
+
radius=self._radius,
|
|
192
|
+
height=self._height,
|
|
193
|
+
width=self._width)
|
|
194
|
+
# don't use the center point and only use X/Y coordinates
|
|
195
|
+
vertices = vertices[1:, ..., :2]
|
|
196
|
+
self._pos = vertices
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
"""RegularPolygonVisual visual based on EllipseVisual"""
|
|
7
|
+
|
|
8
|
+
from __future__ import division
|
|
9
|
+
|
|
10
|
+
from .ellipse import EllipseVisual
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RegularPolygonVisual(EllipseVisual):
|
|
14
|
+
"""
|
|
15
|
+
Displays a regular polygon
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
center : array-like (x, y)
|
|
20
|
+
Center of the regular polygon
|
|
21
|
+
color : str | tuple | list of colors
|
|
22
|
+
Fill color of the polygon
|
|
23
|
+
border_color : str | tuple | list of colors
|
|
24
|
+
Border color of the polygon
|
|
25
|
+
border_width: float
|
|
26
|
+
The width of the border in pixels
|
|
27
|
+
radius : float
|
|
28
|
+
Radius of the regular polygon
|
|
29
|
+
Defaults to 0.1
|
|
30
|
+
sides : int
|
|
31
|
+
Number of sides of the regular polygon
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, center=None, color='black', border_color=None,
|
|
35
|
+
border_width=1, radius=0.1, sides=4, **kwargs):
|
|
36
|
+
EllipseVisual.__init__(self, center=center,
|
|
37
|
+
radius=radius,
|
|
38
|
+
color=color,
|
|
39
|
+
border_color=border_color,
|
|
40
|
+
border_width=border_width,
|
|
41
|
+
num_segments=sides, **kwargs)
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def sides(self):
|
|
45
|
+
"""The number of sides in the regular polygon."""
|
|
46
|
+
# return using the property accessor for num_segments
|
|
47
|
+
return self.num_segments
|
|
48
|
+
|
|
49
|
+
@sides.setter
|
|
50
|
+
def sides(self, sides):
|
|
51
|
+
if sides < 3:
|
|
52
|
+
raise ValueError('PolygonVisual must have at least 3 sides, not %s'
|
|
53
|
+
% sides)
|
|
54
|
+
# edit using the property accessor of num_segments so this
|
|
55
|
+
# internally calls the update()
|
|
56
|
+
self.num_segments = sides
|
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
from .visual import Visual
|
|
9
|
+
from .. import gloo
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ScrollingLinesVisual(Visual):
|
|
13
|
+
"""Displays many line strips of equal length, with the option to add new
|
|
14
|
+
vertex data to one end of the lines.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
n_lines : int
|
|
19
|
+
The number of independent line strips to draw.
|
|
20
|
+
line_size : int
|
|
21
|
+
The number of samples in each line strip.
|
|
22
|
+
dx : float
|
|
23
|
+
The x distance between samples
|
|
24
|
+
color : array-like
|
|
25
|
+
An array of colors to assign to each line strip.
|
|
26
|
+
pos_offset : array-like
|
|
27
|
+
An array of x, y position offsets to apply to each line strip.
|
|
28
|
+
columns : int
|
|
29
|
+
Arrange line strips into a grid with this number of columns. This
|
|
30
|
+
option is not compatible with *pos_offset*.
|
|
31
|
+
cell_size : tuple
|
|
32
|
+
The x, y distance between cells in the grid.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
vertex_code = """
|
|
36
|
+
attribute vec2 index; // .x=line_n, .y=vertex_n
|
|
37
|
+
uniform sampler2D position;
|
|
38
|
+
uniform sampler1D pos_offset;
|
|
39
|
+
uniform sampler1D color_tex;
|
|
40
|
+
|
|
41
|
+
uniform vec2 pos_size; // x=n_lines, y=n_verts_per_line
|
|
42
|
+
uniform float offset; // rolling pointer into vertexes
|
|
43
|
+
uniform float dx; // x step per sample
|
|
44
|
+
|
|
45
|
+
varying vec2 v_index;
|
|
46
|
+
varying vec4 v_color;
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
void main() {
|
|
50
|
+
v_index = vec2(mod(index.y + offset, pos_size.y), index.x);
|
|
51
|
+
vec2 uv = (v_index + 0.5) / (pos_size.yx);
|
|
52
|
+
vec4 pos = vec4(index.y * dx, texture2D(position, uv).r, 0, 1);
|
|
53
|
+
|
|
54
|
+
// fetch starting position from texture lookup:
|
|
55
|
+
pos += vec4(texture1D(pos_offset, (index.x + 0.5) / pos_size.x).rg,
|
|
56
|
+
0, 0);
|
|
57
|
+
|
|
58
|
+
gl_Position = $transform(pos);
|
|
59
|
+
|
|
60
|
+
v_color = texture1D(color_tex, (index.x + 0.5) / pos_size.x);
|
|
61
|
+
}
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
fragment_code = """
|
|
65
|
+
varying vec2 v_index;
|
|
66
|
+
varying vec4 v_color;
|
|
67
|
+
|
|
68
|
+
void main() {
|
|
69
|
+
if (v_index.y - floor(v_index.y) > 0) {
|
|
70
|
+
discard;
|
|
71
|
+
}
|
|
72
|
+
gl_FragColor = $color;
|
|
73
|
+
}
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def __init__(self, n_lines, line_size, dx, color=None, pos_offset=None,
|
|
77
|
+
columns=None, cell_size=None):
|
|
78
|
+
self._pos_data = None
|
|
79
|
+
self._offset = 0
|
|
80
|
+
self._dx = dx
|
|
81
|
+
|
|
82
|
+
data = np.zeros((n_lines, line_size), dtype='float32')
|
|
83
|
+
self._pos_tex = gloo.Texture2D(data, format='luminance',
|
|
84
|
+
internalformat='r32f')
|
|
85
|
+
self._index_buf = gloo.VertexBuffer()
|
|
86
|
+
self._data_shape = data.shape
|
|
87
|
+
|
|
88
|
+
Visual.__init__(self, vcode=self.vertex_code, fcode=self.fragment_code)
|
|
89
|
+
|
|
90
|
+
self.shared_program['position'] = self._pos_tex
|
|
91
|
+
self.shared_program['index'] = self._index_buf
|
|
92
|
+
self.shared_program['dx'] = dx
|
|
93
|
+
self.shared_program['pos_size'] = data.shape
|
|
94
|
+
self.shared_program['offset'] = self._offset
|
|
95
|
+
|
|
96
|
+
# set an array giving the x/y origin for each plot
|
|
97
|
+
if pos_offset is None:
|
|
98
|
+
# construct positions as a grid
|
|
99
|
+
rows = int(np.ceil(n_lines / columns))
|
|
100
|
+
pos_offset = np.empty((rows, columns, 3), dtype='float32')
|
|
101
|
+
pos_offset[..., 0] = (np.arange(columns)[np.newaxis, :] *
|
|
102
|
+
cell_size[0])
|
|
103
|
+
pos_offset[..., 1] = np.arange(rows)[:, np.newaxis] * cell_size[1]
|
|
104
|
+
# limit position texture to the number of lines in case there are
|
|
105
|
+
# more row/column cells than lines
|
|
106
|
+
pos_offset = pos_offset.reshape((rows*columns), 3)[:n_lines, :]
|
|
107
|
+
self._pos_offset = gloo.Texture1D(pos_offset, internalformat='rgb32f',
|
|
108
|
+
interpolation='nearest')
|
|
109
|
+
self.shared_program['pos_offset'] = self._pos_offset
|
|
110
|
+
|
|
111
|
+
if color is None:
|
|
112
|
+
# default to white (1, 1, 1, 1)
|
|
113
|
+
self._color_tex = gloo.Texture1D(
|
|
114
|
+
np.ones((n_lines, 4), dtype=np.float32))
|
|
115
|
+
self.shared_program['color_tex'] = self._color_tex
|
|
116
|
+
self.shared_program.frag['color'] = 'v_color'
|
|
117
|
+
else:
|
|
118
|
+
self._color_tex = gloo.Texture1D(color)
|
|
119
|
+
self.shared_program['color_tex'] = self._color_tex
|
|
120
|
+
self.shared_program.frag['color'] = 'v_color'
|
|
121
|
+
|
|
122
|
+
# construct a vertex buffer index containing (plot_n, vertex_n) for
|
|
123
|
+
# each vertex
|
|
124
|
+
index = np.empty((data.shape[0], data.shape[1], 2), dtype='float32')
|
|
125
|
+
index[..., 0] = np.arange(data.shape[0])[:, np.newaxis]
|
|
126
|
+
index[..., 1] = np.arange(data.shape[1])[np.newaxis, :]
|
|
127
|
+
index = index.reshape((index.shape[0]*index.shape[1], index.shape[2]))
|
|
128
|
+
self._index_buf.set_data(index)
|
|
129
|
+
|
|
130
|
+
self._draw_mode = 'line_strip'
|
|
131
|
+
self.set_gl_state('translucent', line_width=1)
|
|
132
|
+
self.freeze()
|
|
133
|
+
|
|
134
|
+
def set_pos_offset(self, po):
|
|
135
|
+
"""Set the array of position offsets for each line strip.
|
|
136
|
+
|
|
137
|
+
Parameters
|
|
138
|
+
----------
|
|
139
|
+
po : array-like
|
|
140
|
+
An array of xy offset values.
|
|
141
|
+
"""
|
|
142
|
+
self._pos_offset.set_data(po)
|
|
143
|
+
|
|
144
|
+
def set_color(self, color):
|
|
145
|
+
"""Set the array of colors for each line strip.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
color : array-like
|
|
150
|
+
An array of rgba values.
|
|
151
|
+
"""
|
|
152
|
+
self._color_tex.set_data(color)
|
|
153
|
+
|
|
154
|
+
def _prepare_transforms(self, view):
|
|
155
|
+
view.view_program.vert['transform'] = view.get_transform().simplified
|
|
156
|
+
|
|
157
|
+
def _prepare_draw(self, view):
|
|
158
|
+
pass
|
|
159
|
+
|
|
160
|
+
def _compute_bounds(self, axis, view):
|
|
161
|
+
if self._pos_data is None:
|
|
162
|
+
return None
|
|
163
|
+
return self._pos_data[..., axis].min(), self.pos_data[..., axis].max()
|
|
164
|
+
|
|
165
|
+
def roll_data(self, data):
|
|
166
|
+
"""Append new data to the right side of every line strip and remove
|
|
167
|
+
as much data from the left.
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
data : array-like
|
|
172
|
+
A data array to append.
|
|
173
|
+
"""
|
|
174
|
+
data = data.astype('float32')[..., np.newaxis]
|
|
175
|
+
s1 = self._data_shape[1] - self._offset
|
|
176
|
+
if data.shape[1] > s1:
|
|
177
|
+
self._pos_tex[:, self._offset:] = data[:, :s1]
|
|
178
|
+
self._pos_tex[:, :data.shape[1] - s1] = data[:, s1:]
|
|
179
|
+
self._offset = (self._offset + data.shape[1]) % self._data_shape[1]
|
|
180
|
+
else:
|
|
181
|
+
self._pos_tex[:, self._offset:self._offset+data.shape[1]] = data
|
|
182
|
+
self._offset += data.shape[1]
|
|
183
|
+
self.shared_program['offset'] = self._offset
|
|
184
|
+
self.update()
|
|
185
|
+
|
|
186
|
+
def set_data(self, index, data):
|
|
187
|
+
"""Set the complete data for a single line strip.
|
|
188
|
+
|
|
189
|
+
Parameters
|
|
190
|
+
----------
|
|
191
|
+
index : int
|
|
192
|
+
The index of the line strip to be replaced.
|
|
193
|
+
data : array-like
|
|
194
|
+
The data to assign to the selected line strip.
|
|
195
|
+
"""
|
|
196
|
+
self._pos_tex[index, :] = data
|
|
197
|
+
self.update()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""
|
|
5
|
+
Provides functionality for composing shaders from multiple GLSL
|
|
6
|
+
code snippets.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__all__ = ['ModularProgram', 'Function', 'MainFunction', 'Variable', 'Varying',
|
|
10
|
+
'FunctionChain', 'Compiler', 'MultiProgram']
|
|
11
|
+
|
|
12
|
+
from .program import ModularProgram # noqa
|
|
13
|
+
from .function import Function, MainFunction, FunctionChain # noqa
|
|
14
|
+
from .function import StatementList # noqa
|
|
15
|
+
from .variable import Variable, Varying # noqa
|
|
16
|
+
from .compiler import Compiler # noqa
|
|
17
|
+
from .multiprogram import MultiProgram # noqa
|