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 Texture or Renderbuffer
  • Buffer is an OpenGL Buffer
  • Pipeline is an OpenGL Program + Vertex Array + 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(
    vertex_shader=...,
    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() {
            ivec2 at = ivec2(gl_FragCoord.xy);
            vec3 position = texelFetch(Position, at, 0).xyz;
            vec3 velocity = texelFetch(Velocity, at, 0).xyz;
            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 Renderbuffer Objects
  • ZenGL Buffers are OpenGL Buffer Objects
  • ZenGL Pipelines contain an OpenGL Vertex Array Object, a Program Object, and a Framebuffer Object
  • ZenGL Pipelines 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.7.0.tar.gz (54.8 kB view details)

Uploaded Source

Built Distributions

zengl-2.7.0-cp313-cp313-win_amd64.whl (47.8 kB view details)

Uploaded CPython 3.13 Windows x86-64

zengl-2.7.0-cp313-cp313-musllinux_1_2_x86_64.whl (139.4 kB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

zengl-2.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (140.6 kB view details)

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

zengl-2.7.0-cp313-cp313-macosx_11_0_arm64.whl (45.3 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

zengl-2.7.0-cp313-cp313-macosx_10_13_x86_64.whl (47.0 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

zengl-2.7.0-cp312-cp312-win_amd64.whl (47.8 kB view details)

Uploaded CPython 3.12 Windows x86-64

zengl-2.7.0-cp312-cp312-musllinux_1_2_x86_64.whl (139.4 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

zengl-2.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (140.6 kB view details)

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

zengl-2.7.0-cp312-cp312-macosx_11_0_arm64.whl (45.3 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

zengl-2.7.0-cp312-cp312-macosx_10_13_x86_64.whl (47.0 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

zengl-2.7.0-cp311-cp311-win_amd64.whl (47.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

zengl-2.7.0-cp311-cp311-musllinux_1_2_x86_64.whl (134.3 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

zengl-2.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.1 kB view details)

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

zengl-2.7.0-cp311-cp311-macosx_11_0_arm64.whl (45.4 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

zengl-2.7.0-cp311-cp311-macosx_10_9_x86_64.whl (47.0 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

zengl-2.7.0-cp310-cp310-win_amd64.whl (47.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

zengl-2.7.0-cp310-cp310-musllinux_1_2_x86_64.whl (133.4 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

zengl-2.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (135.1 kB view details)

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

zengl-2.7.0-cp310-cp310-macosx_11_0_arm64.whl (45.4 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zengl-2.7.0-cp310-cp310-macosx_10_9_x86_64.whl (47.0 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: zengl-2.7.0.tar.gz
  • Upload date:
  • Size: 54.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for zengl-2.7.0.tar.gz
Algorithm Hash digest
SHA256 31f0c463eb795ae48d237ed78ca3aa0ad74c8dd3556769f5c26d6e7adb474cb9
MD5 2f6dd1018dffb69bd882d951ff76ad71
BLAKE2b-256 9525c37baec1d7b2a8b2760b2005fa3d7e17e95e758c119f9b799a6a5837eb11

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: zengl-2.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 47.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for zengl-2.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 788159772515ca5531adb77f92c6ff9e140573f0e19e5ed157d271e5e8ef4f50
MD5 fb92f1bf5a977340034d32bda13c94b4
BLAKE2b-256 12ea78f90d6904729d377277965f1007291c253d93a69fa6df837045583c7160

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0bbee6356094b726486999e2857d317eb8672eceb62315b9a5e7d65c0f7b61b0
MD5 98dbffa0fe0935aa9075421edef035d1
BLAKE2b-256 29dd1a3b4a5ad194113d510d21c3c6152df450633c1c080bfa1c2771353ae4db

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp313-cp313-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.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 51f8798fd27a4f3103ee3c885e434fc382f6dce889c871f1eb7ed0c9c99556d9
MD5 07e3722f19a2b3a14b5d2641f945acbc
BLAKE2b-256 2ab20f3bb4f222adcaceaf42728d852eb1e0660a51f798f7c63ef0ea281b3005

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dbfffa3360cdde04743ef9c981049f27f867076b760cd10545f475785c44d8d2
MD5 980910928208ab0e350703cc01a1d993
BLAKE2b-256 64638400520d2f8202754709da966ce1f4283ac439ec10d1c9ef2837a42d162a

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a272f7be1d62dee74edb7c78519199b91cef722b361356e1ab97d5edcb935bca
MD5 dbdfa3e5fd7a860c0577b9d36c1821df
BLAKE2b-256 850895086f157325e338ce817f11984c72c26bea63517b7bc7e596492d845482

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: zengl-2.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 47.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for zengl-2.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e107913f8f17f904857cf3395f028c40c31bc0e325e8a1cf87219ebe50098fc5
MD5 e62f90447828a5503751244f3cfa5b04
BLAKE2b-256 82e26620a05c16eecf11db251bfefa723602d11d1522fac3a7bde083b12a46e2

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e214985c86b7a683050dee45cdbaa20b6937668293aae41eaab833998e331184
MD5 abe71b8604dbf13e6423c4b0a4333d5c
BLAKE2b-256 40f9b7b36d0503bda91e47be3c4390d0ae842547c6718a4054380981588b8cb8

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp312-cp312-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.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db0c53690b941517287f7d48a23803326c64811bbb8a04ee5c94a9d7fa19fae3
MD5 d33b9e2e058657b427c6f9b9cf8ddabc
BLAKE2b-256 bceb2cc3b473fca9278bf989f5f20f6f052469a4cb967845a8089ddc7bcce2bf

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a151b02ec828a949421de3818f0cab9fefeb2a226d79e37ce33476dd7c6efad5
MD5 1ef93b977312a46091470df8a08ac083
BLAKE2b-256 15a5dfc1869bcef9986ecf9f9f0d9bef5422b1e07ba5b0a9446c8ab5e9eb9df0

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9460ed3ccf55ef384b896f678d501ddd9ba6bc6a22783e36bdc9849f8eaac596
MD5 40b40edc71cb70e9b7233606351ad4f0
BLAKE2b-256 6500202ecfbc88c73ba259cd56622527acd2cd234dc410285ccf0bcd54c79e28

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: zengl-2.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 47.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for zengl-2.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 543ef384c138ba2c5c8d3f3ef3f9d6a1226a5ef048e7beebb6f3fd941b0b5d46
MD5 50bc6ec5e860395825cb93917864f651
BLAKE2b-256 f83cbacde533b9efd6ee4e3ef2eaa3bfadebd5f3b717a293c0eac50d33aeb2f5

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c2bd165f4adab7ec1d86b98b1e909b3bb5d27ac1ff94f165e24b9bea1e2c6621
MD5 4ef08aa1a20fd4e26d1e301d3b03edc8
BLAKE2b-256 31b045ac89b6de5e9298e8523f92cf91324568fc9c401a49f8e735a7d4d76a38

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp311-cp311-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.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04350a5da89c71d6ea0ae0f2743abe299b04e9f82d387537335fd3cb588a6785
MD5 e50216cf40f51ab4318d790429305074
BLAKE2b-256 de125d92e95c3b4416256426f061ce7a5b4454b5577e7e9fca213ff593f9a609

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f900676e2e8e89f65b8293f711c51a82b97b422ff3447d888a6c4b5e39cd52b5
MD5 9272e42667049a8cf1bc90b3a3d9cc38
BLAKE2b-256 d3c0cfc762910ea6b1f1a21e164f1d65da6a9edd867b8f928664a873d66751de

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.7.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9cfe86b5cc8f5a345370e6da9e319ac765f525cd5c6bf1da01eefaaddb355cd9
MD5 5e3cae2f002c0e93f48fe028f234e40b
BLAKE2b-256 3f89bc9d47d927d405defed84522bb1a1abde683437ed982b33f07ab19d35fba

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 47.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for zengl-2.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d2a89668e0ba36cf722e822e58bd33f04b77ccda4ed6edccd545aa676993889c
MD5 e47851994a92cffb70e8930c4a065fab
BLAKE2b-256 ff0b7978214c30ac2fe470419cb996fee723f57711ea89529fce6f55f47273bc

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.7.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2efbaa184c6a5399169bd9a622481324b1bdb646b1e0a9906e46382855242d50
MD5 efed12aa50acd7dea4737a2dd3b37189
BLAKE2b-256 33098a69f9d2169e0fc450cdfeaab46df31fbc3cbf9854b05e6163d717e105f1

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.7.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.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3047d3934e51068056531e5ff3d03de43d72f1fe372a89b0f9da30c44cef673c
MD5 59652165c400d4fa330e1077ed484213
BLAKE2b-256 e38d55f5620e0816e96fec11160d1e9bbabded17d2f427b7a6a8810e0ffdb5bd

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 696aee7471e040040159003ddb052d710d5c545cf1940f173c44bbd5706e8cfd
MD5 edf2bc543e10969d41bb1240a8ae977b
BLAKE2b-256 96538c40274be82caa9d33faf8d4a64ab2c421adc8ee2f77470c8253f67668cc

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.7.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c5a312f561b624e7eeece4b03380780a83f7a08041225022b48d4596f93523e0
MD5 75b84c90aa62721660e003703537b421
BLAKE2b-256 d34ba6b5f5f65fc9ba8cd35c5b1582fececf5f8df798fd93098d454160ec6a28

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