Outil qui convertit une image en formes géométriques (rectangles + ellipses tournées) et les amène dans l'éditeur de vinyles de Forza Horizon 6 — soit en exportant un JSON, soit en les injectant directement dans la mémoire du jeu.
Application native Windows en C pur : un seul
.exeautonome, GUI Nuklear + GDI, génération CPU multi-thread, aucune dépendance runtime. L'implémentation Python d'origine est conservée dans legacy/ à titre de référence.
| Étape | Statut |
|---|---|
| Génération image → formes + GUI (natif C) | ✅ fait |
| Export JSON FH6 | ✅ fait |
| Injection mémoire FH6 (étape 2b) | ✅ fait |
| Import via contrôle souris (étape 2a) | ❌ abandonné |
| Génération Python + GUI Tkinter (étape 1) | ✅ archivée dans legacy/ |
- Charge n'importe quelle image (PNG / JPG / BMP)
- Détection automatique du canal alpha. Si l'image est transparente, choix entre :
- Garder la transparence (mode sticker) : aucune forme posée sur les zones vides
- Remplacer par une couleur opaque (color picker)
- 6 presets de qualité ajustables par sliders ; nombre de formes plafonné à 3000 (limite FH6)
- 6 types de formes : rectangles et ellipses tournées (natifs FH6, sans perte) ; cercles, ellipses, carrés tournés, triangles (convertis/approximés à l'export)
- Génération en arrière-plan avec preview live et progression
- Export JSON compatible FH6 / forza-painter (
Exporter JSON FH6...) - Injection mémoire directe (étape 2b) : écrit les formes dans le processus du jeu via
WriteProcessMemory, sans saisie manuelle. Localise le groupe de vinyles dynamiquement (empreinte de sphères + fallback RTTI) et valide avant d'écrire (refuse si pas de candidat fiable, pour ne pas corrompre l'état du jeu). Offsets confirmés sur FH6 build 354.221, surchargeables sans recompiler.
Pré-requis : MSYS2 UCRT64 avec GCC. Depuis le shell MSYS2 UCRT64 :
cd native
make release # produit ./vinyl-painter.exe (GUI, optimisé -O3 + LTO)
make run # lance l'exe
make debug # build console avec symboles (prints visibles)Détails (windres, icône, manifest DPI) dans native/README.md.
L'ancienne application (GUI Tkinter + moteur de génération en Python, accélération GPU CuPy optionnelle) reste fonctionnelle dans legacy/ :
pip install -r legacy/requirements.txt
python legacy/main.py
Voir NOTICES.md pour la chaîne complète d'attribution.