LifePlay-Revival/Docs/Migration/etat/CAM/CAM-T3-CART.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

177 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Fiche CAM-T3 — Niveau N3 — Modèle prévu opus | utilisé claude-opus-5-5 — Agent lp-cart — Skills sk-protocol, lp-paths (préchargés aussi : ue-cpp-build, lp-commandlets)
# CAM-T3-CART : caméras dans le C++ et la configuration (2026-10-11)
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD `4283c13` (`git rev-parse --short HEAD`, `git branch --show-current`).
Lecture seule : aucun éditeur, commandlet, MCP ou build. Chemins relatifs à la copie 5.8 sauf mention.
## Tableau de tête : caméras et réglages relevés
| Caméra ou réglage | fichier:ligne | Effet | Appelé par | Valeurs |
|---|---|---|---|---|
| **FollowView**, caméra 3e personne (`ACameraActor`, transitoire) | `Source/LifePlay/LPDirectControlSubsystem.cpp:897-941` ; membre `.h:63-64` ; destruction `.cpp:573-577` | crée (`SpawnActor`, `RF_Transient`, `.cpp:910-913`), règle le FOV (`:916`), active (`SetViewTargetWithBlend`, `:922`), place derrière le pawn avec balayage de collision (`:929-938`), lisse (`:939-940`) | **personne** : `FollowCamera` n'apparaît qu'à la déclaration (`.h:43`) et à la définition (`.cpp:897`) ; en-tête `.h:12` « La camera suiveuse n'est pas branchee » ; `Walk` (`.cpp:840-895`) ne l'appelle pas | FOV 70 ; fondu 0,35 s ; tangage borné -55 / -12° ; visée = pawn + 50 cm en Z ; recul 340 cm ; sphère 12 cm sur `ECC_Camera`, recul de 12 cm sur impact ; `VInterpTo` vitesse 8 ; ne se déclenche que si la vue courante a une classe dont le nom contient `Birdview` **et** que le joueur marche (`:904-905`) |
| **BirdView** (pointeur vers la vue courante) | `LPDirectControlSubsystem.h:66-67` ; `.cpp:903-907` | lu : `PC->GetViewTarget()` mémorisé ; jamais restauré (aucune autre écriture ni lecture, grep `BirdView` : 3 lignes) | code mort (dans `FollowCamera`) | test `GetClass()->GetName().Contains("Birdview")` |
| Marche du MC : direction prise sur la rotation de contrôle | `LPDirectControlSubsystem.cpp:875-892` | lit `PC->GetControlRotation().Yaw` pour orienter `MoveForward` / `MoveRight` ; ne touche à aucune caméra | `Tick` (ticker cœur, `.cpp:566`) → `Walk` (`:619`), sauf menu ouvert ou scène en cours (`:606`) | pawn = `GI.PlayerCharacter` (`:843`), non possédé : `bRunPhysicsWithNoController` (`:855-857`) ; `MaxWalkSpeed` 180 si < 10 (`:860-862`) ; `bOrientRotationToMovement` (`:868-871`) |
| **SecondScreen**, `SceneCapture2D` de l'encadré d'appel (vue du monde : caméra à part entière) | `Source/LifePlay/LPSecondScreenSubsystem.cpp:59-112` ; `.h:3-10` | cherche l'acteur nommé `SecondScreen` une fois par monde (`:69-81`), le rend mobile (`:104-108`), le **déplace** devant le visage du contact et l'oriente vers la tête (`:96-109`), règle le **FOV** (`:110`) à chaque image | ticker cœur (`:50`) ; contact = `GI.SecondScreenPerson` (`:22`, `:89-90`), écrit par le BP `GI` (`portage55/L6f/L6f_dump_GI.txt` : 9 lignes) ; acteur posé dans `CentralLondon` (`.h:3`) | distance 80 cm (`:19`) ; FOV 30° (`:20`) ; tête = os `head` (`:23`, `:28-35`) sinon haut de capsule × 0,8 (`:40`) ; axe = avant du contact à plat (`:97-102`) |
| Réglage joueur **vitesse de caméra** | `Source/LifePlay/LPUserSettings.h:19-31`, `:40-58` ; `.cpp:58-115` | borne (`ClampCameraSpeed`), lit / écrit `GameUserSettings.ini` section `[/Script/LifePlay.LPUserSettings]` clés `CameraSpeed`, `bCameraSpeedSet` ; recopie dans la variable BP `GI.CameraSpeed` (double ou float, `.cpp:12-30`) | `ApplyCameraSpeedAtStartup` ← BP `GI` (`ST/STE/dumps/GI__EventGraph.txt:30143`, `K2Node_CallFunction_448`) ; `SetCameraSpeed` ← `MainMenu` `OnValueChanged(SliderCameraSpeed)` ; `GetCameraSpeed` ← `MainMenu` Construct (`ST/STC/STC-T5-IMPL-BP.md:14`, `:16`) ; lecteurs de `GI.CameraSpeed` : `ST/STE/dumps/Room__EventGraph_V5.txt` (9 lignes `variable 'CameraSpeed'`) | entier 1 à 7, arrondi (`.cpp:60`) ; défaut 3 (`.cpp:10`, `.h:27`) ; poste local : `Saved/Config/WindowsEditor/GameUserSettings.ini:52-54` → `CameraSpeed=4.000000`, `bCameraSpeedSet=True` |
| Style du slider `SliderCameraSpeed` | `Source/LifePlay/LPSettingsSubsystem.cpp:346-419` | teintes de barre et de poignée seulement, aucune valeur écrite (`:346-347`) | sous-système Settings (habillage du menu) | barre 0,06 / survol 0,12 ; poignée (0,2 ; 0,45 ; 0,9) / survol (0,3 ; 0,55 ; 1) (`:348-351`) |
| Rangement d'onglet du menu Settings | `LPSettingsSubsystem.cpp:204-209` | une ligne dont le texte contient « camera » va dans l'onglet Général | `RowText` du menu (`:182`) | — |
| Panneau Clavier : libellés et groupe « Camera » | `Source/LifePlay/LPKeyboardSubsystem.cpp:92`, `:97`, `:165-168` | affichage et remappage : `RotateCamera`, `SwitchCamera`, `LeftRight`, `DownUp`, `ScrollDownUp` rangés dans le groupe 1 « Camera » ; `MoveForward` / `MoveRight` dans « Movement » (`:161-163`) | panneau Clavier (lot clavier) | — |
| `RotateCamera` (action) | `Config/DefaultInput.ini:107-109` | bouton milieu, Alt gauche, Alt droit | BP `PC` : nœuds `K2Node_InputAction` sans nom d'action dans le dump ; candidat `K2Node_InputAction_50` → `MoveCamera` vrai / faux (`ST/STE/dumps/PC__EventGraph.txt:547-560`), incertain ; BP `Room` : événement personnalisé `RotateCamera` (`Room__EventGraph_V5.txt:697`) | — |
| `SwitchCamera` (action) | `DefaultInput.ini:118` | touche C (sans modificateur ; `CityMenu` = Ctrl+C, `:102`) | BP `PC` : événements personnalisés `SwitchCamera` (`PC__EventGraph.txt:2532`) et `SwitchCameraDelayed` (`:3358`), appelés aussi par `GI` (`L6f_dump_GI.txt:25111`, `:25113`) ; nœud d'entrée correspondant non identifié par nom | — |
| `LeftRight`, `DownUp` (axes, vue de dessus) | `DefaultInput.ini:150-153` | flèches | `PC` `InpAxisEvt_DownUp` (`PC__EventGraph.txt:3043`) → `Birdview_C::DownUpBirdview` (`:3092`) ; `InpAxisEvt_LeftRight` (`:3097`) → `Birdview_C::LeftRightBirdView` (`:3117`) ; rappel `LPDirectControlSubsystem.h:3` | échelle ±1 |
| `ScrollDownUp` (axe, zoom) | `DefaultInput.ini:154` | molette | `PC` `InpAxisEvt_ScrollDownUp` (`PC__EventGraph.txt:715`) → `Birdview_C::ScrollDownUp` (`:743`) ; `Room` : événement `ScrollDownUp` (`Room__EventGraph_V5.txt:394`) | échelle 1 |
| `CursorX`, `CursorY` (axes souris) | `DefaultInput.ini:161-162` | `MouseX`, `MouseY` | `PC` `InpAxisEvt_CursorX/Y` (`PC__EventGraph.txt:579`, `:583`) ; `CursorY` → `Birdview_C::RotateCamera(DeltaSeconds = AxisValue)` (`:616-620`) et `Birdview_C::CircleCamera` (`:621`), selon `MoveCamera` (`:597-609`) | voir sensibilité et FOV ci-dessous |
| `MoveForward`, `MoveRight` (axes de marche) | `DefaultInput.ini:155-160` | Z / W / S ; Q / A / D | C++ seulement : `AxisValue` lit les `AxisMappings` directement (`LPDirectControlSubsystem.cpp:47-48`, `:160-179`) | ±1, borné à [-1 ; 1] |
| Sensibilité souris | `DefaultInput.ini:11`, `:16-18` (et retraits `:8-10`) | `Mouse2D`, `MouseX`, `MouseY` 0,07 ; `MouseWheelAxis` 1 | moteur (`UPlayerInput`) | 0,07 / 1,0 ; lissage `bEnableMouseSmoothing=True` (`:78`) ; capture permanente et verrou (`:91-92`) |
| Mise à l'échelle par le FOV | `DefaultInput.ini:79` (`bEnableFOVScaling=True`), `:93` (`FOVScale=0.011110`) | multiplie `MouseX` / `MouseY` par `FOVScale × FOV du PlayerCameraManager` | moteur : `UE_5.8/Engine/Source/Runtime/Engine/Private/UserInterface/PlayerInput.cpp:2346-2353` | FOV 90 → × 0,9999 ; FOV 70 → × 0,778 (calcul) ; FOV par défaut du `PlayerCameraManager` 90 (`PlayerCameraManager.cpp:46`), tangage ±89,9 (`:58-59`) |
| GameMode, GameInstance, carte | `Config/DefaultEngine.ini:8-11` | `GM_C`, `GI_C`, `CentralLondon` (jeu et éditeur) | moteur | aucune ligne `PlayerCameraManagerClass`, `PlayerControllerClass`, `DefaultPawnClass` dans `Config/` (grep § 2, C6) : portées par `GM_C` (BP) |
## 1. Objet et périmètre
Domaine : ce que le C++ du jeu (`Source/`) et la configuration (`Config/*.ini`, réglages utilisateur) font aux caméras :
création, placement, activation, FOV, suivi du MC, réglages exposés au joueur ; rues (StreetMap) et existence d'une
logique de caméra de rue. Hors périmètre : graphes BP (CAM-T2), comptes dans les `.uasset` (CAM-T1), copie 5.5,
`.hyperai/`. Les dumps BP ne servent ici qu'à nommer l'appelant d'une fonction C++ ou d'une action d'entrée.
Environnement vérifié avant de conclure à une absence : `Source/` présent (Glob `Source/**/*.{cpp,h,cs}` : 98 entrées
comptées sur la sortie, dont 5 `.cs`) ; moteur 5.8 installé (lecture de `D:\Game\Launcher\Engine\UE_5.8\Engine\Source`
réussie) ; plugins du jeu présents (Glob `Plugins/*/*.uplugin` : `StreetMap`, `ModdingExtra`, `McpAutomationBridge`,
`LPAnimCore`) ; addon `D:\Game\LifePlay-Sandbox-5.8` présent.
## 2. Commandes et lectures (exactes) avec compte brut
| # | Commande | Compte brut |
|---|---|---|
| C1 | Grep `(?i)camera\|ViewTarget\|SpringArm\|FieldOfView\|FOV\|PlayerCameraManager\|SceneCapture\|Possess`, path `Source`, glob `*.{cpp,h}`, mode count | 88 lignes, 9 fichiers : DirectControl `.cpp` 12, `.h` 4 ; Keyboard `.cpp` 4 ; OutdoorRoom `.h` 1 ; SecondScreen `.cpp` 11, `.h` 6 ; Settings `.cpp` 3 ; UserSettings `.cpp` 29, `.h` 18 ; **0 dans `Source/LifePlayEditorTools`** |
| C1b | Recompte : `git grep -n -i -E "<même motif>" -- "Source/*.cpp" "Source/*.h" \| wc -l` puis `git grep -c …` | 88 ; mêmes 9 fichiers, mêmes comptes |
| C2 | Grep `(?i)street\|CityExpansion\|Birdview\|ControlRotation\|CameraManager\|ViewPoint\|ProjectWorldLocationToScreen\|DeprojectScreen\|ViewLocation\|ViewRotation\|AutoScreenshot\|Screenshot\|HighResShot`, path `Source`, count | 61 lignes, 10 fichiers ; `Source/LifePlay` : 22 lignes (lues) ; `LifePlayEditorTools` : 39 (`LPCheckStreetMapCommandlet.cpp` 31, `.h` 6, `LPCheckMeshesCommandlet.h` 2, commentaires de chemins StreetMap) ; `CityExpansion`, `Screenshot`, `CameraManager`, `ViewPoint`, `Deproject` : 0 |
| C3 | Grep motif C1 sur `Plugins` (path `Plugins`) | 0 : `McpAutomationBridge` sauté (ignoré par git) ; recompté par plugin : C3b-C3e |
| C3b | Grep `(?i)camera\|view\|fov\|capture\|possess` sur `Plugins/StreetMap/Source` | 32 lignes, toutes `FSceneView` / `DetailsView` (`StreetMapSceneProxy.cpp:94-201`, `.h:92-101`, `StreetMapComponentDetails.*`) : rendu et éditeur |
| C3c | Grep motif C1 sur `Plugins/LPAnimCore`, puis `Plugins/ModdingExtra` | 0 ; 0 |
| C3d | Grep motif C1 sur `Plugins/McpAutomationBridge` (path explicite) | 783 lignes, 105 fichiers : outil d'automatisation MCP de l'éditeur, hors jeu |
| C4 | Grep motif C1 sur `D:\Game\LifePlay-Sandbox-5.8\Plugins` | 152 lignes, 11 fichiers (§ 3.6) |
| C5 | Glob `Config/*.ini` | 6 : `DefaultEditorSettings`, `DefaultInput`, `DefaultEngine`, `DefaultScalability`, `DefaultEditor`, `DefaultGame` ; **pas de `DefaultGameUserSettings.ini`** |
| C6 | Grep `(?i)camera\|fov\|fieldofview\|GameMode\|PlayerController\|DefaultPawn\|GameInstance\|ViewTarget\|SpringArm\|SceneCapture\|Possess\|MapsAndModes\|GameDefaultMap\|ViewportClient\|LocalPlayer\|aspect\|SplitScreen` sur `Config` | 11 lignes : `DefaultEngine.ini:8,9,10` ; `DefaultInput.ini:79,93,107,108,109,118` ; `DefaultEditor.ini:4,5` |
| C7 | Read `Config/DefaultInput.ini` (171 lignes), `DefaultEngine.ini:1-40`, `DefaultGame.ini` (82 lignes) | `DefaultGame.ini` : aucune ligne caméra |
| C8 | Glob `Saved/Config/**/GameUserSettings.ini` ; Grep `LPUserSettings\|camera\|fov` dedans | 1 fichier (`WindowsEditor`) ; section `:52-54` |
| C9 | Grep `ApplyCameraSpeedAtStartup\|SetCameraSpeed\|GetCameraSpeed\|ClampCameraSpeed` sur `Docs/Migration/etat` (`*.txt`) | 10 fichiers, 1 ligne chacun : toujours `ApplyCameraSpeedAtStartup` dans des dumps `GI` ; `SetCameraSpeed` / `GetCameraSpeed` absents des dumps `.txt`, présents dans 9 `.md` (55 lignes, lot STC / STF) |
| C10 | Grep `RotateCamera\|SwitchCamera\|ScrollDownUp\|LeftRightBirdView\|DownUpBirdview\|…CursorX\|CursorY` sur `etat` (`*.txt`), count | 34 lignes, 10 fichiers ; lues dans `PC__EventGraph.txt` (9), `Room__EventGraph_V5.txt` (2), `L6f_dump_GI.txt` (2) |
| C11 | Grep `InpActEvt_(RotateCamera\|SwitchCamera)\|InpAxisEvt_(LeftRight\|DownUp\|ScrollDownUp\|MoveForward\|MoveRight)` sur `etat` | 0 fichier (les axes s'écrivent `InpAxisEvt_<Axe>_K2Node…` : retrouvés par C10 ; les actions n'ont pas de nom dans le dump) |
| C12 | Grep `variable 'CameraSpeed'` sur `etat` (`*.txt`) ; `SecondScreenPerson` | 139 lignes / 31 fichiers (dont `Room__EventGraph_V5.txt` 9) ; 18 lignes / 2 fichiers (`L6f`) |
| C13 | Lectures moteur : `PlayerInput.cpp:2336-2353` ; Grep `DefaultFOV\s*=\|ViewPitchMin\s*=\|ViewPitchMax\s*=` sur `PlayerCameraManager.cpp` | `:46` 90, `:58` -89,9, `:59` 89,9 |
## 3. Constats `fichier:ligne`
### 3.1 Classement des 88 lignes de C1
| Fichier | Lignes | Classe | Motif |
|---|---|---|---|
| `LPDirectControlSubsystem.h` | 12, 19, 43, 64 | caméra de vue (non branchée) | commentaire, include, déclaration `FollowCamera`, membre `FollowView` |
| `LPDirectControlSubsystem.cpp` | 15, 16, 897, 903, 913, 914, 916, 918, 922, 925, 934, 935 | caméra de vue (non branchée) | includes, corps de `FollowCamera` (le `SCENE_QUERY_STAT(WalkCamera)` de `:934` est l'étiquette du balayage) |
| `LPSecondScreenSubsystem.h` | 3, 5, 7, 10, 19, 34 | caméra de vue (SceneCapture) | commentaires, déclaration, pointeur `Capture` |
| `LPSecondScreenSubsystem.cpp` | 6, 9, 18, 20, 68, 73, 82, 83, 103, 109, 110 | caméra de vue (SceneCapture) | recherche, placement, FOV |
| `LPUserSettings.h` | 1, 3, 4, 5, 7, 8, 25, 27, 29, 31, 42, 45, 46, 50, 52, 54, 56, 58 | réglage | vitesse de caméra |
| `LPUserSettings.cpp` | 10, 12, 14, 16, 19, 22, 25, 42, 58, 63, 66, 72, 74, 77, 78, 81, 83, 85, 86, 88, 92, 94, 95, 101, 105, 106, 108, 111, 114 | réglage | vitesse de caméra |
| `LPSettingsSubsystem.cpp` | 204, 346, 405 | réglage (UI du menu) | rangement d'onglet, style du slider |
| `LPKeyboardSubsystem.cpp` | 92, 97, 166, 168 | réglage (UI du panneau Clavier) | libellés et groupe « Camera » |
| `LPOutdoorRoomSubsystem.h` | 6 | hors sujet (visibilité du plafond) | « vu de la camera » dans un commentaire ; utile à C3 (§ 3.5) |
Total : caméra de vue 33 (4 + 12 + 6 + 11), réglage 54 (18 + 29 + 3 + 4), hors sujet 1 = 88.
### 3.2 Caméras de vue en C++
- **Aucune caméra C++ ne suit le MC en jeu** : la seule qui le ferait (`FollowView`) n'est jamais appelée (grep `FollowCamera`
sur le `.cpp` : 1 ligne, `:897` ; sur le `.h` : `:43`), et `Walk` se termine sans appel (`.cpp:893-895`). Le commentaire
d'en-tête le dit (`LPDirectControlSubsystem.h:12`). `FollowView` est bien détruite à l'arrêt du sous-système (`.cpp:573-577`).
- Aucun `SpringArm`, `PlayerCameraManager`, `Possess`, `SetViewTarget` hors `FollowCamera` dans `Source/` (C1 : les seules
lignes `ViewTarget` sont `.cpp:903`, `:922`, `:925`).
- La marche dépend de la rotation de contrôle du PC, pas de la caméra (`.cpp:887-891`) ; le pawn n'est pas possédé (`.h:10`,
`.cpp:855-857`). Le Tick saute la marche pendant un menu ou une scène (`.cpp:606-621`, `ScenePlaying` lit `GI.CurrentScene`, `:456-465`).
- `SecondScreen` est la seule caméra déplacée par le C++ ; elle suit le **contact** de l'appel, pas le MC (`LPSecondScreenSubsystem.cpp:89-109`).
- Captures d'écran : `AutoScreenshot`, `Screenshot`, `HighResShot` : 0 ligne dans `Source/` (C2).
### 3.3 Réglages du joueur
- Seul réglage caméra porté par le C++ : **vitesse de caméra**, entier 1 à 7, défaut 3, clé `CameraSpeed` + drapeau
`bCameraSpeedSet` dans `GameUserSettings.ini` (`LPUserSettings.h:19-31`) ; l'ini fait foi, `GI.CameraSpeed` en est la
recopie, `GameSettings.sav` garde aussi un champ `CameraSpeed` (`LPUserSettings.h:3-8`). Écriture seulement si la valeur
change (`.cpp:99-104`).
- Aucun réglage de FOV, de sensibilité, de vue par défaut ou de second écran dans `Source/` ni dans `Config/` (C1, C6) ;
la sensibilité souris est fixe dans `DefaultInput.ini:16-17` (0,07).
- Le panneau Clavier permet de remapper les touches des actions et axes du groupe « Camera » (`LPKeyboardSubsystem.cpp:165-168` ;
`IsRemappable` exclut axes et manette, `:75-78`).
### 3.4 Configuration : classement des lignes de C6 et des lignes liées à la vue
| Ligne | Classe |
|---|---|
| `DefaultEngine.ini:8` `GlobalDefaultGameMode=/Game/BPs/GM.GM_C`, `:9` `GameInstanceClass=/Game/BPs/GI.GI_C`, `:10` `GameDefaultMap=…CentralLondon` | réglage (porte d'entrée : la classe de caméra, de PC et de pawn est dans `GM_C`) |
| `DefaultInput.ini:79` `bEnableFOVScaling=True`, `:93` `FOVScale=0.011110` | réglage lié à la vue (sensibilité souris × FOV) |
| `DefaultInput.ini:107-109` `RotateCamera`, `:118` `SwitchCamera` | caméra de vue (entrées) |
| `DefaultEditor.ini:4-5` (section `[/Script/AdvancedPreviewScene.SharedProfiles]`, `:3`) `CameraShutterSpeed`, `ApplyPhysicalCameraExposure` | hors sujet (post-traitement de l'aperçu d'assets de l'éditeur) |
Lignes lues en plus (liées à la vue) : `DefaultInput.ini:150-154` (`LeftRight`, `DownUp`, `ScrollDownUp`), `:161-162`
(`CursorX`, `CursorY`), `:155-160` (`MoveForward`, `MoveRight`), `:11`, `:16-18`, `:78`, `:91-92` (souris). Hors sujet :
`:95-96` `ActionX` / `ActionY` sur `MouseX` / `MouseY` (le `PC` a des événements `OpenActionXY` / `CloseActionXY`,
`PC__EventGraph.txt:391`, `:398` : menu d'action, estimé). `DefaultGame.ini` : rien sur la vue (C7).
Conflits de touches relevés (constat) : `C` = `SwitchCamera`, `Ctrl+C` = `CityMenu` (`:102`, `:118`) ; `PageUp` / `PageDown`
servent à la fois `NextBuilding` / `PreviousBuilding` (`:119-120`) et l'axe `PenisRotation` (`:163-164`).
### 3.5 Pièces et plafond (utile à la caméra C3)
- Chaque lieu est l'acteur `GI.Room` ; échelle Z de sa racine 0,2 à 0,4 en intérieur, 0,01 pour les 7 lieux extérieurs ; plafond
`WallT` à Z relatif 2040, sans collision (`LPOutdoorRoomSubsystem.h:3-6`). Le sous-système masque `WallT` si l'échelle Z
< 0,05 (`.cpp:14`, `:55-60`) et le rend sinon (`:62-66`).
- Hauteur de plafond au-dessus de la racine : 2040 × 0,2 à 0,4 = 408 à 816 cm (estimé, calcul ; la cote Z de la racine et
du sol n'est pas lue ici).
### 3.6 Rues
- Construction : plugin `StreetMap` (import OSM) ; asset `UStreetMap` (`Plugins/StreetMap/Source/StreetMapRuntime/Public/StreetMap.h:385`)
avec routes `FStreetMapRoad` (type `:159`, points **2D** `TArray<FVector2D> RoadPoints` `:167`, bornes `:173-177`), nœuds
(`:253-260`), bâtiments (`BuildingPoints` 2D `:302`, hauteur en mètres `:304-306`, `Amenity` `:314`), eau, parcs ; recherche
`FindBuilding`, `SearchByAmenity` (`:474-491`). Assets de jeu `/Game/Heavy/StreetMap/CentralLondon` et
`/Game/Heavy/StreetMap/Static/CentralLondon` (`Source/LifePlay/LPDataCompat.cpp:274-275`) ; 280 villes
(`Source/LifePlayEditorTools/LPCheckStreetMapCommandlet.h:6`). Le C++ lit `GI.StreetMapStatic.CurrentPlayerBuilding`
(`LPDirectControlSubsystem.cpp:388-394`) pour les actions de bâtiment. `CityExpansion` : 0 ligne dans `Source/` (C2) ;
c'est un asset BP (cité parmi `BPs/GI`, `BPs/PC`… dans `etat/U58/UA/UA-PLUGINS.md:135`) : CAM-T1 / CAM-T2.
- **Logique de caméra de rue en C++ : aucune.** Preuves : C1 ne touche aucun fichier de rue (les 9 fichiers sont listés en
§ 3.1, aucun ne lit `StreetMap`) ; C2 : les lignes « street » de `Source/` sont un préchargement (`LPDataCompat`), un
compteur de primitives (`LPDebugSubsystem.cpp:118-254`), une lecture de bâtiment (`LPDirectControlSubsystem.cpp:388-394`)
et deux commandlets de vérification, sans caméra ; C3b : dans le plugin `StreetMap`, les seules lignes « view » sont la
pertinence de rendu `FSceneView` du proxy (`StreetMapSceneProxy.cpp:94-201`) et la vue de détails de l'éditeur.
L'existence d'une caméra de rue côté BP ou carte n'est pas tranchée ici (CAM-T1, CAM-T2).
### 3.7 Addon `D:\Game\LifePlay-Sandbox-5.8` (signalé, non cartographié)
Touche aux caméras : 152 lignes, 11 fichiers sous `Plugins/LPSandbox/Source/LPSandbox/` : `LPSandboxCamera.cpp` (19), `.h` (6),
`LPPairSandbox.cpp` (9), `.h` (9), `LPSandboxActors.cpp` (1), `LPSandboxCoupleMod.cpp` (5), `LPSandboxInteraction.cpp` (16),
`LPSandboxMeasure.cpp` (54), `LPSandboxMeasureMod.h` (11), `LPSandboxMeasureTour.cpp` (18), `LPSandboxMod.h` (4).
`LPSandboxCamera.h:1-25` : composants `Arm` (SpringArm) et `Camera` sur le pawn `ALPPairSandboxCharacter`, tangage -50 / 30,
vue par défaut bras 2,5 m, -15 / -135°. Le jeu ne cite l'addon que par nom de classe pour sauter l'animation de marche
(`LPDirectControlSubsystem.cpp:878-880`, `LPPairSandbox`).
## 4. Établi / estimé / incertain
- **Établi** : 88 lignes C1 classées (§ 3.1, recompte C1b) ; `FollowCamera` jamais appelée ; seule caméra déplacée par le C++ =
`SecondScreen` (80 cm, FOV 30) ; seul réglage caméra = vitesse 1-7 défaut 3 dans `GameUserSettings.ini` ; appelants C++ ←
BP : `ApplyCameraSpeedAtStartup` ← `GI` (`GI__EventGraph.txt:30143`) ; aucune ligne de classe caméra / PC / pawn dans
`Config/` ; mise à l'échelle souris par le FOV (moteur `PlayerInput.cpp:2346-2353`, ini `:79`, `:93`) ; aucune caméra de
rue en C++ (§ 3.6) ; vue de dessus pilotée par le BP `Birdview_C` appelé par `PC` (`PC__EventGraph.txt:616`, `:743`, `:3092`, `:3117`).
- **Estimé** : la caméra de jeu courante est l'acteur BP `Birdview` tenu par `GI.Birdview` (`PC__EventGraph.txt:610-615`) ;
`GI.CameraSpeed` règle la rotation / le zoom dans `Room` (9 lectures dans `Room__EventGraph_V5.txt`, non lues) ; facteur souris
≈ 1,0 à FOV 90 (calcul) ; plafond intérieur 408-816 cm au-dessus de la racine de `Room` (calcul § 3.5) ; `ActionX/Y` hors sujet.
- **Incertain** : quel `K2Node_InputAction` du `PC` écoute `RotateCamera` / `SwitchCamera` (noms absents du dump ; essai :
`get_node_infos` MCP ou `LPDumpFunction -BP=PC` avec nom d'action) ; classe de `PlayerCameraManager`, PC, pawn par défaut
de `GM_C` (essai : `LPDumpCDO -List=GM`) ; si la rotation de contrôle du PC est tenue à jour par le BP (direction de marche,
essai en jeu ou lecture de `Birdview_C`).
## 5. Points à confirmer (repris par la fiche suivante)
1. CAM-T2 : graphes `Birdview_C` (`RotateCamera`, `CircleCamera`, `ScrollDownUp`, `DownUpBirdview`, `LeftRightBirdView`), `PC`
(`SwitchCamera`, `SwitchCameraDelayed`, `MoveCamera`), `Room` (`RotateCamera`, `ScrollDownUp`, lectures `CameraSpeed`).
2. CAM-T2 : nœud d'entrée de chaque action `RotateCamera` / `SwitchCamera` (§ 4 incertain).
3. CAM-T1 : `GM_C` (classes PC, pawn, `PlayerCameraManager`), composants caméra de `PlayerCharacter`, acteur `SecondScreen`
de `CentralLondon` et sa cible de rendu, `ChargenCameras` / `CameraComponent` du `MainMenu`
(`ST/STB/dumps/MainMenu__EventGraph.txt:1540-1564`), BP `CityExpansion`.
4. Qui appelle `SetViewTarget*` côté BP (le C++ ne le fait que dans le code mort).
5. Cote Z réelle du sol et du plafond d'une pièce (pour C3 : contrainte « < 3 m au-dessus du MC »).
## 6. Questions pour la SPEC ou l'utilisateur
- Q1 : C3 « au plafond, au centre de la pièce » et « toujours < 3 m au-dessus du MC » : le plafond estimé est à 4-8 m au-dessus
de la racine de `Room` (§ 3.5) ; laquelle des deux règles prime quand elles s'opposent ?
- Q2 : C2 « à 1,75 m » : distance au MC ou hauteur de caméra ? (le code mort existant recule de 340 cm, FOV 70).
- Q3 : la touche C (`SwitchCamera`) et ses événements BP existent déjà : doivent-ils servir à passer de C1 à C2 à C3 ?
- Q4 : la vitesse de caméra (1-7) doit-elle régler les nouvelles caméras ? Faut-il un réglage de FOV ou de sensibilité
exposé au joueur (aucun aujourd'hui) ?
- Q5 : caméras de rue en enfilade : quelle ville, le long des `RoadPoints` (2D, sans hauteur) de `UStreetMap` ou d'acteurs
posés dans la carte ?
- Q6 : la caméra du second écran (suit le contact, pas le MC) reste-t-elle hors du lot ?
Tours : 27 / 60