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.7.tar.gz (103.6 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.7-cp314-cp314-win_amd64.whl (13.5 MB view details)

Uploaded CPython 3.14Windows x86-64

openrct2_x7_renderer-0.3.7-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.7-cp314-cp314-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

openrct2_x7_renderer-0.3.7-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.7-cp313-cp313-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

openrct2_x7_renderer-0.3.7-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.7-cp312-cp312-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

openrct2_x7_renderer-0.3.7-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.7-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.7.tar.gz.

File metadata

  • Download URL: openrct2_x7_renderer-0.3.7.tar.gz
  • Upload date:
  • Size: 103.6 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.7.tar.gz
Algorithm Hash digest
SHA256 35b950f9d90af3bb2428cfc60e821aafb91f4b2ed287de78effa8714fa78bfa3
MD5 0b2c0a2ff1459e447e863025ddfb9f54
BLAKE2b-256 3ac5d639858950fcc1a3c3587945c9c43732a0864b4ca15e90602321da4f9e86

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7.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.7-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e0382dc8a7f3f23163da55fea08885b407f2384d88e28435c21a385dd4d8f12c
MD5 5f7eafc84253e7f106ffb72bfdd9b080
BLAKE2b-256 d86496759599ae175259874c007a8ae2fc3949bf84e6a5e09e9ada4f55521ab7

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3987b3e35383ee63cc0a3cdd6df59363d27ad563cadd622266d5dcfb044b1055
MD5 baf4c8c6d741200e7f3c2e71ed4bde9f
BLAKE2b-256 9334c114898afa3f0c36eb86ebcdf4c94e15c3df36329b256354fa0c7c141ae1

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9c62d2c33639cf5202262f639f318eb3c8bf7256cdd1e1014e3ee7fee194e3eb
MD5 9e4d33d3310505835afea70f937b7ce1
BLAKE2b-256 777346483bb2a5bdeade5f3ca499cf3b698494e089b20a7c9438c7b769af3b54

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 740606027b9d6bddd611948080e5f1db2f63d8ccbba8c0046ec20fc08d061c90
MD5 eda50984555d9341409bb8342858ccbc
BLAKE2b-256 3e988cd62e3cb0113b03c2173b26433c6859fa8e5b1bd12046f1d609e4f3cb9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f4478acedf0dfaef01d86a91a8397ea62c63bb1f11b38d74032352e4d65216d6
MD5 1785bbe4a0015a30c45e20b3fad18c4e
BLAKE2b-256 3b32e125d4a4da0a56f5b3db27095592470c85f5c137863e0d591c3d8ed9d958

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 03ff06d2c033912b2b8be93f30b9b19ec427564ed0d453b5c2deae9166854a77
MD5 fca27d8e4bd939ef53ed3473767628bf
BLAKE2b-256 be0aaec66aa64d36e3a96838f65ba85628375b90dbfd4fd5cfdb59d1f20c68c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 15a0b54a26041c474c425bf2c5af500828c1c79fabd2728e3fd16fa68b239de3
MD5 ebf2babc74d97e2b11740acbabeff6b4
BLAKE2b-256 f0f6ce2c14e9631d8f868be2324b26397bea1ff772ea9d5bd8fdc6dcb6b8e0db

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c4b548c2bd9675037d5d18c234711a1358367b9b9a30b191fccf9428cd47a58f
MD5 f6d2c01b15226369483eef9631f962c4
BLAKE2b-256 40a6fcf12147e2ed876ebfdbfd254a90b41b740c9d20d8d6d5e48d8674f8692e

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 932bcbbf56f645689f2745fe9a1e2c58cb0df7cab9910186302124ba61b89f19
MD5 b4404bbb58094d4a0d980cd0e365e487
BLAKE2b-256 a621e24772d5c7145e746952b3d3dfaa4036712a6dceea5e0e3992d656d7f1b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6b2cf7140dfce59a5ce10725ad96629076295cf068f3c4f0ddd0fd76de69f6db
MD5 95160af6c95f3780cdc185df1c31e528
BLAKE2b-256 7ed74846c3a612d2f4e01e3cd39f6c05206f7d5ad83a1c6870b102c6cd025424

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b1b194d3f8165707fbca20620e2a1df9aff8ec8620773ba35ef5b0bd94d69e4f
MD5 5f0c64ac0daf56469c072534d196b2bb
BLAKE2b-256 c90839a34ca4b0701813ac7c1a623e3e063504c96af78f262faf26d0ecaceb72

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bcc74665e80591362cf91b053efbe60ce98993a9bbb5164a9c9dd792c1bd8be5
MD5 be30d7bbe700792b26932ed898804542
BLAKE2b-256 6026d0861e0ffe319479feb046dd311bb11c90be449c1114186b12e471872334

See more details on using hashes here.

Provenance

The following attestation bundles were made for openrct2_x7_renderer-0.3.7-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