vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +968 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +134 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +698 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +506 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1045 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +173 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +17 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +163 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +796 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +810 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +6 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
"""
|
|
5
|
+
Provides classes representing different transform types suitable for
|
|
6
|
+
use with visuals and scenes.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from .base_transform import BaseTransform # noqa
|
|
11
|
+
from .linear import (NullTransform, STTransform, # noqa
|
|
12
|
+
MatrixTransform) # noqa
|
|
13
|
+
from .nonlinear import LogTransform, PolarTransform # noqa
|
|
14
|
+
from .interactive import PanZoomTransform
|
|
15
|
+
from .chain import ChainTransform # noqa
|
|
16
|
+
from ._util import arg_to_array, arg_to_vec4, as_vec4, TransformCache # noqa
|
|
17
|
+
from .transform_system import TransformSystem
|
|
18
|
+
|
|
19
|
+
__all__ = ['NullTransform', 'STTransform',
|
|
20
|
+
'MatrixTransform', 'LogTransform', 'PolarTransform',
|
|
21
|
+
'ChainTransform', 'TransformSystem', 'PanZoomTransform']
|
|
22
|
+
|
|
23
|
+
transform_types = {}
|
|
24
|
+
for o in list(globals().values()):
|
|
25
|
+
try:
|
|
26
|
+
if issubclass(o, BaseTransform) and o is not BaseTransform:
|
|
27
|
+
name = o.__name__[:-len('Transform')].lower()
|
|
28
|
+
transform_types[name] = o
|
|
29
|
+
except TypeError:
|
|
30
|
+
continue
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def create_transform(type, *args, **kwargs):
|
|
34
|
+
return transform_types[type](*args, **kwargs)
|
|
@@ -0,0 +1,191 @@
|
|
|
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
|
+
from __future__ import division
|
|
6
|
+
|
|
7
|
+
import functools
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from ...util import logger
|
|
11
|
+
from functools import wraps
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def arg_to_array(func):
|
|
15
|
+
"""
|
|
16
|
+
Decorator to convert argument to array.
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
func : function
|
|
21
|
+
The function to decorate.
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
func : function
|
|
26
|
+
The decorated function.
|
|
27
|
+
"""
|
|
28
|
+
@wraps(func)
|
|
29
|
+
def fn(self, arg, *args, **kwargs):
|
|
30
|
+
"""Function
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
arg : array-like
|
|
35
|
+
Argument to convert.
|
|
36
|
+
*args : tuple
|
|
37
|
+
Arguments.
|
|
38
|
+
**kwargs : dict
|
|
39
|
+
Keyword arguments.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
value : object
|
|
44
|
+
The return value of the function.
|
|
45
|
+
"""
|
|
46
|
+
return func(self, np.array(arg), *args, **kwargs)
|
|
47
|
+
return fn
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def as_vec4(obj, default=(0, 0, 0, 1)):
|
|
51
|
+
"""
|
|
52
|
+
Convert `obj` to 4-element vector (numpy array with shape[-1] == 4)
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
obj : array-like
|
|
57
|
+
Original object.
|
|
58
|
+
default : array-like
|
|
59
|
+
The defaults to use if the object does not have 4 entries.
|
|
60
|
+
|
|
61
|
+
Returns
|
|
62
|
+
-------
|
|
63
|
+
obj : array-like
|
|
64
|
+
The object promoted to have 4 elements.
|
|
65
|
+
|
|
66
|
+
Notes
|
|
67
|
+
-----
|
|
68
|
+
`obj` will have at least two dimensions.
|
|
69
|
+
|
|
70
|
+
If `obj` has < 4 elements, then new elements are added from `default`.
|
|
71
|
+
For inputs intended as a position or translation, use default=(0,0,0,1).
|
|
72
|
+
For inputs intended as scale factors, use default=(1,1,1,1).
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
obj = np.atleast_2d(obj)
|
|
76
|
+
# For multiple vectors, reshape to (..., 4)
|
|
77
|
+
if obj.shape[-1] < 4:
|
|
78
|
+
new = np.empty(obj.shape[:-1] + (4,), dtype=obj.dtype)
|
|
79
|
+
new[:] = default
|
|
80
|
+
new[..., :obj.shape[-1]] = obj
|
|
81
|
+
obj = new
|
|
82
|
+
elif obj.shape[-1] > 4:
|
|
83
|
+
raise TypeError("Array shape %s cannot be converted to vec4"
|
|
84
|
+
% (obj.shape, ))
|
|
85
|
+
return obj
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def arg_to_vec4(func):
|
|
89
|
+
"""
|
|
90
|
+
Decorator for converting argument to vec4 format suitable for 4x4 matrix
|
|
91
|
+
multiplication.
|
|
92
|
+
|
|
93
|
+
[x, y] => [[x, y, 0, 1]]
|
|
94
|
+
|
|
95
|
+
[x, y, z] => [[x, y, z, 1]]
|
|
96
|
+
|
|
97
|
+
[[x1, y1], [[x1, y1, 0, 1],
|
|
98
|
+
[x2, y2], => [x2, y2, 0, 1],
|
|
99
|
+
[x3, y3]] [x3, y3, 0, 1]]
|
|
100
|
+
|
|
101
|
+
If 1D input is provided, then the return value will be flattened.
|
|
102
|
+
Accepts input of any dimension, as long as shape[-1] <= 4
|
|
103
|
+
|
|
104
|
+
Alternatively, any class may define its own transform conversion interface
|
|
105
|
+
by defining a _transform_in() method that returns an array with shape
|
|
106
|
+
(.., 4), and a _transform_out() method that accepts the same array shape
|
|
107
|
+
and returns a new (mapped) object.
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
@functools.wraps(func)
|
|
112
|
+
def wrapper(self_, arg, *args, **kwargs):
|
|
113
|
+
if isinstance(arg, (tuple, list, np.ndarray)):
|
|
114
|
+
arg = np.array(arg)
|
|
115
|
+
flatten = arg.ndim == 1
|
|
116
|
+
arg = as_vec4(arg)
|
|
117
|
+
|
|
118
|
+
ret = func(self_, arg, *args, **kwargs)
|
|
119
|
+
if flatten and ret is not None:
|
|
120
|
+
return ret.flatten()
|
|
121
|
+
return ret
|
|
122
|
+
elif hasattr(arg, '_transform_in'):
|
|
123
|
+
arr = arg._transform_in()
|
|
124
|
+
ret = func(self_, arr, *args, **kwargs)
|
|
125
|
+
return arg._transform_out(ret)
|
|
126
|
+
else:
|
|
127
|
+
raise TypeError("Cannot convert argument to 4D vector: %s" % arg)
|
|
128
|
+
|
|
129
|
+
return wrapper
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class TransformCache(object):
|
|
133
|
+
"""Utility class for managing a cache of ChainTransforms.
|
|
134
|
+
|
|
135
|
+
This is an LRU cache; items are removed if they are not accessed after
|
|
136
|
+
*max_age* calls to roll().
|
|
137
|
+
|
|
138
|
+
Notes
|
|
139
|
+
-----
|
|
140
|
+
This class is used by SceneCanvas to ensure that ChainTransform instances
|
|
141
|
+
are re-used across calls to draw_visual(). SceneCanvas creates one
|
|
142
|
+
TransformCache instance for each top-level visual drawn, and calls
|
|
143
|
+
roll() on each cache before drawing, which removes from the cache any
|
|
144
|
+
transforms that were not accessed during the last draw cycle.
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
def __init__(self, max_age=1):
|
|
148
|
+
self._cache = {} # maps {key: [age, transform]}
|
|
149
|
+
self.max_age = max_age
|
|
150
|
+
|
|
151
|
+
def get(self, path):
|
|
152
|
+
"""Get a transform from the cache that maps along *path*, which must
|
|
153
|
+
be a list of Transforms to apply in reverse order (last transform is
|
|
154
|
+
applied first).
|
|
155
|
+
|
|
156
|
+
Accessed items have their age reset to 0.
|
|
157
|
+
"""
|
|
158
|
+
key = tuple(map(id, path))
|
|
159
|
+
item = self._cache.get(key, None)
|
|
160
|
+
if item is None:
|
|
161
|
+
logger.debug("Transform cache miss: %s", key)
|
|
162
|
+
item = [0, self._create(path)]
|
|
163
|
+
self._cache[key] = item
|
|
164
|
+
item[0] = 0 # reset age for this item
|
|
165
|
+
|
|
166
|
+
# make sure the chain is up to date
|
|
167
|
+
# tr = item[1]
|
|
168
|
+
# for i, node in enumerate(path[1:]):
|
|
169
|
+
# if tr.transforms[i] is not node.transform:
|
|
170
|
+
# tr[i] = node.transform
|
|
171
|
+
|
|
172
|
+
return item[1]
|
|
173
|
+
|
|
174
|
+
def _create(self, path):
|
|
175
|
+
# import here to avoid import cycle
|
|
176
|
+
from .chain import ChainTransform
|
|
177
|
+
return ChainTransform(path)
|
|
178
|
+
|
|
179
|
+
def roll(self):
|
|
180
|
+
"""Increase the age of all items in the cache by 1. Items whose age
|
|
181
|
+
is greater than self.max_age will be removed from the cache.
|
|
182
|
+
"""
|
|
183
|
+
rem = []
|
|
184
|
+
for key, item in self._cache.items():
|
|
185
|
+
if item[0] > self.max_age:
|
|
186
|
+
rem.append(key)
|
|
187
|
+
item[0] += 1
|
|
188
|
+
|
|
189
|
+
for key in rem:
|
|
190
|
+
logger.debug("TransformCache remove: %s", key)
|
|
191
|
+
del self._cache[key]
|
|
@@ -0,0 +1,233 @@
|
|
|
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
|
+
API Issues to work out:
|
|
7
|
+
|
|
8
|
+
- MatrixTransform and STTransform both have 'scale' and 'translate'
|
|
9
|
+
attributes, but they are used in very different ways. It would be nice
|
|
10
|
+
to keep this consistent, but how?
|
|
11
|
+
|
|
12
|
+
- Need a transform.map_rect function that returns the bounding rectangle of
|
|
13
|
+
a rect after transformation. Non-linear transforms might need to work
|
|
14
|
+
harder at this, but we can provide a default implementation that
|
|
15
|
+
works by mapping a selection of points across a grid within the original
|
|
16
|
+
rect.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import division
|
|
20
|
+
|
|
21
|
+
from ..shaders import Function
|
|
22
|
+
from ...util.event import EventEmitter
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BaseTransform(object):
|
|
26
|
+
"""
|
|
27
|
+
BaseTransform is a base class that defines a pair of complementary
|
|
28
|
+
coordinate mapping functions in both python and GLSL.
|
|
29
|
+
|
|
30
|
+
All BaseTransform subclasses define map() and imap() methods that map
|
|
31
|
+
an object through the forward or inverse transformation, respectively.
|
|
32
|
+
|
|
33
|
+
The two class variables glsl_map and glsl_imap are instances of
|
|
34
|
+
shaders.Function that define the forward- and inverse-mapping GLSL
|
|
35
|
+
function code.
|
|
36
|
+
|
|
37
|
+
Optionally, an inverse() method returns a new transform performing the
|
|
38
|
+
inverse mapping.
|
|
39
|
+
|
|
40
|
+
Note that although all classes should define both map() and imap(), it
|
|
41
|
+
is not necessarily the case that imap(map(x)) == x; there may be instances
|
|
42
|
+
where the inverse mapping is ambiguous or otherwise meaningless.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
glsl_map = None # Must be GLSL code
|
|
46
|
+
glsl_imap = None
|
|
47
|
+
|
|
48
|
+
# Flags used to describe the transformation. Subclasses should define each
|
|
49
|
+
# as True or False.
|
|
50
|
+
# (usually used for making optimization decisions)
|
|
51
|
+
|
|
52
|
+
# If True, then for any 3 colinear points, the
|
|
53
|
+
# transformed points will also be colinear.
|
|
54
|
+
Linear = None
|
|
55
|
+
|
|
56
|
+
# The transformation's effect on one axis is independent
|
|
57
|
+
# of the input position along any other axis.
|
|
58
|
+
Orthogonal = None
|
|
59
|
+
|
|
60
|
+
# If True, then the distance between two points is the
|
|
61
|
+
# same as the distance between the transformed points.
|
|
62
|
+
NonScaling = None
|
|
63
|
+
|
|
64
|
+
# Scale factors are applied equally to all axes.
|
|
65
|
+
Isometric = None
|
|
66
|
+
|
|
67
|
+
def __init__(self):
|
|
68
|
+
self._inverse = None
|
|
69
|
+
self._dynamic = False
|
|
70
|
+
self.changed = EventEmitter(source=self, type='transform_changed')
|
|
71
|
+
if self.glsl_map is not None:
|
|
72
|
+
self._shader_map = Function(self.glsl_map)
|
|
73
|
+
if self.glsl_imap is not None:
|
|
74
|
+
self._shader_imap = Function(self.glsl_imap)
|
|
75
|
+
|
|
76
|
+
def map(self, obj):
|
|
77
|
+
"""
|
|
78
|
+
Return *obj* mapped through the forward transformation.
|
|
79
|
+
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
obj : tuple (x,y) or (x,y,z)
|
|
83
|
+
array with shape (..., 2) or (..., 3)
|
|
84
|
+
"""
|
|
85
|
+
raise NotImplementedError()
|
|
86
|
+
|
|
87
|
+
def imap(self, obj):
|
|
88
|
+
"""
|
|
89
|
+
Return *obj* mapped through the inverse transformation.
|
|
90
|
+
|
|
91
|
+
Parameters
|
|
92
|
+
----------
|
|
93
|
+
obj : tuple (x,y) or (x,y,z)
|
|
94
|
+
array with shape (..., 2) or (..., 3)
|
|
95
|
+
"""
|
|
96
|
+
raise NotImplementedError()
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def inverse(self):
|
|
100
|
+
"""The inverse of this transform."""
|
|
101
|
+
if self._inverse is None:
|
|
102
|
+
self._inverse = InverseTransform(self)
|
|
103
|
+
return self._inverse
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def dynamic(self):
|
|
107
|
+
"""Boolean flag that indicates whether this transform is expected to
|
|
108
|
+
change frequently.
|
|
109
|
+
|
|
110
|
+
Transforms that are flagged as dynamic will not be collapsed in
|
|
111
|
+
``ChainTransform.simplified``. This allows changes to the transform
|
|
112
|
+
to propagate through the chain without requiring the chain to be
|
|
113
|
+
re-simplified.
|
|
114
|
+
"""
|
|
115
|
+
return self._dynamic
|
|
116
|
+
|
|
117
|
+
@dynamic.setter
|
|
118
|
+
def dynamic(self, d):
|
|
119
|
+
self._dynamic = d
|
|
120
|
+
|
|
121
|
+
def shader_map(self):
|
|
122
|
+
"""
|
|
123
|
+
Return a shader Function that accepts only a single vec4 argument
|
|
124
|
+
and defines new attributes / uniforms supplying the Function with
|
|
125
|
+
any static input.
|
|
126
|
+
"""
|
|
127
|
+
return self._shader_map
|
|
128
|
+
|
|
129
|
+
def shader_imap(self):
|
|
130
|
+
"""See shader_map."""
|
|
131
|
+
return self._shader_imap
|
|
132
|
+
|
|
133
|
+
def _shader_object(self):
|
|
134
|
+
"""This method allows transforms to be assigned directly to shader
|
|
135
|
+
template variables.
|
|
136
|
+
|
|
137
|
+
Example::
|
|
138
|
+
|
|
139
|
+
code = 'void main() { gl_Position = $transform($position); }'
|
|
140
|
+
func = shaders.Function(code)
|
|
141
|
+
tr = STTransform()
|
|
142
|
+
func['transform'] = tr # use tr's forward mapping for $function
|
|
143
|
+
"""
|
|
144
|
+
return self.shader_map()
|
|
145
|
+
|
|
146
|
+
def update(self, *args):
|
|
147
|
+
"""Called to inform any listeners that this transform has changed."""
|
|
148
|
+
self.changed(*args)
|
|
149
|
+
|
|
150
|
+
def __mul__(self, tr):
|
|
151
|
+
"""
|
|
152
|
+
Transform multiplication returns a new transform that is equivalent to
|
|
153
|
+
the two operands performed in series.
|
|
154
|
+
|
|
155
|
+
By default, multiplying two Transforms `A * B` will return
|
|
156
|
+
ChainTransform([A, B]). Subclasses may redefine this operation to
|
|
157
|
+
return more optimized results.
|
|
158
|
+
|
|
159
|
+
To ensure that both operands have a chance to simplify the operation,
|
|
160
|
+
all subclasses should follow the same procedure. For `A * B`:
|
|
161
|
+
|
|
162
|
+
1. A.__mul__(B) attempts to generate an optimized transform product.
|
|
163
|
+
2. If that fails, it must:
|
|
164
|
+
|
|
165
|
+
* return super(A).__mul__(B) OR
|
|
166
|
+
* return NotImplemented if the superclass would return an
|
|
167
|
+
invalid result.
|
|
168
|
+
|
|
169
|
+
3. When BaseTransform.__mul__(A, B) is called, it returns
|
|
170
|
+
NotImplemented, which causes B.__rmul__(A) to be invoked.
|
|
171
|
+
4. B.__rmul__(A) attempts to generate an optimized transform product.
|
|
172
|
+
5. If that fails, it must:
|
|
173
|
+
|
|
174
|
+
* return super(B).__rmul__(A) OR
|
|
175
|
+
* return ChainTransform([B, A]) if the superclass would return
|
|
176
|
+
an invalid result.
|
|
177
|
+
|
|
178
|
+
6. When BaseTransform.__rmul__(B, A) is called, ChainTransform([A, B])
|
|
179
|
+
is returned.
|
|
180
|
+
"""
|
|
181
|
+
# switch to __rmul__ attempts.
|
|
182
|
+
# Don't use the "return NotImplemted" trick, because that won't work if
|
|
183
|
+
# self and tr are of the same type.
|
|
184
|
+
return tr.__rmul__(self)
|
|
185
|
+
|
|
186
|
+
def __rmul__(self, tr):
|
|
187
|
+
return ChainTransform([tr, self])
|
|
188
|
+
|
|
189
|
+
def __repr__(self):
|
|
190
|
+
return "<%s at 0x%x>" % (self.__class__.__name__, id(self))
|
|
191
|
+
|
|
192
|
+
def __del__(self):
|
|
193
|
+
# we can remove ourselves from *all* events in this situation.
|
|
194
|
+
self.changed.disconnect()
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class InverseTransform(BaseTransform):
|
|
198
|
+
def __init__(self, transform):
|
|
199
|
+
BaseTransform.__init__(self)
|
|
200
|
+
self._inverse = transform
|
|
201
|
+
self.map = transform.imap
|
|
202
|
+
self.imap = transform.map
|
|
203
|
+
|
|
204
|
+
@property
|
|
205
|
+
def Linear(self):
|
|
206
|
+
return self._inverse.Linear
|
|
207
|
+
|
|
208
|
+
@property
|
|
209
|
+
def Orthogonal(self):
|
|
210
|
+
return self._inverse.Orthogonal
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def NonScaling(self):
|
|
214
|
+
return self._inverse.NonScaling
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def Isometric(self):
|
|
218
|
+
return self._inverse.Isometric
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def shader_map(self):
|
|
222
|
+
return self._inverse.shader_imap
|
|
223
|
+
|
|
224
|
+
@property
|
|
225
|
+
def shader_imap(self):
|
|
226
|
+
return self._inverse.shader_map
|
|
227
|
+
|
|
228
|
+
def __repr__(self):
|
|
229
|
+
return ("<Inverse of %r>" % repr(self._inverse))
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
# import here to avoid import cycle; needed for BaseTransform.__mul__.
|
|
233
|
+
from .chain import ChainTransform # noqa
|