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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.5-cp313-cp313-win_amd64.whl (13.2 MB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.5-cp312-cp312-win_amd64.whl (13.2 MB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

openrct2_x7_renderer-0.3.5-cp311-cp311-win_amd64.whl (13.2 MB view details)

Uploaded CPython 3.11Windows x86-64

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

File metadata

  • Download URL: openrct2_x7_renderer-0.3.5.tar.gz
  • Upload date:
  • Size: 100.2 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.5.tar.gz
Algorithm Hash digest
SHA256 6bf2e4787f5430e3a703faa827f9f484754a270b6ae0534adfef74ef8cb5c9b4
MD5 b47999dd0fc2b16d21b96385efd11b9d
BLAKE2b-256 1e9f4823891f4a12b163b527c56334792f022132a249b78066f82aa2c2f1889b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 12fbf6a5321410ef59c0b64640ba9163de1f5a4542690024de47d72381833eaa
MD5 24d39a7f15a56e1454768c5f42fceba3
BLAKE2b-256 d456afff0f32afbf75ab8bbf04a0b142728b69c6d9c15e5b2f58cf752b7f1956

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f65dcb4193ca862584eb39a3707bdc5c2845dde1e05d444e8b4684bf718e9425
MD5 db929e7062bef00f383f8664f025cdbe
BLAKE2b-256 d38648dcc924755bccddee51f124bd45717e9bc7930bf28e61b9917c9f9a8f7b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b8e5d89617702f4a50626954ae1e2f2439bb4f996e171d8fd868a816cee35b6
MD5 5add882238a9f31f3799b55e270fb9b7
BLAKE2b-256 afc274895cabc5749948639358eaf0fb45bc613afe34102beecd55e779b3c9c0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b9a96ffcfad6ac8ce10a00c4ee94867ab31f49ec209a2792ac2270cd66ee477b
MD5 4f8a418e563d889e51049cfe2bb7b2fe
BLAKE2b-256 0dbf43da8fe388ea56715b4bbe9593fd7cd43e1a42646327e1ecfe5034c49d79

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 701ef21580109b69547c4e563654f740627e0d42632971b33bc26ca17d97c2bb
MD5 bc3e68ed5419f19cd2f8c6a086305364
BLAKE2b-256 a041a9749b2a6a4b85f62e5ffd41ced597a9b2afa6c898eabad8bb1ebd1e8465

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 387b4ebbb02f324537d94842fb62165051eeb1039cde77c208e364a1d3a15185
MD5 37e23da28aaa13db50ffed38cbc177f6
BLAKE2b-256 10a36fe52b431caf28c69b277eb0958fbe29e792cab97a01549f1b74055476c4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 984b2149a00d711576ee7dae6daa1608ce1847e2370ce7853467500a13d2ddc7
MD5 1af1712c6cceda9b30219155d8902fb1
BLAKE2b-256 d83ad0a840429783e49a7a2be13c713b23cea85d49ca214c7d18a1ebf3eade94

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 547a3e93516fea1c2f1b99a52f12e2a717284aa5d401c363b2c9b676d7dba43b
MD5 5dd83da519ba095c86a5f351773cd1ba
BLAKE2b-256 7f5b6b3d3f74beee94bfd4fdeeb1cf55f6745f767efa64f38408ba87ffc1ebd7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 989936c4a83d2116c196ad351ece1b0688ebd058251dee8898226c8feb3c4ac7
MD5 3a2c27d0f163bba32c4769c46d1894ac
BLAKE2b-256 74e97f505ceb679abaf5799a7765b6d5d886db06b0277430b5929511f12f2cb8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f4dd8d09d40e1879bde008de6458c1b21041851cec6f6bdc3695b5f4d87ff2fa
MD5 11bdf911d8ac85f4ffd9b1832b0b0932
BLAKE2b-256 57ac3b26d3461ab0eb90ef4ffbc1b0a8d776e3336b15da9f5c2aab5dd3e5fc18

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6951adf61ebb35567106667dbc476c68f58f903bfb6216310e40987dc3a057a4
MD5 f7b33ab1ca296ad8ba1762862a6b123a
BLAKE2b-256 edbad828b2dacdaa9408ca284891d6b52e141d2ac72f6f3fc6d0a043e3228f66

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for openrct2_x7_renderer-0.3.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1dbc8de850aae7073159d6d2afed642592187a7b2d80d7e0fa3b1613f17b04c
MD5 d1cbe850c2315bf4139a1dacd5b9505d
BLAKE2b-256 136a3fd357a3f9641024948527d3cdabe0f146a2824839d2edfafcccb1b1236b

See more details on using hashes here.

Provenance

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