Skip to content

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 ​

sh
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 --help

CAR 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.

OptionEditWhat it changes
--param NAME VALUEParamA parameter (carparams.rs names, pod-viewer info GAMMA.BV3 lists them); *.NAME sets it on all four wheels
--setting I VALUESettingGarage 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 FTorqueEvery entry of the torque curve times F
--tint R G B A, --tint-page P R G B ATintThe texture pages blended towards a colour, in both files
--scale X Y ZScaleBody, 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 DZMoveVertexOne 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 ...]FaceTextureA textured face shows page P, with its corners on the 256 grid when given
--page P FILE.pngPagePage 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, pagesWhat 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 .BV4 pages (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 .BV3 pages 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):

PartMust beSo the creator
Record +0x00, the file nameUnique among the cars (they key their slots by it with strcmp), with VOITURES/<file>.BV3 or .BV4Refuses the base car's own name
Record +0x40, the menu nameAlso the picture file: MIMG/<name>.IMG, entries 333 × 257, 125 × 90, 125 × 90Requires it to equal the file name in any case, as in every POD and extra car
The car's name inside its filesNames its set-ups file Params\<name>.prbRenames 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 namesRead by nothingKeeps the base car's
sh
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

GAMMA with page 1 drawn from a 256 × 256 PNG

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.

CarEditsLaps (s)Total (s)Place
GAMMA, stocknone124.75, 111.78, 112.77349.304
GAMMA, editedsettings acceleration 100, grip 100, speed 100 (from 49, 95, 49); tint; scale 1, 1.15, 0.9106.35, 93.68, 112.89312.922
BLUEGAMMA, the same edits as a new caras above106.35, 93.68, 112.89312.922
GAMMA, grip 5setting grip 5125.13, 117.75, 117.02359.905

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).

Prose CC0 1.0, code Apache 2.0. POD: Planet of Death is © Ubi Soft; none of its files are on this site.