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 "" -- "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__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 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