vispy 0.15.0__cp312-cp312-macosx_10_13_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-312-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from vispy.scene.visuals import ComplexImage
|
|
2
|
+
from vispy.visuals.image_complex import CPU_COMPLEX_TRANSFORMS
|
|
3
|
+
from vispy.testing import requires_application, TestingCanvas
|
|
4
|
+
from vispy.testing.image_tester import downsample
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from vispy.testing.rendered_array_tester import compare_render
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# we add the np.float32 case to test that ComplexImage falls back to Image behavior
|
|
13
|
+
# if the data is not complex
|
|
14
|
+
@requires_application()
|
|
15
|
+
@pytest.mark.parametrize("input_dtype", [np.complex64, np.complex128, np.float32])
|
|
16
|
+
@pytest.mark.parametrize("complex_mode", ["magnitude", "real", "imaginary", "phase"])
|
|
17
|
+
def test_image_complex(input_dtype, complex_mode):
|
|
18
|
+
"""Test rendering of complex-valued image data."""
|
|
19
|
+
shape = (40, 40)
|
|
20
|
+
np.random.seed(0)
|
|
21
|
+
data = np.random.random(shape).astype(input_dtype)
|
|
22
|
+
if np.iscomplexobj(data):
|
|
23
|
+
data.imag = np.random.random(shape)
|
|
24
|
+
|
|
25
|
+
with TestingCanvas(size=shape, bgcolor="w") as c:
|
|
26
|
+
ComplexImage(data, cmap="grays", complex_mode=complex_mode, parent=c.scene)
|
|
27
|
+
# render to canvas
|
|
28
|
+
rendered = c.render()
|
|
29
|
+
shape_ratio = rendered.shape[0] // data.shape[0]
|
|
30
|
+
rendered = downsample(rendered, shape_ratio, axis=(0, 1))
|
|
31
|
+
|
|
32
|
+
# perform (auto-clim) rendering on cpu
|
|
33
|
+
exp = CPU_COMPLEX_TRANSFORMS[complex_mode](data) if np.iscomplexobj(data) else data
|
|
34
|
+
exp -= exp.min()
|
|
35
|
+
exp /= exp.max()
|
|
36
|
+
compare_render(exp, rendered)
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
Tests for InfiniteLineVisual
|
|
7
|
+
All images are of size (100,100) to keep a small file size
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from vispy.scene import visuals
|
|
13
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
14
|
+
run_tests_if_main)
|
|
15
|
+
from vispy.testing.image_tester import assert_image_approved
|
|
16
|
+
from vispy.testing import assert_raises
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@requires_application()
|
|
20
|
+
def test_set_data():
|
|
21
|
+
"""Test InfiniteLineVisual"""
|
|
22
|
+
pos = 5.0
|
|
23
|
+
color = [1.0, 1.0, 0.5, 0.5]
|
|
24
|
+
expected_color = np.array(color, dtype=np.float32)
|
|
25
|
+
|
|
26
|
+
for is_vertical, reference_image in [(True, 'infinite_line.png'),
|
|
27
|
+
(False, 'infinite_line_h.png')]:
|
|
28
|
+
|
|
29
|
+
with TestingCanvas() as c:
|
|
30
|
+
# Check set_data is working correctly within visual constructor
|
|
31
|
+
region = visuals.InfiniteLine(pos=pos,
|
|
32
|
+
color=color,
|
|
33
|
+
vertical=is_vertical,
|
|
34
|
+
parent=c.scene)
|
|
35
|
+
assert region.pos == pos
|
|
36
|
+
assert np.all(region.color == expected_color)
|
|
37
|
+
assert region.is_vertical == is_vertical
|
|
38
|
+
|
|
39
|
+
# Check tuple color argument is accepted
|
|
40
|
+
region.set_data(color=tuple(color))
|
|
41
|
+
assert np.all(region.color == expected_color)
|
|
42
|
+
|
|
43
|
+
assert_image_approved(c.render(), 'visuals/%s' % reference_image)
|
|
44
|
+
|
|
45
|
+
# Check only numbers are accepted
|
|
46
|
+
assert_raises(TypeError, region.set_data, pos=[[1, 2], [3, 4]])
|
|
47
|
+
|
|
48
|
+
# Check color argument can be only a 4 length 1D array
|
|
49
|
+
assert_raises(ValueError, region.set_data, color=[[1, 2], [3, 4]])
|
|
50
|
+
assert_raises(ValueError, region.set_data, color=[1, 2])
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from vispy import scene, use
|
|
3
|
+
|
|
4
|
+
from vispy.testing import (TestingCanvas, requires_application,
|
|
5
|
+
run_tests_if_main, requires_pyopengl)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def setup_module(module):
|
|
9
|
+
use(gl='gl+')
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def teardown_module(module):
|
|
13
|
+
use(gl='gl2')
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@requires_pyopengl()
|
|
17
|
+
@requires_application()
|
|
18
|
+
def test_mesh_with_vertex_values():
|
|
19
|
+
size = (80, 60)
|
|
20
|
+
with TestingCanvas(size=size) as c:
|
|
21
|
+
use(gl='gl+')
|
|
22
|
+
vert = np.array([[0, 0, 0], [0, 30, 0], [40, 0, 0]])
|
|
23
|
+
faces = np.array([0, 1, 2])
|
|
24
|
+
pos = np.array([[0, 0, 0], [80, 60, 0]])
|
|
25
|
+
# identity and rotate 180
|
|
26
|
+
trans = np.array([
|
|
27
|
+
[
|
|
28
|
+
[1, 0, 0],
|
|
29
|
+
[0, 1, 0],
|
|
30
|
+
[0, 0, 1],
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
[-1, 0, 0],
|
|
34
|
+
[0, -1, 0],
|
|
35
|
+
[0, 0, 1],
|
|
36
|
+
],
|
|
37
|
+
])
|
|
38
|
+
colors = ['red', 'blue']
|
|
39
|
+
mesh = scene.visuals.InstancedMesh(
|
|
40
|
+
vertices=vert, faces=faces, instance_positions=pos, instance_transforms=trans, instance_colors=colors
|
|
41
|
+
)
|
|
42
|
+
v = c.central_widget.add_view(border_width=0)
|
|
43
|
+
v.add(mesh)
|
|
44
|
+
render = c.render()
|
|
45
|
+
assert np.allclose(render[10, 10], (255, 0, 0, 255))
|
|
46
|
+
assert np.allclose(render[-10, -10], (0, 0, 255, 255))
|
|
47
|
+
assert np.allclose(render[30, 40], (0, 0, 0, 255))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from vispy import scene
|
|
5
|
+
|
|
6
|
+
from vispy.testing import run_tests_if_main, requires_pyopengl
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@requires_pyopengl()
|
|
10
|
+
def test_isosurface():
|
|
11
|
+
|
|
12
|
+
# Create data
|
|
13
|
+
vol = np.arange(1000).reshape((10, 10, 10)).astype(np.float32)
|
|
14
|
+
|
|
15
|
+
# Create visual
|
|
16
|
+
iso = scene.visuals.Isosurface(vol, level=200)
|
|
17
|
+
|
|
18
|
+
# Change color (regression test for a bug that caused this to crash)
|
|
19
|
+
iso.color = (1.0, 0.8, 0.9, 1.0)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,152 @@
|
|
|
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
|
+
Tests for LinearRegionVisual
|
|
7
|
+
All images are of size (100,100) to keep a small file size
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from vispy.scene import visuals
|
|
13
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
14
|
+
run_tests_if_main)
|
|
15
|
+
from vispy.testing.image_tester import assert_image_approved
|
|
16
|
+
from vispy.testing import assert_raises
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@requires_application()
|
|
20
|
+
def test_linear_region_vertical_horizontal():
|
|
21
|
+
"""Test vertical and horizontal LinearRegionVisual with a single color"""
|
|
22
|
+
# Definition of the region
|
|
23
|
+
pos = np.array([5, 15, 24, 36, 40, 42], dtype=np.float32)
|
|
24
|
+
# Expected internal pos buffer for vertical region
|
|
25
|
+
expected_pos_v = np.array([[5.0, -1.],
|
|
26
|
+
[5.0, 1.],
|
|
27
|
+
[15.0, -1.],
|
|
28
|
+
[15.0, 1.],
|
|
29
|
+
[24.0, -1.],
|
|
30
|
+
[24.0, 1.],
|
|
31
|
+
[36.0, -1.],
|
|
32
|
+
[36.0, 1.],
|
|
33
|
+
[40.0, -1.],
|
|
34
|
+
[40.0, 1.],
|
|
35
|
+
[42.0, -1.],
|
|
36
|
+
[42.0, 1.]], dtype=np.float32)
|
|
37
|
+
# Expected internal pos buffer for horizontal region
|
|
38
|
+
expected_pos_h = np.array([expected_pos_v[:, 1] * -1,
|
|
39
|
+
expected_pos_v[:, 0]], dtype=np.float32).T
|
|
40
|
+
|
|
41
|
+
# Test both horizontal and vertical region
|
|
42
|
+
for is_vertical, reference_image in [(True, 'linear_region1.png'),
|
|
43
|
+
(False, 'linear_region1_h.png')]:
|
|
44
|
+
|
|
45
|
+
expected_pos = expected_pos_v if is_vertical else expected_pos_h
|
|
46
|
+
|
|
47
|
+
with TestingCanvas() as c:
|
|
48
|
+
# Check set_data is working correctly within visual constructor
|
|
49
|
+
region = visuals.LinearRegion(pos=pos,
|
|
50
|
+
color=[0.0, 1.0, 0.0, 0.5],
|
|
51
|
+
vertical=is_vertical,
|
|
52
|
+
parent=c.scene)
|
|
53
|
+
assert np.all(region._pos == expected_pos)
|
|
54
|
+
assert np.all(region.pos == pos)
|
|
55
|
+
assert region.is_vertical == is_vertical
|
|
56
|
+
|
|
57
|
+
# Check set_data is working as expected when passing a list as
|
|
58
|
+
# pos argument
|
|
59
|
+
region.set_data(pos=list(pos))
|
|
60
|
+
assert np.all(region._pos == expected_pos)
|
|
61
|
+
assert np.all(region.pos == pos)
|
|
62
|
+
|
|
63
|
+
# Check set_data is working as expected when passing a tuple as
|
|
64
|
+
# pos argument
|
|
65
|
+
region.set_data(pos=tuple(pos))
|
|
66
|
+
assert np.all(region._pos == expected_pos)
|
|
67
|
+
assert np.all(region.pos == pos)
|
|
68
|
+
|
|
69
|
+
# Test with different dtypes that must be converted to float32
|
|
70
|
+
for t in [np.int64, np.float64, np.int32]:
|
|
71
|
+
region.set_data(pos=pos.astype(t))
|
|
72
|
+
assert np.all(region._pos == expected_pos)
|
|
73
|
+
assert np.all(region.pos == pos)
|
|
74
|
+
|
|
75
|
+
assert_image_approved(c.render(), 'visuals/%s' % reference_image)
|
|
76
|
+
|
|
77
|
+
# Check ValueError is raised when pos is not 1D
|
|
78
|
+
assert_raises(ValueError, region.set_data, pos=[[1, 2], [3, 4]])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@requires_application()
|
|
82
|
+
def test_linear_region_color():
|
|
83
|
+
"""Test the color argument of LinearRegionVisual.set_data() method
|
|
84
|
+
using a single color
|
|
85
|
+
"""
|
|
86
|
+
# Definition of the region
|
|
87
|
+
pos1 = [5, 42]
|
|
88
|
+
# Definition of the color of the region
|
|
89
|
+
color1 = np.array([0.0, 1.0, 0.0, 0.5], dtype=np.float32)
|
|
90
|
+
# Expected internal color buffer
|
|
91
|
+
color1_expected = np.array([color1, color1, color1, color1],
|
|
92
|
+
dtype=np.float32)
|
|
93
|
+
|
|
94
|
+
with TestingCanvas() as c:
|
|
95
|
+
# Check set_data is working correctly within visual constructor
|
|
96
|
+
region = visuals.LinearRegion(pos=pos1, color=color1, parent=c.scene)
|
|
97
|
+
assert np.all(region._color == color1_expected)
|
|
98
|
+
assert np.all(region.color == color1)
|
|
99
|
+
|
|
100
|
+
# Check set_data is working as expected when passing a list as
|
|
101
|
+
# color argument
|
|
102
|
+
region.set_data(color=list(color1))
|
|
103
|
+
assert np.all(region._color == color1_expected)
|
|
104
|
+
assert np.all(region.color == color1)
|
|
105
|
+
|
|
106
|
+
# Check set_data is working as expected when passing a tuple as
|
|
107
|
+
# color argument
|
|
108
|
+
region.set_data(color=tuple(color1))
|
|
109
|
+
assert np.all(region._color == color1_expected)
|
|
110
|
+
assert np.all(region.color == color1)
|
|
111
|
+
|
|
112
|
+
# Test with different dtypes that must be converted to float32
|
|
113
|
+
region.set_data(color=color1.astype(np.float64))
|
|
114
|
+
assert np.all(region._color == color1_expected)
|
|
115
|
+
assert np.all(region.color == color1)
|
|
116
|
+
|
|
117
|
+
assert_image_approved(c.render(), 'visuals/linear_region1.png')
|
|
118
|
+
|
|
119
|
+
# Check a ValueError is raised when the length of color argument
|
|
120
|
+
# is not 4.
|
|
121
|
+
assert_raises(ValueError, region.set_data, color=[1.0, 0.5, 0.5])
|
|
122
|
+
|
|
123
|
+
# Check a ValueError is raised when too many colors are provided
|
|
124
|
+
assert_raises(ValueError, region.set_data,
|
|
125
|
+
color=[color1, color1, color1])
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@requires_application()
|
|
129
|
+
def test_linear_region_gradient():
|
|
130
|
+
"""Test LinearRegionVisual with a gradient as color"""
|
|
131
|
+
# Definition of the region
|
|
132
|
+
pos2 = [5, 42, 80]
|
|
133
|
+
# Definition of the color of the region
|
|
134
|
+
color2 = np.array([[0.0, 1.0, 0.0, 0.5],
|
|
135
|
+
[1.0, 0.0, 0.0, 0.75],
|
|
136
|
+
[0.0, 0.0, 1.0, 1.0]], dtype=np.float32)
|
|
137
|
+
# Expected internal color buffer
|
|
138
|
+
color2_expected = np.array([color2[0], color2[0],
|
|
139
|
+
color2[1], color2[1],
|
|
140
|
+
color2[2], color2[2]],
|
|
141
|
+
dtype=np.float32)
|
|
142
|
+
|
|
143
|
+
with TestingCanvas() as c:
|
|
144
|
+
# Check set_data is working correctly within visual constructor
|
|
145
|
+
region = visuals.LinearRegion(pos=pos2, color=color2, parent=c.scene)
|
|
146
|
+
assert np.all(region._color == color2_expected)
|
|
147
|
+
assert np.all(region.color == color2)
|
|
148
|
+
|
|
149
|
+
assert_image_approved(c.render(), 'visuals/linear_region2.png')
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
import numpy as np
|
|
3
|
+
import pytest
|
|
4
|
+
from vispy.scene.visuals import Markers
|
|
5
|
+
from vispy.testing import (requires_application, TestingCanvas,
|
|
6
|
+
run_tests_if_main)
|
|
7
|
+
from vispy.testing.image_tester import assert_image_approved
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@requires_application()
|
|
11
|
+
def test_markers():
|
|
12
|
+
"""Test basic marker / point-sprite support"""
|
|
13
|
+
# this is probably too basic, but it at least ensures that point sprites
|
|
14
|
+
# work for people
|
|
15
|
+
np.random.seed(57983)
|
|
16
|
+
data = np.random.normal(size=(30, 2), loc=50, scale=10)
|
|
17
|
+
|
|
18
|
+
with TestingCanvas() as c:
|
|
19
|
+
marker = Markers(parent=c.scene)
|
|
20
|
+
marker.set_data(data)
|
|
21
|
+
assert_image_approved(c.render(), "visuals/markers.png")
|
|
22
|
+
|
|
23
|
+
# Test good correlation at high-dpi
|
|
24
|
+
with TestingCanvas(px_scale=2) as c:
|
|
25
|
+
marker = Markers(parent=c.scene)
|
|
26
|
+
marker.set_data(data)
|
|
27
|
+
assert_image_approved(c.render(), "visuals/markers.png")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_markers_edge_width():
|
|
31
|
+
data = np.random.rand(10, 3)
|
|
32
|
+
edge_width = np.random.rand(10)
|
|
33
|
+
marker = Markers()
|
|
34
|
+
|
|
35
|
+
with pytest.raises(ValueError):
|
|
36
|
+
marker.set_data(pos=data, edge_width_rel=1, edge_width=1)
|
|
37
|
+
|
|
38
|
+
marker.set_data(pos=data, edge_width=2)
|
|
39
|
+
marker.set_data(pos=data, edge_width=edge_width)
|
|
40
|
+
with pytest.raises(ValueError):
|
|
41
|
+
marker.set_data(pos=data, edge_width=-1)
|
|
42
|
+
|
|
43
|
+
marker.set_data(pos=data, edge_width_rel=edge_width, edge_width=None)
|
|
44
|
+
marker.set_data(pos=data, edge_width_rel=edge_width + 1, edge_width=None)
|
|
45
|
+
with pytest.raises(ValueError):
|
|
46
|
+
marker.set_data(pos=data, edge_width_rel=edge_width - 1, edge_width=None)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_empty_markers_symbol():
|
|
50
|
+
markers = Markers()
|
|
51
|
+
markers.symbol = 'o'
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from vispy import scene
|
|
5
|
+
|
|
6
|
+
from vispy.color import Color
|
|
7
|
+
from vispy.geometry import create_cube, create_sphere
|
|
8
|
+
from vispy.testing import (TestingCanvas, requires_application,
|
|
9
|
+
run_tests_if_main, requires_pyopengl)
|
|
10
|
+
from vispy.visuals.filters import ShadingFilter, WireframeFilter
|
|
11
|
+
from vispy.visuals.filters.mesh import _as_rgba
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@requires_pyopengl()
|
|
17
|
+
def test_mesh_color():
|
|
18
|
+
# Create visual
|
|
19
|
+
vertices, filled_indices, outline_indices = create_cube()
|
|
20
|
+
axis = scene.visuals.Mesh(vertices['position'], outline_indices,
|
|
21
|
+
color='black', mode='lines')
|
|
22
|
+
|
|
23
|
+
# Change color (regression test for a bug that caused this to reset
|
|
24
|
+
# the vertex data to None)
|
|
25
|
+
|
|
26
|
+
axis.color = (0.1, 0.3, 0.7, 0.9)
|
|
27
|
+
|
|
28
|
+
new_vertices = axis.mesh_data.get_vertices()
|
|
29
|
+
|
|
30
|
+
np.testing.assert_allclose(axis.color.rgba, (0.1, 0.3, 0.7, 0.9))
|
|
31
|
+
np.testing.assert_allclose(vertices['position'], new_vertices)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@requires_pyopengl()
|
|
35
|
+
@requires_application()
|
|
36
|
+
def test_mesh_with_vertex_values():
|
|
37
|
+
size = (45, 40)
|
|
38
|
+
with TestingCanvas(size=size) as c:
|
|
39
|
+
v = c.central_widget.add_view(border_width=0)
|
|
40
|
+
vertices = np.array([(0, 0, 0), (0, 0, 1), (1, 0, 0)], dtype=float)
|
|
41
|
+
faces = np.array([(0, 1, 2)])
|
|
42
|
+
mesh = scene.visuals.Mesh(
|
|
43
|
+
vertices=vertices,
|
|
44
|
+
faces=faces,
|
|
45
|
+
vertex_values=np.ones(len(vertices)),
|
|
46
|
+
)
|
|
47
|
+
v.add(mesh)
|
|
48
|
+
c.render()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@requires_pyopengl()
|
|
52
|
+
@requires_application()
|
|
53
|
+
@pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
|
|
54
|
+
def test_mesh_shading_change_from_none(shading):
|
|
55
|
+
# Regression test for #2041: exception raised when changing the shading
|
|
56
|
+
# mode with shading=None initially.
|
|
57
|
+
size = (45, 40)
|
|
58
|
+
with TestingCanvas(size=size) as c:
|
|
59
|
+
v = c.central_widget.add_view(border_width=0)
|
|
60
|
+
vertices = np.array([(0, 0, 0), (0, 0, 1), (1, 0, 0)], dtype=float)
|
|
61
|
+
faces = np.array([(0, 1, 2)])
|
|
62
|
+
mesh = scene.visuals.Mesh(vertices=vertices, faces=faces, shading=None)
|
|
63
|
+
v.add(mesh)
|
|
64
|
+
c.render()
|
|
65
|
+
# This below should not fail.
|
|
66
|
+
mesh.shading = shading
|
|
67
|
+
c.render()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@requires_pyopengl()
|
|
71
|
+
@requires_application()
|
|
72
|
+
@pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
|
|
73
|
+
def test_mesh_shading_filter(shading):
|
|
74
|
+
size = (45, 40)
|
|
75
|
+
with TestingCanvas(size=size, bgcolor="k") as c:
|
|
76
|
+
v = c.central_widget.add_view(border_width=0)
|
|
77
|
+
v.camera = 'arcball'
|
|
78
|
+
mdata = create_sphere(20, 30, radius=1)
|
|
79
|
+
mesh = scene.visuals.Mesh(meshdata=mdata,
|
|
80
|
+
shading=shading,
|
|
81
|
+
color=(0.2, 0.3, 0.7, 1.0))
|
|
82
|
+
v.add(mesh)
|
|
83
|
+
|
|
84
|
+
rendered = c.render()[..., 0] # R channel only
|
|
85
|
+
if shading in ("flat", "smooth"):
|
|
86
|
+
# there should be a gradient, not solid colors
|
|
87
|
+
assert np.unique(rendered).size >= 28
|
|
88
|
+
# sphere/circle is "dark" on the right and gets brighter as you
|
|
89
|
+
# move to the left, then hits a bright spot and decreases after
|
|
90
|
+
invest_row = rendered[34].astype(np.float64)
|
|
91
|
+
# overall, we should be increasing brightness up to a "bright spot"
|
|
92
|
+
assert (np.diff(invest_row[34:60]) <= 0).all()
|
|
93
|
+
else:
|
|
94
|
+
assert np.unique(rendered).size == 2
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_intensity_or_color_as_rgba():
|
|
98
|
+
assert _as_rgba(0.3) == Color((1.0, 1.0, 1.0, 0.3))
|
|
99
|
+
assert _as_rgba((0.3, 0.2, 0.1)) == Color((0.3, 0.2, 0.1, 1.0))
|
|
100
|
+
assert _as_rgba((0.3, 0.2, 0.1, 0.5)) == Color((0.3, 0.2, 0.1, 0.5))
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@requires_pyopengl()
|
|
104
|
+
@requires_application()
|
|
105
|
+
@pytest.mark.parametrize('shading', [None, 'flat', 'smooth'])
|
|
106
|
+
def test_mesh_shading_filter_enabled(shading):
|
|
107
|
+
size = (45, 40)
|
|
108
|
+
with TestingCanvas(size=size, bgcolor="k") as c:
|
|
109
|
+
v = c.central_widget.add_view(border_width=0)
|
|
110
|
+
v.camera = 'arcball'
|
|
111
|
+
mdata = create_sphere(20, 30, radius=1)
|
|
112
|
+
mesh = scene.visuals.Mesh(meshdata=mdata,
|
|
113
|
+
shading=None,
|
|
114
|
+
color=(0.2, 0.3, 0.7, 1.0))
|
|
115
|
+
shading_filter = ShadingFilter(shading=shading)
|
|
116
|
+
mesh.attach(shading_filter)
|
|
117
|
+
v.add(mesh)
|
|
118
|
+
|
|
119
|
+
shading_filter.enabled = False
|
|
120
|
+
rendered_without_shading = c.render()
|
|
121
|
+
|
|
122
|
+
shading_filter.enabled = True
|
|
123
|
+
rendered_with_shading = c.render()
|
|
124
|
+
|
|
125
|
+
if shading is None:
|
|
126
|
+
# There should be no shading applied, regardless of the value of
|
|
127
|
+
# `enabled`.
|
|
128
|
+
assert np.allclose(rendered_without_shading, rendered_with_shading)
|
|
129
|
+
else:
|
|
130
|
+
# The result should be different with shading applied.
|
|
131
|
+
assert not np.allclose(rendered_without_shading,
|
|
132
|
+
rendered_with_shading)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@requires_pyopengl()
|
|
136
|
+
@requires_application()
|
|
137
|
+
@pytest.mark.parametrize('attribute', ['ambient_coefficient',
|
|
138
|
+
'diffuse_coefficient',
|
|
139
|
+
'specular_coefficient',
|
|
140
|
+
'ambient_light',
|
|
141
|
+
'diffuse_light',
|
|
142
|
+
'specular_light'])
|
|
143
|
+
def test_mesh_shading_filter_colors(attribute):
|
|
144
|
+
size = (45, 40)
|
|
145
|
+
with TestingCanvas(size=size, bgcolor="k") as c:
|
|
146
|
+
base_color_white = (1.0, 1.0, 1.0, 1.0)
|
|
147
|
+
overlay_color_red = (1.0, 0.0, 0.0, 1.0)
|
|
148
|
+
|
|
149
|
+
v = c.central_widget.add_view(border_width=0)
|
|
150
|
+
v.camera = 'arcball'
|
|
151
|
+
mdata = create_sphere(20, 30, radius=1)
|
|
152
|
+
mesh = scene.visuals.Mesh(meshdata=mdata, color=base_color_white)
|
|
153
|
+
v.add(mesh)
|
|
154
|
+
|
|
155
|
+
shading_filter = ShadingFilter(shading='smooth',
|
|
156
|
+
# Set the light source on the side of
|
|
157
|
+
# and around the camera to get a clearly
|
|
158
|
+
# visible reflection.
|
|
159
|
+
light_dir=(-5, -5, 5),
|
|
160
|
+
# Activate all illumination types as
|
|
161
|
+
# white light but reduce the intensity
|
|
162
|
+
# to prevent saturation.
|
|
163
|
+
ambient_light=0.3,
|
|
164
|
+
diffuse_light=0.3,
|
|
165
|
+
specular_light=0.3,
|
|
166
|
+
# Get a wide highlight.
|
|
167
|
+
shininess=4)
|
|
168
|
+
mesh.attach(shading_filter)
|
|
169
|
+
|
|
170
|
+
rendered_white = c.render()
|
|
171
|
+
|
|
172
|
+
setattr(shading_filter, attribute, overlay_color_red)
|
|
173
|
+
rendered_red = c.render()
|
|
174
|
+
|
|
175
|
+
# The results should be different.
|
|
176
|
+
assert not np.allclose(rendered_white, rendered_red)
|
|
177
|
+
|
|
178
|
+
# There should be an equal amount of all colors in the white rendering.
|
|
179
|
+
color_count_white = rendered_white.sum(axis=(0, 1))
|
|
180
|
+
r, g, b, _ = color_count_white
|
|
181
|
+
assert r == g and r == b
|
|
182
|
+
|
|
183
|
+
color_count_red = rendered_red.sum(axis=(0, 1))
|
|
184
|
+
# There should be more red in the red-colored rendering.
|
|
185
|
+
r, g, b, _ = color_count_red
|
|
186
|
+
assert r > g and r > b
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@requires_pyopengl()
|
|
190
|
+
def test_mesh_bounds():
|
|
191
|
+
# Create 3D visual
|
|
192
|
+
vertices, filled_indices, outline_indices = create_cube()
|
|
193
|
+
axis = scene.visuals.Mesh(vertices['position'], outline_indices,
|
|
194
|
+
color='black', mode='lines')
|
|
195
|
+
|
|
196
|
+
# Test bounds for all 3 axes
|
|
197
|
+
for i in range(3):
|
|
198
|
+
np.testing.assert_allclose(axis.bounds(i), (-1.0, 1.0))
|
|
199
|
+
|
|
200
|
+
# Create 2D visual using projection of cube
|
|
201
|
+
axis = scene.visuals.Mesh(vertices['position'][:, :2], outline_indices,
|
|
202
|
+
color='black', mode='lines')
|
|
203
|
+
|
|
204
|
+
# Test bounds for first 2 axes
|
|
205
|
+
for i in range(2):
|
|
206
|
+
np.testing.assert_allclose(axis.bounds(i), (-1.0, 1.0))
|
|
207
|
+
# Test bounds for 3rd axis
|
|
208
|
+
np.testing.assert_allclose(axis.bounds(2), (0.0, 0.0))
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@requires_pyopengl()
|
|
212
|
+
@requires_application()
|
|
213
|
+
def test_mesh_wireframe_filter():
|
|
214
|
+
size = (45, 40)
|
|
215
|
+
with TestingCanvas(size=size, bgcolor="k") as c:
|
|
216
|
+
v = c.central_widget.add_view(border_width=0)
|
|
217
|
+
# Create visual
|
|
218
|
+
mdata = create_sphere(20, 40, radius=20)
|
|
219
|
+
mesh = scene.visuals.Mesh(meshdata=mdata,
|
|
220
|
+
shading=None,
|
|
221
|
+
color=(0.1, 0.3, 0.7, 0.9))
|
|
222
|
+
wireframe_filter = WireframeFilter(color='red')
|
|
223
|
+
mesh.attach(wireframe_filter)
|
|
224
|
+
v.add(mesh)
|
|
225
|
+
from vispy.visuals.transforms import STTransform
|
|
226
|
+
mesh.transform = STTransform(translate=(20, 20))
|
|
227
|
+
mesh.transforms.scene_transform = STTransform(scale=(1, 1, 0.01))
|
|
228
|
+
|
|
229
|
+
rendered_with_wf = c.render()
|
|
230
|
+
assert np.unique(rendered_with_wf[..., 0]).size >= 50
|
|
231
|
+
|
|
232
|
+
wireframe_filter.enabled = False
|
|
233
|
+
rendered_wo_wf = c.render()
|
|
234
|
+
# the result should be completely different
|
|
235
|
+
# assert not allclose
|
|
236
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
237
|
+
rendered_with_wf, rendered_wo_wf)
|
|
238
|
+
|
|
239
|
+
wireframe_filter.enabled = True
|
|
240
|
+
wireframe_filter.wireframe_only = True
|
|
241
|
+
rendered_with_wf_only = c.render()
|
|
242
|
+
# the result should be different from the two cases above
|
|
243
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
244
|
+
rendered_with_wf_only, rendered_with_wf)
|
|
245
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
246
|
+
rendered_with_wf_only, rendered_wo_wf)
|
|
247
|
+
|
|
248
|
+
wireframe_filter.enabled = True
|
|
249
|
+
wireframe_filter.wireframe_only = False
|
|
250
|
+
wireframe_filter.faces_only = True
|
|
251
|
+
rendered_with_faces_only = c.render()
|
|
252
|
+
# the result should be different from the cases above
|
|
253
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
254
|
+
rendered_with_faces_only, rendered_with_wf)
|
|
255
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
256
|
+
rendered_with_faces_only, rendered_wo_wf)
|
|
257
|
+
pytest.raises(AssertionError, np.testing.assert_allclose,
|
|
258
|
+
rendered_with_faces_only, rendered_with_wf_only)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
run_tests_if_main()
|