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

Uploaded Source

Built Distributions

zengl-2.6.1-cp313-cp313-win_amd64.whl (48.2 kB view details)

Uploaded CPython 3.13 Windows x86-64

zengl-2.6.1-cp313-cp313-musllinux_1_2_x86_64.whl (140.7 kB view details)

Uploaded CPython 3.13 musllinux: musl 1.2+ x86-64

zengl-2.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (141.8 kB view details)

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

zengl-2.6.1-cp313-cp313-macosx_11_0_arm64.whl (45.7 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

zengl-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl (47.7 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

zengl-2.6.1-cp312-cp312-win_amd64.whl (48.2 kB view details)

Uploaded CPython 3.12 Windows x86-64

zengl-2.6.1-cp312-cp312-musllinux_1_2_x86_64.whl (140.6 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.2+ x86-64

zengl-2.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (141.9 kB view details)

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

zengl-2.6.1-cp312-cp312-macosx_11_0_arm64.whl (45.7 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

zengl-2.6.1-cp312-cp312-macosx_10_13_x86_64.whl (47.6 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

zengl-2.6.1-cp311-cp311-win_amd64.whl (47.9 kB view details)

Uploaded CPython 3.11 Windows x86-64

zengl-2.6.1-cp311-cp311-musllinux_1_2_x86_64.whl (135.4 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.2+ x86-64

zengl-2.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (137.4 kB view details)

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

zengl-2.6.1-cp311-cp311-macosx_11_0_arm64.whl (45.8 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

zengl-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl (47.5 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

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

Uploaded CPython 3.10 Windows x86-64

zengl-2.6.1-cp310-cp310-musllinux_1_2_x86_64.whl (134.5 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.2+ x86-64

zengl-2.6.1-cp310-cp310-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.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

zengl-2.6.1-cp310-cp310-macosx_11_0_arm64.whl (45.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zengl-2.6.1-cp310-cp310-macosx_10_9_x86_64.whl (47.5 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for zengl-2.6.1.tar.gz
Algorithm Hash digest
SHA256 6b885eef5d2bc5ea5da0de4a5b6eccfd21aff6c20ca595a6c29a38474282c5c2
MD5 1f32e1138f362e2f82108ffe1790b504
BLAKE2b-256 4f4980f09df52c856a4b67a5917f661c90dfc5e084ab343674a19a4c5ec46611

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.6.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 48.2 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.6.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7c166240fe77a5756a28bb6dbbd367d11fe021478e98124b09c20294bfed26de
MD5 11a63c82606b022346dda2a847e8de00
BLAKE2b-256 2510578f480c74f67527c232bdd73996218850214de269cee7a942f3a5c224ec

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4015bdff1e9f1aeac2d1f11332b5d508dedca8d8823b91a2031acb45d13b1752
MD5 35bc4f283acd714ff370fbb328bbecba
BLAKE2b-256 2c3ce41fc0db12ca67734555ccf0f5d5f87b150b83ea84cf2b999291bb15f102

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.6.1-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.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4b9a27e442835288cb6d8e3aaa8e0a2018a86c74ef70f2e5b692b4f1edb9529c
MD5 81fa626890c7a534b6a635271d032d66
BLAKE2b-256 b884f2ffaaa0c93623407ff90ac6f5f77ccd7e781fca1a741dd5000557317cdf

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0ee2cc3a6d32b9f2ec584f60cdde37247a34e5091560047737dd963ccccfcb9
MD5 be469cabe6fb20707209023c2e8278d7
BLAKE2b-256 1609b3350336530c17c4fa0303459f484412fc6a1d6aeb3a1548fb1ae726d5f8

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4a6632545d10fa6b675312be5476b2df69eb005b361650ad61477dccf5f38e65
MD5 47d20d8799ba6acd559df0fd069fbb09
BLAKE2b-256 7ce1ac60f39eb273b719bd8e3272daa4130dbcc2f1e2b6ba095e3d3df9fb01cb

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.6.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 48.2 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.6.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a7db4ad5ac5f8f49593dd8c9bba62632bd297473f4f8366848e29d65f56b5756
MD5 b6080fe3791724a29ee7091d16af92da
BLAKE2b-256 b1717a29cb8e516cc2f83f716b621f703d48516006592c96a1f410f8d5b0d9d8

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 39cb68c69712798b2b43f471c17bb12d89116cd61ff4b5122387031c48fc077c
MD5 06bc778b1dc1c16bdbe405b2a28b0875
BLAKE2b-256 8086c5edea136b0cc9cc0d1eccd1227dc319cc7a896c6bf688b04c9e051424e2

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.6.1-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.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 91685d51ddf573c29b966938393778d4f25af77b04e7ff04411083406980235b
MD5 e92e072ce87ba284e8993e5fb839d599
BLAKE2b-256 f05ae4e3075900cb20406dcf6781d2134cfda80495739f5ae9355703a6e3cb8e

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f572af17fe765560c338a5c32271a4aed3dd9158676e22be2ad1117dfe1475dc
MD5 d2db6c351d6444339d9b73e346034e3b
BLAKE2b-256 009a788f89c6337e05f2215211ad532293db1d570463a439aada768db991f3d0

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2b52a4c1cb2446af868df32c31844ad4ad716d3007a584558054a21ffc799fd9
MD5 a840e73a3e28dbfac45ca965f1164899
BLAKE2b-256 d79eb472b5a4b4c30bdca6cbb8f0e938ae551793090b103bc2ddaa52982c397b

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.6.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 47.9 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.6.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 54a6dc37fc6d3c4331e01f812fe1b99edefdac59e20518d4d4234cfca5c1e427
MD5 84b8d0eff8d4a9a2f78b506b70379f50
BLAKE2b-256 da291f2d9afff381d847f41c77a9a35e87d1016e878f7ddeb8c345a19b9e4bed

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d155c5be1303f25d5e2ab48adc0a0badca6ed419b69e9a8930e6c829f01445fe
MD5 fd8975c0b113e71aa214923f1aa98b3e
BLAKE2b-256 12f2cdccc3202343c247f75a0f9438c48792d94327c36c5b87d53e8a30530603

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.6.1-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.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee0db947a02024bf0f43e9360b7b0afa4424f10da5c4e2f18977bc79bbd53e60
MD5 c63ddb15c214a28ad12b1afedeb9ecc1
BLAKE2b-256 f7d73bfe8e54cfd85816d430a0b669cada7b4bae2cce462c911054822583b76d

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b93f740c3c0e192557d0e6996e88b2a9696708fee9d561a16e7bc4c99dd6ce3
MD5 fac79df1251749b0dda3e576c5b2d40b
BLAKE2b-256 9b469ad70df2eddae43d06cc909ccf6f2eb4b922a51d74119a64ede8b8378e25

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f8c118e233b90683334820364c93d1ac17ff82929388021f0bf9c934b4d5d381
MD5 319144b96144c596c3c6a4f425fd6123
BLAKE2b-256 5547bde59aa125ad4649f12dc9a75ca5f71422e100621881273efc3398eece4a

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: zengl-2.6.1-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.1 CPython/3.13.0

File hashes

Hashes for zengl-2.6.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 92fc5babdd07007f5287481959a3e3f8cc161d806b73e6db42cbcd54ffb4bb9c
MD5 aade89db513d2843d77e842a3f323d7e
BLAKE2b-256 abe2c602ad49c736ca2f290e159f6ba0f335e60e2fffa923a60054ea15c08631

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bb1f68ff27ecea8b8b2d12687db9d0402e6411b409a6986055a688faaa6c799c
MD5 0182b949fa0d1e0bd9923f3423d97462
BLAKE2b-256 244a7d50bb61567c56e0f34cefdbadccdcecdb13e0d3d6ce6fdb38139163a2d6

See more details on using hashes here.

Provenance

File details

Details for the file zengl-2.6.1-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.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f27888ae2df5a790149265733e0638906c654c2e6afbf78ff6b83a44840c042
MD5 68336397781e33030d0da9f9f35df808
BLAKE2b-256 5f1655593ba7c459e840b81bc53d69b944a9ea46e9c1eddae52a01055de0dc29

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66dcf5a1e3fdc40c348e00d2399f5a56022e7bfe4816663e17ec8bcb1365ef09
MD5 0ed25bf285990b60e115c65852999e7a
BLAKE2b-256 beb6c4708730eff32c5991c849a8824f987dbb7519d067633eb5f9b514dcfdf8

See more details on using hashes here.

Provenance

File details

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

File metadata

File hashes

Hashes for zengl-2.6.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8908d9fc65725f86abd243e9eb7e1c248b39395bebc27a0c5ddf7c818f877e56
MD5 f7947062ae0034a34fe4034e0f5cdf0a
BLAKE2b-256 8b56d8cc67e73b0162de6f86ae9bbb2baf2169dce32b6cde4f667f001762cd27

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