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,564 @@
|
|
|
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 numpy as np
|
|
8
|
+
|
|
9
|
+
from ...util import transforms
|
|
10
|
+
from ...geometry import Rect
|
|
11
|
+
from ._util import arg_to_vec4, as_vec4
|
|
12
|
+
from .base_transform import BaseTransform
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NullTransform(BaseTransform):
|
|
16
|
+
"""Transform having no effect on coordinates (identity transform)."""
|
|
17
|
+
|
|
18
|
+
glsl_map = "vec4 null_transform_map(vec4 pos) {return pos;}"
|
|
19
|
+
glsl_imap = "vec4 null_transform_imap(vec4 pos) {return pos;}"
|
|
20
|
+
|
|
21
|
+
Linear = True
|
|
22
|
+
Orthogonal = True
|
|
23
|
+
NonScaling = True
|
|
24
|
+
Isometric = True
|
|
25
|
+
|
|
26
|
+
@arg_to_vec4
|
|
27
|
+
def map(self, coords):
|
|
28
|
+
"""Map coordinates
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
coords : array-like
|
|
33
|
+
Coordinates to map.
|
|
34
|
+
"""
|
|
35
|
+
return coords
|
|
36
|
+
|
|
37
|
+
def imap(self, coords):
|
|
38
|
+
"""Inverse map coordinates
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
coords : array-like
|
|
43
|
+
Coordinates to inverse map.
|
|
44
|
+
"""
|
|
45
|
+
return coords
|
|
46
|
+
|
|
47
|
+
def __mul__(self, tr):
|
|
48
|
+
return tr
|
|
49
|
+
|
|
50
|
+
def __rmul__(self, tr):
|
|
51
|
+
return tr
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class STTransform(BaseTransform):
|
|
55
|
+
"""Transform performing only scale and translate, in that order.
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
----------
|
|
59
|
+
scale : array-like
|
|
60
|
+
Scale factors for X, Y, Z axes.
|
|
61
|
+
translate : array-like
|
|
62
|
+
Scale factors for X, Y, Z axes.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
glsl_map = """
|
|
66
|
+
vec4 st_transform_map(vec4 pos) {
|
|
67
|
+
return vec4(pos.xyz * $scale.xyz + $translate.xyz * pos.w, pos.w);
|
|
68
|
+
}
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
glsl_imap = """
|
|
72
|
+
vec4 st_transform_imap(vec4 pos) {
|
|
73
|
+
return vec4((pos.xyz - $translate.xyz * pos.w) / $scale.xyz,
|
|
74
|
+
pos.w);
|
|
75
|
+
}
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
Linear = True
|
|
79
|
+
Orthogonal = True
|
|
80
|
+
NonScaling = False
|
|
81
|
+
Isometric = False
|
|
82
|
+
|
|
83
|
+
def __init__(self, scale=None, translate=None):
|
|
84
|
+
super(STTransform, self).__init__()
|
|
85
|
+
|
|
86
|
+
self._scale = np.ones(4, dtype=np.float32)
|
|
87
|
+
self._translate = np.zeros(4, dtype=np.float32)
|
|
88
|
+
|
|
89
|
+
s = ((1.0, 1.0, 1.0, 1.0) if scale is None else
|
|
90
|
+
as_vec4(scale, default=(1., 1., 1., 1.)))
|
|
91
|
+
t = ((0.0, 0.0, 0.0, 0.0) if translate is None else
|
|
92
|
+
as_vec4(translate, default=(0., 0., 0., 0.)))
|
|
93
|
+
self._set_st(s, t)
|
|
94
|
+
self._update_shaders()
|
|
95
|
+
|
|
96
|
+
@arg_to_vec4
|
|
97
|
+
def map(self, coords):
|
|
98
|
+
"""Map coordinates
|
|
99
|
+
|
|
100
|
+
Parameters
|
|
101
|
+
----------
|
|
102
|
+
coords : array-like
|
|
103
|
+
Coordinates to map.
|
|
104
|
+
|
|
105
|
+
Returns
|
|
106
|
+
-------
|
|
107
|
+
coords : ndarray
|
|
108
|
+
Coordinates.
|
|
109
|
+
"""
|
|
110
|
+
m = np.empty(coords.shape)
|
|
111
|
+
m[:, :3] = (coords[:, :3] * self.scale[np.newaxis, :3] +
|
|
112
|
+
coords[:, 3:] * self.translate[np.newaxis, :3])
|
|
113
|
+
m[:, 3] = coords[:, 3]
|
|
114
|
+
return m
|
|
115
|
+
|
|
116
|
+
@arg_to_vec4
|
|
117
|
+
def imap(self, coords):
|
|
118
|
+
"""Invert map coordinates
|
|
119
|
+
|
|
120
|
+
Parameters
|
|
121
|
+
----------
|
|
122
|
+
coords : array-like
|
|
123
|
+
Coordinates to inverse map.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
coords : ndarray
|
|
128
|
+
Coordinates.
|
|
129
|
+
"""
|
|
130
|
+
m = np.empty(coords.shape)
|
|
131
|
+
m[:, :3] = ((coords[:, :3] -
|
|
132
|
+
coords[:, 3:] * self.translate[np.newaxis, :3]) /
|
|
133
|
+
self.scale[np.newaxis, :3])
|
|
134
|
+
m[:, 3] = coords[:, 3]
|
|
135
|
+
return m
|
|
136
|
+
|
|
137
|
+
def shader_map(self):
|
|
138
|
+
return self._shader_map
|
|
139
|
+
|
|
140
|
+
def shader_imap(self):
|
|
141
|
+
return self._shader_imap
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def scale(self):
|
|
145
|
+
return self._scale.copy()
|
|
146
|
+
|
|
147
|
+
@scale.setter
|
|
148
|
+
def scale(self, s):
|
|
149
|
+
s = as_vec4(s, default=(1, 1, 1, 1))
|
|
150
|
+
self._set_st(scale=s)
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def translate(self):
|
|
154
|
+
return self._translate.copy()
|
|
155
|
+
|
|
156
|
+
@translate.setter
|
|
157
|
+
def translate(self, t):
|
|
158
|
+
t = as_vec4(t, default=(0, 0, 0, 0))
|
|
159
|
+
self._set_st(translate=t)
|
|
160
|
+
|
|
161
|
+
def _set_st(self, scale=None, translate=None, update=True):
|
|
162
|
+
need_update = False
|
|
163
|
+
|
|
164
|
+
if scale is not None and not np.all(scale == self._scale):
|
|
165
|
+
self._scale[:] = scale
|
|
166
|
+
need_update = True
|
|
167
|
+
|
|
168
|
+
if translate is not None and not np.all(translate == self._translate):
|
|
169
|
+
self._translate[:] = translate
|
|
170
|
+
need_update = True
|
|
171
|
+
|
|
172
|
+
if update and need_update:
|
|
173
|
+
self._update_shaders()
|
|
174
|
+
self.update() # inform listeners there has been a change
|
|
175
|
+
|
|
176
|
+
def _update_shaders(self):
|
|
177
|
+
self._shader_map['scale'] = self.scale
|
|
178
|
+
self._shader_map['translate'] = self.translate
|
|
179
|
+
self._shader_imap['scale'] = self.scale
|
|
180
|
+
self._shader_imap['translate'] = self.translate
|
|
181
|
+
|
|
182
|
+
def move(self, move):
|
|
183
|
+
"""Change the translation of this transform by the amount given.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
move : array-like
|
|
188
|
+
The values to be added to the current translation of the transform.
|
|
189
|
+
"""
|
|
190
|
+
move = as_vec4(move, default=(0, 0, 0, 0))
|
|
191
|
+
self.translate = self.translate + move
|
|
192
|
+
|
|
193
|
+
def zoom(self, zoom, center=(0, 0, 0), mapped=True):
|
|
194
|
+
"""Update the transform such that its scale factor is changed, but
|
|
195
|
+
the specified center point is left unchanged.
|
|
196
|
+
|
|
197
|
+
Parameters
|
|
198
|
+
----------
|
|
199
|
+
zoom : array-like
|
|
200
|
+
Values to multiply the transform's current scale
|
|
201
|
+
factors.
|
|
202
|
+
center : array-like
|
|
203
|
+
The center point around which the scaling will take place.
|
|
204
|
+
mapped : bool
|
|
205
|
+
Whether *center* is expressed in mapped coordinates (True) or
|
|
206
|
+
unmapped coordinates (False).
|
|
207
|
+
"""
|
|
208
|
+
zoom = as_vec4(zoom, default=(1, 1, 1, 1))
|
|
209
|
+
center = as_vec4(center, default=(0, 0, 0, 0))
|
|
210
|
+
scale = self.scale * zoom
|
|
211
|
+
if mapped:
|
|
212
|
+
trans = center - (center - self.translate) * zoom
|
|
213
|
+
else:
|
|
214
|
+
trans = self.scale * (1 - zoom) * center + self.translate
|
|
215
|
+
self._set_st(scale=scale, translate=trans)
|
|
216
|
+
|
|
217
|
+
def as_matrix(self):
|
|
218
|
+
m = MatrixTransform()
|
|
219
|
+
m.scale(self.scale)
|
|
220
|
+
m.translate(self.translate)
|
|
221
|
+
return m
|
|
222
|
+
|
|
223
|
+
@classmethod
|
|
224
|
+
def from_mapping(cls, x0, x1):
|
|
225
|
+
"""Create an STTransform from the given mapping
|
|
226
|
+
|
|
227
|
+
See `set_mapping` for details.
|
|
228
|
+
|
|
229
|
+
Parameters
|
|
230
|
+
----------
|
|
231
|
+
x0 : array-like
|
|
232
|
+
Start.
|
|
233
|
+
x1 : array-like
|
|
234
|
+
End.
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
t : instance of STTransform
|
|
239
|
+
The transform.
|
|
240
|
+
"""
|
|
241
|
+
t = cls()
|
|
242
|
+
t.set_mapping(x0, x1)
|
|
243
|
+
return t
|
|
244
|
+
|
|
245
|
+
def set_mapping(self, x0, x1, update=True):
|
|
246
|
+
"""Configure this transform such that it maps points x0 => x1
|
|
247
|
+
|
|
248
|
+
Parameters
|
|
249
|
+
----------
|
|
250
|
+
x0 : array-like, shape (2, 2) or (2, 3)
|
|
251
|
+
Start location.
|
|
252
|
+
x1 : array-like, shape (2, 2) or (2, 3)
|
|
253
|
+
End location.
|
|
254
|
+
update : bool
|
|
255
|
+
If False, then the update event is not emitted.
|
|
256
|
+
|
|
257
|
+
Examples
|
|
258
|
+
--------
|
|
259
|
+
For example, if we wish to map the corners of a rectangle::
|
|
260
|
+
|
|
261
|
+
>>> p1 = [[0, 0], [200, 300]]
|
|
262
|
+
|
|
263
|
+
onto a unit cube::
|
|
264
|
+
|
|
265
|
+
>>> p2 = [[-1, -1], [1, 1]]
|
|
266
|
+
|
|
267
|
+
then we can generate the transform as follows::
|
|
268
|
+
|
|
269
|
+
>>> tr = STTransform()
|
|
270
|
+
>>> tr.set_mapping(p1, p2)
|
|
271
|
+
>>> assert tr.map(p1)[:,:2] == p2 # test
|
|
272
|
+
"""
|
|
273
|
+
# if args are Rect, convert to array first
|
|
274
|
+
if isinstance(x0, Rect):
|
|
275
|
+
x0 = x0._transform_in()[:3]
|
|
276
|
+
if isinstance(x1, Rect):
|
|
277
|
+
x1 = x1._transform_in()[:3]
|
|
278
|
+
|
|
279
|
+
x0 = np.asarray(x0)
|
|
280
|
+
x1 = np.asarray(x1)
|
|
281
|
+
if (x0.ndim != 2 or x0.shape[0] != 2 or x1.ndim != 2 or
|
|
282
|
+
x1.shape[0] != 2):
|
|
283
|
+
raise TypeError("set_mapping requires array inputs of shape "
|
|
284
|
+
"(2, N).")
|
|
285
|
+
denom = x0[1] - x0[0]
|
|
286
|
+
mask = denom == 0
|
|
287
|
+
denom[mask] = 1.0
|
|
288
|
+
s = (x1[1] - x1[0]) / denom
|
|
289
|
+
s[mask] = 1.0
|
|
290
|
+
s[x0[1] == x0[0]] = 1.0
|
|
291
|
+
t = x1[0] - s * x0[0]
|
|
292
|
+
s = as_vec4(s, default=(1, 1, 1, 1))
|
|
293
|
+
t = as_vec4(t, default=(0, 0, 0, 0))
|
|
294
|
+
self._set_st(scale=s, translate=t, update=update)
|
|
295
|
+
|
|
296
|
+
def __mul__(self, tr):
|
|
297
|
+
if isinstance(tr, STTransform):
|
|
298
|
+
s = self.scale * tr.scale
|
|
299
|
+
t = self.translate + (tr.translate * self.scale)
|
|
300
|
+
return STTransform(scale=s, translate=t)
|
|
301
|
+
elif isinstance(tr, MatrixTransform):
|
|
302
|
+
return self.as_matrix() * tr
|
|
303
|
+
else:
|
|
304
|
+
return super(STTransform, self).__mul__(tr)
|
|
305
|
+
|
|
306
|
+
def __rmul__(self, tr):
|
|
307
|
+
if isinstance(tr, MatrixTransform):
|
|
308
|
+
return tr * self.as_matrix()
|
|
309
|
+
return super(STTransform, self).__rmul__(tr)
|
|
310
|
+
|
|
311
|
+
def __repr__(self):
|
|
312
|
+
return ("<STTransform scale=%s translate=%s at 0x%s>"
|
|
313
|
+
% (self.scale, self.translate, id(self)))
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
class MatrixTransform(BaseTransform):
|
|
317
|
+
"""Affine transformation class
|
|
318
|
+
|
|
319
|
+
Parameters
|
|
320
|
+
----------
|
|
321
|
+
matrix : array-like | None
|
|
322
|
+
4x4 array to use for the transform.
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
glsl_map = """
|
|
326
|
+
vec4 affine_transform_map(vec4 pos) {
|
|
327
|
+
return $matrix * pos;
|
|
328
|
+
}
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
glsl_imap = """
|
|
332
|
+
vec4 affine_transform_imap(vec4 pos) {
|
|
333
|
+
return $inv_matrix * pos;
|
|
334
|
+
}
|
|
335
|
+
"""
|
|
336
|
+
|
|
337
|
+
Linear = True
|
|
338
|
+
Orthogonal = False
|
|
339
|
+
NonScaling = False
|
|
340
|
+
Isometric = False
|
|
341
|
+
|
|
342
|
+
def __init__(self, matrix=None):
|
|
343
|
+
super(MatrixTransform, self).__init__()
|
|
344
|
+
if matrix is not None:
|
|
345
|
+
self.matrix = matrix
|
|
346
|
+
else:
|
|
347
|
+
self.reset()
|
|
348
|
+
|
|
349
|
+
@arg_to_vec4
|
|
350
|
+
def map(self, coords):
|
|
351
|
+
"""Map coordinates
|
|
352
|
+
|
|
353
|
+
Parameters
|
|
354
|
+
----------
|
|
355
|
+
coords : array-like
|
|
356
|
+
Coordinates to map.
|
|
357
|
+
|
|
358
|
+
Returns
|
|
359
|
+
-------
|
|
360
|
+
coords : ndarray
|
|
361
|
+
Coordinates.
|
|
362
|
+
"""
|
|
363
|
+
# looks backwards, but both matrices are transposed.
|
|
364
|
+
return np.dot(coords, self.matrix)
|
|
365
|
+
|
|
366
|
+
@arg_to_vec4
|
|
367
|
+
def imap(self, coords):
|
|
368
|
+
"""Inverse map coordinates
|
|
369
|
+
|
|
370
|
+
Parameters
|
|
371
|
+
----------
|
|
372
|
+
coords : array-like
|
|
373
|
+
Coordinates to inverse map.
|
|
374
|
+
|
|
375
|
+
Returns
|
|
376
|
+
-------
|
|
377
|
+
coords : ndarray
|
|
378
|
+
Coordinates.
|
|
379
|
+
"""
|
|
380
|
+
return np.dot(coords, self.inv_matrix)
|
|
381
|
+
|
|
382
|
+
def shader_map(self):
|
|
383
|
+
fn = super(MatrixTransform, self).shader_map()
|
|
384
|
+
fn['matrix'] = self.matrix # uniform mat4
|
|
385
|
+
return fn
|
|
386
|
+
|
|
387
|
+
def shader_imap(self):
|
|
388
|
+
fn = super(MatrixTransform, self).shader_imap()
|
|
389
|
+
fn['inv_matrix'] = self.inv_matrix # uniform mat4
|
|
390
|
+
return fn
|
|
391
|
+
|
|
392
|
+
@property
|
|
393
|
+
def matrix(self):
|
|
394
|
+
return self._matrix
|
|
395
|
+
|
|
396
|
+
@matrix.setter
|
|
397
|
+
def matrix(self, m):
|
|
398
|
+
self._matrix = m
|
|
399
|
+
self._inv_matrix = None
|
|
400
|
+
self.shader_map()
|
|
401
|
+
self.shader_imap()
|
|
402
|
+
self.update()
|
|
403
|
+
|
|
404
|
+
@property
|
|
405
|
+
def inv_matrix(self):
|
|
406
|
+
if self._inv_matrix is None:
|
|
407
|
+
self._inv_matrix = np.linalg.inv(self.matrix)
|
|
408
|
+
return self._inv_matrix
|
|
409
|
+
|
|
410
|
+
@arg_to_vec4
|
|
411
|
+
def translate(self, pos):
|
|
412
|
+
"""
|
|
413
|
+
Translate the matrix
|
|
414
|
+
|
|
415
|
+
The translation is applied *after* the transformations already present
|
|
416
|
+
in the matrix.
|
|
417
|
+
|
|
418
|
+
Parameters
|
|
419
|
+
----------
|
|
420
|
+
pos : arrayndarray
|
|
421
|
+
Position to translate by.
|
|
422
|
+
"""
|
|
423
|
+
self.matrix = np.dot(self.matrix, transforms.translate(pos[0, :3]))
|
|
424
|
+
|
|
425
|
+
def scale(self, scale, center=None):
|
|
426
|
+
"""
|
|
427
|
+
Scale the matrix about a given origin.
|
|
428
|
+
|
|
429
|
+
The scaling is applied *after* the transformations already present
|
|
430
|
+
in the matrix.
|
|
431
|
+
|
|
432
|
+
Parameters
|
|
433
|
+
----------
|
|
434
|
+
scale : array-like
|
|
435
|
+
Scale factors along x, y and z axes.
|
|
436
|
+
center : array-like or None
|
|
437
|
+
The x, y and z coordinates to scale around. If None,
|
|
438
|
+
(0, 0, 0) will be used.
|
|
439
|
+
"""
|
|
440
|
+
scale = transforms.scale(as_vec4(scale, default=(1, 1, 1, 1))[0, :3])
|
|
441
|
+
if center is not None:
|
|
442
|
+
center = as_vec4(center)[0, :3]
|
|
443
|
+
scale = np.dot(np.dot(transforms.translate(-center), scale),
|
|
444
|
+
transforms.translate(center))
|
|
445
|
+
self.matrix = np.dot(self.matrix, scale)
|
|
446
|
+
|
|
447
|
+
def rotate(self, angle, axis):
|
|
448
|
+
"""
|
|
449
|
+
Rotate the matrix by some angle about a given axis.
|
|
450
|
+
|
|
451
|
+
The rotation is applied *after* the transformations already present
|
|
452
|
+
in the matrix.
|
|
453
|
+
|
|
454
|
+
Parameters
|
|
455
|
+
----------
|
|
456
|
+
angle : float
|
|
457
|
+
The angle of rotation, in degrees.
|
|
458
|
+
axis : array-like
|
|
459
|
+
The x, y and z coordinates of the axis vector to rotate around.
|
|
460
|
+
"""
|
|
461
|
+
self.matrix = np.dot(self.matrix, transforms.rotate(angle, axis))
|
|
462
|
+
|
|
463
|
+
def set_mapping(self, points1, points2):
|
|
464
|
+
"""Set to a 3D transformation matrix that maps points1 onto points2.
|
|
465
|
+
|
|
466
|
+
Parameters
|
|
467
|
+
----------
|
|
468
|
+
points1 : array-like, shape (4, 3)
|
|
469
|
+
Four starting 3D coordinates.
|
|
470
|
+
points2 : array-like, shape (4, 3)
|
|
471
|
+
Four ending 3D coordinates.
|
|
472
|
+
"""
|
|
473
|
+
# note: need to transpose because util.functions uses opposite
|
|
474
|
+
# of standard linear algebra order.
|
|
475
|
+
self.matrix = transforms.affine_map(points1, points2).T
|
|
476
|
+
|
|
477
|
+
def set_ortho(self, l, r, b, t, n, f): # noqa
|
|
478
|
+
"""Set ortho transform
|
|
479
|
+
|
|
480
|
+
Parameters
|
|
481
|
+
----------
|
|
482
|
+
l : float
|
|
483
|
+
Left.
|
|
484
|
+
r : float
|
|
485
|
+
Right.
|
|
486
|
+
b : float
|
|
487
|
+
Bottom.
|
|
488
|
+
t : float
|
|
489
|
+
Top.
|
|
490
|
+
n : float
|
|
491
|
+
Near.
|
|
492
|
+
f : float
|
|
493
|
+
Far.
|
|
494
|
+
"""
|
|
495
|
+
self.matrix = transforms.ortho(l, r, b, t, n, f)
|
|
496
|
+
|
|
497
|
+
def reset(self):
|
|
498
|
+
self.matrix = np.eye(4)
|
|
499
|
+
|
|
500
|
+
def __mul__(self, tr):
|
|
501
|
+
if (isinstance(tr, MatrixTransform) and not
|
|
502
|
+
any(tr.matrix[:3, 3] != 0)):
|
|
503
|
+
# don't multiply if the perspective column is used
|
|
504
|
+
return MatrixTransform(matrix=np.dot(tr.matrix, self.matrix))
|
|
505
|
+
else:
|
|
506
|
+
return tr.__rmul__(self)
|
|
507
|
+
|
|
508
|
+
def __repr__(self):
|
|
509
|
+
s = "%s(matrix=[" % self.__class__.__name__
|
|
510
|
+
indent = " "*len(s)
|
|
511
|
+
s += str(list(self.matrix[0])) + ",\n"
|
|
512
|
+
s += indent + str(list(self.matrix[1])) + ",\n"
|
|
513
|
+
s += indent + str(list(self.matrix[2])) + ",\n"
|
|
514
|
+
s += indent + str(list(self.matrix[3])) + "] at 0x%x)" % id(self)
|
|
515
|
+
return s
|
|
516
|
+
|
|
517
|
+
def set_perspective(self, fov, aspect, near, far):
|
|
518
|
+
"""Set the perspective
|
|
519
|
+
|
|
520
|
+
Parameters
|
|
521
|
+
----------
|
|
522
|
+
fov : float
|
|
523
|
+
Field of view.
|
|
524
|
+
aspect : float
|
|
525
|
+
Aspect ratio.
|
|
526
|
+
near : float
|
|
527
|
+
Near location.
|
|
528
|
+
far : float
|
|
529
|
+
Far location.
|
|
530
|
+
"""
|
|
531
|
+
self.matrix = transforms.perspective(fov, aspect, near, far)
|
|
532
|
+
|
|
533
|
+
def set_frustum(self, l, r, b, t, n, f): # noqa
|
|
534
|
+
"""Set the frustum
|
|
535
|
+
|
|
536
|
+
Parameters
|
|
537
|
+
----------
|
|
538
|
+
l : float
|
|
539
|
+
Left.
|
|
540
|
+
r : float
|
|
541
|
+
Right.
|
|
542
|
+
b : float
|
|
543
|
+
Bottom.
|
|
544
|
+
t : float
|
|
545
|
+
Top.
|
|
546
|
+
n : float
|
|
547
|
+
Near.
|
|
548
|
+
f : float
|
|
549
|
+
Far.
|
|
550
|
+
"""
|
|
551
|
+
self.matrix = transforms.frustum(l, r, b, t, n, f)
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
# class SRTTransform(BaseTransform):
|
|
555
|
+
# """ Transform performing scale, rotate, and translate, in that order.
|
|
556
|
+
#
|
|
557
|
+
# This transformation allows objects to be placed arbitrarily in a scene
|
|
558
|
+
# much the same way MatrixTransform does. However, an incorrect order of
|
|
559
|
+
# operations in MatrixTransform may result in shearing the object (if scale
|
|
560
|
+
# is applied after rotate) or in unpredictable translation (if scale/rotate
|
|
561
|
+
# is applied after translation). SRTTransform avoids these problems by
|
|
562
|
+
# enforcing the correct order of operations.
|
|
563
|
+
# """
|
|
564
|
+
# # TODO
|