PVUI/Sources/PVUIBase/Resources/DefaultSkins/README.md
This directory contains DeltaSkin bundles for known third-party physical button cases and controllers.
These skins are bundled with Provenance and loaded automatically via DeltaSkinManager.
When a compatible physical controller case is detected, Provenance can auto-load the appropriate skin to optimise the game screen layout. Since physical buttons handle all input, these skins:
All button and screen coordinates are in the skin's mapping coordinate space (not 0–1 normalised).
750 × 1334 (logical pixels, equivalent to iPhone 6/7/8)393 × 852 (logical points for iPhone 14/15/16)768 × 1024820 × 11801334 × 750852 × 3931366 × 10241180 × 820Button frame values represent approximate physical positions estimated from product photographs
and typical MFi controller ergonomics. All coordinates require real-device calibration.
PocketTaco-*.deltaskin)The GameSir Pocket Taco is a clip-on physical MFi Bluetooth controller for iPhone. The phone sits in the top portion of the controller; physical buttons are on the grip body below.
Soolra-*.deltaskin)The Soolra is a full MFi layout physical controller for iPhone with buttons on both sides.
Backbone-*.deltaskin)The Backbone One is a landscape clamshell MFi controller. The phone clips into the middle.
RazerKishi-*.deltaskin)The Razer Kishi v2 is a landscape clamshell MFi controller similar to the Backbone.
Each .deltaskin bundle contains:
info.json — skin metadata, button/screen mappings, and asset referencecontroller.svg — SVG controller artwork (transparent background, semi-opaque button shapes)transparent.png — 1×1 transparent PNG placeholder (fallback for older loading paths)The controller.svg uses a transparent background so the game screen shows through.
Each button area is drawn with a semi-transparent fill (opacity 0.85) and a coloured stroke
indicating the button type (A=red, B=yellow, X=blue, Y=green, C=purple, D-pad=dark, L/R=dark).
The Python script Scripts/generate_default_skins.py regenerates all bundles:
python3 Scripts/generate_default_skins.py
The script overwrites info.json and controller.svg in every bundle but preserves existing
transparent.png files to avoid rewriting unchanged binary data.
To add a skin for a new physical case:
<CaseName>-.deltaskin/info.json as a templatename, identifier, gameTypeIdentifierframe coordinates to match the physical casecontroller.svg with your artwork (or use the generator script).copy("Resources/DefaultSkins") in Package.swift already picks it upTo calibrate button positions on a real device:
"debug": true in info.json to show button overlay rectanglesframe values in info.json until overlays align with physical buttons"debug": false when completeThe SVG renderer (SVGRenderer.swift) supports a subset of SVG:
<svg>, <g>, <rect>, <circle>, <ellipse>, <polygon>, <text>translate() only#rrggbb, #rgb, rgba(), rgb(), CSS named colorsPVUI/Sources/PVUIBase/SwiftUI/DeltaSkins/Models/DeltaSkin.swiftPVUI/Sources/PVUIBase/SwiftUI/DeltaSkins/Extensions/SVGRenderer.swiftScripts/generate_default_skins.py