vispy 0.15.0__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- 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.cp313-win_amd64.pyd +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 +5 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,272 @@
|
|
|
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
|
+
import numpy as np
|
|
5
|
+
from .shader_object import ShaderObject
|
|
6
|
+
|
|
7
|
+
VARIABLE_TYPES = ('const', 'uniform', 'attribute', 'varying', 'inout')
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Variable(ShaderObject):
|
|
11
|
+
"""Representation of global shader variable
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
name : str
|
|
16
|
+
the name of the variable. This string can also contain the full
|
|
17
|
+
definition of the variable, e.g. 'uniform vec2 foo'.
|
|
18
|
+
value : {float, int, tuple, GLObject}
|
|
19
|
+
If given, vtype and dtype are determined automatically. If a
|
|
20
|
+
float/int/tuple is given, the variable is a uniform. If a gloo
|
|
21
|
+
object is given that has a glsl_type property, the variable is
|
|
22
|
+
an attribute and
|
|
23
|
+
vtype : {'const', 'uniform', 'attribute', 'varying', 'inout'}
|
|
24
|
+
The type of variable.
|
|
25
|
+
dtype : str
|
|
26
|
+
The data type of the variable, e.g. 'float', 'vec4', 'mat', etc.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
_vtype_32_conversion = {'in': 'attribute', 'out': 'varying'}
|
|
30
|
+
_vtype_23_conversion = {'attribute': 'in', 'varying': 'out'}
|
|
31
|
+
|
|
32
|
+
def __init__(self, name, value=None, vtype=None, dtype=None):
|
|
33
|
+
super(Variable, self).__init__()
|
|
34
|
+
|
|
35
|
+
# allow full definition in first argument
|
|
36
|
+
if ' ' in name:
|
|
37
|
+
fields = name.split(' ')
|
|
38
|
+
if len(fields) == 3:
|
|
39
|
+
vtype, dtype, name = fields
|
|
40
|
+
elif len(fields) == 4 and fields[0] == 'const':
|
|
41
|
+
vtype, dtype, name, value = fields
|
|
42
|
+
else:
|
|
43
|
+
raise ValueError('Variable specifications given by string must'
|
|
44
|
+
' be of the form "vtype dtype name" or '
|
|
45
|
+
'"const dtype name value".')
|
|
46
|
+
|
|
47
|
+
if not (isinstance(name, str) or name is None):
|
|
48
|
+
raise TypeError("Variable name must be string or None.")
|
|
49
|
+
|
|
50
|
+
self._state_counter = 0
|
|
51
|
+
self._name = name
|
|
52
|
+
self._vtype = self._vtype_32_conversion.get(vtype, vtype)
|
|
53
|
+
self._dtype = dtype
|
|
54
|
+
self._value = None
|
|
55
|
+
|
|
56
|
+
# If vtype/dtype were given at init, then we will never
|
|
57
|
+
# try to set these values automatically.
|
|
58
|
+
self._type_locked = self._vtype is not None and self._dtype is not None
|
|
59
|
+
|
|
60
|
+
if value is not None:
|
|
61
|
+
self.value = value
|
|
62
|
+
|
|
63
|
+
if self._vtype and self._vtype not in VARIABLE_TYPES:
|
|
64
|
+
raise ValueError('Not a valid vtype: %r' % self._vtype)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def name(self):
|
|
68
|
+
"""The name of this variable."""
|
|
69
|
+
return self._name
|
|
70
|
+
|
|
71
|
+
@name.setter
|
|
72
|
+
def name(self, n):
|
|
73
|
+
# Settable mostly to allow automatic setting of varying names
|
|
74
|
+
# See ShaderObject.create()
|
|
75
|
+
if self._name != n:
|
|
76
|
+
self._name = n
|
|
77
|
+
self.changed(code_changed=True)
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def vtype(self):
|
|
81
|
+
"""The type of variable (const, uniform, attribute, or varying).
|
|
82
|
+
|
|
83
|
+
For in/out variables (GLSL 150+), vtype is 'varying'.
|
|
84
|
+
"""
|
|
85
|
+
return self._vtype
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def dtype(self):
|
|
89
|
+
"""The type of data (float, int, vec, mat, ...)."""
|
|
90
|
+
return self._dtype
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def value(self):
|
|
94
|
+
"""The value associated with this variable."""
|
|
95
|
+
return self._value
|
|
96
|
+
|
|
97
|
+
@value.setter
|
|
98
|
+
def value(self, value):
|
|
99
|
+
if isinstance(value, (tuple, list)) and 1 < len(value) < 5:
|
|
100
|
+
vtype = 'uniform'
|
|
101
|
+
dtype = 'vec%d' % len(value)
|
|
102
|
+
elif isinstance(value, np.ndarray):
|
|
103
|
+
if value.ndim == 1 and (1 < len(value) < 5):
|
|
104
|
+
vtype = 'uniform'
|
|
105
|
+
dtype = 'vec%d' % len(value)
|
|
106
|
+
elif value.ndim == 2 and value.shape in ((2, 2), (3, 3), (4, 4)):
|
|
107
|
+
vtype = 'uniform'
|
|
108
|
+
dtype = 'mat%d' % value.shape[0]
|
|
109
|
+
else:
|
|
110
|
+
raise ValueError("Cannot make uniform value for %s from array "
|
|
111
|
+
"of shape %s." % (self.name, value.shape))
|
|
112
|
+
elif np.isscalar(value):
|
|
113
|
+
vtype = 'uniform'
|
|
114
|
+
if isinstance(value, (float, np.floating)):
|
|
115
|
+
dtype = 'float'
|
|
116
|
+
elif isinstance(value, (int, np.integer)):
|
|
117
|
+
dtype = 'int'
|
|
118
|
+
else:
|
|
119
|
+
raise TypeError("Unknown data type %r for variable %r" %
|
|
120
|
+
(type(value), self))
|
|
121
|
+
elif getattr(value, 'glsl_type', None) is not None:
|
|
122
|
+
# Note: hasattr() is broken by design--swallows all exceptions!
|
|
123
|
+
vtype, dtype = value.glsl_type
|
|
124
|
+
else:
|
|
125
|
+
raise TypeError("Unknown data type %r for variable %r" %
|
|
126
|
+
(type(value), self))
|
|
127
|
+
|
|
128
|
+
self._value = value
|
|
129
|
+
self._state_counter += 1
|
|
130
|
+
|
|
131
|
+
if self._type_locked:
|
|
132
|
+
if dtype != self._dtype or vtype != self._vtype:
|
|
133
|
+
raise TypeError('Variable is type "%s"; cannot assign value '
|
|
134
|
+
'%r.' % (self.dtype, value))
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
# update vtype/dtype and emit changed event if necessary
|
|
138
|
+
changed = False
|
|
139
|
+
if self._dtype != dtype:
|
|
140
|
+
self._dtype = dtype
|
|
141
|
+
changed = True
|
|
142
|
+
if self._vtype != vtype:
|
|
143
|
+
self._vtype = vtype
|
|
144
|
+
changed = True
|
|
145
|
+
if changed:
|
|
146
|
+
self.changed(code_changed=True, value_changed=True)
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def state_id(self):
|
|
150
|
+
"""Return a unique ID that changes whenever the state of the Variable
|
|
151
|
+
has changed. This allows ModularProgram to quickly determine whether
|
|
152
|
+
the value has changed since it was last used.
|
|
153
|
+
"""
|
|
154
|
+
return id(self), self._state_counter
|
|
155
|
+
|
|
156
|
+
def __repr__(self):
|
|
157
|
+
return ("<%s \"%s %s %s\" at 0x%x>" % (self.__class__.__name__,
|
|
158
|
+
self._vtype, self._dtype,
|
|
159
|
+
self.name, id(self)))
|
|
160
|
+
|
|
161
|
+
def expression(self, names):
|
|
162
|
+
return names[self]
|
|
163
|
+
|
|
164
|
+
def _vtype_for_version(self, version):
|
|
165
|
+
"""Return the vtype for this variable, converted based on the GLSL version."""
|
|
166
|
+
vtype = self.vtype
|
|
167
|
+
if version is None or version[0] == 120:
|
|
168
|
+
return self._vtype_32_conversion.get(vtype, vtype)
|
|
169
|
+
else:
|
|
170
|
+
return self._vtype_23_conversion.get(vtype, vtype)
|
|
171
|
+
|
|
172
|
+
def definition(self, names, version, shader):
|
|
173
|
+
if self.vtype is None:
|
|
174
|
+
raise RuntimeError("Variable has no vtype: %r" % self)
|
|
175
|
+
if self.dtype is None:
|
|
176
|
+
raise RuntimeError("Variable has no dtype: %r" % self)
|
|
177
|
+
|
|
178
|
+
name = names[self]
|
|
179
|
+
vtype = self._vtype_for_version(version)
|
|
180
|
+
if vtype == 'const':
|
|
181
|
+
return '%s %s %s = %s;' % (vtype, self.dtype, name, self.value)
|
|
182
|
+
else:
|
|
183
|
+
return '%s %s %s;' % (vtype, self.dtype, name)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class Varying(Variable):
|
|
187
|
+
"""Representation of a varying (variables passed from one shader to the
|
|
188
|
+
next).
|
|
189
|
+
|
|
190
|
+
Varyings can inherit their dtype from another Variable, allowing for
|
|
191
|
+
more flexibility in composing shaders.
|
|
192
|
+
"""
|
|
193
|
+
|
|
194
|
+
def __init__(self, name, dtype=None):
|
|
195
|
+
self._link = None
|
|
196
|
+
self._src_func = None
|
|
197
|
+
self._dst_func = None
|
|
198
|
+
Variable.__init__(self, name, vtype='varying', dtype=dtype)
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def value(self):
|
|
202
|
+
"""The value associated with this variable."""
|
|
203
|
+
return self._value
|
|
204
|
+
|
|
205
|
+
@value.setter
|
|
206
|
+
def value(self, value):
|
|
207
|
+
if value is not None:
|
|
208
|
+
raise TypeError("Cannot assign value directly to varying.")
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def dtype(self):
|
|
212
|
+
if self._dtype is None:
|
|
213
|
+
if self._link is None:
|
|
214
|
+
return None
|
|
215
|
+
else:
|
|
216
|
+
return self._link.dtype
|
|
217
|
+
else:
|
|
218
|
+
return self._dtype
|
|
219
|
+
|
|
220
|
+
def link(self, var):
|
|
221
|
+
"""Link this Varying to another object from which it will derive its
|
|
222
|
+
dtype.
|
|
223
|
+
|
|
224
|
+
This method is used internally when assigning an attribute to
|
|
225
|
+
a varying using syntax ``function[varying] = attr``.
|
|
226
|
+
"""
|
|
227
|
+
assert self._dtype is not None or hasattr(var, 'dtype')
|
|
228
|
+
self._link = var
|
|
229
|
+
self.changed()
|
|
230
|
+
|
|
231
|
+
def invar(self, array=False):
|
|
232
|
+
"""Return a varying that defines itself using the same name as this,
|
|
233
|
+
but as an `in` variable instead of `out`.
|
|
234
|
+
"""
|
|
235
|
+
return InVar(self, array=array)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class InVar(Variable):
|
|
239
|
+
def __init__(self, var, array=False):
|
|
240
|
+
self._var = var
|
|
241
|
+
self._array = array
|
|
242
|
+
Variable.__init__(self, var.name)
|
|
243
|
+
|
|
244
|
+
@property
|
|
245
|
+
def value(self):
|
|
246
|
+
"""The value associated with this variable."""
|
|
247
|
+
return self._var.value
|
|
248
|
+
|
|
249
|
+
@value.setter
|
|
250
|
+
def value(self, value):
|
|
251
|
+
if value is not None:
|
|
252
|
+
raise TypeError("Cannot assign value directly to varying.")
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def dtype(self):
|
|
256
|
+
return self._var.dtype
|
|
257
|
+
|
|
258
|
+
def definition(self, names, version, shader):
|
|
259
|
+
# inherit name from source variable
|
|
260
|
+
name = names[self._var]
|
|
261
|
+
dtype = self._var.dtype
|
|
262
|
+
|
|
263
|
+
if version[0] <= 120:
|
|
264
|
+
return "varying %s %s;" % (dtype, name)
|
|
265
|
+
else:
|
|
266
|
+
if self._array:
|
|
267
|
+
return "in %s %s[];" % (dtype, name)
|
|
268
|
+
else:
|
|
269
|
+
return "in %s %s;" % (dtype, name)
|
|
270
|
+
|
|
271
|
+
def expression(self, names):
|
|
272
|
+
return names[self._var]
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
|
|
9
|
+
from .image import ImageVisual
|
|
10
|
+
from ..util.fourier import stft, fft_freqs
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SpectrogramVisual(ImageVisual):
|
|
14
|
+
"""Calculate and show a spectrogram
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
x : array-like
|
|
19
|
+
1D signal to operate on. ``If len(x) < n_fft``, x will be
|
|
20
|
+
zero-padded to length ``n_fft``.
|
|
21
|
+
n_fft : int
|
|
22
|
+
Number of FFT points. Much faster for powers of two.
|
|
23
|
+
step : int | None
|
|
24
|
+
Step size between calculations. If None, ``n_fft // 2``
|
|
25
|
+
will be used.
|
|
26
|
+
fs : float
|
|
27
|
+
The sample rate of the data.
|
|
28
|
+
window : str | None
|
|
29
|
+
Window function to use. Can be ``'hann'`` for Hann window, or None
|
|
30
|
+
for no windowing.
|
|
31
|
+
normalize : bool
|
|
32
|
+
Normalization of spectrogram values across frequencies.
|
|
33
|
+
color_scale : {'linear', 'log'}
|
|
34
|
+
Scale to apply to the result of the STFT.
|
|
35
|
+
``'log'`` will use ``10 * log10(power)``.
|
|
36
|
+
cmap : str
|
|
37
|
+
Colormap name.
|
|
38
|
+
clim : str | tuple
|
|
39
|
+
Colormap limits. Should be ``'auto'`` or a two-element tuple of
|
|
40
|
+
min and max values.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, x=None, n_fft=256, step=None, fs=1., window='hann',
|
|
44
|
+
normalize=False, color_scale='log', cmap='cubehelix',
|
|
45
|
+
clim='auto'):
|
|
46
|
+
self._x = np.asarray(x)
|
|
47
|
+
self._n_fft = int(n_fft)
|
|
48
|
+
self._step = step
|
|
49
|
+
self._fs = float(fs)
|
|
50
|
+
self._window = window
|
|
51
|
+
self._normalize = normalize
|
|
52
|
+
self._color_scale = color_scale
|
|
53
|
+
|
|
54
|
+
if clim == 'auto':
|
|
55
|
+
self._clim_auto = True
|
|
56
|
+
else:
|
|
57
|
+
self._clim_auto = False
|
|
58
|
+
|
|
59
|
+
if not isinstance(self._color_scale, str) or \
|
|
60
|
+
self._color_scale not in ('log', 'linear'):
|
|
61
|
+
raise ValueError('color_scale must be "linear" or "log"')
|
|
62
|
+
|
|
63
|
+
data = self._calculate_spectrogram()
|
|
64
|
+
super(SpectrogramVisual, self).__init__(data, clim=clim, cmap=cmap)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def freqs(self):
|
|
68
|
+
"""The spectrogram frequencies"""
|
|
69
|
+
return fft_freqs(self._n_fft, self._fs)
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def x(self):
|
|
73
|
+
"""The original signal"""
|
|
74
|
+
return self._x
|
|
75
|
+
|
|
76
|
+
@x.setter
|
|
77
|
+
def x(self, x):
|
|
78
|
+
self._x = np.asarray(x)
|
|
79
|
+
self._update_image()
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def n_fft(self):
|
|
83
|
+
"""The length of fft window"""
|
|
84
|
+
return self._n_fft
|
|
85
|
+
|
|
86
|
+
@n_fft.setter
|
|
87
|
+
def n_fft(self, n_fft):
|
|
88
|
+
self._n_fft = int(n_fft)
|
|
89
|
+
self._update_image()
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def step(self):
|
|
93
|
+
"""The step of fft window"""
|
|
94
|
+
if self._step is None:
|
|
95
|
+
return self._n_fft // 2
|
|
96
|
+
else:
|
|
97
|
+
return self._step
|
|
98
|
+
|
|
99
|
+
@step.setter
|
|
100
|
+
def step(self, step):
|
|
101
|
+
self._step = step
|
|
102
|
+
self._update_image()
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def fs(self):
|
|
106
|
+
"""The sampling frequency"""
|
|
107
|
+
return self._fs
|
|
108
|
+
|
|
109
|
+
@fs.setter
|
|
110
|
+
def fs(self, fs):
|
|
111
|
+
self._fs = fs
|
|
112
|
+
self._update_image()
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def window(self):
|
|
116
|
+
"""The used window function"""
|
|
117
|
+
return self._window
|
|
118
|
+
|
|
119
|
+
@window.setter
|
|
120
|
+
def window(self, window):
|
|
121
|
+
self._window = window
|
|
122
|
+
self._update_image()
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def color_scale(self):
|
|
126
|
+
"""The color scale"""
|
|
127
|
+
return self._color_scale
|
|
128
|
+
|
|
129
|
+
@color_scale.setter
|
|
130
|
+
def color_scale(self, color_scale):
|
|
131
|
+
if not isinstance(color_scale, str) or \
|
|
132
|
+
color_scale not in ('log', 'linear'):
|
|
133
|
+
raise ValueError('color_scale must be "linear" or "log"')
|
|
134
|
+
self._color_scale = color_scale
|
|
135
|
+
self._update_image()
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def normalize(self):
|
|
139
|
+
"""The normalization setting"""
|
|
140
|
+
return self._normalize
|
|
141
|
+
|
|
142
|
+
@normalize.setter
|
|
143
|
+
def normalize(self, normalize):
|
|
144
|
+
self._normalize = normalize
|
|
145
|
+
self._update_image()
|
|
146
|
+
|
|
147
|
+
def _calculate_spectrogram(self):
|
|
148
|
+
if self._x is not None:
|
|
149
|
+
x = self._x
|
|
150
|
+
nan_mean = np.nanmean(x)
|
|
151
|
+
idx = np.isnan(x)
|
|
152
|
+
x[idx] = nan_mean
|
|
153
|
+
data = stft(x, self._n_fft, self._step, self._fs, self._window)
|
|
154
|
+
data = np.abs(data)
|
|
155
|
+
data = 20 * np.log10(data) if self._color_scale == 'log' else data
|
|
156
|
+
if self._normalize:
|
|
157
|
+
for i in range(data.shape[0]):
|
|
158
|
+
data[i, :] -= np.mean(data[i, :])
|
|
159
|
+
data[i, :] /= np.std(data[i, :])
|
|
160
|
+
return data.astype(np.float32) # ImageVisual will warn if 64-bit
|
|
161
|
+
else:
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
def _update_image(self):
|
|
165
|
+
data = self._calculate_spectrogram()
|
|
166
|
+
self.set_data(data)
|
|
167
|
+
self.update()
|
|
168
|
+
if self._clim_auto:
|
|
169
|
+
self.clim = 'auto'
|
vispy/visuals/sphere.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
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_sphere
|
|
8
|
+
from .mesh import MeshVisual
|
|
9
|
+
from .visual import CompoundVisual
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SphereVisual(CompoundVisual):
|
|
13
|
+
"""Visual that displays a sphere
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
radius : float
|
|
18
|
+
The size of the sphere.
|
|
19
|
+
cols : int
|
|
20
|
+
Number of cols that make up the sphere mesh
|
|
21
|
+
(for method='latitude' and 'cube').
|
|
22
|
+
rows : int
|
|
23
|
+
Number of rows that make up the sphere mesh
|
|
24
|
+
(for method='latitude' and 'cube').
|
|
25
|
+
depth : int
|
|
26
|
+
Number of depth segments that make up the sphere mesh
|
|
27
|
+
(for method='cube').
|
|
28
|
+
subdivisions : int
|
|
29
|
+
Number of subdivisions to perform (for method='ico').
|
|
30
|
+
method : str
|
|
31
|
+
Method for generating sphere. Accepts 'latitude' for
|
|
32
|
+
latitude-longitude, 'ico' for icosahedron, and 'cube'
|
|
33
|
+
for cube based tessellation.
|
|
34
|
+
vertex_colors : ndarray
|
|
35
|
+
Same as for `MeshVisual` class.
|
|
36
|
+
See `create_sphere` for vertex ordering.
|
|
37
|
+
face_colors : ndarray
|
|
38
|
+
Same as for `MeshVisual` class.
|
|
39
|
+
See `create_sphere` for vertex ordering.
|
|
40
|
+
color : Color
|
|
41
|
+
The `Color` to use when drawing the sphere faces.
|
|
42
|
+
edge_color : tuple or Color
|
|
43
|
+
The `Color` to use when drawing the sphere edges. If `None`, then no
|
|
44
|
+
sphere edges are drawn.
|
|
45
|
+
shading : str | None
|
|
46
|
+
Shading to use.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, radius=1.0, cols=30, rows=30, depth=30, subdivisions=3,
|
|
50
|
+
method='latitude', vertex_colors=None, face_colors=None,
|
|
51
|
+
color=(0.5, 0.5, 1, 1), edge_color=None, shading=None, **kwargs):
|
|
52
|
+
|
|
53
|
+
mesh = create_sphere(rows, cols, depth, radius=radius,
|
|
54
|
+
subdivisions=subdivisions, method=method)
|
|
55
|
+
|
|
56
|
+
self._mesh = MeshVisual(vertices=mesh.get_vertices(),
|
|
57
|
+
faces=mesh.get_faces(),
|
|
58
|
+
vertex_colors=vertex_colors,
|
|
59
|
+
face_colors=face_colors, color=color,
|
|
60
|
+
shading=shading)
|
|
61
|
+
if edge_color:
|
|
62
|
+
self._border = MeshVisual(vertices=mesh.get_vertices(),
|
|
63
|
+
faces=mesh.get_edges(),
|
|
64
|
+
color=edge_color, mode='lines')
|
|
65
|
+
else:
|
|
66
|
+
self._border = MeshVisual()
|
|
67
|
+
|
|
68
|
+
CompoundVisual.__init__(self, [self._mesh, self._border], **kwargs)
|
|
69
|
+
self.mesh.set_gl_state(polygon_offset_fill=True,
|
|
70
|
+
polygon_offset=(1, 1), depth_test=True)
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def mesh(self):
|
|
74
|
+
"""The vispy.visuals.MeshVisual that used to fil in."""
|
|
75
|
+
return self._mesh
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def border(self):
|
|
79
|
+
"""The vispy.visuals.MeshVisual that used to draw the border."""
|
|
80
|
+
return self._border
|