Skip to main content

OpenGL Pipelines for Python

Project description

ZenGL

pip install zengl

ZenGL

ZenGL is a low level graphics library. Works on all platforms including the browser.

Description

  • Context is the root object to access OpenGL
  • Image is an OpenGL Textures or OpenGL Renderbuffer
  • Buffer is an OpenGL Buffer
  • Pipeline is an OpenGL Program + OpenGL Vertex Array + OpenGL Framebuffer + complete state for rendering
ctx = zengl.context()
texture = ctx.image(size, 'rgba8unorm', pixels)
renderbuffer = ctx.image(size, 'rgba8unorm', samples=4)
vertex_buffer = ctx.buffer(vertices)
pipeline = ctx.pipeline(...)

The complete OpenGL state is encapsulated by the Pipeline.

Rendering with multiple pipelines guarantees proper state with minimal changes and api calls.

background.render()
scene.render()
particles.render()
bloom.render()

Pipelines render to framebuffers, Images can be blit to the screen.

# init time
pipeline = ctx.pipeline(
    framebuffer=[image, depth],
)
# per frame
image.clear()
depth.clear()
pipeline.render()
image.blit()

Programs are simple, easy, and cached. Unique shader sources are only compiled once.

pipeline = ctx.pipeline(
    vertex_shader='''
        #version 330 core

        void main() {
            gl_Position = ...
        }
    ''',
    fragment_shader='''
        #version 330 core

        out vec4 frag_color;

        void main() {
            frag_color = ...
        }
    ''',
)

Vertex Arrays are simple.

# simple
pipeline = ctx.pipeline(
    vertex_buffers=zengl.bind(vertex_buffer, '3f 3f 2f', 0, 1, 2),
    vertex_count=vertex_buffer.size // zengl.calcsize('3f 3f 2f'),
)
# indexed
pipeline = ctx.pipeline(
    vertex_buffers=zengl.bind(vertex_buffer, '3f 3f 2f', 0, 1, 2),
    index_buffer=index_buffer,
    vertex_count=index_buffer.size // 4,
)
# instanced
pipeline = ctx.pipeline(
    vertex_buffers=[
        *zengl.bind(vertex_buffer, '3f 3f 2f', 0, 1, 2),
        *zengl.bind(instance_buffer, '3f 4f /i', 3, 4),
    ],
    vertex_count=vertex_buffer.size // zengl.calcsize('3f 3f 2f'),
    instance_count=1000,
)

Uniform Buffer, Texture, and Sampler binding is easy.

# uniform buffers
pipeline = ctx.pipeline(
    layout=[
        {
            'name': 'Common',
            'binding': 0,
        },
    ],
    resources=[
        {
            'type': 'uniform_buffer',
            'binding': 0,
            'buffer': uniform_buffer,
        },
    ],
)
# textures
pipeline = ctx.pipeline(
    layout=[
        {
            'name': 'Texture',
            'binding': 0,
        },
    ],
    resources=[
        {
            'type': 'sampler',
            'binding': 0,
            'image': texture,
            'wrap_x': 'clamp_to_edge',
            'wrap_y': 'clamp_to_edge',
            'min_filter': 'nearest',
            'mag_filter': 'nearest',
        },
    ],
)

Postprocessing and Compute can be implemented as rendering a fullscreen quad.

pipeline = ctx.pipeline(
    vertex_shader='''
        #version 330 core

        vec2 vertices[3] = vec2[](
            vec2(-1.0, -1.0),
            vec2(3.0, -1.0),
            vec2(-1.0, 3.0)
        );

        void main() {
            gl_Position = vec4(vertices[gl_VertexID], 0.0, 1.0);
        }
    ''',
    fragment_shader='''
        #version 330 core

        out vec4 frag_color;

        void main() {
            frag_color = ...
        }
    ''',
    topology='triangles',
    vertex_count=3,
)
particle_system = ctx.pipeline(
    fragment_shader='''
        #version 330 core

        uniform sampler2D Position;
        uniform sampler2D Velocity;
        uniform vec3 Acceleration;

        layout (location = 0) out vec3 OutputPosition;
        layout (location = 1) out vec3 OutputVelocity;

        void main() {
            OutputPosition = Position + Velocity;
            OutputVelocity = Velocity + Acceleration;
        }
    ''',
)

ZenGL intentionally does not support:

  • Transform Feedback
  • Geometry Shaders
  • Tesselation
  • Compute Shaders
  • 3D Textures
  • Storage Buffers

Most of the above can be implemented in a more hardware friendly way using the existing ZenGL API. Interoperability with other modules is also possible. Using such may reduce the application's portablity. It is even possible to use direct OpenGL calls together with ZenGL, however this is likely not necessary.

It is common to render directly to the screen with OpenGL. With ZenGL, the right way is to render to a framebuffer and blit the final image to the screen. This allows fine-grained control of the framebuffer format, guaranteed multisampling settings, correct depth/stencil precison. It is also possible to render directly to the screen, however this feature is designed to be used for the postprocessing step.

This design allows ZenGL to support:

  • Rendering without a window
  • Rendering to multiple windows
  • Rendering to HDR monitors
  • Refreshing the screen without re-rendering the scene
  • Apply post-processing without changing how the scene is rendered
  • Making reusable shaders and components
  • Taking screenshots or exporting a video

The default framebuffer in OpenGL is highly dependent on how the Window is created. It is often necessary to configure the Window to provide the proper depth precision, stencil buffer, multisampling and double buffering. Often the "best pixel format" lacks all of these features on purpose. ZenGL aims to allow choosing these pixel formats and ensures the user specifies the rendering requirements. It is even possible to render low-resolution images and upscale them for high-resolution monitors. Tearing can be easily prevented by decoupling the scene rendering from the screen updates.

ZenGL was designed for Prototyping

It is tempting to start a project with Vulkan, however even getting a simple scene rendered requires tremendous work and advanced tooling to compile shaders ahead of time. ZenGL provides self-contained Pipelines which can be easily ported to Vulkan. ZenGL code is verbose and easy to read.

ZenGL support multiple design patters

Many libraries enfore certain design patterns. ZenGL avoids this by providing cached pipeline creation, pipeline templating and lean resourece and framebuffer definition. It is supported to create pipelines on the fly or template them for certain use-cases.

TODO: examples for such patters

ZenGL emerged from an experimental version of ModernGL. To keep ModernGL backward compatible, ZenGL was re-designed from the ground-up to support a strict subset of OpenGL. On the other hand, ModernGL supports a wide variety of OpenGL versions and extensions.

Disambiguation

  • ZenGL is a drop-in replacement for pure OpenGL code
  • Using ZenGL requires some OpenGL knowledge
  • ZenGL Images are OpenGL Texture Objects or OpenGL Renderbuffer Objects
  • ZenGL Buffers are OpenGL Buffer Objects
  • ZenGL Pipelines contain an OpenGL Vertex Array Object, an OpenGL Program Object, and an OpenGL Framebuffer Object
  • ZenGL Pielines may also contain OpenGL Sampler Objects
  • Creating ZenGL Pipelines does not necessarily compile the shader from source
  • The ZenGL Shader Cache exists independently from the Pipeline objects
  • A Framebuffer is always represented by a Python list of ZenGL Images
  • There is no Pipeline.clear() method, individual images must be cleared independently
  • GLSL Uniform Blocks and sampler2D objects are bound in the Pipeline layout
  • Textures and Uniform Buffers are bound in the Pipeline resources

Examples

bezier_curves deferred_rendering envmap fractal grass normal_mapping rigged_objects wireframe

Simple Pipeline Definition

pipeline = ctx.pipeline(
    # program definition
    vertex_shader='...',
    fragment_shader='...',
    layout=[
        {
            'name': 'Uniforms',
            'binding': 0,
        },
        {
            'name': 'Texture',
            'binding': 0,
        },
    ],

    # descriptor sets
    resources=[
        {
            'type': 'uniform_buffer',
            'binding': 0,
            'buffer': uniform_buffer,
        },
        {
            'type': 'sampler',
            'binding': 0,
            'image': texture,
        },
    ],

    # uniforms
    uniforms={
        'color': [0.0, 0.5, 1.0],
        'iterations': 10,
    },

    # program definition global state
    depth={
        'func': 'less',
        'write': False,
    },
    stencil={
        'front': {
            'fail_op': 'replace',
            'pass_op': 'replace',
            'depth_fail_op': 'replace',
            'compare_op': 'always',
            'compare_mask': 1,
            'write_mask': 1,
            'reference': 1,
        },
        'back': ...,
        # or
        'both': ...,
    },
    blend={
        'enable': True,
        'src_color': 'src_alpha',
        'dst_color': 'one_minus_src_alpha',
    },
    cull_face='back',
    topology='triangles',

    # framebuffer
    framebuffer=[color1, color2, ..., depth],
    viewport=(x, y, width, height),

    # vertex array
    vertex_buffers=[
        *zengl.bind(vertex_buffer, '3f 3f', 0, 1), # bound vertex attributes
        *zengl.bind(None, '2f', 2), # unused vertex attribute
    ],
    index_buffer=index_buffer, # or None
    short_index=False, # 2 or 4 byte intex
    vertex_count=...,
    instance_count=1,
    first_vertex=0,

    # override includes
    includes={
        'common': '...',
    },
)

# some members are actually mutable and calls no OpenGL functions
pipeline.viewport = ...
pipeline.vertex_count = ...
pipeline.uniforms['iterations'][:] = struct.pack('i', 50) # writable memoryview

# rendering
pipeline.render() # no parameters for hot code

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zengl-2.5.0.tar.gz (55.0 kB view details)

Uploaded Source

Built Distributions

zengl-2.5.0-cp311-abi3-win_amd64.whl (48.2 kB view details)

Uploaded CPython 3.11+ Windows x86-64

zengl-2.5.0-cp311-abi3-win32.whl (41.3 kB view details)

Uploaded CPython 3.11+ Windows x86

zengl-2.5.0-cp311-abi3-musllinux_1_2_x86_64.whl (130.6 kB view details)

Uploaded CPython 3.11+ musllinux: musl 1.2+ x86-64

zengl-2.5.0-cp311-abi3-musllinux_1_2_i686.whl (122.2 kB view details)

Uploaded CPython 3.11+ musllinux: musl 1.2+ i686

zengl-2.5.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (133.6 kB view details)

Uploaded CPython 3.11+ manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

zengl-2.5.0-cp311-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (122.9 kB view details)

Uploaded CPython 3.11+ manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zengl-2.5.0-cp311-abi3-macosx_11_0_arm64.whl (44.8 kB view details)

Uploaded CPython 3.11+ macOS 11.0+ ARM64

zengl-2.5.0-cp311-abi3-macosx_10_9_x86_64.whl (46.7 kB view details)

Uploaded CPython 3.11+ macOS 10.9+ x86-64

zengl-2.5.0-cp310-cp310-win_amd64.whl (47.9 kB view details)

Uploaded CPython 3.10 Windows x86-64

zengl-2.5.0-cp310-cp310-win32.whl (41.1 kB view details)

Uploaded CPython 3.10 Windows x86

zengl-2.5.0-cp310-cp310-musllinux_1_2_x86_64.whl (129.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

zengl-2.5.0-cp310-cp310-musllinux_1_2_i686.whl (121.3 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ i686

zengl-2.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

zengl-2.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (122.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zengl-2.5.0-cp310-cp310-macosx_11_0_arm64.whl (44.9 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zengl-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl (46.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

zengl-2.5.0-cp39-cp39-win_amd64.whl (48.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

zengl-2.5.0-cp39-cp39-win32.whl (41.1 kB view details)

Uploaded CPython 3.9 Windows x86

zengl-2.5.0-cp39-cp39-musllinux_1_2_x86_64.whl (128.6 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ x86-64

zengl-2.5.0-cp39-cp39-musllinux_1_2_i686.whl (120.9 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.2+ i686

zengl-2.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

zengl-2.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (121.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zengl-2.5.0-cp39-cp39-macosx_11_0_arm64.whl (44.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

zengl-2.5.0-cp39-cp39-macosx_10_9_x86_64.whl (46.7 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

zengl-2.5.0-cp38-cp38-win_amd64.whl (48.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

zengl-2.5.0-cp38-cp38-win32.whl (41.1 kB view details)

Uploaded CPython 3.8 Windows x86

zengl-2.5.0-cp38-cp38-musllinux_1_2_x86_64.whl (131.2 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ x86-64

zengl-2.5.0-cp38-cp38-musllinux_1_2_i686.whl (123.4 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.2+ i686

zengl-2.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

zengl-2.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (124.8 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zengl-2.5.0-cp38-cp38-macosx_11_0_arm64.whl (44.9 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

zengl-2.5.0-cp38-cp38-macosx_10_9_x86_64.whl (46.7 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

File details

Details for the file zengl-2.5.0.tar.gz.

File metadata

  • Download URL: zengl-2.5.0.tar.gz
  • Upload date:
  • Size: 55.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0.tar.gz
Algorithm Hash digest
SHA256 7dde6e9bd861ec7c896d592d8308c2beafc48551973f9578a99884125d8ac6af
MD5 3413533a35f3d44e89342503194f4146
BLAKE2b-256 19e9cc96f1d5bea0e88239852cd9c72178c1eef7f813e24512808d1be66e1ed0

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: zengl-2.5.0-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 48.2 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e45523d0c98322585126cfd5b350505a0634f9dc14a7ba7c392a788ea34d23c2
MD5 3aaafc4b6fdbb61b943e12affbc9af2e
BLAKE2b-256 46e4f8861cc690b761ae9b83e8436fc6df760cc5da9f0c0ba393aa60456c285a

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-win32.whl.

File metadata

  • Download URL: zengl-2.5.0-cp311-abi3-win32.whl
  • Upload date:
  • Size: 41.3 kB
  • Tags: CPython 3.11+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp311-abi3-win32.whl
Algorithm Hash digest
SHA256 4b7b5951c8269698f4898c0c6f305556b9a11c53921f0022f4f18415a43c3590
MD5 12dba319158ee68773a20aa2fcf1ceec
BLAKE2b-256 3e329ae9b6e7b21da80832eccf158c58b33f29f31a02062d389c1e991332b423

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c247cbbbd4bcce0917ff27e8b66084668b09d54c1c59b3b1082a3095e4cc8876
MD5 6e070815e2dc69b5954a9c4a07cc033a
BLAKE2b-256 0a9f3b6f51ae5e755a6f11ad87350daeb9a3a8d676ab6271e9295604cfbb61df

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 94b4f321fe0708fcacc543a3e5d5bde06e3f19726ef7b80995398fdc683c3255
MD5 7a29acddbdc11d44cdd8397f3d491579
BLAKE2b-256 d91fa6c80e5ff92fb29b6f7052b83f8bbba7fb02b234b173fa89b33e4496c544

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2211eb3ccbdb2841ab0867619f5c1fe22b795dcfb8de85f61e93f19e2517b53a
MD5 3ced0d33285708471fee34cbbba53621
BLAKE2b-256 cc51df8ff177ca14c0ba2afa1ab628e298d8afc553b046fc937e6240e30fcab2

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c54d86c5c751d3c77f0584d8eeafe1a96b47d37bfd66e306e708e4c22e9576b2
MD5 d29065bdc4808bc866495c5dba853a81
BLAKE2b-256 d87e6926550dde6609a34e1b9d262edcdcbeb03ba43b2c889521509625293ec4

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5d54db625aac183bf78848486194c8b8c9674c9112b57a353b9b4425e6637972
MD5 dc55362181a1334a8dac0cb8d784fcee
BLAKE2b-256 83073dd78b3587c307e96acc6a5dd988752366f38c5d891d8535f5c2d53a23bc

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp311-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp311-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d17fbbae1c956ab77fc014731cfdcb9a7e20f7787bde452f36db22a8b4b61c54
MD5 fb8e5b6357de88ce6772ea1720a8c68a
BLAKE2b-256 d6b36ce29d64da3a696167dd2a78b765f2530a19a13d74535c64e145cc9e84fd

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: zengl-2.5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 47.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 96b8743bbb520514a8881eb97a25cefbf2f1c2a5ca33ab9b7ce755ceeabf2bf4
MD5 5e25ac168aa0a1f5a76f3aafe2e66060
BLAKE2b-256 54fd175e4d6cbe5c0292ecffb2c364027e9c96555e52d537b34325f16e897b88

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: zengl-2.5.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 41.1 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 4117e3d804cef93fb69a839ea1c113126b5fb6be6a27d1fbf40e16ae4f3faf3f
MD5 399f5be5f3a1b7885174e77358770487
BLAKE2b-256 73476bdb7e2c79e2f479e3a74e7d9c53812ed3347eae826b98da7d75a7510a1d

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3c1f3bbc1aa16cdb728d98727279b700a87e90cad6bb5e90c0a204207f6cb1fd
MD5 44d367b7a5b822c7f1a24da7026bec2d
BLAKE2b-256 d9c1a2d8a40d479b7e291ea153dedf0dc25be8a6ec9b6eefc41706e146414744

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fcaf35e0904c792867d2aef06088b46f9ce24e42bfa90ce6edd6e7706102e84d
MD5 66d44d50df8e4f398aac35d8b0fddda8
BLAKE2b-256 466f49207a44aef53c3ae9f64fe48426596900c32d4ccddc31d85cfdf5dc1179

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 565486525b9a66ce80eaa4793e90eb21b9ca2305c05f0a27568f9afb75c6f926
MD5 37b76ca924d1957b0be5f57c5fa64767
BLAKE2b-256 d4e1455ee0a306c17ba6f3772a7c8f9ef0891098a9b732135406eaee9e02912d

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 af93b5eba16b8dd2394b49c4bdc6e3a48963de9ddb86c34c690d5a5b3c54073b
MD5 d3f174e0f9170e11cc264dd021eac73d
BLAKE2b-256 202793d05945b3c252162d45b46f490b20207e4c20ec290ad8a2bce2707ba438

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6a230c62762e3daf119667ceb1c5c4831cf56cf5158b1d569373f9cb2110a716
MD5 a9e4ebfbbb29e2fc43548ac15b177af5
BLAKE2b-256 2415af94acb082f1cfdb13717159364138e29f4bf0fd4332d89346a3fff54f24

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 878ff67b2825575214529073cc5e678bfd4ae703cca3f602edc0a6955a53df54
MD5 b04e4fdc010fd13921285fa742341875
BLAKE2b-256 827d1bfcf488d17ac0939f47b768ca8905386870e9c2d0ddb64293b1321266e7

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: zengl-2.5.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 48.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a47aca591738f966c3ec706b1b01170ebc6784583fa3f7143b38305ff2da7440
MD5 037fb5d7d73dd0b90ee124a24ab82b74
BLAKE2b-256 25eb9e2763ed632a5345196a89f2d6561be89ff4ed77301fc44512c1d9c77ad4

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-win32.whl.

File metadata

  • Download URL: zengl-2.5.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 41.1 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 97dfbf75ce1a860d6f7fab774a914b1a3714d92cacce4828ff72abdead67abf4
MD5 f1006ed93450d7a2e8c8f119827ff344
BLAKE2b-256 d985dae6e02bd914297646b0b050dcea25b04ba81fff0b75d5c8efa911dc516e

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d5c6bf34c42babbcadef15efc18887c8c5ecd8a36a5aa06f441509d5bbfb287e
MD5 2f834affa49bff2271b5aae4d4e4ca51
BLAKE2b-256 f5487cf9fe6958a9c2e75d0af9ac83168ee633fc30f43f13eecda27055157013

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 908b6e0a8739734cd2b2b64263466466de5813f3df1222263646857231aa290c
MD5 c386adcf8c966fc5039d4ece48d28ca2
BLAKE2b-256 665eac663cae9f75fdad58a05499192dfe4bf47f32115468ad2529a43c7fc6e7

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7524940d4a60ce202a26cf92de5ffc456b0391b8a0ae73bfd334a53e7eef4031
MD5 a4ecde7217d8282b7f74ab5e8b26b81f
BLAKE2b-256 dd7588217ed64fc6fb3667f05a081f1adec3d11fdcd1df3878bf2ff242d3d7a2

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a4a73a812f9e6e96df5c7fde65005412ab7f793f996c00f129a78b53177098f0
MD5 cbb980acf9d59badaf506c82d828e142
BLAKE2b-256 716240afcccc9bb4c45a3c83ddbd55780a3ad836067257efc3354ab1f693d86b

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8e19264d05480389979324df33454c2aa1f01229f84147ffe960f3c64423055
MD5 3fec908041c7bb84ec3d1fc6cbaef303
BLAKE2b-256 6ab53025d0023ac5bfe37c866444204080ddb63a76a1b4275ee31e5e190ba07a

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 42b500acbcf94f1afc96d587bd1917f75bd531faa438d4350efefb197ee0618a
MD5 878bb6c9f5d7719cdf6f988a16770b3e
BLAKE2b-256 028a7590080bb2a9d5a3dc606df0b08335196ff04ba64020648124ad4fd5a68c

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: zengl-2.5.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 48.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 14a76ed1daff9c9409cdd3b307bf74cdff0beaab554cddb8897a8f8298e72be7
MD5 49a00c89c051babae125f00fb4a359e2
BLAKE2b-256 46c51dd03d2ba953d4ab5354c43c0bf12aa3338dc5fcde073e2e0749d5af4764

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-win32.whl.

File metadata

  • Download URL: zengl-2.5.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 41.1 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for zengl-2.5.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 4afeef810e3c8c057113f8df8b9ed73da43bd60e1055619257c4cdea121b8bf6
MD5 4c75520cec9ebe4791395b573ac0dd77
BLAKE2b-256 66f486123bba7dd5faff1553b86f140d4543c78f58870617f2e5e7486bd090ef

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3d672830abface012b22dccd7d1d3396e86ddf39abc952dd12194688220da757
MD5 96a1a1f2e9868ecd70fcf27c5fa2bb7a
BLAKE2b-256 6203bf29f42e67554f24585f6e74b8a9be613ae50b91d6b6532572c60ba33a0e

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 eed9941eed95d2b0ac5cc1f74e90139aee986105de8601cc6fe9754d912b6a19
MD5 b011fe49a044bea5f8fe775c650770ab
BLAKE2b-256 38f2924bbeecbb24cf67b67d40a3ac6e084e1683a4a8acdd47f51b72ab591edc

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 65c80fb0c407c6ee4d54d383937b8d0d4f9fb548db219c8d108159c37c909f1b
MD5 986a49fff5a0b14110c455d38661640f
BLAKE2b-256 7042819bd3d02eed3052cdffd9ff3510446b090027dbe22cb417fe4f412dcde7

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 973816b37626dc84c31456b3ea36b85d31fef74fa0d82d407781c27881b30f18
MD5 67d2eedcc2072d82911f2eab3b932aae
BLAKE2b-256 8876b1c88e999d5eeb501b7cb0e327e03927f2d593f23561ca3a87b979f0fd60

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5be3c852e0104a0ad4800d0b0132cd320f9e980a807a1d2490a94ca44bc48123
MD5 f9f93fe87fb3602d8cdc93d8bdf9ad07
BLAKE2b-256 5d3e0d26b790ce00934a7a35bb3f54d96888fe31b488aef36d7a6cec431cbc4b

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 db05b7c157aeb642e2bda9d39bee62165e0a02b12efa6a7fc8452641ee34b75d
MD5 554c14717f554a0f49c42cccddfd9fa0
BLAKE2b-256 8c8ea8443f323888030f815e63722f9006e21e5eda9901c8896cf8e6787ccc66

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page