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,568 @@
|
|
|
1
|
+
"""Test to verify the functionality of the OpenGL backends. This test
|
|
2
|
+
sets up a real visualization with shaders and all. This tests setting
|
|
3
|
+
source code, setting texture and buffer data, and we touch many other
|
|
4
|
+
functions of the API too. The end result is an image with four colored
|
|
5
|
+
quads. The result is tested for pixel color.
|
|
6
|
+
|
|
7
|
+
The visualization
|
|
8
|
+
-----------------
|
|
9
|
+
|
|
10
|
+
We create a visualization where the screen is divided in 4 quadrants,
|
|
11
|
+
and each quadrant is drawn a different color (black, red, green,
|
|
12
|
+
blue). The drawing is done for 50% using attribute data, and 50%
|
|
13
|
+
using a texture. The end result should be fully saturated colors.
|
|
14
|
+
|
|
15
|
+
Remember: the bottom left is (-1, -1) and the first quadrant.
|
|
16
|
+
"""
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
from vispy.app import Canvas
|
|
22
|
+
from vispy.testing import (requires_application, requires_pyopengl, SkipTest,
|
|
23
|
+
run_tests_if_main, assert_equal, assert_true)
|
|
24
|
+
|
|
25
|
+
from vispy.gloo import gl
|
|
26
|
+
import pytest
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# All these tests require a working backend.
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
# High level tests
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
def teardown_module():
|
|
36
|
+
gl.use_gl() # Reset to default
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.mark.xfail(sys.platform == 'darwin',
|
|
40
|
+
reason='functionality fails on OSX (see #1178)')
|
|
41
|
+
@requires_application()
|
|
42
|
+
def test_functionality_desktop():
|
|
43
|
+
"""Test desktop GL backend for full functionality."""
|
|
44
|
+
_test_functionality('gl2')
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.xfail(sys.platform == 'darwin',
|
|
48
|
+
reason='functionality fails on OSX (see #1178)')
|
|
49
|
+
@requires_application()
|
|
50
|
+
def test_functionality_proxy():
|
|
51
|
+
"""Test GL proxy class for full functionality."""
|
|
52
|
+
# By using debug mode, we are using the proxy class
|
|
53
|
+
_test_functionality('gl2 debug')
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@pytest.mark.xfail(sys.platform == 'darwin',
|
|
57
|
+
reason='functionality fails on OSX (see #1178)')
|
|
58
|
+
@requires_application()
|
|
59
|
+
@requires_pyopengl()
|
|
60
|
+
def test_functionality_pyopengl():
|
|
61
|
+
"""Test pyopengl GL backend for full functionality."""
|
|
62
|
+
_test_functionality('pyopengl2')
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@requires_application()
|
|
66
|
+
def test_functionality_es2():
|
|
67
|
+
"""Test es2 GL backend for full functionality."""
|
|
68
|
+
if True:
|
|
69
|
+
raise SkipTest('Skip es2 functionality test for now.')
|
|
70
|
+
if not sys.platform.startswith('win'):
|
|
71
|
+
raise SkipTest('Can only test es2 functionality on Windows.')
|
|
72
|
+
_test_functionality('es2')
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _clear_screen():
|
|
76
|
+
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
|
|
77
|
+
gl.glFinish()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _test_functionality(backend):
|
|
81
|
+
"""Create app and canvas so we have a context. Then run tests."""
|
|
82
|
+
# use the backend
|
|
83
|
+
gl.use_gl(backend)
|
|
84
|
+
|
|
85
|
+
with Canvas() as canvas:
|
|
86
|
+
_clear_screen()
|
|
87
|
+
|
|
88
|
+
# Prepare
|
|
89
|
+
w, h = canvas.size
|
|
90
|
+
gl.glViewport(0, 0, w, h)
|
|
91
|
+
gl.glScissor(0, 0, w, h) # touch
|
|
92
|
+
gl.glClearColor(0.0, 0.0, 0.0, 1.0)
|
|
93
|
+
|
|
94
|
+
# Setup visualization, ensure to do it in a draw event
|
|
95
|
+
objects = _prepare_vis()
|
|
96
|
+
_clear_screen()
|
|
97
|
+
_draw1()
|
|
98
|
+
_clear_screen()
|
|
99
|
+
_draw2()
|
|
100
|
+
_clear_screen()
|
|
101
|
+
_draw3()
|
|
102
|
+
|
|
103
|
+
# Clean up
|
|
104
|
+
for delete_func, handle in objects:
|
|
105
|
+
delete_func(handle)
|
|
106
|
+
gl.glFinish()
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
# Create CPU data
|
|
111
|
+
#
|
|
112
|
+
|
|
113
|
+
# Create vertex and fragments shader. They are designed to that all
|
|
114
|
+
# OpenGL func can be tested, i.e. all types of uniforms are present.
|
|
115
|
+
# Most variables are nullified however, but we must make sure we do this
|
|
116
|
+
# in a way that the compiler won't optimize out :)
|
|
117
|
+
VERT = """
|
|
118
|
+
#version 120
|
|
119
|
+
|
|
120
|
+
attribute float a_1;
|
|
121
|
+
attribute vec2 a_2;
|
|
122
|
+
attribute vec3 a_3;
|
|
123
|
+
attribute vec4 a_4;
|
|
124
|
+
|
|
125
|
+
uniform float u_f1;
|
|
126
|
+
uniform vec2 u_f2;
|
|
127
|
+
uniform vec3 u_f3;
|
|
128
|
+
uniform vec4 u_f4;
|
|
129
|
+
|
|
130
|
+
uniform int u_i1;
|
|
131
|
+
uniform ivec2 u_i2;
|
|
132
|
+
uniform ivec3 u_i3;
|
|
133
|
+
uniform ivec4 u_i4;
|
|
134
|
+
|
|
135
|
+
uniform mat2 u_m2;
|
|
136
|
+
uniform mat3 u_m3;
|
|
137
|
+
uniform mat4 u_m4;
|
|
138
|
+
|
|
139
|
+
varying vec2 v_2; // tex coords
|
|
140
|
+
varying vec4 v_4; // attr colors
|
|
141
|
+
|
|
142
|
+
void main()
|
|
143
|
+
{
|
|
144
|
+
float zero = float(u_i1);
|
|
145
|
+
|
|
146
|
+
// Combine int with float uniforms (i.e. ints are "used")
|
|
147
|
+
float u1 = u_f1 + float(u_i1);
|
|
148
|
+
vec2 u2 = u_f2 + vec2(u_i2);
|
|
149
|
+
vec3 u3 = u_f3 + vec3(u_i3);
|
|
150
|
+
vec4 u4 = u_f4 + vec4(u_i4);
|
|
151
|
+
|
|
152
|
+
// Set varyings (use every 2D and 4D variable, and u1)
|
|
153
|
+
v_2 = a_1 * a_2 + zero*u_m2 * a_2 * u2 * u1;
|
|
154
|
+
v_4 = u_m4 * a_4 * u4;
|
|
155
|
+
|
|
156
|
+
// Set position (use 3D variables)
|
|
157
|
+
gl_Position = vec4(u_m3* a_3* u3, 1.0);
|
|
158
|
+
}
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
FRAG = """
|
|
162
|
+
#version 120
|
|
163
|
+
|
|
164
|
+
uniform sampler2D s_1;
|
|
165
|
+
uniform int u_i1;
|
|
166
|
+
varying vec2 v_2; // rex coords
|
|
167
|
+
varying vec4 v_4; // attr colors
|
|
168
|
+
|
|
169
|
+
void main()
|
|
170
|
+
{
|
|
171
|
+
float zero = float(u_i1);
|
|
172
|
+
gl_FragColor = (texture2D(s_1, v_2) + v_4);
|
|
173
|
+
}
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
# Color texture
|
|
177
|
+
texquad = 5
|
|
178
|
+
im1 = np.zeros((texquad*2, texquad*2, 3), np.uint8)
|
|
179
|
+
im1[texquad:, :texquad, 0] = 128
|
|
180
|
+
im1[texquad:, texquad:, 1] = 128
|
|
181
|
+
im1[:texquad, texquad:, 2] = 128
|
|
182
|
+
|
|
183
|
+
# Grayscale texture (uploaded but not used)
|
|
184
|
+
im2 = im1[:, :, 0] # A non-contiguous view
|
|
185
|
+
assert im2.flags['C_CONTIGUOUS'] is False
|
|
186
|
+
|
|
187
|
+
# Vertex Buffers
|
|
188
|
+
|
|
189
|
+
# Create coordinates for upper left quad
|
|
190
|
+
quad = np.array([[0, 0, 0], [-1, 0, 0], [-1, -1, 0],
|
|
191
|
+
[0, 0, 0], [-1, -1, 0], [0, -1, 0]], np.float32)
|
|
192
|
+
N = quad.shape[0] * 4
|
|
193
|
+
|
|
194
|
+
# buf3 contains coordinates in device coordinates for four quadrants
|
|
195
|
+
buf3 = np.vstack([
|
|
196
|
+
quad + (0, 0, 0), quad + (0, 1, 0),
|
|
197
|
+
quad + (1, 1, 0), quad + (1, 0, 0),
|
|
198
|
+
]).astype(np.float32)
|
|
199
|
+
|
|
200
|
+
# buf2 is texture coords. Note that this is a view on buf2
|
|
201
|
+
buf2 = ((buf3+1.0)*0.5)[:, :2] # not C-contiguous
|
|
202
|
+
assert buf2.flags['C_CONTIGUOUS'] is False
|
|
203
|
+
|
|
204
|
+
# Array of colors
|
|
205
|
+
buf4 = np.zeros((N, 5), np.float32)
|
|
206
|
+
buf4[6:12, 0] = 0.5
|
|
207
|
+
buf4[12:18, 1] = 0.5
|
|
208
|
+
buf4[18:24, 2] = 0.5
|
|
209
|
+
buf4[:, 3] = 1.0 # alpha
|
|
210
|
+
buf4 = buf4[:, :4] # make non-contiguous
|
|
211
|
+
|
|
212
|
+
# Element buffer
|
|
213
|
+
# elements = np.arange(N, dtype=np.uint8) # C-contiguous
|
|
214
|
+
elements = np.arange(0, N, 0.5).astype(np.uint8)[::2] # not C-contiguous
|
|
215
|
+
helements = None # the OpenGL object ref
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
#
|
|
219
|
+
# The GL calls
|
|
220
|
+
#
|
|
221
|
+
|
|
222
|
+
def _prepare_vis():
|
|
223
|
+
|
|
224
|
+
objects = []
|
|
225
|
+
|
|
226
|
+
# --- program and shaders
|
|
227
|
+
|
|
228
|
+
# Create program and shaders
|
|
229
|
+
hprog = gl.glCreateProgram()
|
|
230
|
+
hvert = gl.glCreateShader(gl.GL_VERTEX_SHADER)
|
|
231
|
+
hfrag = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
|
|
232
|
+
objects.append((gl.glDeleteProgram, hprog))
|
|
233
|
+
objects.append((gl.glDeleteShader, hvert))
|
|
234
|
+
objects.append((gl.glDeleteShader, hfrag))
|
|
235
|
+
|
|
236
|
+
# Compile source code
|
|
237
|
+
gl.glShaderSource(hvert, VERT)
|
|
238
|
+
gl.glShaderSource(hfrag, FRAG)
|
|
239
|
+
gl.glCompileShader(hvert)
|
|
240
|
+
gl.glCompileShader(hfrag)
|
|
241
|
+
|
|
242
|
+
# Check
|
|
243
|
+
assert gl.glGetShaderInfoLog(hvert) == ''
|
|
244
|
+
assert gl.glGetShaderInfoLog(hfrag) == ''
|
|
245
|
+
assert gl.glGetShaderParameter(hvert, gl.GL_COMPILE_STATUS) == 1
|
|
246
|
+
assert gl.glGetShaderParameter(hfrag, gl.GL_COMPILE_STATUS) == 1
|
|
247
|
+
|
|
248
|
+
# Attach and link
|
|
249
|
+
gl.glAttachShader(hprog, hvert)
|
|
250
|
+
gl.glAttachShader(hprog, hfrag)
|
|
251
|
+
# touch glDetachShader
|
|
252
|
+
gl.glDetachShader(hprog, hvert)
|
|
253
|
+
gl.glAttachShader(hprog, hvert)
|
|
254
|
+
|
|
255
|
+
# Bind all attributes - we could let this occur automatically, but some
|
|
256
|
+
# implementations bind an attribute to index 0, which has the unfortunate
|
|
257
|
+
# property of being unable to be modified.
|
|
258
|
+
gl.glBindAttribLocation(hprog, 1, 'a_1')
|
|
259
|
+
gl.glBindAttribLocation(hprog, 2, 'a_2')
|
|
260
|
+
gl.glBindAttribLocation(hprog, 3, 'a_3')
|
|
261
|
+
gl.glBindAttribLocation(hprog, 4, 'a_4')
|
|
262
|
+
|
|
263
|
+
gl.glLinkProgram(hprog)
|
|
264
|
+
|
|
265
|
+
# Test that indeed these shaders are attached
|
|
266
|
+
attached_shaders = gl.glGetAttachedShaders(hprog)
|
|
267
|
+
assert_equal(set(attached_shaders), set([hvert, hfrag]))
|
|
268
|
+
|
|
269
|
+
# Check
|
|
270
|
+
assert_equal(gl.glGetProgramInfoLog(hprog), '')
|
|
271
|
+
assert_equal(gl.glGetProgramParameter(hprog, gl.GL_LINK_STATUS), 1)
|
|
272
|
+
gl.glValidateProgram(hprog)
|
|
273
|
+
assert_equal(gl.glGetProgramParameter(hprog, gl.GL_VALIDATE_STATUS), 1)
|
|
274
|
+
|
|
275
|
+
# Use it!
|
|
276
|
+
gl.glUseProgram(hprog)
|
|
277
|
+
|
|
278
|
+
# Check if all is ok
|
|
279
|
+
assert_equal(gl.glGetError(), 0)
|
|
280
|
+
|
|
281
|
+
# Check source
|
|
282
|
+
vert_source = gl.glGetShaderSource(hvert)
|
|
283
|
+
assert_true('attribute vec2 a_2;' in vert_source)
|
|
284
|
+
|
|
285
|
+
# --- get information on attributes and uniforms
|
|
286
|
+
|
|
287
|
+
# Count attributes and uniforms
|
|
288
|
+
natt = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_ATTRIBUTES)
|
|
289
|
+
nuni = gl.glGetProgramParameter(hprog, gl.GL_ACTIVE_UNIFORMS)
|
|
290
|
+
assert_equal(natt, 4)
|
|
291
|
+
assert_equal(nuni, 4+4+3+1)
|
|
292
|
+
|
|
293
|
+
# Get names
|
|
294
|
+
names = {}
|
|
295
|
+
for i in range(natt):
|
|
296
|
+
name, count, type = gl.glGetActiveAttrib(hprog, i)
|
|
297
|
+
names[name] = type
|
|
298
|
+
assert_equal(count, 1)
|
|
299
|
+
for i in range(nuni):
|
|
300
|
+
name, count, type = gl.glGetActiveUniform(hprog, i)
|
|
301
|
+
names[name] = type
|
|
302
|
+
assert_equal(count, 1)
|
|
303
|
+
|
|
304
|
+
# Check
|
|
305
|
+
assert_equal(names['a_1'], gl.GL_FLOAT)
|
|
306
|
+
assert_equal(names['a_2'], gl.GL_FLOAT_VEC2)
|
|
307
|
+
assert_equal(names['a_3'], gl.GL_FLOAT_VEC3)
|
|
308
|
+
assert_equal(names['a_4'], gl.GL_FLOAT_VEC4)
|
|
309
|
+
assert_equal(names['s_1'], gl.GL_SAMPLER_2D)
|
|
310
|
+
#
|
|
311
|
+
for i, type in enumerate([gl.GL_FLOAT, gl.GL_FLOAT_VEC2,
|
|
312
|
+
gl.GL_FLOAT_VEC3, gl.GL_FLOAT_VEC4]):
|
|
313
|
+
assert_equal(names['u_f%i' % (i+1)], type)
|
|
314
|
+
for i, type in enumerate([gl.GL_INT, gl.GL_INT_VEC2,
|
|
315
|
+
gl.GL_INT_VEC3, gl.GL_INT_VEC4]):
|
|
316
|
+
assert_equal(names['u_i%i' % (i+1)], type)
|
|
317
|
+
for i, type in enumerate([gl.GL_FLOAT_MAT2, gl.GL_FLOAT_MAT3,
|
|
318
|
+
gl.GL_FLOAT_MAT4]):
|
|
319
|
+
assert_equal(names['u_m%i' % (i+2)], type)
|
|
320
|
+
|
|
321
|
+
# Check if all is ok
|
|
322
|
+
assert_equal(gl.glGetError(), 0)
|
|
323
|
+
|
|
324
|
+
# --- texture
|
|
325
|
+
|
|
326
|
+
# Create, bind, activate
|
|
327
|
+
htex = gl.glCreateTexture()
|
|
328
|
+
objects.append((gl.glDeleteTexture, htex))
|
|
329
|
+
gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1)
|
|
330
|
+
gl.glBindTexture(gl.GL_TEXTURE_2D, htex)
|
|
331
|
+
|
|
332
|
+
# Allocate data and upload
|
|
333
|
+
# This data is luminance and not C-contiguous
|
|
334
|
+
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
|
|
335
|
+
gl.GL_UNSIGNED_BYTE, im2) # touch
|
|
336
|
+
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_LUMINANCE, gl.GL_LUMINANCE,
|
|
337
|
+
gl.GL_UNSIGNED_BYTE, im2.shape[:2])
|
|
338
|
+
gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_LUMINANCE,
|
|
339
|
+
gl.GL_UNSIGNED_BYTE, im2)
|
|
340
|
+
|
|
341
|
+
# Set texture parameters (use f and i to touch both)
|
|
342
|
+
T = gl.GL_TEXTURE_2D
|
|
343
|
+
gl.glTexParameterf(T, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
|
|
344
|
+
gl.glTexParameteri(T, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
|
|
345
|
+
|
|
346
|
+
# Re-allocate data and upload
|
|
347
|
+
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_RGB,
|
|
348
|
+
gl.GL_UNSIGNED_BYTE, im1.shape[:2])
|
|
349
|
+
gl.glTexSubImage2D(gl.GL_TEXTURE_2D, 0, 0, 0, gl.GL_RGB,
|
|
350
|
+
gl.GL_UNSIGNED_BYTE, im1)
|
|
351
|
+
|
|
352
|
+
# Attach!
|
|
353
|
+
loc = gl.glGetUniformLocation(hprog, 's_1')
|
|
354
|
+
unit = 0
|
|
355
|
+
gl.glActiveTexture(gl.GL_TEXTURE0+unit)
|
|
356
|
+
gl.glUniform1i(loc, unit)
|
|
357
|
+
|
|
358
|
+
# Mipmaps (just to touch this function)
|
|
359
|
+
gl.glGenerateMipmap(gl.GL_TEXTURE_2D)
|
|
360
|
+
|
|
361
|
+
# Check min filter (touch getTextParameter)
|
|
362
|
+
minfilt = gl.glGetTexParameter(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER)
|
|
363
|
+
assert_equal(minfilt, gl.GL_LINEAR)
|
|
364
|
+
|
|
365
|
+
# Check if all is ok
|
|
366
|
+
assert_equal(gl.glGetError(), 0)
|
|
367
|
+
|
|
368
|
+
# --- buffer vec2 (contiguous VBO)
|
|
369
|
+
|
|
370
|
+
# Create buffer
|
|
371
|
+
hbuf2 = gl.glCreateBuffer()
|
|
372
|
+
objects.append((gl.glDeleteBuffer, hbuf2))
|
|
373
|
+
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf2)
|
|
374
|
+
|
|
375
|
+
# Allocate and set data
|
|
376
|
+
gl.glBufferData(gl.GL_ARRAY_BUFFER, buf2.nbytes, gl.GL_DYNAMIC_DRAW)
|
|
377
|
+
gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf2)
|
|
378
|
+
|
|
379
|
+
# Attach!
|
|
380
|
+
loc = gl.glGetAttribLocation(hprog, 'a_2')
|
|
381
|
+
gl.glDisableVertexAttribArray(loc) # touch
|
|
382
|
+
gl.glEnableVertexAttribArray(loc)
|
|
383
|
+
gl.glVertexAttribPointer(loc, 2, gl.GL_FLOAT, False, 2*4, 0)
|
|
384
|
+
|
|
385
|
+
# Check (touch glGetBufferParameter, glGetVertexAttrib and
|
|
386
|
+
# glGetVertexAttribOffset)
|
|
387
|
+
size = gl.glGetBufferParameter(gl.GL_ARRAY_BUFFER, gl.GL_BUFFER_SIZE)
|
|
388
|
+
assert_equal(size, buf2.nbytes)
|
|
389
|
+
stride = gl.glGetVertexAttrib(loc, gl.GL_VERTEX_ATTRIB_ARRAY_STRIDE)
|
|
390
|
+
assert_equal(stride, 2*4)
|
|
391
|
+
offset = gl.glGetVertexAttribOffset(loc, gl.GL_VERTEX_ATTRIB_ARRAY_POINTER)
|
|
392
|
+
assert_equal(offset, 0)
|
|
393
|
+
|
|
394
|
+
# Check if all is ok
|
|
395
|
+
assert_equal(gl.glGetError(), 0)
|
|
396
|
+
|
|
397
|
+
# --- buffer vec3 (non-contiguous VBO)
|
|
398
|
+
|
|
399
|
+
# Create buffer
|
|
400
|
+
hbuf3 = gl.glCreateBuffer()
|
|
401
|
+
objects.append((gl.glDeleteBuffer, hbuf3))
|
|
402
|
+
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, hbuf3)
|
|
403
|
+
|
|
404
|
+
# Allocate and set data
|
|
405
|
+
gl.glBufferData(gl.GL_ARRAY_BUFFER, buf3.nbytes, gl.GL_DYNAMIC_DRAW)
|
|
406
|
+
gl.glBufferSubData(gl.GL_ARRAY_BUFFER, 0, buf3)
|
|
407
|
+
|
|
408
|
+
# Attach!
|
|
409
|
+
loc = gl.glGetAttribLocation(hprog, 'a_3')
|
|
410
|
+
gl.glEnableVertexAttribArray(loc)
|
|
411
|
+
gl.glVertexAttribPointer(loc, 3, gl.GL_FLOAT, False, 3*4, 0)
|
|
412
|
+
|
|
413
|
+
# Check if all is ok
|
|
414
|
+
assert_equal(gl.glGetError(), 0)
|
|
415
|
+
|
|
416
|
+
# --- buffer vec4 (client vertex data)
|
|
417
|
+
|
|
418
|
+
# Select no FBO
|
|
419
|
+
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
|
|
420
|
+
|
|
421
|
+
# Attach!
|
|
422
|
+
loc = gl.glGetAttribLocation(hprog, 'a_4')
|
|
423
|
+
gl.glEnableVertexAttribArray(loc)
|
|
424
|
+
gl.glVertexAttribPointer(loc, 4, gl.GL_FLOAT, False, 4*4, buf4)
|
|
425
|
+
|
|
426
|
+
# Check if all is ok
|
|
427
|
+
assert_equal(gl.glGetError(), 0)
|
|
428
|
+
|
|
429
|
+
# --- element buffer
|
|
430
|
+
|
|
431
|
+
# Create buffer
|
|
432
|
+
global helements
|
|
433
|
+
helements = gl.glCreateBuffer()
|
|
434
|
+
objects.append((gl.glDeleteBuffer, helements))
|
|
435
|
+
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
|
|
436
|
+
|
|
437
|
+
# Allocate and set data
|
|
438
|
+
gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, elements, gl.GL_DYNAMIC_DRAW)
|
|
439
|
+
gl.glBufferSubData(gl.GL_ELEMENT_ARRAY_BUFFER, 0, elements)
|
|
440
|
+
|
|
441
|
+
# Turn off
|
|
442
|
+
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
|
|
443
|
+
|
|
444
|
+
# Check if all is ok
|
|
445
|
+
assert_equal(gl.glGetError(), 0)
|
|
446
|
+
|
|
447
|
+
# --- uniforms
|
|
448
|
+
|
|
449
|
+
# Set integer uniforms to 0
|
|
450
|
+
# We set them twice just to touch both i and iv functions
|
|
451
|
+
for i, fun1, fun2 in [(1, gl.glUniform1i, gl.glUniform1iv),
|
|
452
|
+
(2, gl.glUniform2i, gl.glUniform2iv),
|
|
453
|
+
(3, gl.glUniform3i, gl.glUniform3iv),
|
|
454
|
+
(4, gl.glUniform4i, gl.glUniform4iv)]:
|
|
455
|
+
name = 'u_i%i' % i
|
|
456
|
+
value = [0] * i
|
|
457
|
+
loc = gl.glGetUniformLocation(hprog, name)
|
|
458
|
+
fun1(loc, *value) # e.g. glUniform4i
|
|
459
|
+
fun2(loc, 1, value) # e.g. glUniform4iv
|
|
460
|
+
|
|
461
|
+
# Set float uniforms to 1.0
|
|
462
|
+
# We set them twice just to touch both i and iv functions
|
|
463
|
+
for i, fun1, fun2 in [(1, gl.glUniform1f, gl.glUniform1fv),
|
|
464
|
+
(2, gl.glUniform2f, gl.glUniform2fv),
|
|
465
|
+
(3, gl.glUniform3f, gl.glUniform3fv),
|
|
466
|
+
(4, gl.glUniform4f, gl.glUniform4fv)]:
|
|
467
|
+
name = 'u_f%i' % i
|
|
468
|
+
value = [1.0] * i
|
|
469
|
+
loc = gl.glGetUniformLocation(hprog, name)
|
|
470
|
+
fun1(loc, *value) # e.g. glUniform4f
|
|
471
|
+
fun2(loc, 1, value) # e.g. glUniform4fv
|
|
472
|
+
|
|
473
|
+
# Set matrix uniforms
|
|
474
|
+
m = np.eye(5, dtype='float32')
|
|
475
|
+
loc = gl.glGetUniformLocation(hprog, 'u_m2')
|
|
476
|
+
gl.glUniformMatrix2fv(loc, 1, False, m[:2, :2])
|
|
477
|
+
#
|
|
478
|
+
loc = gl.glGetUniformLocation(hprog, 'u_m3')
|
|
479
|
+
m = np.eye(3, dtype='float32')
|
|
480
|
+
gl.glUniformMatrix3fv(loc, 1, False, m[:3, :3])
|
|
481
|
+
#
|
|
482
|
+
loc = gl.glGetUniformLocation(hprog, 'u_m4')
|
|
483
|
+
m = np.eye(4, dtype='float32')
|
|
484
|
+
gl.glUniformMatrix4fv(loc, 1, False, m[:4, :4])
|
|
485
|
+
|
|
486
|
+
# Check some uniforms
|
|
487
|
+
loc = gl.glGetUniformLocation(hprog, 'u_i1')
|
|
488
|
+
assert_equal(gl.glGetUniform(hprog, loc), 0)
|
|
489
|
+
loc = gl.glGetUniformLocation(hprog, 'u_i2')
|
|
490
|
+
assert_equal(gl.glGetUniform(hprog, loc), (0, 0))
|
|
491
|
+
loc = gl.glGetUniformLocation(hprog, 'u_f2')
|
|
492
|
+
assert_equal(gl.glGetUniform(hprog, loc), (1.0, 1.0))
|
|
493
|
+
|
|
494
|
+
# Check if all is ok
|
|
495
|
+
assert_equal(gl.glGetError(), 0)
|
|
496
|
+
|
|
497
|
+
# --- attributes
|
|
498
|
+
|
|
499
|
+
# Constant values for attributes. We do not even use this ...
|
|
500
|
+
loc = gl.glGetAttribLocation(hprog, 'a_1')
|
|
501
|
+
gl.glVertexAttrib1f(loc, 1.0)
|
|
502
|
+
loc = gl.glGetAttribLocation(hprog, 'a_2')
|
|
503
|
+
gl.glVertexAttrib2f(loc, 1.0, 1.0)
|
|
504
|
+
loc = gl.glGetAttribLocation(hprog, 'a_3')
|
|
505
|
+
gl.glVertexAttrib3f(loc, 1.0, 1.0, 1.0)
|
|
506
|
+
loc = gl.glGetAttribLocation(hprog, 'a_4')
|
|
507
|
+
gl.glVertexAttrib4f(loc, 1.0, 1.0, 1.0, 1.0)
|
|
508
|
+
|
|
509
|
+
# --- flush and finish
|
|
510
|
+
|
|
511
|
+
# Not really necessary, but we want to touch the functions
|
|
512
|
+
gl.glFlush()
|
|
513
|
+
gl.glFinish()
|
|
514
|
+
|
|
515
|
+
# print([i[1] for i in objects])
|
|
516
|
+
return objects
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def _draw1():
|
|
520
|
+
# Draw using arrays
|
|
521
|
+
gl.glDrawArrays(gl.GL_TRIANGLES, 0, N)
|
|
522
|
+
gl.glFinish()
|
|
523
|
+
_check_result()
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def _draw2():
|
|
527
|
+
# Draw using elements via buffer
|
|
528
|
+
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, helements)
|
|
529
|
+
gl.glDrawElements(gl.GL_TRIANGLES, elements.size, gl.GL_UNSIGNED_BYTE, 0)
|
|
530
|
+
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
|
|
531
|
+
gl.glFinish()
|
|
532
|
+
_check_result()
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def _draw3():
|
|
536
|
+
# Draw using elements via numpy array
|
|
537
|
+
gl.glDrawElements(gl.GL_TRIANGLES,
|
|
538
|
+
elements.size, gl.GL_UNSIGNED_BYTE, elements)
|
|
539
|
+
gl.glFinish()
|
|
540
|
+
_check_result()
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def _check_result(assert_result=True):
|
|
544
|
+
"""Test the color of each quadrant by picking the center pixel
|
|
545
|
+
of each quadrant and comparing it with the reference color.
|
|
546
|
+
"""
|
|
547
|
+
# Take screenshot
|
|
548
|
+
x, y, w, h = gl.glGetParameter(gl.GL_VIEWPORT)
|
|
549
|
+
data = gl.glReadPixels(x, y, w, h, gl.GL_RGB, gl.GL_UNSIGNED_BYTE)
|
|
550
|
+
im = np.frombuffer(data, np.uint8)
|
|
551
|
+
im.shape = h, w, 3
|
|
552
|
+
|
|
553
|
+
# Get center pixel from each quadrant
|
|
554
|
+
pix1 = tuple(im[int(1*h/4), int(1*w/4)])
|
|
555
|
+
pix2 = tuple(im[int(3*h/4), int(1*w/4)])
|
|
556
|
+
pix3 = tuple(im[int(3*h/4), int(3*w/4)])
|
|
557
|
+
pix4 = tuple(im[int(1*h/4), int(3*w/4)])
|
|
558
|
+
# print(pix1, pix2, pix3, pix4)
|
|
559
|
+
|
|
560
|
+
if assert_result:
|
|
561
|
+
# Test their value
|
|
562
|
+
assert_equal(pix1, (0, 0, 0))
|
|
563
|
+
assert_equal(pix2, (255, 0, 0))
|
|
564
|
+
assert_equal(pix3, (0, 255, 0))
|
|
565
|
+
assert_equal(pix4, (0, 0, 255))
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
run_tests_if_main()
|