# CAM-B2p-F-IMPL : intérieur réel de la pièce, pose libre, focus clavier (C++, 2026-10-14) GO : Big Boss, 2026-10-14 (« GO pour B2p-F (F1 à F5, G1, G2, H1, H2) »). G3 est attribué à STE. DIAG : `CAM-COMMUN9-DIAG.md` § 6. Écriture sans UE ni compilation ; le lot entre dans COMMUN-11. Instantané : `D:\Game\LifePlay_Backup_5.5\CAM-B2p-F\` (`.cpp` `FFF0FBB4…`, `.h` `0EDC1F76…`, état jusqu'à B2p-E). | Fichier | Avant | Après | |---|---|---| | `Source/LifePlay/LPCameraModeSubsystem.cpp` | `FFF0FBB45D493B931B08780BF09547C8`, 1163 lignes | `8C6A3D719FBC60900CC35BAD46BF6D51`, 1426 lignes | | `Source/LifePlay/LPCameraModeSubsystem.h` | `0EDC1F76B7EEC0D135EA046DA2269BE0`, 121 lignes | `3DF4B51155A42BCC0F99FCC26CFD4F6E`, 130 lignes | Fins de ligne : LF (0 CR). ## 1. Écritures - **Includes** : `Engine/OverlapResult.h`, `Widgets/Input/SEditableText.h`. - **Constantes** : - noms : `WallPrefix` (`Wall`), `RoomAllComponents` ; - `RoomStructureCount` (6) ; - critères de mur (plus de 100 cm de haut ; petit côté sous le quart du grand) ; - critères de plafond (moins de 50 cm d'épaisseur, plus de 150 cm au-dessus du sol) ; - `RootHalfSizePerScale` (50 cm par unité d'échelle) ; - `CoupleWallMargin` (80 cm, G2) ; - `CoupleProbeExtent` (78 × 46 × 50) et `CoupleProbeAboveRoot` (58 cm, G1) ; - `CoupleHeadroom` (120 cm entre la racine la plus haute et le plafond). - **`FRoomInterior` et `ComputeRoomInterior`** (F1) : - base : la boîte du sol (`Room.Box`) ; - murs : composants de Room dont le nom commence par `Wall`, hauts et minces. Chacun resserre la borne de son côté par rapport au centre du sol ; - repli 1 : `AllComponents[0..5]` avec les mêmes critères ; - repli 2 : demi-côté d'échelle de la racine (±échelle × 50 cm autour de Room), dans la boîte du sol ; - plafond : un composant mince en Z et à plus de 150 cm au-dessus du sol (dans les murs ou la structure). Sinon, sol + 350 cm ; - incohérence (bornes croisées) : retour à la boîte du sol, source notée. - **`CoupleSpotFree`** (G1) : - `OverlapMultiByChannel`, canal Pawn, boîte 78 × 46 × 50 orientée selon le lacet du meneur, centre à la racine du maillage + 58 cm ; - seuls comptent les recouvrements bloquants de composants de Room. Le couple et le sol sont ignorés, et les lits sont admis (même règle que `IsBedMesh` de STE). - **`FocusedEditable`** : un widget de texte qui a le focus clavier. - **`TickCoupleBounds`** (E1 avec F1, F2, F4) : - l'intérieur réel remplace la boîte du sol, avec une marge de 80 cm ; si la pièce est plus étroite que deux marges, le couple va au centre de ce côté ; - Z : plancher inchangé ; borne haute = plafond − 120 cm ; - **F2** : une ligne par scène, `Sexe : bornes du couple X [..] Y [..] sol .. plafond .. (marge 80) ; source .., murs n, plafond trouve 0|1 ; sol Box X [..] Y [..] ; echelle racine (sx, sy)` ; - **F4** : l'image où une prise vient de finir n'est pas comptée par le témoin « hors prise » ; - ligne de correction : `plafond .. (racine au plus ..)`. - **`TickCoupleMouse`** (F3, G1, G2) : - le glisser est borné par le même intérieur, avec la même marge de 80 cm ; - avant chaque déplacement, `CoupleSpotFree` à la place visée. Si elle n'est pas libre, le couple ne bouge pas, et une ligne `Sexe : place refusee, recouvre ` est écrite à chaque changement de composant ; - une prise qui part d'une place encombrée peut aller vers toute place libre ; - `bGrabJustEnded` est posé au relâcher. - **`TickSexCamera`** (H1, H2), avant la garde de menu, pendant le sexe : - **H1** : si un champ de texte a le focus et qu'un bouton de souris vient d'être enfoncé dans la vue (vu par le `PlayerInput`, donc hors interface), le focus est rendu au viewport (`FSlateApplication::SetAllUserFocusToGameViewport`) et le menu est recalculé tout de suite ; - **H2** : à la première image du sexe, un `SEditableText` vide qui a le focus le rend une fois ; - ligne : `Sexe : focus clavier rendu a la vue (, champ )`. - **`.h`** : `bGrabJustEnded`, `bBoundsLogged`, `LastSpotBlocker`, `bSceneFocusChecked`, `bFocusClickWasDown`. ## 2. Écarts et limites - `CoupleFloorMargin` (30 cm) n'est plus utilisé. On le laisse pour ne pas élargir le diff ; on le retirera au nettoyage. - Plafond : la borne haute porte sur la racine du maillage (pieds). Plafond − 120 cm laisse la place d'un corps assis ou allongé. Avec le plafond estimé (sol + 350), la borne passe à sol + 230 (avant : sol + 350). - G3 (dégagement côté résolveur de STE) n'est pas appelé : la fonction de STE n'existe pas encore. Nom et signature proposés : `void ULPShowCoupleSubsystem::NotifyCoupleTeleported()`, publique, sans paramètre. Elle reprend `LastSafe` à la position actuelle du meneur. Appel prévu dans `TickCoupleMouse` après un déplacement validé par G1, dès que STE l'aura livrée (une ligne). - Le recalcul de l'intérieur à chaque image parcourt les composants de Room (quelques dizaines). C'est un coût faible, seulement pendant le sexe. ## 2 bis. Ajout G3 (appel au contrat de STE, 2026-10-14, après la VAL de B2p-F) Contrat STE-G3 (VAL PASS-STATIC chez STE), relayé par Big Boss : `void ULPShowCoupleSubsystem::NotifyCoupleTeleported();`, publique, sans paramètre (fichiers STE vérifiés sans les toucher : `.h` `44C721EE…`, `.cpp` `3CDD572D…`). Instantané avant cet ajout : `D:\Game\LifePlay_Backup_5.5\CAM-B2p-F-G3\` (`.cpp` `8C6A3D71…`, `.h` `3DF4B511…`). | Fichier | Avant (B2p-F validé) | Après | |---|---|---| | `LPCameraModeSubsystem.cpp` | `8C6A3D719FBC60900CC35BAD46BF6D51`, 1426 lignes | `03D85D282A6306E6D2494D7DC2C253FC`, 1437 lignes | | `LPCameraModeSubsystem.h` | `3DF4B51155A42BCC0F99FCC26CFD4F6E`, 130 lignes | `4AE6599447750371CFF7E0AAC74EB93E`, 132 lignes | - `#include "LPShowCoupleSubsystem.h"`. - `.h` : membre `GrabLeadStart`, la place du meneur (`Couple[0]`) au moment de la prise. - Au relâcher d'une prise (dans le bloc « relâcher » de `TickCoupleMouse`), si le meneur est à plus de 1 cm de `GrabLeadStart` : `GI->GetSubsystem()->NotifyCoupleTeleported()`, une seule fois par pose. Il n'y a **jamais d'appel à chaque image** d'un glisser. - **Choix pour la rotation (mode 2)** : la même règle « le meneur a bougé » sert pour les deux modes. - Si la rotation ne déplace pas le meneur (les deux corps à la même place, cas habituel), il n'y a pas d'appel. - Si elle le déplace (pivot hors du meneur), il y a un appel au relâcher. ## 3. Points à confirmer en V7 (COMMUN-11) - Ligne F2 : - source « murs Wall* » attendue ; - bornes X et Y à l'intérieur de celles de `Box` ; - plafond trouvé ou non. - G1 : - les lits ne sont pas refusés ; - les meubles et les murs le sont ; - un couple coincé se dégage vers une place libre (complet seulement avec G3). - H1 et H2 : ZQSD remarche après un clic dans la vue ; un clic dans le champ y remet le focus. - Compilation (`/we4458`, etc.). - Essais CAM-69 à CAM-75. ## 4. Fichiers à commiter A `Source/LifePlay/LPCameraModeSubsystem.cpp` et `.h` ; A `CAM-B2p-F-IMPL.md`, `CAM-B2p-F-VAL.md` ; `CAM-COMMUN9-DIAG.md`.