LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-F-IMPL.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

109 lines
7.1 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.

# 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 <composant>` 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 (<raison>, champ <type>)`.
- **`.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<ULPShowCoupleSubsystem>()->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`.