The vehicle creator
Edits a POD car and writes both of its files, .BV3 (8-bit textures, the software builds) and .BV4 (16-bit textures, the 3D-card builds), byte for byte where nothing changed. An addition the original does not have (working rule 5): the cargo feature creator of apps/viewer (apps/viewer/src/creator/). It follows the track editor's way of working (apps/viewer/src/editor/): every change is one Edit, written as bytes over the fields the car reader found (crates/pod-formats/src/car.rs), and nothing changes size.
Installing a car into the original game is the extras session's installer (docs/PORT.md); the original looks for it under its install folder first (docs/modding.md).
Use
cargo build --release -p pod-viewer --features creator
build/release/pod-viewer car GAMMA --data target/pod/disc/DATA \
--setting 0 100 --setting 2 100 --setting 4 100 \
--tint 0 90 255 0.55 --scale 1 1.15 0.9 \
--out derived/creator/blue --render derived/creator/gamma-blue.png --list settings
build/release/pod-viewer car --helpCAR is a car's name in the game's files or a .BV3 on disk (with its .BV4 beside it).
In the window (build/release/pod-viewer target/pod/disc/DATA, a car chosen, create ticked; apps/viewer/src/creator/ui.rs) a panel beside the car has the same edits: the five settings as sliders, a colour picker for the tint, the scale, one vertex or one face of a chosen part, a parameter by name, a page from a PNG, "save both files" and "write as a new car". Every button makes one Edit through the same Doc, and the car on screen is read again from the edited file. Saving and pictures from files are native only; the browser build (trunk build --release true index-creator.html --dist ../../build/viewer-web-creator in apps/viewer) edits and shows.
| Option | Edit | What it changes |
|---|---|---|
--param NAME VALUE | Param | A parameter (carparams.rs names, pod-viewer info GAMMA.BV3 lists them); *.NAME sets it on all four wheels |
--setting I VALUE | Setting | Garage setting I, 0 to 100: 0 acceleration, 1 brakes, 2 grip, 3 steering, 4 speed. The player's set-up is built from them |
--torque F | Torque | Every entry of the torque curve times F |
--tint R G B A, --tint-page P R G B A | Tint | The texture pages blended towards a colour, in both files |
--scale X Y Z | Scale | Body, hull and the two extra objects scaled per axis; face and vertex normals follow; the wheels keep their size (the parameters place them) |
--move-vertex PART V DX DY DZ | MoveVertex | One vertex of one object (body:N 0-17, wheel:N 0-3, hull:N 0-3, extra:N 0-1); the normals of its faces are made again from their corners, keeping their side, and its own normal is their mean (inferred: the original tool's way is not known) |
--face-page PART F P [U V ...] | FaceTexture | A textured face shows page P, with its corners on the 256 grid when given |
--page P FILE.png | Page | Page P drawn from a PNG, scaled to each file's page size (256 for .BV3, 128 for .BV4) by the nearest pixel; the .BV3 takes the nearest colours of its palette |
--list objects, vertices:PART, faces:PART, params, settings, pages | What there is to edit |
Axes as stored: x runs along the car, y across it, z is the height (measured: GAMMA's body spans x −3.61 to 3.60, y −1.66 to 1.67, z −0.57 to 0.57; --list vertices:body:N). So --scale 1 1.15 0.9 makes a car 15% wider and 10% lower.
What reaches the race
Which values matter depends on who drives the car (observed in POD, ported in crates/pod-world/src/racer.rs; measured in the original for grip, docs/modding.md):
- Parameters: copied into every race car (
car_to_racer), then the garage set-up replaces the torque curve, gears, steering, brakes and grip from the settings (setup_from_car,car_from_setup). Mass, wheel positions, springs and the rest stay as the file has them. - Settings: the player's set-up comes from the file's five settings; the computer cars use constants (
place_racers: speed 80, acceleration 80, grip 75, brakes 35, steering 30 at EASY), whatever their file says. - Model: drawn, and its half-extents size the car's collision box (
half_extents). - Textures: drawn. Un-POD draws the
.BV4pages (a deviation,apps/unpod/src/load.rs); the software builds of the original draw the.BV3.
The 8-bit palette
The .BV3 block carries its palette, and it is the same 768 bytes as CHROME.CH3's in every POD car (measured); the 16-bit software build loads the chrome first into the cars' palette slot and remaps each car's pages to it (crates/pod-render/src/palette.rs). A tint of a .BV3 maps each index to the index whose colour is nearest its tinted colour, so the pages stay in that palette. Drawn with it, the .BV3 pages come within 2.5 to 6.0 colour levels (of 255) of the .BV4's on all 16 cars (measured, creator::tests).
A first version of the creator inferred the palette from the .BV4, following an older note that the .BV3 slot was empty; its tints came out teal in Un-POD's 8-bit drawing. The note was wrong (the render session corrected texture.rs the same day).
Tests
cargo test --release -p pod-viewer --features creator creator over every car of the player's POD copy (16; POD_DATA to change):
- an unedited save is the original, byte for byte, in both files;
- the two files hold the same parameters, settings and torque curve;
- each edit reads back from both saved files (parameter, wheel parameter, setting, curve, tint, scale);
- the
.BV3pages through their own palette match the.BV4, as above.
A new car beside the sixteen
--new FILE NAME --package DIR writes the edited car as a package in the layout of the extra cars (docs/extras.md): DIR/VOITURES/FILE/ with FILE.BV3, FILE.BV4, FILE.IMG (the base car's menu pictures, with the tints made on them too), FILE.MEG (its sounds) and a VOITURES.BIN of one record (the file name and the menu name, the base record's other bytes). pod-extras install DIR GAME_DIR installs it as CD Patcher did, into the install folder and VOITURE2.BIN, where the car swap ("Load new car") offers it. What each part must be (the front-end session's trace of the car swap, the reset and the garage, docs/systems/front-end.md):
| Part | Must be | So the creator |
|---|---|---|
| Record +0x00, the file name | Unique among the cars (they key their slots by it with strcmp), with VOITURES/<file>.BV3 or .BV4 | Refuses the base car's own name |
| Record +0x40, the menu name | Also the picture file: MIMG/<name>.IMG, entries 333 × 257, 125 × 90, 125 × 90 | Requires it to equal the file name in any case, as in every POD and extra car |
| The car's name inside its files | Names its set-ups file Params\<name>.prb | Renames it to the file name in lower case; a longer name takes its bytes from the unread end of the stream, so the files keep their size |
| The record's three picture names | Read by nothing | Keeps the base car's |
build/release/pod-viewer car GAMMA --data target/pod/disc/DATA \
--setting 0 100 --setting 2 100 --setting 4 100 --tint 0 90 255 0.55 --scale 1 1.15 0.9 \
--new BLUEGAMMA bluegamma --package derived/creator/pkg/bluegamma
build/release/pod-extras install derived/creator/pkg derived/creator/game --build all
build/release/unpod --live --content derived/creator/game/Data --car BLUEGAMMA
Raced in Un-POD (2026-10-24)
measure/unpod_follow.py drives the player's car in Un-POD through the probe along a lap recorded from a computer car (the Un-POD twin of run/vm/follow.py). Beltane, EASY, three laps, the player's car as below; the edited GAMMA in a data folder of its own, BLUEGAMMA from the content folder pod-extras installed. Lap times from the probe (car 0, 16.16 s). Un-POD is deterministic: the same files give the same times.
| Car | Edits | Laps (s) | Total (s) | Place |
|---|---|---|---|---|
| GAMMA, stock | none | 124.75, 111.78, 112.77 | 349.30 | 4 |
| GAMMA, edited | settings acceleration 100, grip 100, speed 100 (from 49, 95, 49); tint; scale 1, 1.15, 0.9 | 106.35, 93.68, 112.89 | 312.92 | 2 |
| BLUEGAMMA, the same edits as a new car | as above | 106.35, 93.68, 112.89 | 312.92 | 2 |
| GAMMA, grip 5 | setting grip 5 | 125.13, 117.75, 117.02 | 359.90 | 5 |
The new car races exactly as the same edits made on GAMMA itself. Times from Un-POD's build of main at 40c29aa; an earlier build gave other times (98.3 s laps for the edited car), so the times belong to the build, not to the car alone.
Open
- Picking a vertex or face with the mouse, as the track editor picks faces.
- Saving from the browser build (a download).