vispy 0.14.0__cp311-cp311-macosx_11_0_arm64.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-311-darwin.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 +5 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
vispy/ext/gdi32plus.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
# Adapted from Pyglet
|
|
8
|
+
|
|
9
|
+
import atexit
|
|
10
|
+
from functools import partial
|
|
11
|
+
import struct
|
|
12
|
+
|
|
13
|
+
from ctypes import (windll, Structure, POINTER, byref, WINFUNCTYPE,
|
|
14
|
+
c_uint, c_float, c_int, c_ulong, c_uint64,
|
|
15
|
+
c_void_p, c_uint32, c_wchar, c_wchar_p)
|
|
16
|
+
from ctypes.wintypes import (LONG, BYTE, HFONT, HGDIOBJ, BOOL, UINT, INT,
|
|
17
|
+
DWORD, LPARAM)
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
import _winreg as winreg
|
|
21
|
+
except ImportError:
|
|
22
|
+
import winreg # noqa, analysis:ignore
|
|
23
|
+
|
|
24
|
+
_64_bit = (8 * struct.calcsize("P")) == 64
|
|
25
|
+
|
|
26
|
+
LF_FACESIZE = 32
|
|
27
|
+
FW_BOLD = 700
|
|
28
|
+
FW_NORMAL = 400
|
|
29
|
+
ANTIALIASED_QUALITY = 4
|
|
30
|
+
FontStyleBold = 1
|
|
31
|
+
FontStyleItalic = 2
|
|
32
|
+
UnitPixel = 2
|
|
33
|
+
UnitPoint = 3
|
|
34
|
+
DEFAULT_CHARSET = 1
|
|
35
|
+
ANSI_CHARSET = 0
|
|
36
|
+
TRUETYPE_FONTTYPE = 4
|
|
37
|
+
GM_ADVANCED = 2
|
|
38
|
+
CSIDL_FONTS = 0x0014
|
|
39
|
+
|
|
40
|
+
PixelFormat24bppRGB = 137224
|
|
41
|
+
PixelFormat32bppRGB = 139273
|
|
42
|
+
PixelFormat32bppARGB = 2498570
|
|
43
|
+
|
|
44
|
+
DriverStringOptionsCmapLookup = 1
|
|
45
|
+
DriverStringOptionsRealizedAdvance = 4
|
|
46
|
+
TextRenderingHintAntiAlias = 4
|
|
47
|
+
TextRenderingHintAntiAliasGridFit = 3
|
|
48
|
+
ImageLockModeRead = 1
|
|
49
|
+
StringFormatFlagsMeasureTrailingSpaces = 0x00000800
|
|
50
|
+
StringFormatFlagsNoClip = 0x00004000
|
|
51
|
+
StringFormatFlagsNoFitBlackBox = 0x00000004
|
|
52
|
+
|
|
53
|
+
INT_PTR = c_int
|
|
54
|
+
REAL = c_float
|
|
55
|
+
TCHAR = c_wchar
|
|
56
|
+
UINT32 = c_uint32
|
|
57
|
+
HDC = c_void_p
|
|
58
|
+
PSTR = c_uint64 if _64_bit else c_uint
|
|
59
|
+
|
|
60
|
+
HORZSIZE = 4
|
|
61
|
+
VERTSIZE = 6
|
|
62
|
+
|
|
63
|
+
HORZRES = 8
|
|
64
|
+
VERTRES = 10
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# gdi32
|
|
68
|
+
|
|
69
|
+
class POINT(Structure):
|
|
70
|
+
_fields_ = [('x', LONG), ('y', LONG)]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class RECT(Structure):
|
|
74
|
+
_fields_ = [('left', LONG), ('top', LONG),
|
|
75
|
+
('right', LONG), ('bottom', LONG)]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PANOSE(Structure):
|
|
79
|
+
_fields_ = [
|
|
80
|
+
('bFamilyType', BYTE), ('bSerifStyle', BYTE), ('bWeight', BYTE),
|
|
81
|
+
('bProportion', BYTE), ('bContrast', BYTE), ('bStrokeVariation', BYTE),
|
|
82
|
+
('bArmStyle', BYTE), ('bLetterform', BYTE), ('bMidline', BYTE),
|
|
83
|
+
('bXHeight', BYTE)]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class TEXTMETRIC(Structure):
|
|
87
|
+
_fields_ = [
|
|
88
|
+
('tmHeight', LONG), ('tmAscent', LONG), ('tmDescent', LONG),
|
|
89
|
+
('tmInternalLeading', LONG), ('tmExternalLeading', LONG),
|
|
90
|
+
('tmAveCharWidth', LONG), ('tmMaxCharWidth', LONG),
|
|
91
|
+
('tmWeight', LONG), ('tmOverhang', LONG),
|
|
92
|
+
('tmDigitizedAspectX', LONG), ('tmDigitizedAspectY', LONG),
|
|
93
|
+
('tmFirstChar', TCHAR), ('tmLastChar', TCHAR),
|
|
94
|
+
('tmDefaultChar', TCHAR), ('tmBreakChar', TCHAR),
|
|
95
|
+
('tmItalic', BYTE), ('tmUnderlined', BYTE),
|
|
96
|
+
('tmStruckOut', BYTE), ('tmPitchAndFamily', BYTE),
|
|
97
|
+
('tmCharSet', BYTE)]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class OUTLINETEXTMETRIC(Structure):
|
|
101
|
+
_fields_ = [
|
|
102
|
+
('otmSize', UINT), ('otmTextMetrics', TEXTMETRIC),
|
|
103
|
+
('otmMysteryBytes', BYTE), ('otmPanoseNumber', PANOSE),
|
|
104
|
+
('otmMysteryByte', BYTE),
|
|
105
|
+
('otmfsSelection', UINT), ('otmfsType', UINT),
|
|
106
|
+
('otmsCharSlopeRise', INT), ('otmsCharSlopeRun', INT),
|
|
107
|
+
('otmItalicAngle', INT), ('otmEMSquare', UINT), ('otmAscent', INT),
|
|
108
|
+
('otmDescent', INT), ('otmLineGap', UINT), ('otmsCapEmHeight', UINT),
|
|
109
|
+
('otmsXHeight', UINT), ('otmrcFontBox', RECT), ('otmMacAscent', INT),
|
|
110
|
+
('otmMacDescent', INT), ('otmMacLineGap', UINT),
|
|
111
|
+
('otmusMinimumPPEM', UINT), ('otmptSubscriptSize', POINT),
|
|
112
|
+
('otmptSubscriptOffset', POINT), ('otmptSuperscriptSize', POINT),
|
|
113
|
+
('otmptSuperscriptOffset', POINT), ('otmsStrikeoutSize', UINT),
|
|
114
|
+
('otmsStrikeoutPosition', INT), ('otmsUnderscoreSize', INT),
|
|
115
|
+
('otmsUnderscorePosition', INT), ('otmpFamilyName', PSTR),
|
|
116
|
+
('otmpFaceName', PSTR), ('otmpStyleName', PSTR),
|
|
117
|
+
('otmpFullName', PSTR), ('junk', (BYTE) * 1024)] # room for strs
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class LOGFONT(Structure):
|
|
121
|
+
_fields_ = [
|
|
122
|
+
('lfHeight', LONG), ('lfWidth', LONG), ('lfEscapement', LONG),
|
|
123
|
+
('lfOrientation', LONG), ('lfWeight', LONG), ('lfItalic', BYTE),
|
|
124
|
+
('lfUnderline', BYTE), ('lfStrikeOut', BYTE), ('lfCharSet', BYTE),
|
|
125
|
+
('lfOutPrecision', BYTE), ('lfClipPrecision', BYTE),
|
|
126
|
+
('lfQuality', BYTE), ('lfPitchAndFamily', BYTE),
|
|
127
|
+
('lfFaceName', (TCHAR * LF_FACESIZE))]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
gdi32 = windll.gdi32
|
|
131
|
+
|
|
132
|
+
gdi32.CreateFontIndirectW.restype = HFONT
|
|
133
|
+
gdi32.CreateFontIndirectW.argtypes = [POINTER(LOGFONT)]
|
|
134
|
+
|
|
135
|
+
gdi32.SelectObject.restype = HGDIOBJ
|
|
136
|
+
gdi32.SelectObject.argtypes = [HDC, HGDIOBJ]
|
|
137
|
+
|
|
138
|
+
gdi32.SetGraphicsMode.restype = INT
|
|
139
|
+
gdi32.SetGraphicsMode.argtypes = [HDC, INT]
|
|
140
|
+
|
|
141
|
+
gdi32.GetTextMetricsW.restype = BOOL
|
|
142
|
+
gdi32.GetTextMetricsW.argtypes = [HDC, POINTER(TEXTMETRIC)]
|
|
143
|
+
|
|
144
|
+
FONTENUMPROC = WINFUNCTYPE(INT, POINTER(LOGFONT), POINTER(TEXTMETRIC),
|
|
145
|
+
DWORD, c_void_p)
|
|
146
|
+
gdi32.EnumFontFamiliesExW.restype = INT
|
|
147
|
+
gdi32.EnumFontFamiliesExW.argtypes = [HDC, POINTER(LOGFONT),
|
|
148
|
+
FONTENUMPROC, LPARAM, DWORD]
|
|
149
|
+
|
|
150
|
+
gdi32.GetOutlineTextMetricsW.restype = UINT
|
|
151
|
+
gdi32.GetOutlineTextMetricsW.argtypes = [HDC, UINT,
|
|
152
|
+
POINTER(OUTLINETEXTMETRIC)]
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
gdi32.GetDeviceCaps.argtypes = [HDC, INT]
|
|
156
|
+
gdi32.GetDeviceCaps.restype = INT
|
|
157
|
+
|
|
158
|
+
user32 = windll.user32
|
|
159
|
+
|
|
160
|
+
user32.GetDC.restype = HDC # HDC
|
|
161
|
+
user32.GetDC.argtypes = [UINT32] # HWND
|
|
162
|
+
|
|
163
|
+
user32.ReleaseDC.argtypes = [c_void_p, HDC]
|
|
164
|
+
|
|
165
|
+
try:
|
|
166
|
+
user32.SetProcessDPIAware.argtypes = []
|
|
167
|
+
except AttributeError:
|
|
168
|
+
pass # not present on XP
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
# gdiplus
|
|
172
|
+
|
|
173
|
+
class GdiplusStartupInput(Structure):
|
|
174
|
+
_fields_ = [
|
|
175
|
+
('GdiplusVersion', UINT32), ('DebugEventCallback', c_void_p),
|
|
176
|
+
('SuppressBackgroundThread', BOOL), ('SuppressExternalCodecs', BOOL)]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class GdiplusStartupOutput(Structure):
|
|
180
|
+
_fields = [('NotificationHookProc', c_void_p),
|
|
181
|
+
('NotificationUnhookProc', c_void_p)]
|
|
182
|
+
|
|
183
|
+
gdiplus = windll.gdiplus
|
|
184
|
+
|
|
185
|
+
gdiplus.GdipCreateFontFamilyFromName.restype = c_int
|
|
186
|
+
gdiplus.GdipCreateFontFamilyFromName.argtypes = [c_wchar_p, c_void_p, c_void_p]
|
|
187
|
+
|
|
188
|
+
gdiplus.GdipNewPrivateFontCollection.restype = c_int
|
|
189
|
+
gdiplus.GdipNewPrivateFontCollection.argtypes = [c_void_p]
|
|
190
|
+
|
|
191
|
+
gdiplus.GdipPrivateAddFontFile.restype = c_int
|
|
192
|
+
gdiplus.GdipPrivateAddFontFile.argtypes = [c_void_p, c_wchar_p]
|
|
193
|
+
|
|
194
|
+
gdiplus.GdipGetFamilyName.restype = c_int
|
|
195
|
+
gdiplus.GdipGetFamilyName.argtypes = [c_void_p, c_wchar_p, c_int]
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def gdiplus_init():
|
|
199
|
+
token = c_ulong()
|
|
200
|
+
startup_in = GdiplusStartupInput()
|
|
201
|
+
startup_in.GdiplusVersion = 1
|
|
202
|
+
startup_out = GdiplusStartupOutput()
|
|
203
|
+
gdiplus.GdiplusStartup(byref(token), byref(startup_in), byref(startup_out))
|
|
204
|
+
atexit.register(partial(gdiplus.GdiplusShutdown, token))
|
|
205
|
+
|
|
206
|
+
gdiplus_init()
|
vispy/ext/osmesa.py
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# vispy: testskip
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
|
|
6
|
+
"""A ctypes-based API to OSMesa"""
|
|
7
|
+
from __future__ import print_function
|
|
8
|
+
import os
|
|
9
|
+
import ctypes
|
|
10
|
+
import ctypes.util
|
|
11
|
+
from ctypes import c_int as _c_int, c_uint as _c_uint, c_void_p
|
|
12
|
+
|
|
13
|
+
# See vispy/gloo/gl/_constants.py for reference
|
|
14
|
+
GL_RGBA = 6408
|
|
15
|
+
GL_UNSIGNED_BYTE = 5121
|
|
16
|
+
GL_VERSION = 7938
|
|
17
|
+
|
|
18
|
+
_osmesa_file = None
|
|
19
|
+
if 'OSMESA_LIBRARY' in os.environ:
|
|
20
|
+
if os.path.exists(os.environ['OSMESA_LIBRARY']):
|
|
21
|
+
_osmesa_file = os.path.realpath(os.environ['OSMESA_LIBRARY'])
|
|
22
|
+
|
|
23
|
+
# Else, try to find it
|
|
24
|
+
if _osmesa_file is None:
|
|
25
|
+
_osmesa_file = ctypes.util.find_library('OSMesa')
|
|
26
|
+
|
|
27
|
+
# Else, we failed and exit
|
|
28
|
+
if _osmesa_file is None:
|
|
29
|
+
raise OSError('OSMesa library not found')
|
|
30
|
+
|
|
31
|
+
# Load it
|
|
32
|
+
_lib = ctypes.CDLL(_osmesa_file)
|
|
33
|
+
|
|
34
|
+
# Constants
|
|
35
|
+
OSMESA_RGBA = GL_RGBA
|
|
36
|
+
|
|
37
|
+
# Functions
|
|
38
|
+
|
|
39
|
+
# GLAPI OSMesaContext GLAPIENTRY
|
|
40
|
+
# OSMesaCreateContext( GLenum format, OSMesaContext sharelist );
|
|
41
|
+
_lib.OSMesaCreateContext.argtypes = _c_int, c_void_p
|
|
42
|
+
_lib.OSMesaCreateContext.restype = c_void_p
|
|
43
|
+
# GLAPI void GLAPIENTRY
|
|
44
|
+
# OSMesaDestroyContext( OSMesaContext ctx );
|
|
45
|
+
_lib.OSMesaDestroyContext.argtypes = c_void_p,
|
|
46
|
+
# GLAPI GLboolean GLAPIENTRY
|
|
47
|
+
# OSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
|
|
48
|
+
# GLsizei width, GLsizei height );
|
|
49
|
+
_lib.OSMesaMakeCurrent.argtypes = c_void_p, c_void_p, _c_int, _c_int, _c_int
|
|
50
|
+
_lib.OSMesaMakeCurrent.restype = _c_int
|
|
51
|
+
# GLAPI OSMesaContext GLAPIENTRY
|
|
52
|
+
# OSMesaGetCurrentContext( void );
|
|
53
|
+
_lib.OSMesaGetCurrentContext.restype = c_void_p
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def allocate_pixels_buffer(width, height):
|
|
57
|
+
"""Helper function to allocate a buffer to contain an image of
|
|
58
|
+
width * height suitable for OSMesaMakeCurrent
|
|
59
|
+
"""
|
|
60
|
+
# Seems like OSMesa has some trouble with non-RGBA buffers, so enforce
|
|
61
|
+
# RGBA
|
|
62
|
+
return (_c_uint * width * height * 4)()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def OSMesaCreateContext():
|
|
66
|
+
return ctypes.cast(_lib.OSMesaCreateContext(OSMESA_RGBA, None), c_void_p)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def OSMesaDestroyContext(context):
|
|
70
|
+
_lib.OSMesaDestroyContext(context)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def OSMesaMakeCurrent(context, buffer, width, height):
|
|
74
|
+
ret = _lib.OSMesaMakeCurrent(context, buffer, GL_UNSIGNED_BYTE,
|
|
75
|
+
width, height)
|
|
76
|
+
return ret != 0
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def OSMesaGetCurrentContext():
|
|
80
|
+
return c_void_p(_lib.OSMesaGetCurrentContext())
|
|
81
|
+
|
|
82
|
+
if __name__ == '__main__':
|
|
83
|
+
"""This test basic OSMesa functionality"""
|
|
84
|
+
# If you have OSMesa installed alongside normal OpenGL, execute with
|
|
85
|
+
# VISPY_GL_LIB=/opt/osmesa_llvmpipe/lib/libGLESv2.so \
|
|
86
|
+
# LD_LIBRARY_PATH=/opt/osmesa_llvmpipe/lib/ \
|
|
87
|
+
# OSMESA_LIBRARY=/opt/osmesa_llvmpipe/lib/libOSMesa.so \
|
|
88
|
+
# python vispy/ext/osmesa.py
|
|
89
|
+
context = OSMesaCreateContext()
|
|
90
|
+
w, h = 640, 480
|
|
91
|
+
pixels = allocate_pixels_buffer(w, h)
|
|
92
|
+
ok = OSMesaMakeCurrent(context, pixels, 640, 480)
|
|
93
|
+
if not ok:
|
|
94
|
+
raise RuntimeError('Failed OSMesaMakeCurrent')
|
|
95
|
+
if not (OSMesaGetCurrentContext().value == context.value):
|
|
96
|
+
raise RuntimeError('OSMesa context not correctly attached')
|
|
97
|
+
|
|
98
|
+
_lib.glGetString.argtypes = (ctypes.c_uint,)
|
|
99
|
+
_lib.glGetString.restype = ctypes.c_char_p
|
|
100
|
+
|
|
101
|
+
print("OpenGL version : ", _lib.glGetString(GL_VERSION))
|
|
102
|
+
|
|
103
|
+
OSMesaDestroyContext(context)
|
|
104
|
+
if OSMesaGetCurrentContext().value is not None:
|
|
105
|
+
raise RuntimeError('Failed to destroy OSMesa context')
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
"""This module implements classes and methods for handling geometric data."""
|
|
6
|
+
|
|
7
|
+
from __future__ import division
|
|
8
|
+
|
|
9
|
+
__all__ = ['MeshData', 'PolygonData', 'Rect', 'Triangulation', 'triangulate',
|
|
10
|
+
'create_arrow', 'create_box', 'create_cone', 'create_cube',
|
|
11
|
+
'create_cylinder', 'create_grid_mesh', 'create_plane',
|
|
12
|
+
'create_sphere', 'resize']
|
|
13
|
+
|
|
14
|
+
from .polygon import PolygonData # noqa
|
|
15
|
+
from .meshdata import MeshData # noqa
|
|
16
|
+
from .rect import Rect # noqa
|
|
17
|
+
from .triangulation import Triangulation, triangulate # noqa
|
|
18
|
+
from .torusknot import TorusKnot # noqa
|
|
19
|
+
from .calculations import (_calculate_normals, _fast_cross_3d, # noqa
|
|
20
|
+
resize) # noqa
|
|
21
|
+
from .generation import (create_arrow, create_box, create_cone, # noqa
|
|
22
|
+
create_cube, create_cylinder, create_grid_mesh, # noqa
|
|
23
|
+
create_plane, create_sphere) # noqa
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
Debugging system for Triangulation class. Displays stepwise visual
|
|
4
|
+
representation of the algorithm.
|
|
5
|
+
|
|
6
|
+
This system currently requires pyqtgraph for its visual output.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import division
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
import time
|
|
12
|
+
|
|
13
|
+
from ..util.geometry.triangulation import Triangulation
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DebugTriangulation(Triangulation):
|
|
17
|
+
"""Visualize triangulation process stepwise to aid in debugging.
|
|
18
|
+
|
|
19
|
+
*interval* specifies the diration to wait before drawing each update in
|
|
20
|
+
the triangulation procedure. Negative values cause the display to wait
|
|
21
|
+
until the user clicks on the window for each update.
|
|
22
|
+
|
|
23
|
+
*skip* causes the display to immediately process the first N events
|
|
24
|
+
before pausing.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, pts, edges, interval=0.01, skip=0):
|
|
28
|
+
self.interval = interval
|
|
29
|
+
self.iteration = 0
|
|
30
|
+
self.skip = skip
|
|
31
|
+
|
|
32
|
+
Triangulation.__init__(self, pts, edges)
|
|
33
|
+
|
|
34
|
+
# visual #debugging: draw edges, front, triangles
|
|
35
|
+
self.win = pg.plot()
|
|
36
|
+
self.graph = pg.GraphItem(pos=pts.copy(), adj=edges.copy(),
|
|
37
|
+
pen={'width': 3, 'color': (0, 100, 0)})
|
|
38
|
+
self.win.addItem(self.graph)
|
|
39
|
+
self.front_line = pg.PlotCurveItem(pen={'width': 2,
|
|
40
|
+
'dash': [5, 5],
|
|
41
|
+
'color': 'y'})
|
|
42
|
+
self.win.addItem(self.front_line)
|
|
43
|
+
self.tri_shapes = {}
|
|
44
|
+
|
|
45
|
+
self.nextStep = False
|
|
46
|
+
self.win.scene().sigMouseClicked.connect(self.mouseClicked)
|
|
47
|
+
|
|
48
|
+
def mouseClicked(self):
|
|
49
|
+
self.nextStep = True
|
|
50
|
+
|
|
51
|
+
def draw_state(self):
|
|
52
|
+
global app
|
|
53
|
+
print("State %s" % self.iteration)
|
|
54
|
+
self.iteration += 1
|
|
55
|
+
if self.iteration <= self.skip:
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
front_pts = self.pts[np.array(self.front)]
|
|
59
|
+
self.front_line.setData(front_pts[:, 0], front_pts[:, 1])
|
|
60
|
+
self.graph.setData(pos=self.pts, adj=self.edges)
|
|
61
|
+
|
|
62
|
+
# Auto-advance on timer
|
|
63
|
+
if self.interval < 0:
|
|
64
|
+
# Advance once per click
|
|
65
|
+
while True:
|
|
66
|
+
app.processEvents()
|
|
67
|
+
time.sleep(0.01)
|
|
68
|
+
if self.nextStep:
|
|
69
|
+
self.nextStep = False
|
|
70
|
+
break
|
|
71
|
+
else:
|
|
72
|
+
# sleep, but keep ui responsive
|
|
73
|
+
for i in range(int(self.interval / 0.01)):
|
|
74
|
+
app.processEvents()
|
|
75
|
+
time.sleep(0.01)
|
|
76
|
+
|
|
77
|
+
def draw_tri(self, tri, source=None):
|
|
78
|
+
# assign triangle color based on the source that generated it
|
|
79
|
+
color = {
|
|
80
|
+
None: (0, 255, 255, 50),
|
|
81
|
+
'smooth1': (0, 255, 0, 50),
|
|
82
|
+
'fill_hull': (255, 255, 0, 50),
|
|
83
|
+
'edge_event': (100, 100, 255, 100),
|
|
84
|
+
}[source]
|
|
85
|
+
|
|
86
|
+
tpts = self.pts[np.array(tri)]
|
|
87
|
+
path = pg.arrayToQPath(tpts[:, 0], tpts[:, 1])
|
|
88
|
+
shape = pg.QtGui.QGraphicsPathItem(path)
|
|
89
|
+
shape.setPen(pg.mkPen(255, 255, 255, 100))
|
|
90
|
+
brush = pg.mkBrush(color)
|
|
91
|
+
shape.setBrush(brush)
|
|
92
|
+
self.win.addItem(shape)
|
|
93
|
+
self.tri_shapes[tri] = shape
|
|
94
|
+
self.draw_state()
|
|
95
|
+
|
|
96
|
+
def undraw_tri(self, tri):
|
|
97
|
+
shape = self.tri_shapes.pop(tri)
|
|
98
|
+
self.win.removeItem(shape)
|
|
99
|
+
self.draw_state()
|
|
100
|
+
|
|
101
|
+
def add_tri(self, *args, **kwargs):
|
|
102
|
+
Triangulation._add_tri(self, *args, **kwargs)
|
|
103
|
+
self.draw_tri(list(self.tris.keys())[-1],
|
|
104
|
+
source=kwargs.get('source', None))
|
|
105
|
+
|
|
106
|
+
def remove_tri(self, *args, **kwargs):
|
|
107
|
+
k = Triangulation._remove_tri(self, *args, **kwargs)
|
|
108
|
+
self.undraw_tri(k)
|
|
109
|
+
|
|
110
|
+
def edge_event(self, *args, **kwargs):
|
|
111
|
+
self.draw_state()
|
|
112
|
+
Triangulation._edge_event(self, *args, **kwargs)
|
|
113
|
+
self.draw_state()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == '__main__':
|
|
117
|
+
import pyqtgraph as pg
|
|
118
|
+
|
|
119
|
+
app = pg.mkQApp()
|
|
120
|
+
|
|
121
|
+
# user input data - points and constraining edges
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
# Test 1
|
|
125
|
+
#
|
|
126
|
+
pts = [(0, 0),
|
|
127
|
+
(10, 0),
|
|
128
|
+
(10, 10),
|
|
129
|
+
(20, 10),
|
|
130
|
+
(20, 20),
|
|
131
|
+
(25, 20),
|
|
132
|
+
(25, 25),
|
|
133
|
+
(20, 25),
|
|
134
|
+
(20, 20),
|
|
135
|
+
(10, 17),
|
|
136
|
+
(5, 25),
|
|
137
|
+
(9, 30),
|
|
138
|
+
(6, 15),
|
|
139
|
+
(15, 12.5),
|
|
140
|
+
(0, 5)]
|
|
141
|
+
num_pts = len(pts)
|
|
142
|
+
edges = [(i, (i+1) % num_pts) for i in range(num_pts)]
|
|
143
|
+
pts += [(21, 21),
|
|
144
|
+
(24, 21),
|
|
145
|
+
(24, 24),
|
|
146
|
+
(21, 24)]
|
|
147
|
+
edges += [(num_pts, num_pts + 1),
|
|
148
|
+
(num_pts + 1, num_pts + 2),
|
|
149
|
+
(num_pts + 2, num_pts + 3),
|
|
150
|
+
(num_pts + 3, num_pts)]
|
|
151
|
+
|
|
152
|
+
pts = np.array(pts, dtype=float)
|
|
153
|
+
edges = np.array(edges, dtype=int)
|
|
154
|
+
|
|
155
|
+
# t = DebugTriangulation(pts, edges, interval=-1, skip=19570)
|
|
156
|
+
# t.triangulate()
|
|
157
|
+
|
|
158
|
+
# make lines that are entirely vertical / horizontal
|
|
159
|
+
np.random.seed(1)
|
|
160
|
+
N = 100
|
|
161
|
+
pts = [[0, 0]]
|
|
162
|
+
for i in range(N - 1):
|
|
163
|
+
p = pts[-1][:]
|
|
164
|
+
p[i % 2] += np.random.normal()
|
|
165
|
+
pts.append(p)
|
|
166
|
+
pts = np.array(pts)
|
|
167
|
+
edges = np.zeros((N, 2), dtype=int)
|
|
168
|
+
edges[:, 0] = np.arange(N)
|
|
169
|
+
edges[:, 1] = np.arange(1, N + 1) % N
|
|
170
|
+
t = DebugTriangulation(pts, edges)
|
|
171
|
+
t.triangulate()
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
"""Miscellaneous functions"""
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
###############################################################################
|
|
11
|
+
# These fast normal calculation routines are adapted from mne-python
|
|
12
|
+
|
|
13
|
+
def _fast_cross_3d(x, y):
|
|
14
|
+
"""Compute cross product between list of 3D vectors
|
|
15
|
+
|
|
16
|
+
Much faster than np.cross() when the number of cross products
|
|
17
|
+
becomes large (>500). This is because np.cross() methods become
|
|
18
|
+
less memory efficient at this stage.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
x : array
|
|
23
|
+
Input array 1.
|
|
24
|
+
y : array
|
|
25
|
+
Input array 2.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
z : array
|
|
30
|
+
Cross product of x and y.
|
|
31
|
+
|
|
32
|
+
Notes
|
|
33
|
+
-----
|
|
34
|
+
x and y must both be 2D row vectors. One must have length 1, or both
|
|
35
|
+
lengths must match.
|
|
36
|
+
"""
|
|
37
|
+
assert x.ndim == 2
|
|
38
|
+
assert y.ndim == 2
|
|
39
|
+
assert x.shape[1] == 3
|
|
40
|
+
assert y.shape[1] == 3
|
|
41
|
+
assert (x.shape[0] == 1 or y.shape[0] == 1) or x.shape[0] == y.shape[0]
|
|
42
|
+
if max([x.shape[0], y.shape[0]]) >= 500:
|
|
43
|
+
return np.c_[x[:, 1] * y[:, 2] - x[:, 2] * y[:, 1],
|
|
44
|
+
x[:, 2] * y[:, 0] - x[:, 0] * y[:, 2],
|
|
45
|
+
x[:, 0] * y[:, 1] - x[:, 1] * y[:, 0]]
|
|
46
|
+
else:
|
|
47
|
+
return np.cross(x, y)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _calculate_normals(rr, tris):
|
|
51
|
+
"""Efficiently compute vertex normals for triangulated surface"""
|
|
52
|
+
# ensure highest precision for our summation/vectorization "trick"
|
|
53
|
+
rr = rr.astype(np.float64)
|
|
54
|
+
# first, compute triangle normals
|
|
55
|
+
r1 = rr[tris[:, 0], :]
|
|
56
|
+
r2 = rr[tris[:, 1], :]
|
|
57
|
+
r3 = rr[tris[:, 2], :]
|
|
58
|
+
tri_nn = _fast_cross_3d((r2 - r1), (r3 - r1))
|
|
59
|
+
|
|
60
|
+
# Triangle normals and areas
|
|
61
|
+
size = np.sqrt(np.sum(tri_nn * tri_nn, axis=1))
|
|
62
|
+
size[size == 0] = 1.0 # prevent ugly divide-by-zero
|
|
63
|
+
tri_nn /= size[:, np.newaxis]
|
|
64
|
+
|
|
65
|
+
npts = len(rr)
|
|
66
|
+
|
|
67
|
+
# the following code replaces this, but is faster (vectorized):
|
|
68
|
+
#
|
|
69
|
+
# for p, verts in enumerate(tris):
|
|
70
|
+
# nn[verts, :] += tri_nn[p, :]
|
|
71
|
+
#
|
|
72
|
+
nn = np.zeros((npts, 3))
|
|
73
|
+
for verts in tris.T: # note this only loops 3x (number of verts per tri)
|
|
74
|
+
for idx in range(3): # x, y, z
|
|
75
|
+
nn[:, idx] += np.bincount(verts.astype(np.int32),
|
|
76
|
+
tri_nn[:, idx], minlength=npts)
|
|
77
|
+
size = np.sqrt(np.sum(nn * nn, axis=1))
|
|
78
|
+
size[size == 0] = 1.0 # prevent ugly divide-by-zero
|
|
79
|
+
nn /= size[:, np.newaxis]
|
|
80
|
+
return nn
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def resize(image, shape, kind='linear'):
|
|
84
|
+
"""Resize an image
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
image : ndarray
|
|
89
|
+
Array of shape (N, M, ...).
|
|
90
|
+
shape : tuple
|
|
91
|
+
2-element shape.
|
|
92
|
+
kind : str
|
|
93
|
+
Interpolation, either "linear" or "nearest".
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
scaled_image : ndarray
|
|
98
|
+
New image, will have dtype np.float64.
|
|
99
|
+
"""
|
|
100
|
+
image = np.array(image, float)
|
|
101
|
+
shape = np.array(shape, int)
|
|
102
|
+
if shape.ndim != 1 or shape.size != 2:
|
|
103
|
+
raise ValueError('shape must have two elements')
|
|
104
|
+
if image.ndim < 2:
|
|
105
|
+
raise ValueError('image must have two dimensions')
|
|
106
|
+
if not isinstance(kind, str) or kind not in ('nearest', 'linear'):
|
|
107
|
+
raise ValueError('mode must be "nearest" or "linear"')
|
|
108
|
+
|
|
109
|
+
r = np.linspace(0, image.shape[0] - 1, shape[0])
|
|
110
|
+
c = np.linspace(0, image.shape[1] - 1, shape[1])
|
|
111
|
+
if kind == 'linear':
|
|
112
|
+
r_0 = np.floor(r).astype(int)
|
|
113
|
+
c_0 = np.floor(c).astype(int)
|
|
114
|
+
r_1 = r_0 + 1
|
|
115
|
+
c_1 = c_0 + 1
|
|
116
|
+
|
|
117
|
+
top = (r_1 - r)[:, np.newaxis]
|
|
118
|
+
bot = (r - r_0)[:, np.newaxis]
|
|
119
|
+
lef = (c - c_0)[np.newaxis, :]
|
|
120
|
+
rig = (c_1 - c)[np.newaxis, :]
|
|
121
|
+
|
|
122
|
+
c_1 = np.minimum(c_1, image.shape[1] - 1)
|
|
123
|
+
r_1 = np.minimum(r_1, image.shape[0] - 1)
|
|
124
|
+
for arr in (top, bot, lef, rig):
|
|
125
|
+
arr.shape = arr.shape + (1,) * (image.ndim - 2)
|
|
126
|
+
out = top * rig * image[r_0][:, c_0, ...]
|
|
127
|
+
out += bot * rig * image[r_1][:, c_0, ...]
|
|
128
|
+
out += top * lef * image[r_0][:, c_1, ...]
|
|
129
|
+
out += bot * lef * image[r_1][:, c_1, ...]
|
|
130
|
+
else: # kind == 'nearest'
|
|
131
|
+
r = np.round(r).astype(int)
|
|
132
|
+
c = np.round(c).astype(int)
|
|
133
|
+
out = image[r][:, c, ...]
|
|
134
|
+
return out
|