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.5.5.tar.gz (55.0 kB view details)

Uploaded Source

Built Distributions

zengl-2.5.5-cp313-cp313-win_amd64.whl (48.5 kB view details)

Uploaded CPython 3.13 Windows x86-64

zengl-2.5.5-cp313-cp313-musllinux_1_2_x86_64.whl (133.3 kB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

zengl-2.5.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.4 kB view details)

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

zengl-2.5.5-cp313-cp313-macosx_11_0_arm64.whl (45.0 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

zengl-2.5.5-cp313-cp313-macosx_10_13_x86_64.whl (46.9 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

zengl-2.5.5-cp312-cp312-win_amd64.whl (48.5 kB view details)

Uploaded CPython 3.12 Windows x86-64

zengl-2.5.5-cp312-cp312-musllinux_1_2_x86_64.whl (133.2 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

zengl-2.5.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.4 kB view details)

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

zengl-2.5.5-cp312-cp312-macosx_11_0_arm64.whl (45.0 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

zengl-2.5.5-cp312-cp312-macosx_10_9_x86_64.whl (47.0 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

zengl-2.5.5-cp311-cp311-win_amd64.whl (48.1 kB view details)

Uploaded CPython 3.11 Windows x86-64

zengl-2.5.5-cp311-cp311-musllinux_1_2_x86_64.whl (130.1 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

zengl-2.5.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (132.8 kB view details)

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

zengl-2.5.5-cp311-cp311-macosx_11_0_arm64.whl (45.1 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

zengl-2.5.5-cp311-cp311-macosx_10_9_x86_64.whl (46.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

zengl-2.5.5-cp310-cp310-win_amd64.whl (48.1 kB view details)

Uploaded CPython 3.10 Windows x86-64

zengl-2.5.5-cp310-cp310-musllinux_1_2_x86_64.whl (129.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

zengl-2.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (131.8 kB view details)

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

zengl-2.5.5-cp310-cp310-macosx_11_0_arm64.whl (45.1 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zengl-2.5.5-cp310-cp310-macosx_10_9_x86_64.whl (46.9 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: zengl-2.5.5.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.5.tar.gz
Algorithm Hash digest
SHA256 882231bcb02a6df15f300220948daf6878a8c609f51aa294c4eb9160ab0d654a
MD5 defd81d45dea1ba68bc7368875288d88
BLAKE2b-256 42dd002e6b1b920704b6bd68662191550da6ba532c2efaff25eb7134bf50744e

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.5.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 48.5 kB
  • Tags: CPython 3.13, 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.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e7e4ffe4f30c8dbb3f3f3a16501e34823b6e72daa05c61ad2460d9513a9e1777
MD5 824d96eb928b018e1e8df8787e215089
BLAKE2b-256 dc8cdbc7ab7ff30e8024b1b63fb8b532880d8348579c464c22808a8048fb22f6

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 68484ca12641f001fbe51176c50ddb192bec0d1b5ede907a21054a4726fd3682
MD5 2d40d27bfd2d82d17994d0fe2931d4ae
BLAKE2b-256 d73650237a2a3af25b11c32105b8e756ed228de3ba72666e362fb12a44be3f5f

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.5-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.5.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 afee8afc1ddce10bd06b180a7698cbf1cceb6118321f48d155230a8bde07e669
MD5 bfb52934bb2dd0cae14e6d09cf0c3088
BLAKE2b-256 2c17dc9b13ab532959d1ce40bc4c12d40542804ca25c760d0bbe007131b42df2

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8aaa41b46fc7a7f34d1a63eadbf8271b1cb8f05d04be89bbf6cad6dfca2c9d45
MD5 be78192ccf44cf8b3c426ad535e91abe
BLAKE2b-256 57202dd6c2d14b480fd669afc146f7ba3d64937201bd28ee92bbbf2a33c44d60

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 311d88db5c1c223b5655ce71f9625454dc6b894211dab0bac15be2315401e6ad
MD5 7e1106e77e49c858600f9ee4e8c57245
BLAKE2b-256 668c4346a5ee22ec464369c6bc177e105756b39d95f3dbb1ac1078e6ce2df2ca

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.5.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 48.5 kB
  • Tags: CPython 3.12, 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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b30141f6713ffb3622f4a806094731fd6adcedc0a2ddc2e106f93c92c0651957
MD5 a031a16bc506ebc08121e3ea7abb663c
BLAKE2b-256 2aff773c8a8d6767fd8fd21739d025bf32644030d9d915c95a9b79e620b223a7

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2898378ec175bb1a47924861af9674df0deb1246f6ebc178d4f4fca178948877
MD5 be3f7b1367881bd743cd8208a598b39c
BLAKE2b-256 ba878e0c555524f64c8d3204b60331e2e4fac57f33f574239c1255c2c4774f08

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.5-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.5.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a1f56a973c0e932ee6a4bc8759dc3fe1f5a49476df2cac6eccf902e40f15a17a
MD5 2f8dbd694a611591705308079cd33e22
BLAKE2b-256 e566b8f339a5b6aaec478e7b9be7ec9f68c302021ebf43bc4853a80f9adb0426

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2490d61c5962337d427f199b999bb1cf26bb8247cc1c3a73e5fc82ce57aa9de9
MD5 42cd40c5122ed6a4d9f0b44f8dceb33a
BLAKE2b-256 5c77eb4ceaab916ed0a5fc39cb1d8314f47f57db477336f70049a4fae005003c

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.5-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zengl-2.5.5-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 38676e17bc74e384b2d1eee8d08e67e9448771ebb7a470e8475a7d2c4052e560
MD5 91d1108910a4d1ab783cca7f114eadb1
BLAKE2b-256 225d1d8611873adb59f7b70819583fd7e03e7864c289fa8f7ddf91bf94d109c8

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.5.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 48.1 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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3b7a42a9973149aa7a832c80f27c828bfc3961f944b489c105f6383d68751a80
MD5 e83d2eee65cdda519fc476dd3d3f7b41
BLAKE2b-256 65d2e0ed0ff2ee5426d56aeeb0d2d6cb04487992830dd5f12a551a5d33796a83

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f2beb9b624a9e69b27fa1a7314014d180f4fa0ad276f9568f07cb3f463fbe67e
MD5 e7756453b5c36f6874d1761933b02f02
BLAKE2b-256 0fcfc42403e4ea214575b7a2f7757c3d5ef55dfa5d52afcfd0f7c8a915623884

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.5-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.5.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ece29d0eb43b73b8005aab9267447f44e75600c5037591c69448e4fa0c04d053
MD5 4f9416f8934eceec651b4489a7985ee7
BLAKE2b-256 4e93aa284a1956d72283f78a752e65a7a7dee80705c6dba167b09e11fbfbc092

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4f67a50887bb50d29338eb74ac8a9540b4e8ca7b8b26253574901ca99d227131
MD5 3ba509501432ebc5094c6f019b5eeefe
BLAKE2b-256 77e9a0af82ec79141653293c816933854544860c35ddbd8aa1ae9b482f1c6fe7

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9d824ea21e3bbc346e9e6a0add8ca65217d838a5b7e7858b368adfc05f6660ea
MD5 3ea250ae9759cb0b9a4247e1443dd0c2
BLAKE2b-256 64ec1f70899e203e00f723e0a7a960cd6170716d439c210a937f6cdf58507b46

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.5.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 48.1 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.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8d5b4315dc95d3dbabd2002c167cad0f77ce3ad421280da04fdd3a9fd9b52587
MD5 f904eebea8196827b6240fcb20da85ca
BLAKE2b-256 72209c05ff813cada5366d83de5b5e305d884515420f8058fd30f92282836288

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 452d2d43a9429434187b5f56f9a6106b8c5151d77ac290f3eba2918f5ceeb4e2
MD5 839a1fba922baee99fce073e5dd024dd
BLAKE2b-256 9379466a5e943507613ec408fe7d2661694f86c2118834b75d3bd3cc3e92d7c7

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.5.5-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.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cbc309f25b0338bdfbd9f8fedcaf605f7cf6415ad00118a23658ce4aaa186467
MD5 7ad9d2e5f0ec5324ece9aa358e05c31f
BLAKE2b-256 ef9d35af9e3df36b98b050837ce7fc08f576297e4d4bbee528e3b55b0d9c8cbc

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aa6ee5217843cbf4a1191005c29af66201e0d5bfaa16bfd8960fb304f6dc321b
MD5 1e2d97dab9387f49b2aefcc3518451ec
BLAKE2b-256 9d18d32be4b7da66649e60bcd364850113467a22140eceace5c42c6ee2c55929

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.5.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 43469c450b888a0e048f2d9e2b25875f9b96ae7307821531ffa4b47b5491573b
MD5 121958d0bad8254173ae29aecb442b63
BLAKE2b-256 fffb6c3b8b548415d10b5ac6c39de83a6279911afd9cdbd5c3afd110f7145574

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