vispy 0.15.0__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_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-x86_64-linux-gnu.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,486 @@
|
|
|
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
|
+
from vispy.visuals.shaders import (Function, MainFunction, Variable, Varying,
|
|
5
|
+
FunctionChain, StatementList)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Users normally don't need these, but I want to test them
|
|
9
|
+
from vispy.visuals.shaders.expression import FunctionCall, TextExpression
|
|
10
|
+
|
|
11
|
+
from vispy.testing import (assert_in, assert_not_in, assert_is,
|
|
12
|
+
run_tests_if_main, assert_raises, assert_equal)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Define some snippets
|
|
16
|
+
|
|
17
|
+
transformScale = Function("""
|
|
18
|
+
vec4 transform_scale(vec4 pos)
|
|
19
|
+
{
|
|
20
|
+
pos.xyz *= $scale;
|
|
21
|
+
return pos;
|
|
22
|
+
}
|
|
23
|
+
""")
|
|
24
|
+
|
|
25
|
+
transformZOffset = Function("""
|
|
26
|
+
vec4 transform_zoffset(vec4 pos)
|
|
27
|
+
{
|
|
28
|
+
pos.z += $offset;
|
|
29
|
+
return pos;
|
|
30
|
+
}
|
|
31
|
+
""")
|
|
32
|
+
|
|
33
|
+
vert_template = Function("""
|
|
34
|
+
void main(void)
|
|
35
|
+
{
|
|
36
|
+
int nlights = $nlights;
|
|
37
|
+
vec4 pos = $position;
|
|
38
|
+
pos += $correction;
|
|
39
|
+
gl_Position = $endtransform(pos);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
""")
|
|
43
|
+
|
|
44
|
+
frag_template = Function("""
|
|
45
|
+
void main(void)
|
|
46
|
+
{
|
|
47
|
+
gl_Fragcolor = $color;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
""")
|
|
51
|
+
|
|
52
|
+
data = 'just some dummy variable, Function is agnostic about this'
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Examples
|
|
56
|
+
|
|
57
|
+
def test_example1():
|
|
58
|
+
"""Just a few simple compositions."""
|
|
59
|
+
# Get function objects. Generate random name for transforms
|
|
60
|
+
code = Function(vert_template)
|
|
61
|
+
t1 = Function(transformScale)
|
|
62
|
+
t2 = Function(transformZOffset)
|
|
63
|
+
t3 = Function(transformScale)
|
|
64
|
+
|
|
65
|
+
# We need to create a variable in order to use it in two places
|
|
66
|
+
pos = Variable('attribute vec4 a_position')
|
|
67
|
+
|
|
68
|
+
# Compose everything together
|
|
69
|
+
code['position'] = t1(t2(pos))
|
|
70
|
+
code['correction'] = t1(pos) # Look, we use t1 again, different sig
|
|
71
|
+
code['endtransform'] = t3 # function pointer rather than function call
|
|
72
|
+
code['nlights'] = '4'
|
|
73
|
+
t1['scale'] = t2
|
|
74
|
+
t3['scale'] = (3.0, 4.0, 5.0)
|
|
75
|
+
t2['offset'] = '1.0'
|
|
76
|
+
|
|
77
|
+
code2 = Function(frag_template)
|
|
78
|
+
code2['color'] = Varying('v_position')
|
|
79
|
+
|
|
80
|
+
code['gl_PointSize'] = '3.0'
|
|
81
|
+
code[code2['color']] = pos
|
|
82
|
+
print(code)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_example2():
|
|
86
|
+
"""Demonstrate how a transform would work."""
|
|
87
|
+
vert_template = Function("""
|
|
88
|
+
void main(void)
|
|
89
|
+
{
|
|
90
|
+
gl_Position = $position;
|
|
91
|
+
}
|
|
92
|
+
""")
|
|
93
|
+
|
|
94
|
+
transformScale = Function("""
|
|
95
|
+
vec4 transform_scale(vec4 pos)
|
|
96
|
+
{
|
|
97
|
+
pos.xyz *= $scale;
|
|
98
|
+
return pos;
|
|
99
|
+
}
|
|
100
|
+
""")
|
|
101
|
+
|
|
102
|
+
class Transform(object):
|
|
103
|
+
def __init__(self):
|
|
104
|
+
# Equivalent methods to create new function object
|
|
105
|
+
self.func = Function(transformScale)
|
|
106
|
+
self.func['scale'] = 'uniform float'
|
|
107
|
+
# self.func = Function(transformScale)
|
|
108
|
+
|
|
109
|
+
def set_scale(self, scale):
|
|
110
|
+
self.func['scale'].value = scale
|
|
111
|
+
|
|
112
|
+
transforms = [Transform(), Transform(), Transform()]
|
|
113
|
+
|
|
114
|
+
code = Function(vert_template)
|
|
115
|
+
ob = Variable('attribute vec3 a_position')
|
|
116
|
+
for trans in transforms:
|
|
117
|
+
ob = trans.func(ob)
|
|
118
|
+
code['position'] = ob
|
|
119
|
+
print(code)
|
|
120
|
+
|
|
121
|
+
# Tests
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def test_TextExpression():
|
|
125
|
+
exp = TextExpression('foo bar')
|
|
126
|
+
assert_equal('foo bar', exp.expression(None))
|
|
127
|
+
assert_equal(None, exp.definition(None, ('120', '')))
|
|
128
|
+
assert_raises(TypeError, TextExpression, 4)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def test_FunctionCall():
|
|
132
|
+
fun = Function(transformScale)
|
|
133
|
+
fun['scale'] = '1.0'
|
|
134
|
+
fun2 = Function(transformZOffset)
|
|
135
|
+
|
|
136
|
+
# No args
|
|
137
|
+
assert_raises(TypeError, fun) # need 1 arg
|
|
138
|
+
assert_raises(TypeError, fun, 1, 2) # need 1 arg
|
|
139
|
+
call = fun('x')
|
|
140
|
+
# Test repr
|
|
141
|
+
exp = call.expression({fun: 'y'})
|
|
142
|
+
assert_equal(exp, 'y(x)')
|
|
143
|
+
# Test sig
|
|
144
|
+
assert len(call._args) == 1
|
|
145
|
+
# Test dependencies
|
|
146
|
+
assert_in(fun, call.dependencies())
|
|
147
|
+
assert_in(call._args[0], call.dependencies())
|
|
148
|
+
|
|
149
|
+
# More args
|
|
150
|
+
call = fun(fun2('foo'))
|
|
151
|
+
# Test repr
|
|
152
|
+
exp = call.expression({fun: 'y', fun2: 'z'})
|
|
153
|
+
assert_in('y(z(', exp)
|
|
154
|
+
# Test sig
|
|
155
|
+
assert len(call._args) == 1
|
|
156
|
+
call2 = call._args[0]
|
|
157
|
+
assert len(call2._args) == 1
|
|
158
|
+
# Test dependencies
|
|
159
|
+
assert_in(fun, call.dependencies())
|
|
160
|
+
assert_in(call._args[0], call.dependencies())
|
|
161
|
+
assert_in(fun2, call.dependencies())
|
|
162
|
+
assert_in(call2._args[0], call.dependencies())
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def test_Variable():
|
|
166
|
+
|
|
167
|
+
# Test init fail
|
|
168
|
+
assert_raises(TypeError, Variable) # no args
|
|
169
|
+
assert_raises(TypeError, Variable, 3) # wrong type
|
|
170
|
+
assert_raises(TypeError, Variable, "name", "str") # wrong type
|
|
171
|
+
assert_raises(ValueError, Variable, 'bla bla') # need correct vtype
|
|
172
|
+
assert_raises(ValueError, Variable, 'uniform b l a') # too many
|
|
173
|
+
|
|
174
|
+
# Test init success
|
|
175
|
+
var = Variable('uniform float bla') # Finally
|
|
176
|
+
assert_equal(var.name, 'bla')
|
|
177
|
+
assert_equal(var.dtype, 'float')
|
|
178
|
+
assert_equal(var.vtype, 'uniform')
|
|
179
|
+
assert var.value is None
|
|
180
|
+
|
|
181
|
+
# test assign new value
|
|
182
|
+
var.value = 10.
|
|
183
|
+
assert_equal(var.dtype, 'float') # type is locked; won't change
|
|
184
|
+
|
|
185
|
+
# test name-only init
|
|
186
|
+
var = Variable('bla') # Finally
|
|
187
|
+
assert_equal(var.name, 'bla')
|
|
188
|
+
assert_equal(var.dtype, None)
|
|
189
|
+
assert_equal(var.vtype, None)
|
|
190
|
+
assert var.value is None
|
|
191
|
+
|
|
192
|
+
# test assign new value
|
|
193
|
+
var.value = 10
|
|
194
|
+
assert_equal(var.dtype, 'int')
|
|
195
|
+
assert_equal(var.vtype, 'uniform')
|
|
196
|
+
assert_equal(var.value, 10)
|
|
197
|
+
|
|
198
|
+
# test init with value
|
|
199
|
+
var = Variable('bla', (1, 2, 3)) # Also valid
|
|
200
|
+
assert_equal(var.name, 'bla')
|
|
201
|
+
assert_equal(var.dtype, 'vec3')
|
|
202
|
+
assert_equal(var.vtype, 'uniform')
|
|
203
|
+
assert_equal(var.value, (1, 2, 3))
|
|
204
|
+
|
|
205
|
+
# Test value
|
|
206
|
+
# var = Variable('uniform float bla', data) # Also valid
|
|
207
|
+
# assert_equal(var.value, data)
|
|
208
|
+
# var.value = 3
|
|
209
|
+
# assert_equal(var.value, 3)
|
|
210
|
+
|
|
211
|
+
# Test repr
|
|
212
|
+
var = Variable('uniform float bla')
|
|
213
|
+
assert_in('uniform float bla', var.compile())
|
|
214
|
+
|
|
215
|
+
# Test injection, definition, dependencies
|
|
216
|
+
assert_equal(var.expression({var: 'xxx'}), 'xxx')
|
|
217
|
+
assert_equal(var.definition({var: 'xxx'}, ('120', ''), None),
|
|
218
|
+
'uniform float xxx;')
|
|
219
|
+
assert_in(var, var.dependencies())
|
|
220
|
+
|
|
221
|
+
# Renaming
|
|
222
|
+
var = Variable('uniform float bla')
|
|
223
|
+
assert_equal(var.name, 'bla')
|
|
224
|
+
var.name = 'foo'
|
|
225
|
+
assert_equal(var.name, 'foo')
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def test_function_basics():
|
|
229
|
+
|
|
230
|
+
# Test init fail
|
|
231
|
+
assert_raises(TypeError, Function) # no args
|
|
232
|
+
assert_raises(ValueError, Function, 3) # need string
|
|
233
|
+
|
|
234
|
+
# Test init success 1
|
|
235
|
+
fun = Function('void main(){}')
|
|
236
|
+
assert_equal(fun.name, 'main')
|
|
237
|
+
assert len(fun.template_vars) == 0
|
|
238
|
+
|
|
239
|
+
# Test init success with template vars
|
|
240
|
+
fun = Function('void main(){$foo; $bar;}')
|
|
241
|
+
assert_equal(fun.name, 'main')
|
|
242
|
+
assert len(fun.template_vars) == 2
|
|
243
|
+
assert_in('foo', fun.template_vars)
|
|
244
|
+
|
|
245
|
+
# Test that `var in fun` syntax works as well
|
|
246
|
+
assert 'foo' in fun
|
|
247
|
+
assert 'bar' in fun
|
|
248
|
+
assert 'baz' not in fun
|
|
249
|
+
|
|
250
|
+
assert_in('bar', fun.template_vars)
|
|
251
|
+
|
|
252
|
+
# Test setting verbatim expressions
|
|
253
|
+
assert_raises(KeyError, fun.__setitem__, 'bla', '33') # no such template
|
|
254
|
+
fun['foo'] = '33'
|
|
255
|
+
fun['bar'] = 'bla bla'
|
|
256
|
+
assert_is(type(fun['foo']), TextExpression)
|
|
257
|
+
assert_equal(fun['foo'].expression(None), '33')
|
|
258
|
+
assert_is(type(fun['bar']), TextExpression)
|
|
259
|
+
assert_equal(fun['bar'].expression(None), 'bla bla')
|
|
260
|
+
|
|
261
|
+
# Test setting call expressions
|
|
262
|
+
fun = Function('void main(){\n$foo;\n$bar;\n$spam(XX);\n$eggs(YY);\n}')
|
|
263
|
+
trans = Function('float transform_scale(float x) {return x+1.0;}')
|
|
264
|
+
assert_raises(TypeError, trans) # requires 1 arg
|
|
265
|
+
assert_raises(TypeError, trans, '1', '2')
|
|
266
|
+
fun['foo'] = trans('2')
|
|
267
|
+
fun['bar'] = trans('3')
|
|
268
|
+
fun['spam'] = trans
|
|
269
|
+
fun['eggs'] = trans
|
|
270
|
+
#
|
|
271
|
+
for name in ['foo', 'bar']:
|
|
272
|
+
assert_is(type(fun[name]), FunctionCall)
|
|
273
|
+
assert_equal(fun[name].function, trans)
|
|
274
|
+
assert_in(trans, fun.dependencies())
|
|
275
|
+
for name in ['spam', 'eggs']:
|
|
276
|
+
assert_equal(fun[name], trans)
|
|
277
|
+
|
|
278
|
+
#
|
|
279
|
+
text = fun.compile()
|
|
280
|
+
assert_in('\ntransform_scale(2);\n', text)
|
|
281
|
+
assert_in('\ntransform_scale(3);\n', text)
|
|
282
|
+
assert_in('\ntransform_scale(XX);\n', text)
|
|
283
|
+
assert_in('\ntransform_scale(YY);\n', text)
|
|
284
|
+
|
|
285
|
+
# test pre/post assignments
|
|
286
|
+
fun = Function('void main() {some stuff;}')
|
|
287
|
+
fun['pre'] = '__pre__'
|
|
288
|
+
fun['post'] = '__post__'
|
|
289
|
+
text = fun.compile()
|
|
290
|
+
assert text == 'void main() {\n __pre__\nsome stuff;\n __post__\n}\n'
|
|
291
|
+
|
|
292
|
+
# Test variable expressions
|
|
293
|
+
fun = Function('void main(){$foo; $bar;}')
|
|
294
|
+
fun['foo'] = Variable('uniform float bla')
|
|
295
|
+
fun['bar'] = Variable('attribute float bla')
|
|
296
|
+
assert_is(type(fun['foo']), Variable)
|
|
297
|
+
assert_is(type(fun['bar']), Variable)
|
|
298
|
+
assert_in(fun['foo'], fun.dependencies())
|
|
299
|
+
assert_in(fun['bar'], fun.dependencies())
|
|
300
|
+
|
|
301
|
+
# Test special variables
|
|
302
|
+
fun = Function('void main(){$foo; $bar;}')
|
|
303
|
+
variable = Variable('attribute vec3 v_pos')
|
|
304
|
+
varying = Variable('varying vec3 color')
|
|
305
|
+
# These do not work due to index
|
|
306
|
+
assert_raises(TypeError, fun.__setitem__, 3, 3) # not a string
|
|
307
|
+
assert_raises(KeyError, fun.__setitem__, 'xxx', 3) # unknown template var
|
|
308
|
+
assert_raises(TypeError, fun.__setitem__, variable, 3) # only varyings
|
|
309
|
+
# These work
|
|
310
|
+
fun['gl_PointSize'] = '3.0'
|
|
311
|
+
fun[varying] = variable
|
|
312
|
+
# And getting works
|
|
313
|
+
assert_equal(fun['gl_PointSize'].text, '3.0')
|
|
314
|
+
assert_equal(fun[varying], variable)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def test_function_changed():
|
|
318
|
+
ch = []
|
|
319
|
+
|
|
320
|
+
class C(object):
|
|
321
|
+
def _dep_changed(self, dep, **kwargs):
|
|
322
|
+
ch.append(dep)
|
|
323
|
+
ch_obj = C()
|
|
324
|
+
|
|
325
|
+
def assert_changed(*objs):
|
|
326
|
+
assert set(ch) == set(objs)
|
|
327
|
+
while ch:
|
|
328
|
+
ch.pop()
|
|
329
|
+
|
|
330
|
+
fun1 = Function('void main(){$var1; $var2;}')
|
|
331
|
+
fun1._dependents[ch_obj] = None
|
|
332
|
+
fun1['var1'] = 'x'
|
|
333
|
+
fun1['var2'] = 'y'
|
|
334
|
+
assert_changed(fun1)
|
|
335
|
+
|
|
336
|
+
fun1['var1'] = 'z'
|
|
337
|
+
assert_changed(fun1)
|
|
338
|
+
|
|
339
|
+
# same value; should result in no change events
|
|
340
|
+
fun1['var1'] = 'z'
|
|
341
|
+
assert_changed()
|
|
342
|
+
|
|
343
|
+
fun1['var1'] = 0.5
|
|
344
|
+
var1 = fun1['var1']
|
|
345
|
+
var1._dependents[ch_obj] = None
|
|
346
|
+
assert_changed(fun1)
|
|
347
|
+
|
|
348
|
+
var1.name = 'xxx'
|
|
349
|
+
assert_changed(fun1, var1)
|
|
350
|
+
|
|
351
|
+
# changing type requires code change
|
|
352
|
+
var1.value = 7
|
|
353
|
+
assert_changed(fun1, var1)
|
|
354
|
+
|
|
355
|
+
# changing value (but not type) requires no code changes
|
|
356
|
+
var1.value = 6
|
|
357
|
+
assert_changed()
|
|
358
|
+
|
|
359
|
+
# test variable disconnect
|
|
360
|
+
fun1['var1'] = Variable('var1', 7)
|
|
361
|
+
var2 = fun1['var1']
|
|
362
|
+
var2._dependents[ch_obj] = None
|
|
363
|
+
# assert_changed(fun1)
|
|
364
|
+
# var2 is now connected
|
|
365
|
+
var2.value = (1, 2, 3, 4)
|
|
366
|
+
assert_changed(fun1, var2)
|
|
367
|
+
# ..but var1 no longer triggers fun1.changed
|
|
368
|
+
assert_changed()
|
|
369
|
+
var1.value = 0.5
|
|
370
|
+
assert_changed(var1)
|
|
371
|
+
|
|
372
|
+
# test expressions
|
|
373
|
+
fun2 = Function('float fn(float x){return $var1 + x;}')
|
|
374
|
+
fun3 = Function('float fn(float x){return $var1 + x;}')
|
|
375
|
+
exp1 = fun2(fun3(0.5))
|
|
376
|
+
fun1['var2'] = exp1
|
|
377
|
+
assert_changed(fun1)
|
|
378
|
+
|
|
379
|
+
fun2._dependents[ch_obj] = None
|
|
380
|
+
fun3._dependents[ch_obj] = None
|
|
381
|
+
exp1._dependents[ch_obj] = None
|
|
382
|
+
|
|
383
|
+
fun2['var1'] = 'x'
|
|
384
|
+
assert_changed(fun1, fun2, exp1)
|
|
385
|
+
|
|
386
|
+
fun3['var1'] = 'x'
|
|
387
|
+
assert_changed(fun1, fun3, exp1)
|
|
388
|
+
|
|
389
|
+
# test disconnect
|
|
390
|
+
fun1['var2'] = fun2
|
|
391
|
+
assert_changed(fun1)
|
|
392
|
+
# triggers change
|
|
393
|
+
fun2['var1'] = 0.9
|
|
394
|
+
assert_changed(fun1, fun2, exp1)
|
|
395
|
+
# no longer triggers change
|
|
396
|
+
fun3['var1'] = 0.9
|
|
397
|
+
assert_changed(fun3, exp1)
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def test_FunctionChain():
|
|
401
|
+
|
|
402
|
+
f1 = Function("void f1(){}")
|
|
403
|
+
f2 = Function("void f2(){}")
|
|
404
|
+
f3 = Function("float f3(vec3 x){}")
|
|
405
|
+
f4 = Function("vec3 f4(vec3 y){}")
|
|
406
|
+
f5 = Function("vec3 f5(vec4 z){}")
|
|
407
|
+
|
|
408
|
+
ch = FunctionChain('chain', [f1, f2])
|
|
409
|
+
assert ch.name == 'chain'
|
|
410
|
+
assert ch.args == []
|
|
411
|
+
assert ch.rtype == 'void'
|
|
412
|
+
|
|
413
|
+
assert_in('f1', ch.compile())
|
|
414
|
+
assert_in('f2', ch.compile())
|
|
415
|
+
|
|
416
|
+
ch.remove(f2)
|
|
417
|
+
assert_not_in('f2', ch.compile())
|
|
418
|
+
|
|
419
|
+
ch.append(f2)
|
|
420
|
+
assert_in('f2', ch.compile())
|
|
421
|
+
|
|
422
|
+
ch = FunctionChain(funcs=[f5, f4, f3])
|
|
423
|
+
assert_equal('float', ch.rtype)
|
|
424
|
+
assert_equal([('vec4', 'z')], ch.args)
|
|
425
|
+
assert_in('f3', ch.compile())
|
|
426
|
+
assert_in('f4', ch.compile())
|
|
427
|
+
assert_in('f5', ch.compile())
|
|
428
|
+
assert_in(f3, ch.dependencies())
|
|
429
|
+
assert_in(f4, ch.dependencies())
|
|
430
|
+
assert_in(f5, ch.dependencies())
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def test_StatementList():
|
|
434
|
+
func = Function("void func() {}")
|
|
435
|
+
main = Function("void main() {}")
|
|
436
|
+
main['pre'] = StatementList()
|
|
437
|
+
expr = func()
|
|
438
|
+
main['pre'].add(expr, 0)
|
|
439
|
+
assert list(main['pre'].items) == [expr]
|
|
440
|
+
main['pre'].add(expr)
|
|
441
|
+
assert list(main['pre'].items) == [expr]
|
|
442
|
+
|
|
443
|
+
code = main.compile()
|
|
444
|
+
assert " func();" in code
|
|
445
|
+
|
|
446
|
+
main['pre'].remove(expr)
|
|
447
|
+
assert list(main['pre'].items) == []
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def test_MainFunction():
|
|
451
|
+
code = """
|
|
452
|
+
const float pi = 3.0; // close enough.
|
|
453
|
+
|
|
454
|
+
vec4 rotate(vec4 pos) {
|
|
455
|
+
return pos; // just kidding.
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
attribute mat4 m_transform;
|
|
459
|
+
attribute vec4 a_pos;
|
|
460
|
+
void main() {
|
|
461
|
+
gl_Position = m_transform * a_pos;
|
|
462
|
+
}
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
mf = MainFunction('vertex', code)
|
|
466
|
+
|
|
467
|
+
assert mf.name == 'main'
|
|
468
|
+
assert mf.rtype == 'void'
|
|
469
|
+
assert len(mf.args) == 0
|
|
470
|
+
sn = set(mf.static_names())
|
|
471
|
+
assert sn == set(['pi', 'rotate', 'pos', 'm_transform', 'a_pos'])
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
if __name__ == '__main__':
|
|
475
|
+
for key in [key for key in globals()]:
|
|
476
|
+
if key.startswith('test_'):
|
|
477
|
+
func = globals()[key]
|
|
478
|
+
print('running', func.__name__)
|
|
479
|
+
func()
|
|
480
|
+
|
|
481
|
+
# Uncomment to run example
|
|
482
|
+
print('='*80)
|
|
483
|
+
test_example1()
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
from vispy.visuals.shaders import MultiProgram, Function, StatementList
|
|
5
|
+
from vispy.visuals.transforms import STTransform, MatrixTransform
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_multiprogram():
|
|
9
|
+
vert = """
|
|
10
|
+
uniform float u_scale;
|
|
11
|
+
|
|
12
|
+
void main() {
|
|
13
|
+
gl_Position = $transform(vec4(0, 0, 0, 0));
|
|
14
|
+
}
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
frag = """
|
|
18
|
+
void main() {
|
|
19
|
+
gl_FragColor = $color;
|
|
20
|
+
$post_hook
|
|
21
|
+
}
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
# test adding programs
|
|
25
|
+
mp = MultiProgram(vert, frag)
|
|
26
|
+
p1 = mp.add_program()
|
|
27
|
+
p2 = mp.add_program('p2')
|
|
28
|
+
assert 'p2' in mp._programs
|
|
29
|
+
|
|
30
|
+
# test weak reference to program
|
|
31
|
+
mp.add_program('junk')
|
|
32
|
+
assert 'junk' not in mp._programs and len(mp._programs) == 2
|
|
33
|
+
|
|
34
|
+
# test setting variables on multiprogram or individual programs
|
|
35
|
+
mp['u_scale'] = 2
|
|
36
|
+
assert p1['u_scale'] == 2
|
|
37
|
+
assert p2['u_scale'] == 2
|
|
38
|
+
|
|
39
|
+
p1['u_scale'] = 3
|
|
40
|
+
assert p1['u_scale'] == 3
|
|
41
|
+
assert p2['u_scale'] == 2
|
|
42
|
+
|
|
43
|
+
# test setting template variables globally
|
|
44
|
+
mp.frag['color'] = (1, 1, 1, 1)
|
|
45
|
+
assert p1.frag['color'].value == (1, 1, 1, 1)
|
|
46
|
+
assert p2.frag['color'].value == (1, 1, 1, 1)
|
|
47
|
+
|
|
48
|
+
# test setting template variables per-program
|
|
49
|
+
func = Function("""
|
|
50
|
+
void filter() {
|
|
51
|
+
gl_FragColor.r = 0.5;
|
|
52
|
+
}
|
|
53
|
+
""")
|
|
54
|
+
p1.frag['post_hook'] = StatementList()
|
|
55
|
+
p2.frag['post_hook'] = StatementList()
|
|
56
|
+
p2.frag['post_hook'].add(func())
|
|
57
|
+
|
|
58
|
+
tr1 = STTransform()
|
|
59
|
+
tr2 = MatrixTransform()
|
|
60
|
+
p1.vert['transform'] = tr1
|
|
61
|
+
p2.vert['transform'] = tr2
|
|
62
|
+
|
|
63
|
+
assert 'st_transform_map' in p1.vert.compile()
|
|
64
|
+
assert 'affine_transform_map' in p2.vert.compile()
|
|
65
|
+
assert 'filter' not in p1.frag.compile()
|
|
66
|
+
assert 'filter' in p2.frag.compile()
|
|
67
|
+
|
|
68
|
+
# test changing shader code
|
|
69
|
+
mp.vert = vert + '\n//test\n'
|
|
70
|
+
mp.vert['transform'] = tr1
|
|
71
|
+
assert '//test' in p1.vert.compile()
|
|
72
|
+
|
|
73
|
+
# test that newly-added programs inherit all previously set variables
|
|
74
|
+
p3 = mp.add_program()
|
|
75
|
+
assert p3['u_scale'] == 2
|
|
76
|
+
assert p3.frag['color'].value == (1, 1, 1, 1)
|
|
77
|
+
assert '//test' in p3.vert.compile()
|
|
78
|
+
assert 'st_transform_map' in p3.vert.compile()
|
|
@@ -0,0 +1,57 @@
|
|
|
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 re
|
|
5
|
+
|
|
6
|
+
from vispy.visuals.shaders.parsing import re_identifier, find_program_variables
|
|
7
|
+
from vispy.testing import run_tests_if_main
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_identifier():
|
|
11
|
+
assert(re.match('('+re_identifier+')', 'Ax2_d3__7').groups()[0] ==
|
|
12
|
+
'Ax2_d3__7')
|
|
13
|
+
assert(re.match('('+re_identifier+')', '_Ax2_d3__7').groups()[0] ==
|
|
14
|
+
'_Ax2_d3__7')
|
|
15
|
+
assert(re.match(re_identifier, '7Ax2_d3__7') is None)
|
|
16
|
+
assert(re.match('('+re_identifier+')', 'x,y').groups()[0] == 'x')
|
|
17
|
+
assert(re.match('('+re_identifier+')', 'x y').groups()[0] == 'x')
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_find_variables():
|
|
21
|
+
code = """
|
|
22
|
+
float x;
|
|
23
|
+
float y, z;
|
|
24
|
+
int w,v,u;
|
|
25
|
+
junk
|
|
26
|
+
vec4 t = vec4(0, 0, 1, 1);
|
|
27
|
+
junk junk junk;
|
|
28
|
+
uniform vec2 s;
|
|
29
|
+
attribute float r,q;
|
|
30
|
+
const mat4 p;
|
|
31
|
+
void main() {
|
|
32
|
+
vec2 float undetectable;
|
|
33
|
+
}
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
expect = dict(
|
|
37
|
+
x=(None, 'float'),
|
|
38
|
+
y=(None, 'float'),
|
|
39
|
+
z=(None, 'float'),
|
|
40
|
+
w=(None, 'int'),
|
|
41
|
+
v=(None, 'int'),
|
|
42
|
+
u=(None, 'int'),
|
|
43
|
+
t=(None, 'vec4'),
|
|
44
|
+
s=('uniform', 'vec2'),
|
|
45
|
+
q=('attribute', 'float'),
|
|
46
|
+
r=('attribute', 'float'),
|
|
47
|
+
p=('const', 'mat4'),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
vars = find_program_variables(code)
|
|
51
|
+
for k in expect:
|
|
52
|
+
assert expect[k] == vars.pop(k)
|
|
53
|
+
|
|
54
|
+
assert len(vars) == 0
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
run_tests_if_main()
|