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,253 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
"""
|
|
7
|
+
A collection is a container for several items having the same data
|
|
8
|
+
structure (dtype). Each data type can be declared as local (it specific to a
|
|
9
|
+
vertex), shared (it is shared among an item vertices) or global (it is shared
|
|
10
|
+
by all vertices). It is based on the BaseCollection but offers a more intuitive
|
|
11
|
+
interface.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
from ... import gloo
|
|
16
|
+
from . util import fetchcode
|
|
17
|
+
from . base_collection import BaseCollection
|
|
18
|
+
from ..shaders import ModularProgram
|
|
19
|
+
from ...util.event import EventEmitter
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Collection(BaseCollection):
|
|
23
|
+
"""
|
|
24
|
+
A collection is a container for several items having the same data
|
|
25
|
+
structure (dtype). Each data type can be declared as local (it is specific
|
|
26
|
+
to a vertex), shared (it is shared among item vertices) or global (it is
|
|
27
|
+
shared by all items). It is based on the BaseCollection but offers a more
|
|
28
|
+
intuitive interface.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
dtype: list
|
|
33
|
+
Data individual types as (name, dtype, scope, default)
|
|
34
|
+
|
|
35
|
+
itype: np.dtype or None
|
|
36
|
+
Indices data type
|
|
37
|
+
|
|
38
|
+
mode : GL_ENUM
|
|
39
|
+
GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP,
|
|
40
|
+
GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN
|
|
41
|
+
|
|
42
|
+
vertex: str or tuple of str
|
|
43
|
+
Vertex shader to use to draw this collection
|
|
44
|
+
|
|
45
|
+
fragment: str or tuple of str
|
|
46
|
+
Fragment shader to use to draw this collection
|
|
47
|
+
|
|
48
|
+
kwargs: str
|
|
49
|
+
Scope can also be specified using keyword argument,
|
|
50
|
+
where parameter name must be one of the dtype.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
_gtypes = {('float32', 1): "float",
|
|
54
|
+
('float32', 2): "vec2",
|
|
55
|
+
('float32', 3): "vec3",
|
|
56
|
+
('float32', 4): "vec4",
|
|
57
|
+
('int32', 1): "int",
|
|
58
|
+
('int32', 2): "ivec2",
|
|
59
|
+
('int32', 3): "ivec3",
|
|
60
|
+
('int32', 4): "ivec4"}
|
|
61
|
+
|
|
62
|
+
def __init__(self, dtype, itype, mode, vertex, fragment, program=None,
|
|
63
|
+
**kwargs):
|
|
64
|
+
"""
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
self._uniforms = {}
|
|
68
|
+
self._attributes = {}
|
|
69
|
+
self._varyings = {}
|
|
70
|
+
self._mode = mode
|
|
71
|
+
vtype = []
|
|
72
|
+
utype = []
|
|
73
|
+
|
|
74
|
+
self.update = EventEmitter(source=self, type='collection_update')
|
|
75
|
+
|
|
76
|
+
# Build vtype and utype according to parameters
|
|
77
|
+
declarations = {"uniforms": "",
|
|
78
|
+
"attributes": "",
|
|
79
|
+
"varyings": ""}
|
|
80
|
+
defaults = {}
|
|
81
|
+
for item in dtype:
|
|
82
|
+
name, (basetype, count), scope, default = item
|
|
83
|
+
basetype = np.dtype(basetype).name
|
|
84
|
+
if scope[0] == "!":
|
|
85
|
+
scope = scope[1:]
|
|
86
|
+
else:
|
|
87
|
+
scope = kwargs.pop(name, scope)
|
|
88
|
+
defaults[name] = default
|
|
89
|
+
gtype = Collection._gtypes[(basetype, count)]
|
|
90
|
+
if scope == "local":
|
|
91
|
+
# numpy dtypes with size 1 are ambiguous, only add size if it is greater than 1
|
|
92
|
+
vtype.append((name, basetype, count) if count != 1 else (name, basetype))
|
|
93
|
+
declarations[
|
|
94
|
+
"attributes"] += "attribute %s %s;\n" % (gtype, name)
|
|
95
|
+
elif scope == "shared":
|
|
96
|
+
# numpy dtypes with size 1 are ambiguous, only add size if it is greater than 1
|
|
97
|
+
utype.append((name, basetype, count) if count != 1 else (name, basetype))
|
|
98
|
+
declarations["varyings"] += "varying %s %s;\n" % (gtype, name)
|
|
99
|
+
else:
|
|
100
|
+
declarations["uniforms"] += "uniform %s %s;\n" % (gtype, name)
|
|
101
|
+
self._uniforms[name] = None
|
|
102
|
+
|
|
103
|
+
if len(kwargs) > 0:
|
|
104
|
+
raise NameError("Invalid keyword argument(s): %s" %
|
|
105
|
+
list(kwargs.keys()))
|
|
106
|
+
|
|
107
|
+
vtype = np.dtype(vtype)
|
|
108
|
+
itype = np.dtype(itype) if itype else None
|
|
109
|
+
utype = np.dtype(utype) if utype else None
|
|
110
|
+
|
|
111
|
+
BaseCollection.__init__(self, vtype=vtype, utype=utype, itype=itype)
|
|
112
|
+
self._declarations = declarations
|
|
113
|
+
self._defaults = defaults
|
|
114
|
+
|
|
115
|
+
# Build program (once base collection is built)
|
|
116
|
+
saved = vertex
|
|
117
|
+
vertex = ""
|
|
118
|
+
|
|
119
|
+
if self.utype is not None:
|
|
120
|
+
vertex += fetchcode(self.utype) + vertex
|
|
121
|
+
else:
|
|
122
|
+
vertex += "void fetch_uniforms(void) { }\n" + vertex
|
|
123
|
+
vertex += self._declarations["uniforms"]
|
|
124
|
+
vertex += self._declarations["attributes"]
|
|
125
|
+
vertex += saved
|
|
126
|
+
|
|
127
|
+
self._vertex = vertex
|
|
128
|
+
self._fragment = fragment
|
|
129
|
+
|
|
130
|
+
if program is None:
|
|
131
|
+
program = ModularProgram(vertex, fragment)
|
|
132
|
+
else:
|
|
133
|
+
program.vert = vertex
|
|
134
|
+
program.frag = fragment
|
|
135
|
+
if hasattr(program, 'changed'):
|
|
136
|
+
program.changed.connect(self.update)
|
|
137
|
+
self._programs.append(program)
|
|
138
|
+
|
|
139
|
+
# Initialize uniforms
|
|
140
|
+
for name in self._uniforms.keys():
|
|
141
|
+
self._uniforms[name] = self._defaults.get(name)
|
|
142
|
+
program[name] = self._uniforms[name]
|
|
143
|
+
|
|
144
|
+
def view(self, transform, viewport=None):
|
|
145
|
+
"""Return a view on the collection using provided transform"""
|
|
146
|
+
return CollectionView(self, transform, viewport)
|
|
147
|
+
|
|
148
|
+
# program = gloo.Program(self._vertex, self._fragment)
|
|
149
|
+
# if "transform" in program.hooks:
|
|
150
|
+
# program["transform"] = transform
|
|
151
|
+
# if "viewport" in program.hooks:
|
|
152
|
+
# if viewport is not None:
|
|
153
|
+
# program["viewport"] = viewport
|
|
154
|
+
# else:
|
|
155
|
+
# program["viewport"] = Viewport()
|
|
156
|
+
# self._programs.append(program)
|
|
157
|
+
# program.bind(self._vertices_buffer)
|
|
158
|
+
# for name in self._uniforms.keys():
|
|
159
|
+
# program[name] = self._uniforms[name]
|
|
160
|
+
# #if self._uniforms_list is not None:
|
|
161
|
+
# # program["uniforms"] = self._uniforms_texture
|
|
162
|
+
# # program["uniforms_shape"] = self._ushape
|
|
163
|
+
|
|
164
|
+
# # Piggy backing
|
|
165
|
+
# def draw():
|
|
166
|
+
# if self._need_update:
|
|
167
|
+
# self._update()
|
|
168
|
+
# program.bind(self._vertices_buffer)
|
|
169
|
+
# if self._uniforms_list is not None:
|
|
170
|
+
# program["uniforms"] = self._uniforms_texture
|
|
171
|
+
# program["uniforms_shape"] = self._ushape
|
|
172
|
+
|
|
173
|
+
# if self._indices_list is not None:
|
|
174
|
+
# Program.draw(program, self._mode, self._indices_buffer)
|
|
175
|
+
# else:
|
|
176
|
+
# Program.draw(program, self._mode)
|
|
177
|
+
|
|
178
|
+
# program.draw = draw
|
|
179
|
+
# return program
|
|
180
|
+
|
|
181
|
+
def __getitem__(self, key):
|
|
182
|
+
|
|
183
|
+
program = self._programs[0]
|
|
184
|
+
for name, (storage, _, _) in program._code_variables.items():
|
|
185
|
+
if name == key and storage == 'uniform':
|
|
186
|
+
return program[key]
|
|
187
|
+
return BaseCollection.__getitem__(self, key)
|
|
188
|
+
|
|
189
|
+
def __setitem__(self, key, value):
|
|
190
|
+
try:
|
|
191
|
+
BaseCollection.__setitem__(self, key, value)
|
|
192
|
+
except IndexError:
|
|
193
|
+
for program in self._programs:
|
|
194
|
+
program[key] = value
|
|
195
|
+
|
|
196
|
+
def draw(self, mode=None):
|
|
197
|
+
"""Draw collection"""
|
|
198
|
+
if self._need_update:
|
|
199
|
+
self._update()
|
|
200
|
+
|
|
201
|
+
program = self._programs[0]
|
|
202
|
+
|
|
203
|
+
mode = mode or self._mode
|
|
204
|
+
if self._indices_list is not None:
|
|
205
|
+
program.draw(mode, self._indices_buffer)
|
|
206
|
+
else:
|
|
207
|
+
program.draw(mode)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class CollectionView(object):
|
|
211
|
+
|
|
212
|
+
def __init__(self, collection, transform=None, viewport=None):
|
|
213
|
+
|
|
214
|
+
vertex = collection._vertex
|
|
215
|
+
fragment = collection._fragment
|
|
216
|
+
program = gloo.Program(vertex, fragment)
|
|
217
|
+
|
|
218
|
+
# if "transform" in program.hooks and transform is not None:
|
|
219
|
+
# program["transform"] = transform
|
|
220
|
+
# if "viewport" in program.hooks and viewport is not None:
|
|
221
|
+
# program["viewport"] = viewport
|
|
222
|
+
|
|
223
|
+
program.bind(collection._vertices_buffer)
|
|
224
|
+
for name in collection._uniforms.keys():
|
|
225
|
+
program[name] = collection._uniforms[name]
|
|
226
|
+
|
|
227
|
+
collection._programs.append(program)
|
|
228
|
+
self._program = program
|
|
229
|
+
self._collection = collection
|
|
230
|
+
|
|
231
|
+
def __getitem__(self, key):
|
|
232
|
+
return self._program[key]
|
|
233
|
+
|
|
234
|
+
def __setitem__(self, key, value):
|
|
235
|
+
self._program[key] = value
|
|
236
|
+
|
|
237
|
+
def draw(self):
|
|
238
|
+
|
|
239
|
+
program = self._program
|
|
240
|
+
collection = self._collection
|
|
241
|
+
mode = collection._mode
|
|
242
|
+
|
|
243
|
+
if collection._need_update:
|
|
244
|
+
collection._update()
|
|
245
|
+
# self._program.bind(self._vertices_buffer)
|
|
246
|
+
if collection._uniforms_list is not None:
|
|
247
|
+
program["uniforms"] = collection._uniforms_texture
|
|
248
|
+
program["uniforms_shape"] = collection._ushape
|
|
249
|
+
|
|
250
|
+
if collection._indices_list is not None:
|
|
251
|
+
program.draw(mode, collection._indices_buffer)
|
|
252
|
+
else:
|
|
253
|
+
program.draw(mode)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
from . raw_path_collection import RawPathCollection
|
|
7
|
+
from . agg_path_collection import AggPathCollection
|
|
8
|
+
from . agg_fast_path_collection import AggFastPathCollection
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def PathCollection(mode="agg", *args, **kwargs):
|
|
12
|
+
"""
|
|
13
|
+
mode: string
|
|
14
|
+
- "raw" (speed: fastest, size: small, output: ugly, no dash,
|
|
15
|
+
no thickness)
|
|
16
|
+
- "agg" (speed: medium, size: medium output: nice, some flaws, no dash)
|
|
17
|
+
- "agg+" (speed: slow, size: big, output: perfect, no dash)
|
|
18
|
+
"""
|
|
19
|
+
if mode == "raw":
|
|
20
|
+
return RawPathCollection(*args, **kwargs)
|
|
21
|
+
elif mode == "agg+":
|
|
22
|
+
return AggPathCollection(*args, **kwargs)
|
|
23
|
+
return AggFastPathCollection(*args, **kwargs)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
from . raw_point_collection import RawPointCollection
|
|
8
|
+
from . agg_point_collection import AggPointCollection
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def PointCollection(mode="raw", *args, **kwargs):
|
|
12
|
+
"""
|
|
13
|
+
mode: string
|
|
14
|
+
- "raw" (speed: fastest, size: small, output: ugly)
|
|
15
|
+
- "agg" (speed: fast, size: small, output: beautiful)
|
|
16
|
+
"""
|
|
17
|
+
if mode == "raw":
|
|
18
|
+
return RawPointCollection(*args, **kwargs)
|
|
19
|
+
return AggPointCollection(*args, **kwargs)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
""" """
|
|
7
|
+
from . raw_polygon_collection import RawPolygonCollection
|
|
8
|
+
# from . agg_polygon_collection import AggPolygonCollection
|
|
9
|
+
# from . agg_fast_polygon_collection import AggPolygonCollection
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def PolygonCollection(mode="raw", *args, **kwargs):
|
|
13
|
+
"""
|
|
14
|
+
mode: string
|
|
15
|
+
- "raw" (speed: fastest, size: small, output: ugly, no dash, no
|
|
16
|
+
thickness)
|
|
17
|
+
- "agg" (speed: medium, size: medium output: nice, some flaws, no
|
|
18
|
+
dash)
|
|
19
|
+
- "agg+" (speed: slow, size: big, output: perfect, no dash)
|
|
20
|
+
"""
|
|
21
|
+
# if mode == "raw":
|
|
22
|
+
return RawPolygonCollection(*args, **kwargs)
|
|
23
|
+
# elif mode == "agg":
|
|
24
|
+
# return AggFastPolygonCollection(*args, **kwargs)
|
|
25
|
+
# return AggPolygonCollection(*args, **kwargs)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
import numpy as np
|
|
7
|
+
from ... import glsl
|
|
8
|
+
from . collection import Collection
|
|
9
|
+
from ..transforms import NullTransform
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RawPathCollection(Collection):
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, user_dtype=None, transform=None,
|
|
18
|
+
vertex=None, fragment=None, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
Initialize the collection.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
user_dtype: list
|
|
25
|
+
The base dtype can be completed (appended) by the used_dtype. It
|
|
26
|
+
only make sense if user also provide vertex and/or fragment shaders
|
|
27
|
+
|
|
28
|
+
transform : Transform instance
|
|
29
|
+
Used to define the transform(vec4) function
|
|
30
|
+
|
|
31
|
+
vertex: string
|
|
32
|
+
Vertex shader code
|
|
33
|
+
|
|
34
|
+
fragment: string
|
|
35
|
+
Fragment shader code
|
|
36
|
+
|
|
37
|
+
color : string
|
|
38
|
+
'local', 'shared' or 'global'
|
|
39
|
+
"""
|
|
40
|
+
base_dtype = [('position', (np.float32, 3), '!local', (0, 0, 0)),
|
|
41
|
+
('id', (np.float32, 1), '!local', 0),
|
|
42
|
+
('color', (np.float32, 4), 'local', (0, 0, 0, 1)),
|
|
43
|
+
("linewidth", (np.float32, 1), 'global', 1),
|
|
44
|
+
("viewport", (np.float32, 4), 'global', (0, 0, 512, 512))
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
dtype = base_dtype
|
|
48
|
+
if user_dtype:
|
|
49
|
+
dtype.extend(user_dtype)
|
|
50
|
+
|
|
51
|
+
if vertex is None:
|
|
52
|
+
vertex = glsl.get('collections/raw-path.vert')
|
|
53
|
+
if transform is None:
|
|
54
|
+
transform = NullTransform()
|
|
55
|
+
self.transform = transform
|
|
56
|
+
if fragment is None:
|
|
57
|
+
fragment = glsl.get('collections/raw-path.frag')
|
|
58
|
+
|
|
59
|
+
vertex = transform + vertex
|
|
60
|
+
Collection.__init__(self, dtype=dtype, itype=None, mode='line_strip',
|
|
61
|
+
vertex=vertex, fragment=fragment, **kwargs)
|
|
62
|
+
self._programs[0].vert['transform'] = self.transform
|
|
63
|
+
|
|
64
|
+
def append(self, P, closed=False, itemsize=None, **kwargs):
|
|
65
|
+
"""
|
|
66
|
+
Append a new set of vertices to the collection.
|
|
67
|
+
|
|
68
|
+
For kwargs argument, n is the number of vertices (local) or the number
|
|
69
|
+
of item (shared)
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
P : np.array
|
|
74
|
+
Vertices positions of the path(s) to be added
|
|
75
|
+
|
|
76
|
+
closed: bool
|
|
77
|
+
Whether path(s) is/are closed
|
|
78
|
+
|
|
79
|
+
itemsize: int or None
|
|
80
|
+
Size of an individual path
|
|
81
|
+
|
|
82
|
+
color : list, array or 4-tuple
|
|
83
|
+
Path color
|
|
84
|
+
"""
|
|
85
|
+
itemsize = itemsize or len(P)
|
|
86
|
+
itemcount = len(P) / itemsize
|
|
87
|
+
P = P.reshape(itemcount, itemsize, 3)
|
|
88
|
+
if closed:
|
|
89
|
+
V = np.empty((itemcount, itemsize + 3), dtype=self.vtype)
|
|
90
|
+
# Apply default values on vertices
|
|
91
|
+
for name in self.vtype.names:
|
|
92
|
+
if name not in ['collection_index', 'position']:
|
|
93
|
+
V[name][1:-2] = kwargs.get(name, self._defaults[name])
|
|
94
|
+
V["position"][:, 1:-2] = P
|
|
95
|
+
V["position"][:, -2] = V["position"][:, 1]
|
|
96
|
+
else:
|
|
97
|
+
V = np.empty((itemcount, itemsize + 2), dtype=self.vtype)
|
|
98
|
+
# Apply default values on vertices
|
|
99
|
+
for name in self.vtype.names:
|
|
100
|
+
if name not in ['collection_index', 'position']:
|
|
101
|
+
V[name][1:-1] = kwargs.get(name, self._defaults[name])
|
|
102
|
+
V["position"][:, 1:-1] = P
|
|
103
|
+
V["id"] = 1
|
|
104
|
+
V[:, 0] = V[:, 1]
|
|
105
|
+
V[:, -1] = V[:, -2]
|
|
106
|
+
V["id"][:, 0] = 0
|
|
107
|
+
V["id"][:, -1] = 0
|
|
108
|
+
|
|
109
|
+
# Uniforms
|
|
110
|
+
if self.utype:
|
|
111
|
+
U = np.zeros(itemcount, dtype=self.utype)
|
|
112
|
+
for name in self.utype.names:
|
|
113
|
+
if name not in ["__unused__"]:
|
|
114
|
+
U[name] = kwargs.get(name, self._defaults[name])
|
|
115
|
+
else:
|
|
116
|
+
U = None
|
|
117
|
+
|
|
118
|
+
Collection.append(self, vertices=V, uniforms=U,
|
|
119
|
+
itemsize=itemsize + 2 + closed)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
"""
|
|
7
|
+
Raw Point Collection
|
|
8
|
+
|
|
9
|
+
This collection provides very fast points. Output quality is ugly so it must be
|
|
10
|
+
used at small size only (2/3 pixels). You've been warned.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import division
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
from ... import glsl
|
|
17
|
+
from . collection import Collection
|
|
18
|
+
from ..transforms import NullTransform
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class RawPointCollection(Collection):
|
|
22
|
+
"""
|
|
23
|
+
Raw Point Collection
|
|
24
|
+
|
|
25
|
+
This collection provides very fast points. Output quality is ugly so it
|
|
26
|
+
must be used at small size only (2/3 pixels). You've been warned.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, user_dtype=None, transform=None,
|
|
30
|
+
vertex=None, fragment=None, **kwargs):
|
|
31
|
+
"""
|
|
32
|
+
Initialize the collection.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
user_dtype: list
|
|
37
|
+
The base dtype can be completed (appended) by the used_dtype. It
|
|
38
|
+
only make sense if user also provide vertex and/or fragment shaders
|
|
39
|
+
|
|
40
|
+
transform : Transform instance
|
|
41
|
+
Used to define the transform(vec4) function
|
|
42
|
+
|
|
43
|
+
vertex: string
|
|
44
|
+
Vertex shader code
|
|
45
|
+
|
|
46
|
+
fragment: string
|
|
47
|
+
Fragment shader code
|
|
48
|
+
|
|
49
|
+
color : string
|
|
50
|
+
'local', 'shared' or 'global'
|
|
51
|
+
"""
|
|
52
|
+
base_dtype = [('position', (np.float32, 3), "!local", (0, 0, 0)),
|
|
53
|
+
('size', (np.float32, 1), "global", 3.0),
|
|
54
|
+
('color', (np.float32, 4), "global", (0, 0, 0, 1))]
|
|
55
|
+
|
|
56
|
+
dtype = base_dtype
|
|
57
|
+
if user_dtype:
|
|
58
|
+
dtype.extend(user_dtype)
|
|
59
|
+
|
|
60
|
+
if vertex is None:
|
|
61
|
+
vertex = glsl.get("collections/raw-point.vert")
|
|
62
|
+
if transform is None:
|
|
63
|
+
transform = NullTransform()
|
|
64
|
+
self.transform = transform
|
|
65
|
+
if fragment is None:
|
|
66
|
+
fragment = glsl.get("collections/raw-point.frag")
|
|
67
|
+
|
|
68
|
+
Collection.__init__(self, dtype=dtype, itype=None, mode="points",
|
|
69
|
+
vertex=vertex, fragment=fragment, **kwargs)
|
|
70
|
+
|
|
71
|
+
# Set hooks if necessary
|
|
72
|
+
program = self._programs[0]
|
|
73
|
+
program.vert['transform'] = self.transform
|
|
74
|
+
|
|
75
|
+
def append(self, P, itemsize=None, **kwargs):
|
|
76
|
+
"""
|
|
77
|
+
Append a new set of vertices to the collection.
|
|
78
|
+
|
|
79
|
+
For kwargs argument, n is the number of vertices (local) or the number
|
|
80
|
+
of item (shared)
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
P : np.array
|
|
85
|
+
Vertices positions of the points(s) to be added
|
|
86
|
+
|
|
87
|
+
itemsize: int or None
|
|
88
|
+
Size of an individual path
|
|
89
|
+
|
|
90
|
+
color : list, array or 4-tuple
|
|
91
|
+
Path color
|
|
92
|
+
"""
|
|
93
|
+
itemsize = itemsize or 1
|
|
94
|
+
itemcount = len(P) // itemsize
|
|
95
|
+
|
|
96
|
+
V = np.empty(len(P), dtype=self.vtype)
|
|
97
|
+
|
|
98
|
+
# Apply default values on vertices
|
|
99
|
+
for name in self.vtype.names:
|
|
100
|
+
if name not in ['position', "collection_index"]:
|
|
101
|
+
V[name] = kwargs.get(name, self._defaults[name])
|
|
102
|
+
V["position"] = P
|
|
103
|
+
|
|
104
|
+
# Uniforms
|
|
105
|
+
if self.utype:
|
|
106
|
+
U = np.zeros(itemcount, dtype=self.utype)
|
|
107
|
+
for name in self.utype.names:
|
|
108
|
+
if name not in ["__unused__"]:
|
|
109
|
+
U[name] = kwargs.get(name, self._defaults[name])
|
|
110
|
+
else:
|
|
111
|
+
U = None
|
|
112
|
+
|
|
113
|
+
Collection.append(self, vertices=V, uniforms=U, itemsize=itemsize)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
import numpy as np
|
|
7
|
+
from ... import glsl
|
|
8
|
+
from . collection import Collection
|
|
9
|
+
from ..transforms import NullTransform
|
|
10
|
+
from ...geometry import triangulate
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RawPolygonCollection(Collection):
|
|
14
|
+
|
|
15
|
+
def __init__(self, user_dtype=None, transform=None,
|
|
16
|
+
vertex=None, fragment=None, **kwargs):
|
|
17
|
+
|
|
18
|
+
base_dtype = [('position', (np.float32, 3), '!local', (0, 0, 0)),
|
|
19
|
+
('color', (np.float32, 4), 'local', (0, 0, 0, 1))]
|
|
20
|
+
|
|
21
|
+
dtype = base_dtype
|
|
22
|
+
if user_dtype:
|
|
23
|
+
dtype.extend(user_dtype)
|
|
24
|
+
|
|
25
|
+
if vertex is None:
|
|
26
|
+
vertex = glsl.get('collections/raw-triangle.vert')
|
|
27
|
+
if transform is None:
|
|
28
|
+
transform = NullTransform()
|
|
29
|
+
self.transform = transform
|
|
30
|
+
if fragment is None:
|
|
31
|
+
fragment = glsl.get('collections/raw-triangle.frag')
|
|
32
|
+
|
|
33
|
+
Collection.__init__(self, dtype=dtype, itype=np.uint32, # 16 for WebGL
|
|
34
|
+
mode="triangles",
|
|
35
|
+
vertex=vertex, fragment=fragment, **kwargs)
|
|
36
|
+
|
|
37
|
+
# Set hooks if necessary
|
|
38
|
+
program = self._programs[0]
|
|
39
|
+
program.vert['transform'] = self.transform
|
|
40
|
+
|
|
41
|
+
def append(self, points, **kwargs):
|
|
42
|
+
"""
|
|
43
|
+
Append a new set of vertices to the collection.
|
|
44
|
+
|
|
45
|
+
For kwargs argument, n is the number of vertices (local) or the number
|
|
46
|
+
of item (shared)
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
points : np.array
|
|
51
|
+
Vertices composing the triangles
|
|
52
|
+
|
|
53
|
+
color : list, array or 4-tuple
|
|
54
|
+
Path color
|
|
55
|
+
"""
|
|
56
|
+
vertices, indices = triangulate(points)
|
|
57
|
+
itemsize = len(vertices)
|
|
58
|
+
itemcount = 1
|
|
59
|
+
|
|
60
|
+
V = np.empty(itemcount * itemsize, dtype=self.vtype)
|
|
61
|
+
for name in self.vtype.names:
|
|
62
|
+
if name not in ['collection_index', 'position']:
|
|
63
|
+
V[name] = kwargs.get(name, self._defaults[name])
|
|
64
|
+
V["position"] = vertices
|
|
65
|
+
|
|
66
|
+
# Uniforms
|
|
67
|
+
if self.utype:
|
|
68
|
+
U = np.zeros(itemcount, dtype=self.utype)
|
|
69
|
+
for name in self.utype.names:
|
|
70
|
+
if name not in ["__unused__"]:
|
|
71
|
+
U[name] = kwargs.get(name, self._defaults[name])
|
|
72
|
+
else:
|
|
73
|
+
U = None
|
|
74
|
+
|
|
75
|
+
Collection.append(self, vertices=V, uniforms=U,
|
|
76
|
+
indices=np.array(indices).ravel(),
|
|
77
|
+
itemsize=itemsize)
|