110 lines
7.1 KiB
Markdown
110 lines
7.1 KiB
Markdown
|
|
# 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`.
|