Skip to main content

Embree-backed isometric renderer that turns meshes into OpenRCT2 palette-indexed sprites.

Project description

OpenRCT2 X7 Renderer

openrct2-x7-renderer is the Embree-backed isometric renderer that turns triangle meshes into OpenRCT2 palette-indexed sprites.

Heavily inspired by X7's RCTGen.

Install

Requires Python 3.11+. Embree-vendored wheels are published to PyPI:

pip install openrct2-x7-renderer

The wheels bundle Embree + TBB, so there is no system Embree dependency at runtime.

Build from source

Building the extension needs Embree 4 and a C++23 compiler. On macOS: brew install embree.

uv sync
uv run pytest   # coverage is enabled by default via pyproject.toml

Quick start

import numpy as np

from openrct2_x7_renderer.mesh import load_mesh
from openrct2_x7_renderer.lights import default_lights
from openrct2_x7_renderer.ray_trace import Context, VIEWS

mesh = load_mesh("model.obj")
ctx = Context(lights=default_lights(), dither=True)
with ctx.begin_render() as scene:
    with scene.add_model(mesh, matrix=np.eye(3), translation=np.zeros(3)).finalize() as ready:
        sprite = ready.render_view(VIEWS[0])   # -> IndexedImage

Usage

Render context

Context is the entry point for rendering. The three constructor parameters control the entire render:

from openrct2_x7_renderer.ray_trace import Context
from openrct2_x7_renderer.lights import default_lights
from openrct2_x7_renderer.constants import TILE_SIZE

ctx = Context(
    lights=default_lights(),  # light rig (see below)
    dither=True,              # Floyd-Steinberg dithering when quantizing to the palette
    upt=TILE_SIZE,            # camera scale: units-per-tile (default 3.3)
)

upt controls zoom: smaller values zoom in, larger values zoom out. The CLI helpers scale upt by TEST_ZOOM (0.125) in test mode (--test) for fast iteration.

Render lifecycle (typestate pattern)

A single render pass follows a strict state machine enforced at the type level:

  1. Context.begin_render() → returns a SceneBuilder
  2. SceneBuilder.add_model(...) → chainable, returns self
  3. SceneBuilder.finalize() → returns a FinalizedScene
  4. FinalizedScene.render_view(view) / .render_silhouette(view) → produces sprites
  5. Cleanup via FinalizedScene context manager or explicit end_render() call
ctx = Context(lights=default_lights())

with ctx.begin_render() as scene:
    with (
        scene
        .add_model(mesh, matrix=np.eye(3), translation=np.zeros(3))
        .add_model(mesh2, matrix=rotation, translation=offset, mask=MeshFlag.GHOST)
        .finalize()
    ) as ready:
        sprite = ready.render_view(VIEWS[0])           # full shaded render
        mask   = ready.render_silhouette(VIEWS[0])     # solid silhouette / mask sprite

FinalizedScene.__exit__ calls end_render(), freeing the Embree scene. SceneBuilder.__exit__ calls end_render() only when finalize() was not called (e.g. the block exited early due to an exception). The context may be reused across multiple render passes by calling begin_render() again.

SceneBuilder.add_model parameters:

Parameter Type Description
mesh Mesh Triangle mesh returned by load_mesh
matrix (3,3) float64 Rotation / orientation matrix applied to the mesh
translation (3,) float64 World-space offset after rotation
mask int Bitmask of MeshFlag values (default 0)

MeshFlag.GHOST (from constants) makes the mesh transparent (ghost ride vehicles). MeshFlag.MASK marks the mesh as a collision/mask geometry.

Views

VIEWS is a tuple of four (3,3) world-rotation matrices — one per compass corner, matching OpenRCT2's four viewpoints (NE, NW, SW, SE). These rotate the scene before the dimetric projection:

from openrct2_x7_renderer.ray_trace import Context, VIEWS

ctx = Context(lights=default_lights())
with ctx.begin_render() as scene:
    with scene.add_model(mesh, np.eye(3), np.zeros(3)).finalize() as ready:
        for view in VIEWS:
            sprite = ready.render_view(view)

Pass any custom (3,3) float64 orthonormal matrix to render from an arbitrary direction.

Lights

default_lights() returns a nine-light rig that matches X7's RCTGen defaults. To customise the rig, build a list of Light objects:

from openrct2_x7_renderer.types import Light
from openrct2_x7_renderer.constants import LightType
import numpy as np

lights = [
    Light(
        type=LightType.DIFFUSE,                      # LightType.DIFFUSE | .SPECULAR | .HEMI
        shadow=True,                                 # whether the light casts shadows
        direction=np.array([1.0, 1.65, -1.0]) / ..., # unit vector toward the light
        intensity=0.8,                               # strength multiplier
    ),
]

Light types:

Constant Behaviour
LightType.DIFFUSE Lambertian diffuse shading
LightType.SPECULAR Phong specular highlight
LightType.HEMI Hemisphere / sky light

When loading lights from a config via load_lights, each direction must be a non-zero vector; passing [0, 0, 0] raises ValueError.

Lights can also be loaded from a config file (see Config files).

Mesh loading

from openrct2_x7_renderer.mesh import load_mesh
import numpy as np

mesh = load_mesh("model.obj")

# Optional: apply an orthonormal transform at load time
# (e.g. mirror or axis-swap).  Negative determinant flips winding order.
# Raises LoadError if the matrix is not orthonormal (|det| − 1 > 0.001).
mesh = load_mesh("model.obj", transform=np.diag([-1, 1, 1]))

load_mesh parses the OBJ file and the MTL it references, loading textures (map_Kd) as linear-RGB float32 arrays. Standard MTL properties are honoured.

Normal handling: if the OBJ defines vn entries and every face vertex references one, the artist normals are used directly. If normals are defined but any face vertex omits the //vn token, a WARNING is logged and area-weighted face normals are generated for the entire mesh. If no vn entries exist at all, face normals are generated silently.

UV handling: if a face vertex references a texture coordinate index but no vt entries are defined, a WARNING is logged and that vertex's UV defaults to (0, 0).

MTL directive Effect
Kd r g b Diffuse colour (sRGB → linear on load; used when no map_Kd is present)
Ks r g b Specular reflectance (sRGB → linear on load)
Ka r g b Ambient reflectance (sRGB → linear on load)
Ns value Phong shininess exponent
map_Kd file Diffuse texture (sRGB → linear on load)

Material name flags

The renderer recognises keywords in OBJ material names to set rendering behaviour. Keywords are matched by substring, case-sensitive:

Keyword in material name Effect
Remap1, Remap2, Remap3 Map diffuse colour into OpenRCT2 remap palette region 1–3 (runtime recoloring)
Greyscale Use palette region 4 (greyscale remap)
Peep Use palette region 5 (peep skin remap)
Glass Render in the translucent glass pass
Ghost Ghost geometry: primary rays trace through it (not drawn) but it still contributes to the silhouette/occlusion pass
Back Included only in rear-wall sprite blocks
Front Included only in front-wall sprite blocks
Mask Treated as a visibility mask (MaterialFlag.IS_MASK)
NoAO Disable ambient occlusion for this material
Edge Enable background anti-aliasing blending
DarkEdge Enable dark-variant background AA blending
NoBleed Disable colour bleed from neighbouring pixels

Example MTL material name: mat_Remap1_NoAO gets remappable region 1 with AO disabled.

Constants

All material/mesh/light constants are exposed as strongly-typed enums:

from openrct2_x7_renderer.constants import MaterialFlag, MeshFlag, LightType

# MaterialFlag is an IntFlag — supports bitwise operations
flags = MaterialFlag.IS_REMAPPABLE | MaterialFlag.NO_AO

# MeshFlag is an IntFlag
mask = MeshFlag.GHOST | MeshFlag.MASK

# LightType is an IntEnum
light_type = LightType.DIFFUSE

Silhouette rendering

FinalizedScene.render_silhouette produces a solid silhouette sprite — every hit pixel is rendered as flat mid-gray (linear 0.5, 0.5, 0.5) and quantized to the nearest RCT2 palette entry; transparent pixels are unchanged:

with ctx.begin_render() as scene:
    with scene.add_model(mesh, np.eye(3), np.zeros(3)).finalize() as ready:
        mask_sprite = ready.render_silhouette(VIEWS[0])

Image I/O

from openrct2_x7_renderer.image import write_png, read_png, quantize_to_indexed, PREVIEW_SIZE

# Write a rendered IndexedImage as a paletted PNG (transparent index = 0).
write_png(sprite, "out.png")

# Read a paletted PNG back (must already be an 8-bit palette-mode PNG).
img = read_png("existing.png")

# Convert any image format to an IndexedImage sized for a 112x112 preview.
preview = quantize_to_indexed("photo.jpg", size=PREVIEW_SIZE)

quantize_to_indexed resizes with Lanczos resampling, Floyd-Steinberg dithers into the safe palette ranges (indices 10–201, 214–226, and 240–242 — excluding the remap windows and animated colours), and maps alpha < 128 to transparent.

Geometry helpers

from openrct2_x7_renderer.geometry import (
    rotate_x, rotate_y, rotate_z,
    combine_model_world,
    assign_faces_to_tiles, subset_mesh,
)

# Build a rotation matrix from Euler angles (radians).
rot = rotate_y(math.pi / 2) @ rotate_z(angle_z) @ rotate_x(angle_x)

# Bake a multi-part animated Model into a single world-space Mesh.
world_mesh = combine_model_world(meshes, model, frame=0)

# Assign each face to the nearest tile center (for large multi-tile scenery).
tile_ids = assign_faces_to_tiles(world_mesh, tile_centers_xz)

# Extract a per-tile sub-mesh (tightens scene bounds, improves AO accuracy).
tile_mesh = subset_mesh(world_mesh, tile_ids == 0)

Multi-frame animation

Model and MeshFrame represent an animated object with up to four frames (OpenRCT2's engine limit). Each placement holds one MeshFrame per frame:

from openrct2_x7_renderer.types import Model, MeshFrame
import numpy as np

model = Model(meshes=[
    [
        MeshFrame(mesh_index=0, position=np.zeros(3),
                  orientation=np.array([0.0, 0.0, 0.0])),   # frame 0
        MeshFrame(mesh_index=0, position=np.zeros(3),
                  orientation=np.array([90.0, 0.0, 0.0])),  # frame 1
    ],
])

orientation is (angle_y, angle_z, angle_x) in degrees, applied as rotate_y @ rotate_z @ rotate_x. combine_model_world(meshes, model, frame=N) selects the pose for frame N; placements with fewer frames fall back to their last frame.

Config files

parse_config reads a JSON or YAML file into a plain dict (PyYAML is already included as a package dependency). The run_cli helper builds the full context from a config automatically, but you can load individual sections by hand:

from openrct2_x7_renderer.config import parse_config
from openrct2_x7_renderer.lights import load_lights, default_lights

root = parse_config("object.json")   # or "object.yaml"
lights = load_lights(root["lights"]) if "lights" in root else default_lights()

A lights block in the config is a list of light objects:

{
  "lights": [
    { "type": "diffuse",  "direction": [1.0, 1.65, -1.0], "strength": 0.8, "shadow": true },
    { "type": "specular", "direction": [0.0, 1.0,  0.0],  "strength": 0.5, "shadow": false },
    { "type": "hemi",     "direction": [0.0, -1.0, 0.0],  "strength": 0.1, "shadow": false }
  ]
}

output_directory (string) sets where generated files are written; omitting it defaults to the current working directory.

meshes (array of strings) lists OBJ files to load. preview (string) points to a preview PNG. Both accept absolute paths; relative paths are resolved against the config file's parent directory when a base_dir is passed to load_meshes() / load_preview() (the CLI does this automatically), falling back to the current working directory when the file isn't found there.

Test-mode remap colours

Remap1/Remap2/Remap3 materials render into reserved palette windows that OpenRCT2 repaints to the player-chosen colour in-game, so they look wrong in a static preview. An optional test_remap_colors block recolours those windows in --test previews to show the repainted result. It is ignored outside test mode, so real renders keep the raw remap windows OpenRCT2 expects.

{
  "test_remap_colors": {
    "1": "bordeaux_red",
    "2": "dark_green",
    "3": "yellow"
  }
}

Keys are remap regions (13); values are OpenRCT2 colour names (the 32 standard colours, e.g. grey, bright_red, teal, light_pink). Any region you omit keeps its raw remap window. make_context(..., root=root) reads the block, and Context.render_view applies the substitution; the per-colour shade ramps in openrct2_x7_renderer.remap are taken from OpenRCT2's own palette-map sprites, so the preview matches the in-game repaint.

Performance

The renderer maintains a persistent thread pool for the lifetime of each Context — one worker thread per logical CPU core by default (capped at 256). The pool is created when the Context is constructed and reused across all render calls, so there is no thread-creation overhead on subsequent renders. Set OPENRCT2_X7_NUM_THREADS to override the thread count:

OPENRCT2_X7_NUM_THREADS=4 python generate.py

Sprite output format

images_dat.write_images_dat writes a single binary blob images.dat containing all sprites, referenced from an OpenRCT2 object.json via the $LGX: syntax ("images": ["$LGX:images.dat[0..N-1]"]). This is the same format the vanilla OpenRCT2 parkobjs use.

images.dat layout

+--------------------+--------------------+
| num_entries (u32)  | total_pixels (u32) |   8-byte header
+--------------------+--------------------+
| element 0          (16 bytes)           |
| ...                                     |   num_entries * 16 bytes
+-----------------------------------------+
| sprite 0 pixels    (w * h bytes)        |
| ...                                     |   total_pixels bytes
+-----------------------------------------+

Each element is u32 offset, u16 width, u16 height, i16 x_offset, i16 y_offset, u16 flags, u16 zoom; width and height are unsigned. flags = 0x0001 (G1_FLAG_BMP) indicates raw indexed pixel data — palette index 0 is transparent. RLE compression (flags = 0x0008) would be more compact but is not implemented.

License

GPL-3.0-or-later. The distributed wheels bundle Embree and TBB (Apache-2.0); their license texts ship alongside.

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

openrct2_x7_renderer-0.3.8.tar.gz (103.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

openrct2_x7_renderer-0.3.8-cp314-cp314-win_amd64.whl (13.5 MB view details)

Uploaded CPython 3.14Windows x86-64

openrct2_x7_renderer-0.3.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (13.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

openrct2_x7_renderer-0.3.8-cp314-cp314-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.8-cp313-cp313-win_amd64.whl (13.3 MB view details)

Uploaded CPython 3.13Windows x86-64

openrct2_x7_renderer-0.3.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (13.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

openrct2_x7_renderer-0.3.8-cp313-cp313-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.8-cp312-cp312-win_amd64.whl (13.3 MB view details)

Uploaded CPython 3.12Windows x86-64

openrct2_x7_renderer-0.3.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (13.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

openrct2_x7_renderer-0.3.8-cp312-cp312-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.8-cp311-cp311-win_amd64.whl (13.3 MB view details)

Uploaded CPython 3.11Windows x86-64

openrct2_x7_renderer-0.3.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (13.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

openrct2_x7_renderer-0.3.8-cp311-cp311-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file openrct2_x7_renderer-0.3.8.tar.gz.

File metadata

  • Download URL: openrct2_x7_renderer-0.3.8.tar.gz
  • Upload date:
  • Size: 103.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for openrct2_x7_renderer-0.3.8.tar.gz
Algorithm Hash digest
SHA256 c9bef8ed19cf0923524d65ea2fcb80ca436c6be9fcfa9c56d934363e345ad101
MD5 f380bf93846856c0240bbf901c975824
BLAKE2b-256 cabd7c4ba61e107eb5ac303fe4fb599c46aae40aa1bcad5d21ef44c97b29343a

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8.tar.gz:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a75dbeaa5ef49ec6505ad7c58366381e544c576f4398e39939df42bea8b05a6b
MD5 0cb3a1eca0879d2e42cef5e4fad6a98f
BLAKE2b-256 0357669ba0c2e2049127b4a31b558e4db3c79132bf23e5322a3e609ea0235436

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0195307d43b6fa6352f7897ded6851aff3e03fd3103a01dab1a68f3eb6e6627e
MD5 c21db5a9682fdfbaf97376644be5268c
BLAKE2b-256 eff80697034c2a281dfc056d87791f4ba50a53acc59c7e588dfe3375e25fa3ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 918e82f9b0c79aaa6d3094cfb4ff98efd7da9c5f52f37b674591875b36e036d0
MD5 82b5d62f9a1056fd54915d918e259793
BLAKE2b-256 6c42d0343acacc901fda3f65833d019022089fd62bc689238fb9664a8d8650f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f2826bd24c9a9aeb32a1b5188141b17e2734b1973c892fc3a30fac6a3514ff93
MD5 890088f3cb340f7e5290fe23dc9402df
BLAKE2b-256 ef5e3d633e527cf8d7ac1260977c15db9e0c3b5080814bfbe1f6dbc50918ee5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ecc754b1d83961d693eaf46fc8f7ce575fa771dd6bfdc1710a097287fe07b64b
MD5 9491dccbb38e7adcb6f4bec19ce874c4
BLAKE2b-256 622b6b64b2280b6e1614115acc0911ec7a6d1afc9dca332bd8051cb429701b0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8d601206f1dd96a29674e663bd8bfd62884f86da200ddaffc16a6b358d9b3be
MD5 cdf41065a858126b9dead37864c17d17
BLAKE2b-256 57db885a03aab53697ac78e8cca209a326e874a4dd7f6ff2554e5febf2cd6d2f

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 82ac96fac0243acd61b7ced6811a57ae1d51c4d9a94db93a9ca97895046b5b2c
MD5 42b5ba013f48731c750b0f3955da9660
BLAKE2b-256 e830bffd7faee60bfa0dfd45a1ba8f0ccd2e62181e1cbe2bce710f10c2e613f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3abc2457562d338489a3d06e7bfd1c61cc1fdaf842635d1abe1cf5e13c63e7c7
MD5 bf14db7dce474f6e772679de19f2a2d4
BLAKE2b-256 9b42f3673a91179cbe6f129a335e66717743d7c65c9fd4c68bb37e438d6de26d

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 06b7e97aa935182dc3d3d102aacb0d0950c025437774585ddb08eea9292026bc
MD5 292aca03cd4d0dbcce9b73d1b062658d
BLAKE2b-256 2ff84951a95a6acaf851118d78b149d146540e88af3a6095e0c7048b6f3714bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6d6cbd25e88c3af6cd5b4d0be7342ded7ef9383d363076ab412aeba305648811
MD5 9c7a3df6287d2dd6da249d7fc22c1343
BLAKE2b-256 6fc756773f5a6c646d09c63f5fcab82bec321e104875cf645f58b50dc29d511f

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2d70fa52563bbab1673dd735cbef004b61fe2e935a0b0abd2c0125afd6972ace
MD5 b5b7d0b841b4aabaa8abb16af607abdb
BLAKE2b-256 746d2b5c40218e46367728e214aa0968d5c1a076cb8efc77af194f2d3d8169e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openrct2_x7_renderer-0.3.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8db744b7b618f0adf93256b8c3416c0d2768b0a8c7309d6ecbb46ebeac129a14
MD5 937a8c0bdd2db756c27b71d324d81f33
BLAKE2b-256 fcc7993579a06c5a1a3ddac72b9ae65b4fc42b5d9951a65a66f7b69873652b14

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.8-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on alex-parisi/OpenRCT2-X7-Renderer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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