- Python 99.3%
- Batchfile 0.7%
| fd6 | ||
| fonts | ||
| tests | ||
| tools | ||
| AppIconTransparent.png | ||
| BlossomParticle.png | ||
| Blue.png | ||
| build_exe.bat | ||
| Green.png | ||
| LICENSE | ||
| Orange.png | ||
| Pink.png | ||
| Purple.png | ||
| pyproject.toml | ||
| README.md | ||
| requirements.txt | ||
| run.bat | ||
| Song1OpenSource.mp3 | ||
| Song2OpenSource.mp3 | ||
| Song3OpenSource.mp3 | ||
| SplashScreen.mp4 | ||
| Yellow.png | ||
Forza Designer 6 (FD6)
▶ Trailer / tutorial on YouTube
Convert any image into a vinyl group for Forza Horizon 3, 4, 5, or 6.
Repo: https://github.com/tokyubevoxelverse/ForzaDesigner6 · License: MIT · Windows 10/11 x64
Install
- Download
FD6.exefrom Releases. - Double-click — no installer, no admin rights. Windows SmartScreen → "More info" → "Run anyway".
Source build: Python 3.10+, pip install -r requirements.txt. Microsoft Visual C++ Redistributable is normally already installed; if FD6 fails to launch, grab it here.
How to use
Generate:
- Launch
FD6.exe. Click Upload Image… and pick a JPEG/PNG. - Right panel: pick a Profile (
balancedrecommended) and Stop at shapes (1500 or 3000 typical). - Click Start. Watch the live preview rebuild your image. The JSON auto-saves next to your source image when done.
Inject:
- Launch your target game (Forza Horizon 3, 4, 5, or 6) and open the Vinyl Group editor.
- Load a vinyl group with at least N spheres, where N is the shape count of your JSON. Keep saved 1500-sphere / 3000-sphere templates for reuse — fastest path is a fresh untouched template.
- In FD6: pick your target from the Target dropdown, click Upload JSON, then Inject into [game].
- Watch the dialog progress. Do not click anything in FD6 or the game during injection — interacting can reallocate the in-game memory mid-write and fail the operation.
- When the status turns 🟢 green, the vinyl group has been painted with your shapes.
Re-injecting onto an already-painted template works too — the locator falls back to an RTTI vtable scan when the fresh-sphere fingerprint misses. Expect an extra 2–5 minutes on the first re-injection scan per game session; subsequent ones are instant.
✅ Do / ❌ Don't
- Do open the game's vinyl editor before clicking Inject.
- Do keep one or two sphere templates saved for fast re-use.
- Do wait for the green status — large-game scans can take minutes.
- Don't edit, add, delete, or move shapes in-game during an active injection.
- Don't click anything in FD6 during the RTTI fallback phase. Windows may label it "Not Responding"; it isn't — let it finish.
- Don't close the game mid-injection or run FD6 as admin.
Troubleshooting
| Problem | Fix |
|---|---|
| Splash video hangs | Click anywhere or press Esc. A hard 30 s auto-skip is always active. |
| "No confident match" error | Vinyl editor not open, or template doesn't have enough spheres for the JSON's shape count. Load a bigger template. |
| Re-injection scan looks stalled | RTTI fallback phase can run silently for 2–5 min on a large game. The dialog resumes once a candidate is located. |
| Shapes offset or wrong scale | File an issue with the JSON, the source image, and a screenshot of the in-game result. |
| Game patched, all candidates rejected | The per-game struct offset may have shifted. Open an issue — the profile in fd6/inject/game_profiles.py needs updating. |
Build from source
git clone https://github.com/tokyubevoxelverse/ForzaDesigner6.git
cd ForzaDesigner6
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m fd6 # run from source
pytest # run tests
.\build_exe.bat # → dist/FD6.exe
Credits
Inspired by:
- forza-painter by
the_adawg(FH4/FH5 — MIT) - geometrize-lib by Sam Twidale (MIT)
- Primitive by Michael Fogleman (MIT)
- bvzrays' publicly available forza-painter-fh6 (MIT). FD6 uses his published research for: the CLiveryGroup struct field offsets, the (X, −Y) position convention and 63 / 127 scale divisors, the confirmation that FH5 and FH6 share the same struct layout (which made FH3/FH4/FH5 support feasible), and the MSVC RTTI vtable-scan locator approach (FD6's
rtti_locator.pylooks up.?AVCLiveryGroup@@by C++ type). FD6 does not ship or load community-distributedforza-codes.datruntime pattern files — only the single baseline RTTI class name is hardcoded.
The FH6 vinyl-group memory layout was independently reverse-engineered from scratch for this project against FH6 build 354.221 and later cross-validated against bvzrays' research; the two derivations matched on every field offset. The sphere-template injection workflow (load a fresh sphere group → fingerprint-locate it in memory → overwrite each sphere's bytes in place) and the strict 5/5 + 95% full-table validation gate are FD6 originals; both stay as the primary locator path, with RTTI vtable scan as the secondary fallback for re-injection onto already-painted templates.
License
MIT — free for any use with attribution.