Plan 24_Plan_Decouplage_Sandbox.md (lots DC0 a DC4) : plugin LPAnimCore dans le jeu, module editeur LPModTools et tout l'outillage de mods dans l'addon (prive). Documentation seule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
131 lines
9.3 KiB
Markdown
131 lines
9.3 KiB
Markdown
# DC0-CART — Cartographie du découplage jeu / sandbox
|
||
|
||
- **Fiche** : DC0-T1 (A-CART) — **Modèle** : (a) M1 haiku | haiku ; (b) M3 opus | opus (session principale)
|
||
- **Date** : 2026-10-07 — **Plan** : `Docs/Migration/24_Plan_Decouplage_Sandbox.md`
|
||
- **États de départ** : jeu `main` = `fba19bc` (+ modifications non commitées) ; addon `lot/SB4-final` = `4795ea2`
|
||
(pin `16905c6`).
|
||
|
||
## (b) Dépendances (M3)
|
||
|
||
### b1. Graphe d'inclusion de `LPAnimMeasure` (addon)
|
||
|
||
| Fichier | Inclut (LP) | Destination |
|
||
|---|---|---|
|
||
| `LPAnimRedirect.h/.cpp` | — (moteur seul : `ConfigCacheIni`, `Paths`) | **LPAnimCore** (jeu) |
|
||
| `LPCoupleSim.h` + `LPCoupleSimCore.cpp` | — (moteur seul) | **LPAnimCore** (jeu) |
|
||
| `LPAnimMeasure.h/.cpp` | — ; déclare `LogLPAnimMeasure` | reste (addon) |
|
||
| `LPPoseMeasure.h/.cpp` | `LPAnimMeasure.h`, `LPSkeletonProfile.h` | reste |
|
||
| `LPPoseOrchestrator.h/.cpp` | `LPPoseMeasure.h`, **`LPAnimRedirect.h`**, `LPAnimMeasure.h` | reste → **dépend de LPAnimCore** |
|
||
| `LPSkeletonProfile.h/.cpp` | `LPAnimMeasure.h` | reste |
|
||
|
||
- `LPAnimRedirect.cpp` et `LPCoupleSimCore.cpp` n'écrivent pas dans `LogLPAnimMeasure` : aucune catégorie de journal à
|
||
déplacer.
|
||
- Macro d'export : `LPANIMMEASURE_API` (45 occurrences, 6 en-têtes). Celles de `LPAnimRedirect.h` et `LPCoupleSim.h`
|
||
deviennent `LPANIMCORE_API`.
|
||
- Utilisateurs dans `LPSandbox` : `LPAnimRedirect.h` ← `LPSandbox.cpp`, `LPSandboxActors.cpp`, `LPSandboxMeasure.cpp`,
|
||
`LPSandboxMeasureTour.cpp` (+1) ; `LPCoupleSim.h` ← `LPSandboxCoupleMod.cpp` ; `LPPoseMeasure.h` / `LPPoseOrchestrator.h`
|
||
← mode Mesure. Donc `LPSandbox` dépend de `LPAnimCore` **et** de `LPAnimMeasure`.
|
||
- Utilisateurs dans le jeu : `Source/LifePlay/LPDirectControlSubsystem.cpp` (`LPAnimRedirect::IsGameTarget`, `ClipPath`),
|
||
`Source/LifePlay/LPShowCoupleSubsystem.cpp/.h` (`LPCoupleSim::*`, 25 appels). Aucun usage de la mesure dans `LifePlay`.
|
||
|
||
### b2. `SetUALRoot`
|
||
|
||
Appelé uniquement par l'addon : `LPSandbox.cpp:17` (au démarrage, depuis `FLPSandboxConfig::QuaterniusUALRoot`) et
|
||
`LPSandboxMeasure.cpp:39` (bascule `ClipRoot` pendant la Mesure). Le jeu ne l'appelle pas (le commentaire de `21` §
|
||
« Rupture du couplage » qui cite `FLifePlayModule::StartupModule()` est périmé). Sans sandbox, `LPAnimRedirect` garde
|
||
son défaut interne `/Game/Quaternius/UAL` : comportement du jeu inchangé.
|
||
|
||
### b3. Chemins relatifs au projet du jeu dans le C++ de l'addon (cassent si les données quittent le jeu)
|
||
|
||
| Fichier:ligne | Chemin lu | Problème après DC3 |
|
||
|---|---|---|
|
||
| `LPAnimMeasure/LPSkeletonProfile.cpp:31` | `ProjectDir()/Tools/anim/profiles` | profils déplacés dans l'addon |
|
||
| `LPAnimMeasure/LPPoseMeasure.cpp:26` | `ProjectDir()/Tools/anim/methodes` | méthodes déplacées dans l'addon |
|
||
| `LifePlayEditorTools/LPAnimIdentifyCommandlet.cpp:109` | `ProjectDir()/Tools/anim/profiles` | idem (commandlet déplacé en DC2) |
|
||
| `LPSandbox/LPSandboxConfig.cpp:36` | `ProjectConfigDir()/LPSandbox.ini` | **lit la copie du jeu** ; la copie de l'addon (`LifePlay-Sandbox/Config/LPSandbox.ini`) est identique octet pour octet mais n'est pas lue |
|
||
| `LPSandbox/LPSandboxConfig.cpp:38` | `ProjectSavedDir()/sandbox_pack.ini` | aucun (sortie du pilote dans `Saved/` du jeu) |
|
||
|
||
`Tools/anim/RetargetPack.py` résout `profiles/` et `methodes/` relativement à son propre fichier (`HERE`) : il suit le
|
||
déplacement sans modification.
|
||
|
||
### b4. Racine utilisée par les scripts à déplacer
|
||
|
||
Tous calculent une seule racine `$Root` = dossier du jeu, déduite de leur propre emplacement :
|
||
`BuildMod`, `NewMod`, `EditMod`, `HairPipeline` : `Split-Path $PSScriptRoot -Parent` ; `anim/AnimPipeline`,
|
||
`anim/DeliverAnims` : deux niveaux au-dessus. Après déplacement, il faut **deux racines** :
|
||
|
||
| Racine | Sert à | Exemples |
|
||
|---|---|---|
|
||
| `$GameRoot` (jeu) | `LifePlay.uproject`, `Config/DefaultGame.ini` (`ProjectVersion`), `Releases/<v>`, `Mods/`, `Content/`, `Saved/`, `Plugins/`, `Licenses/`, outils restés au jeu (`Tools/RunCommandlet.ps1`, `Tools/BuildCollections.py`) | `BuildMod.ps1:172,200,202,221,229` ; `AnimPipeline.ps1:118,204,297,426` ; `HairPipeline.ps1:49,70,72,262` |
|
||
| `$SbRoot` (addon) | `ModSources/`, `AnimSources/`, `Tools/mods/*.json`, `Tools/hairs/*.json`, `Tools/anim/*`, lanceurs sandbox | `BuildMod.ps1:176` ; `NewMod.ps1:32,66` ; `AnimPipeline.ps1:136,269,301,363,386,417,442` ; `DeliverAnims.ps1:45,64,69` |
|
||
|
||
`ModSource.ps1` (dot-sourcé par `BuildMod`, `EditMod`, `HairPipeline`, `DeliverAnims`) monte `ModSources/<Mod>` (addon)
|
||
vers `Mods/<Mod>` (jeu) : ses fonctions prennent aujourd'hui une seule racine → signature à deux racines.
|
||
|
||
### b5. Appels croisés
|
||
|
||
- `BuildMod` → `ModSource` (dot-source), `anim/AnimPipeline` (`-Anim`), `anim/RetargetPack.py` (`-Retarget`, dans l'éditeur).
|
||
- `AnimPipeline` → `BuildMod` (×2), `DeliverAnims`, `RapportControles.py`, lanceur `LifePlay_interaction_sandbox.bat`,
|
||
`Tools/RunCommandlet.ps1` (**reste au jeu**), commandlets `-run=pythonscript`, `LPAnimEval`, `LPAnimTwist`.
|
||
- `HairPipeline` → `ModSource`, `HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py`, `-run=LPHairFromStaticMesh`,
|
||
`Tools/BuildCollections.py` (**reste au jeu**).
|
||
- `NewMod` → écrit `Tools/mods/<Mod>.json`, renvoie vers `BuildMod`, `EditMod`, `HairPipeline`.
|
||
- `DeliverAnims` → `ModSource`, `DeliverAnims.py`, `Catalogue.py`.
|
||
- Jeu → outillage : `SplitModules.ps1:21,41,43` (messages et contrôle qui citent `BuildMod.ps1`, pas d'appel) ;
|
||
`BuildDebug.ps1:39` (commentaire seulement).
|
||
|
||
### b6. Données hors liste initiale
|
||
|
||
- `AnimSources/` (non suivi, 28 Ko : `pack.json` de `freeanims`, `quaternius`) : entrée du pilote `AnimPipeline` →
|
||
**à déplacer avec l'outillage** (ajout à la liste).
|
||
- `ModSources/` : 133 Mo sur disque (dont `lpr_anim_*` non suivis et `*/Content` ignorés) ; 15 fichiers suivis
|
||
(`lpr_hair_pocolov`).
|
||
- La sandbox a déjà un dossier `Tools/debug/` vide (`.gitkeep`) et un `Config/LPSandbox.ini` identique à celui du jeu.
|
||
|
||
## (a) Inventaire (M1)
|
||
|
||
Livrable de l'agent DC0-T1a (haiku), **vérifié et corrigé** par la session principale (corrections marquées ✎).
|
||
|
||
### a1. Fichiers à déplacer
|
||
|
||
| Élément | Suivi git | Taille |
|
||
|---|---|---|
|
||
| `Tools/BuildMod.ps1`, `NewMod.ps1`, `EditMod.ps1`, `ModSource.ps1`, `HairPipeline.ps1` | oui | 20 K, 3,7 K, 1,4 K, 2,2 K, 19 K |
|
||
| `Tools/HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py` | oui | 2,8 K, 6,1 K, 4,0 K |
|
||
| `Tools/ImportQuaternius.py`, `Tools/DiagnosePose.py` | **non** | 1,7 K, 4,6 K |
|
||
| `Tools/anim/` | oui | 14 fichiers, 143 K |
|
||
| `Tools/hairs/`, `Tools/mods/` | oui | 1 fichier chacun |
|
||
| `ModSources/` | ✎ **15 fichiers suivis** (`lpr_hair_pocolov/Module`) sur 720 présents (133 Mo : `*/Content` ignorés, `lpr_anim_*` non suivis) | 133 M |
|
||
| `AnimSources/` (ajout b6) | non | 28 K |
|
||
| `Config/LPSandbox.ini` | oui | 1,6 K (identique à la copie de l'addon) |
|
||
| `Tools/debug/LifePlay_{pair,interaction,measure}_sandbox.bat` | oui | ≈ 0,5 K chacun |
|
||
| `Docs/Modding/FullGuides/Creating_Asset_Mods.md` | oui | 9,6 K |
|
||
| `Docs/Modding/ShortGuides/explanation.lphair` (✎ dossier `ShortGuides`) | oui | — |
|
||
| C++ : `LPAnimEval`, `LPAnimTwist`, `LPAnimCatalog`, `LPAnimIdentify` (commandlets, `.h/.cpp`), `LPAnimChecks.h/.cpp`, `LPHairFromStaticMesh` (`.h/.cpp`) | oui | — |
|
||
| C++ : `LPAnimMethodSelect.h` (✎ en-tête seul, **suivi** ; l'agent l'avait noté non suivi) | oui | — |
|
||
|
||
### a2. Références hors fichiers déplacés (hors `etat/`)
|
||
|
||
| Fichier | Référence | Traitement |
|
||
|---|---|---|
|
||
| `README.md:29,47,48,55,73` | `ModSources`, `NewMod`/`EditMod`/`HairPipeline`/`BuildMod`, lien vers `Creating_Asset_Mods.md` | DC3/DC4 : réécrire (outillage dans un dépôt séparé, plus de lien) |
|
||
| `.gitignore:48-50` | `/ModSources/*/{Saved,Intermediate,Content}/` | DC3 : déplacer vers l'addon |
|
||
| `LifePlay.uproject:23` | plugin `LPSandbox` | reste (`Optional`) |
|
||
| `Source/LifePlay/LPModInfoSubsystem.h:8` | commentaire `Tools/BuildMod.ps1` | DC3 : « `LifePlay-Sandbox/Tools/BuildMod.ps1` » |
|
||
| `Source/LifePlay/LifePlay.Build.cs:43` | commentaire `LPAnimMeasure (plugin LPSandbox)` | DC1 (remplacé) |
|
||
| `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs:43,47-51` | commentaires `LPAnimEval`, `LPHairFromStaticMesh` | DC2 |
|
||
| `Tools/SplitModules.ps1:21,41,43` | `BuildMod.ps1` | DC3 |
|
||
| `Tools/BuildDebug.ps1` | ✎ aucune référence à `ModSources` (seulement `BuildMod.ps1` en commentaire, ligne 39) | DC3 (commentaire) |
|
||
| `Docs/Modding/ShortGuides/explanation.lpmod` (2) | `NewMod`, `BuildMod` | reste au jeu (format `.lpmod`) ; DC3 : citer le dépôt de l'addon |
|
||
| `Docs/Migration/09` (23), `10` (3), `13` (7), `16` (24), `20` (16), `21` (31), `23` (25), `README` (1) | outils et commandlets | DC1–DC4 selon § 6 de la SPEC (ajout : `10_Protocole_Operations.md`, `23_Cycle_De_Vie_Mod.md`, `Docs/Migration/README.md`) |
|
||
|
||
### a3. Inclusions C++
|
||
|
||
Aucune inclusion orpheline côté jeu : seuls les fichiers déplacés incluent `LPAnimChecks.h`, `LPAnimMethodSelect.h`,
|
||
`LPPoseMeasure.h`, `LPSkeletonProfile.h`. ✎ L'agent signale `LPPoseMeasure.h` comme « inexistant » : il est dans
|
||
l'addon (`LPAnimMeasure`), c'est attendu.
|
||
|
||
### a4. Chiffres
|
||
|
||
≈ 765 fichiers sur disque à déplacer (dont 720 sous `ModSources`), ≈ 133 Mo ; côté git du jeu : ≈ 45 fichiers suivis
|
||
quittent le dépôt. Références : 65 fichiers hors `etat/`, dont 1 seul fichier de code exécuté (`SplitModules.ps1`).
|