# S4-T1 : cartographie de LPPairSandbox.cpp Role A-CART. Lecture seule : aucun fichier du plugin n'a ete modifie. Source : `D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\Source\LPSandbox\LPPairSandbox.cpp` Taille mesuree : **4274 lignes** (`LPPairSandbox.h` : 322 lignes, `LPInteractionSandbox.cpp` : 441, `LPSandboxConfig.cpp` : 73). Objectif : aucun fichier > ~800 LOC. ## 1. Constat - Le .cpp contient 4 classes (UCLASS dans le .h) : `ALPPairSandboxStage`, `ALPPairSandboxCharacter`, `ALPPairSandboxGameMode`, plus les structs `FPairSandboxMenu` (l. 57-77) et `PairSandbox::*` (l. 79-823, machine virtuelle `lpaction`, catalogue, lecture `.lpworld`). - Les UCLASS restent dans `LPPairSandbox.h` : seul le .cpp se decoupe, sans toucher a UHT. Les membres prives restent accessibles car chaque nouveau .cpp n'implemente que des methodes des memes classes. - Quatre fonctions depassent 150 lignes et doivent etre decoupees en sous-methodes, sinon l'objectif ~800 LOC reste tenable mais la lisibilite non : | Fonction | Lignes | Taille | |---|---|---| | `ALPPairSandboxCharacter::ShowAnimMenu` | 3363-3939 | 577 | | `ALPPairSandboxStage::BeginMeasure` | 1290-1664 | 375 | | `ALPPairSandboxCharacter::Tick` | 3940-4247 | 308 | | `ALPPairSandboxStage::Build` | 831-1042 | 213 | | `ALPPairSandboxStage::TickTour` | 2068-2196 | ~130 | ## 2. Carte par unite (lignes actuelles) ### 2.1 RoomBuilder (lpworld, murs, mobilier, eclairage) | Bloc | Lignes | LOC | Contenu | |---|---|---|---| | `FProp`, `Token`, `LoadWorldFile` | 748-823 | 76 | lecture `work___vin01.lpworld` (echelle, props) | | `Stage::Stage()` (ctor) | 825-829 | 5 | RootComponent | | `Build` partie piece | 831-953 | 123 | meubles `StaticMeshComponent`, lambda `Shell` (4 murs + plafond + sol), capsule Person, recherche du point de depart libre | | `Build` partie eclairage | 954-1040 | 87 | 2 directionnelles, SkyLight, SkyAtmosphere, BP_Sky_Sphere | | `Build` fin | 1041-1042 | 2 | appel `LoadChat`, `LoadActions` (reste dans l'orchestrateur) | Total source : ~290 LOC. ### 2.2 CoupleSim (box, weld, capsule, animation de paire) | Bloc | Lignes | LOC | Contenu | |---|---|---|---| | `PlayIdle`, `ConfigureCapsule`, `Weld`, `Apply`, `ToggleFurniture`, `ToggleCapsules` | 1072-1165 | 94 | idle Daz, capsule copiee de Person, soudure partenaire, collisions | | `PlayPair`, `MoveCouple` | 2528-2599 | 72 | animation de paire, deplacement avec blocage par la box | | `FitCoupleBox` | 2600-2712 | 113 | boite englobante du couple (lambda `Accumulate` 2609-2661) | | `Character::LoadQuaternius`, `SelectBody`, `ApplyBody` | 2958-3060 | 103 | corps Quaternius / Bridget / Michael / mannequin | | `Character::RefreshPose`, `PlayWalk` | 3063-3135 | 73 | pose d'interaction, marche | Total source : ~455 LOC. ### 2.3 InteractionFilters (VM lpaction, catalogue, chat) | Bloc | Lignes | LOC | Contenu | |---|---|---|---| | Types `FAction`, `FPerson`, `FVal`, `FEnv`, `EKind`, `FTok`, globales `Catalog`, `PlaceChoices`, `WhenChoices`, `MakePerson` | 79-153 | ~75 | modele de donnees | | `Tokenize` + `FWhoEval` (`Eat`, `Resolve`, `Call`, `ReadArgs`, `Primary`, `Unary`, `Add`, `Compare`, `And`, `Expr`) | 155-548 | 394 | analyseur et evaluateur des conditions WHO | | `WhoAllows`, `WhereHas`, `LoadActions`, `CollectActions` | 549-685 et 727-747 | ~158 | filtrage du catalogue `.lpaction` | | `ReadInteractKey` | 686-726 | 41 | touche d'interaction depuis l'ini d'entree | | `Stage::LoadChat` | 1044-1070 | 27 | `chat.lpaction` | | `Stage::BeginInteraction` | 1167-1208 | 42 | entree dans le mode Interaction | | `Character::ApplyInteractionView` | 3136-3178 | 43 | vues interaction / dessus / yeux | | `Character::ApplyFilters` | 2950-2957 | 8 | rafraichit le chat | | `ShowChat`, `HideChat` | 3179-3274 | 96 | liste des actions filtrees (Slate) | | `RefreshInteractKey`, `ShowKeyMark`, `HideKeyMark`, `PlaceKeyMark` | 3275-3362 | 88 | pastille de touche | | Panneau filtres (flags WHO1 / WHO2, combos lieu / heure / race) | 3560-3641, 3642-3676, 3845-3890 | ~170 | partie de `ShowAnimMenu` | | Bloc interaction de `Tick` | 4017-4119 | 103 | marche, distance, touche E | Total source : ~1290 LOC. ### 2.4 MeasureUI (mesure, tournee, vignettes, planches, panneau Slate) | Bloc | Lignes | LOC | Contenu | |---|---|---|---| | `EndMeasure` | 1209-1289 | 81 | nettoyage de la scene de mesure | | `BeginMeasure` | 1290-1664 | 375 | scene, lambda `Place` (1370-1445), lambda `RunClip` (1446-1593), anneau de 6 cameras (1601-1642), score des vues | | `ReplayMeasure`, `ShowBestModel` | 1665-1678 | 14 | | | Namespace `PairSandboxAuto` | 1679-1698 | 20 | constantes et chemins des captures auto | | `ToggleRaw`, `ToggleFormula`, `ToggleT`, `SetAutoRun`, `TickAuto` | 1700-1851 | 152 | boucle automatique | | Namespace `PairSandboxTour` | 1853-1888 | 36 | constantes tournee, vignettes, planches | | `GetMeasureClips`, `ShowFormulaDefault`, `BrowseClip`, `BrowseTime` | 1890-1988 | 99 | clips, vue par defaut | | `StartTour`, `TickTour` | 1989-2196 | 208 | tournee des clips | | `SaveVignette`, `SavePlancheFrame`, `WritePlanche` | 2197-2307 | 111 | PNG 512 px, JPEG 256 px | | `GetMeasureCameraName`, `UseMeasureCamera`, `SetFreeView`, `MoveFreeView` | 2309-2399 | 91 | cameras fixes et libre | | `DrawMeasureFigures`, `ScoreMeasureViews` | 2400-2527 | 128 | calques, squelettes, ecart par camera | | Panneau Mesure (`MeasureHolder`, boutons, Auto, Tournee) | 3706-3832 | 127 | partie de `ShowAnimMenu` | | Branche Mesure de `SelectMode` | 2877-2906 | ~30 | | | Entrees clavier Mesure de `Tick` (0-9, R, M, T, F, N, P, PgUp, PgDn, camera libre) | 4125-4211 | 87 | | | Libelles flottants Mesure de `Tick` | 4212-4240 | ~29 | | Total source : ~1590 LOC. ### 2.5 Stage / GameMode / Character (reste) | Bloc | Lignes | LOC | Contenu | |---|---|---|---| | Includes + `FPairSandboxMenu` | 1-77 | 77 | | | `Stage::Possess` | 2713-2745 | 33 | | | `Character` ctor | 2746-2768 | 23 | spring arm, camera | | `SetStage`, `EndPlay`, `ResetView` | 2769-2824 | 56 | | | `SelectAnim`, `SelectMode` (hors Mesure), `SelectView`, `SelectWalk` | 2825-2949 | ~100 | | | `ShowAnimMenu` : preparation, combos, ossature Slate, fin (mode persistant) | 3363-3705, 3833-3844, 3876-3939 | ~420 | | | `Tick` commun (souris, ZQSD, chute, Echap) | 3940-4016, 4120-4124 | ~82 | | | `GameMode` | 4240-4274 | ~35 | | Total source : ~830 LOC. Controle : 290 + 455 + 1290 + 1590 + 830 = 4455, soit un ecart de ~180 lignes avec 4274 : les chevauchements (`ShowAnimMenu` et `Tick` sont comptes dans plusieurs unites par tranche, bornes approximatives). ## 3. Plan de fichiers propose Dossier plat conserve (`PublicIncludePaths.Add(ModuleDirectory)` dans `LPSandbox.Build.cs`) : aucun changement de `.Build.cs` necessaire, UBT ramasse les nouveaux `.cpp` du dossier. Les LOC estimes incluent ~20-35 lignes d'includes par fichier (le .cpp d'origine en porte 55). ### 3.1 Fichiers conserves | Fichier | LOC estime | Role | |---|---|---| | `LPPairSandbox.h` | ~340 | UCLASS inchangees ; +4 declarations privees (`BuildRoom`, `BuildLighting`, `RunMeasureClip`, `BuildMenuPanels`) ; `FLPMeasureFigure` y reste | | `LPPairSandbox.cpp` | ~150 | ctor Stage, `Build` (orchestrateur), `Possess`, `GameMode` | | `LPPairSandboxCharacter.cpp` (nouveau) | ~330 | ctor, `SetStage`, `EndPlay`, `ResetView`, `Select*`, `Tick` commun | ### 3.2 Unite RoomBuilder | Fichier | LOC estime | Contenu | |---|---|---| | `LPSandboxWorldFile.h` | ~30 | `FProp`, `LoadWorldFile` | | `LPSandboxWorldFile.cpp` | ~100 | `Token`, `LoadWorldFile` (748-823) | | `LPSandboxRoomBuilder.cpp` | ~160 | `Stage::BuildRoom` (831-953) | | `LPSandboxLighting.cpp` | ~120 | `Stage::BuildLighting` (954-1040) | ### 3.3 Unite CoupleSim | Fichier | LOC estime | Contenu | |---|---|---| | `LPCoupleSim.cpp` | ~200 | 1072-1165 + 2528-2599 | | `LPCoupleBox.cpp` | ~150 | `FitCoupleBox` (2600-2712) | | `LPSandboxBodies.cpp` | ~215 | 2958-3135 (corps, pose, marche) | ### 3.4 Unite InteractionFilters | Fichier | LOC estime | Contenu | |---|---|---| | `LPSandboxActionVM.h` | ~110 | types `PairSandbox::*` (79-153) + declarations (`MakePerson`, `WhoAllows`, `CollectActions`, `ReadInteractKey`, `LoadActions`) + `extern` des globales | | `LPSandboxActionVM.cpp` | ~430 | `Tokenize` + `FWhoEval` (155-548) | | `LPSandboxActionCatalog.cpp` | ~260 | 549-747 + `Stage::LoadChat` | | `LPInteractionMode.cpp` | ~230 | `BeginInteraction`, `ApplyInteractionView`, `ApplyFilters`, bloc interaction du `Tick` (extrait en `TickInteraction`) | | `LPChatUI.cpp` | ~210 | `ShowChat`, `HideChat`, pastille de touche (3179-3362) | | `LPFilterPanel.cpp` | ~190 | panneau WHO1 / WHO2 / lieu / heure (extrait de `ShowAnimMenu`) | ### 3.5 Unite MeasureUI | Fichier | LOC estime | Contenu | |---|---|---| | `LPMeasureShared.h` | ~70 | constantes et chemins de `PairSandboxAuto` et `PairSandboxTour` (en `inline constexpr` / `inline` pour partage) | | `LPMeasureScene.cpp` | ~350 | `EndMeasure`, `BeginMeasure` (hors RunClip et cameras), `ReplayMeasure`, `ShowBestModel` | | `LPMeasureClip.cpp` | ~190 | `RunMeasureClip` (lambdas `Place` + `RunClip`, 1370-1593) | | `LPMeasureAuto.cpp` | ~185 | 1700-1851 | | `LPMeasureTour.cpp` | ~340 | 1890-2196 | | `LPMeasureCapture.cpp` | ~150 | vignettes, planches (2197-2307) | | `LPMeasureCameras.cpp` | ~170 | 2309-2399 + anneau de cameras (1601-1642, extrait en `SpawnMeasureCameras`) | | `LPMeasureOverlay.cpp` | ~165 | `DrawMeasureFigures`, `ScoreMeasureViews` | | `LPMeasurePanel.cpp` | ~300 | panneau Slate (3706-3832), touches (4125-4211), libelles (4212-4240), branche Mesure de `SelectMode` | ### 3.6 Menu (partage entre unites) | Fichier | LOC estime | Contenu | |---|---|---| | `LPPairSandboxMenu.h` | ~30 | `FPairSandboxMenu` (57-77) | | `LPSandboxMenu.cpp` | ~470 | `ShowAnimMenu` : liste des animations, Modes / Vues / Marche / Corps, ossature Slate ; appelle `BuildMeasurePanel` et `BuildFilterPanel` | ## 4. Totaux et verification de l'objectif | Unite | Fichiers | LOC estime | Plus gros fichier | |---|---|---|---| | RoomBuilder | 4 | ~410 | 160 | | CoupleSim | 3 | ~565 | 215 | | InteractionFilters | 6 | ~1430 | 430 | | MeasureUI | 9 | ~1920 | 350 | | Stage / GameMode / Character | 3 + 2 menu | ~1020 | 470 | | **Total** | **27** | **~5350** | **470** | - Plus gros fichier : `LPSandboxMenu.cpp` (~470). Marge d'environ 40 % sous 800 LOC. - Le total passe de 4274 a ~5350 : surcout de ~1000 lignes, imputable aux includes repetes (~25 fichiers x ~25 lignes), aux en-tetes internes et aux signatures des fonctions extraites. - Les UCLASS ne bougent pas : aucun risque de regeneration UHT incoherente. ## 5. Risques et points d'attention 1. **Namespaces anonymes partages** : `PairSandboxAuto` et `PairSandboxTour` sont utilises par Auto, Tour, Capture et Scene. A deplacer dans `LPMeasureShared.h` en `inline constexpr` / fonctions `inline`, sinon duplication ODR entre .cpp. 2. **Globales `PairSandbox::Catalog / PlaceChoices / WhenChoices`** : definies dans `LPSandboxActionCatalog.cpp`, `extern` dans `LPSandboxActionVM.h`. 3. **Lambdas a pointeur de membre** : le lambda `Flag` (`bool ALPPairSandboxCharacter::*`) exige l'acces prive : `BuildFilterPanel` doit etre une methode membre, pas une fonction libre. 4. **`static bool bPoseWritten`** (`ShowFormulaDefault`, 1918) : reste local au .cpp Tour, ne pas dupliquer. 5. **Unity build** : le module a `PCHUsage = UseExplicitOrSharedPCHs` ; verifier avec et sans unity (`bUseUnity=false`) que les includes de chaque nouveau .cpp suffisent. 6. **Doublon connu** : `LPInteractionSandbox.cpp` (441 LOC) reimplemente `LoadChat`, `ShowChat`, `HideChat`. A ne pas fusionner dans S4 (hors perimetre), mais `LPChatUI.cpp` pourra servir de base a un dedoublonnage ulterieur. 7. **Tick** : l'ordre des blocs (souris, deplacement, interaction, Echap, mesure, libelles) doit etre conserve exactement lors de l'extraction en `TickInteraction` / `TickMeasureInput` / `TickMeasureLabels`. ## 6. Ordre de migration recommande (un commit par etape, build + capture de reference entre chaque) 1. Extraire `LPSandboxActionVM.h/.cpp` et `LPSandboxActionCatalog.cpp` (code libre, sans UObject : risque minimal). 2. Extraire `LPSandboxWorldFile` puis `BuildRoom` / `BuildLighting` (RoomBuilder). 3. Extraire CoupleSim (`LPCoupleSim`, `LPCoupleBox`, `LPSandboxBodies`). 4. Extraire `LPChatUI`, `LPInteractionMode`. 5. Extraire `LPMeasureShared.h` puis Capture, Tour, Auto, Overlay, Cameras. 6. Decouper `BeginMeasure` (`RunMeasureClip`, `SpawnMeasureCameras`) et `ShowAnimMenu` (`BuildMeasurePanel`, `BuildFilterPanel`), puis `Tick`. 7. Verifier : build Win64 Development, lancement des 3 modes (Pair, Interaction, Mesure), comparaison de `Saved/Measurement/tour.csv` et d'une vignette avant / apres.