vexy-stax
Render a deck of layered PNG slides as 3D glass plates — in two views and the
transitions between them — from a single shared JSON scene format. This is the
offline Python package; a browser sibling (vexy-stax-js) consumes the same
scene format. See the repo-level SPEC.md for the binding contract.
This package implements the scene model, geometry math, CLI, and three fully functional render backends: Blender, pygfx, and Playwright.
Install
uv venv --python 3.12 && uv sync
Concepts
- A scene is an ordered list of slides (back-to-front; index 0 is farthest from the camera) plus camera, floor, and transition settings.
- Two views:
expanded(angled, plates spaced bygap, captions on) andcompact(head-on, plates collapsed toMIN_GAP ≈ 3 pt). - A transition morphs between the views (
expand,collapse,expand_collapse,collapse_expand), interpolating camera, spacing, and per-slide opacity with a shared easing curve.
CLI
vexy-stax dir2scene assets/ --out scene.json # generate scene JSON from directory
vexy-stax render scene.json --view expanded --engine pygfx --out beauty.png
vexy-stax render scene.json --view compact --engine blender --out stack.png
vexy-stax video scene.json --engine blender --out morph.mp4
vexy-stax overlay scene.json --out flat.png # pure-Pillow flat composite
vexy-stax engines # list available engines
Defaults: still ⇒ pygfx, video ⇒ blender. A missing/unimplemented engine
fails with an actionable message, not a crash.
Library
from vexy_stax.scene import load_scene
from vexy_stax import geometry as g
scene = load_scene("scene.json") # validates + resolves slide paths
plan = g.frame_plan(scene) # per-frame camera/spacing/opacity
pose = g.expanded_camera(scene) # CameraPose dataclass
vexy_stax.scene is a strict pydantic v2 model (extra="forbid" everywhere —
unknown fields fail loud at the boundary). vexy_stax.geometry holds the pure,
engine-agnostic view math (SPEC.md §3), mirrored by the JS geometry.js against
shared fixture vectors.
Layout
src/vexy_stax/
├── scene.py # pydantic v2 scene model + loader
├── geometry.py # §3 camera/spacing/opacity math (pure, engine-agnostic)
├── engines/ # base.py protocol + registry; blender, pygfx, and playwright renderers
├── images.py # Composites 2D flat preview overlays using Pillow
├── juicy.py # Matches colors between 3D renders and 2D overlays
└── cli.py # fire + rich CLI
Test
uv run pytest -q
License
MIT.
Release files for vexy-stax 3.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vexy_stax-3.1.6.tar.gz | 11.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vexy_stax-3.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.3 MB
Release files / vexy_stax-3.1.6.tar.gz
| Download URL | vexy_stax-3.1.6.tar.gz |
|---|---|
| Size | 11.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
674026dd9f52b31c2300bfd6d0c2745155fbf865312ada9c164f96c628a03fb3
|
|
BLAKE2b-256 checksum How to use checksums |
8c2e65a382cd234507f59409983eb5ce0a885fadcd3e10a8a9cd179af9c67f6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / vexy_stax-3.1.6-py3-none-any.whl
| Download URL | vexy_stax-3.1.6-py3-none-any.whl |
|---|---|
| Size | 112.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b614e75988d0a8bc65156d7c30fffd5c1306222f2f4caa9d2ef3c97f3ef6a7d9
|
|
BLAKE2b-256 checksum How to use checksums |
b5e541cfa84cf5fba638a3ca6d19ca265e6b62828f9d7744f9c376db4f819614
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|