LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-J-IMPL.md

144 lines
10 KiB
Markdown
Raw Normal View History

# CAM-B2p-J : DIAG COMMUN-12 (souris, lit, Espace, hauteurs) et correctif C++ (2026-10-14)
GO : Big Boss, 2026-10-14 (« DIAG puis correctif, avec un seul GO » : glisser et rotation à la souris, panneau sur
Alt, restauration à la sortie, N2 et B2p-I ; GO pour la partie C++ ; le PC attend l'UE-GO). Journal lu sans le
modifier : `D:\Game\LifePlay_Backup_5.5\COMMUN-12\essais\commun12_LifePlay.log` (UTC).
## 1. DIAG
### 1.1 Glisser et rotation sans effet (régression B2p-G, établie)
- **Journal** :
- les prises existent : `couple pris (deplacement)` à 12:36:24, 12:37:39, 12:38:15… ;
- mais chaque pose est **à la même place**, et chaque rotation est de **+0 degré** (12:36:32, 12:37:41,
12:38:20, 12:38:26) ;
- il n'y a aucune ligne `surface refusee` ni `place refusee`. Le code de pose n'est donc jamais atteint : le seuil
de 5 px du glisser (`bGrabMoved`) n'est jamais franchi, et l'écart de `MouseX` vaut 0 ;
- le curseur ne bouge pas pendant l'appui.
- **Cause, établie (dump du PC et moteur 5.8)** :
- à la fermeture du panneau, le PC repasse en GameOnly (`CallFunction_1394` `SetInputMode_GameOnly`, l. 1171) ;
- `FInputModeGameOnly::ApplyInputMode` (`PlayerController.cpp:6439-6451`) active `UseHighPrecisionMouseMovement`
et `LockMouseToWidget`, puis `CapturePermanently` et `LockOnCapture` : le curseur est caché, sa position figée ;
- le journal montre ces bascules (`LogViewport … CaptureDuringMouseDown -> CapturePermanently`, 12:38:21).
- **Pourquoi c'est une régression de B2p-G** : avant G-g, un clic court ouvrait le panneau (`LeftMouseSexOn`, puis
`SetInputMode_GameAndUIEx`, `DoNotLock`, l. 1034-1041). La souris restait donc libre pour les prises suivantes
(COMMUN-9 à 11). G-g a coupé cette voie : le panneau reste fermé, la souris reste verrouillée.
- **`prise=0 MoveCamera=1`** (12:41 à 12:43) : la position lue au clic est la position figée, pas celle que voit
l'utilisateur. La sélection par projection échoue, et le clic part à l'orbite.
- **Pistes écartées** :
- **canal Pawn de H3** : la requête ignore le couple (`Query.AddIgnoredActors(Couple)`), et le tracé vertical ne
sert qu'après `bGrabMoved` ;
- **test de pose de H4** : jamais atteint (aucune ligne) ;
- **sélection depuis que la caméra suit** : le recadrage met le couple au centre, ce qui explique les quelques
`prise=1` (position figée près du centre).
### 1.2 S3, « le lit nous interdit de se poser »
C'est la même cause : la prise sur le lit (12:38:15, `racine a +60 cm … fnt_bed02`) n'a rien déplacé, puisque le
curseur était figé. Aucune règle de H3 ou H4 n'a refusé le lit (aucune ligne).
### 1.3 Hauteurs
- **Montée pendant la rotation** (+22 cm à chaque prise, 12:38:18 à 12:38:23 ; Z 99, puis 121, puis 144) : CAM n'a
rien bougé (rotation de 0). Le meneur a été déplacé **pendant la prise par une autre source**, et `G3` le mesure
au relâcher (`meneur deplace de 22 cm`). La seule voie connue qui monte le couple est **la molette de Room** :
B2p-R O1 (`MoveObject` OU `SexOn`) la donne au couple pendant le sexe. Preuve à 12:37:57 :
`deplace hors prise … +9 ; molette=+1.0`. Le témoin E4 est muet pendant une prise : c'est **estimé**. Un nouveau
témoin l'écrira.
- **+180 cm au-dessus du sol** (12:38:37 à 12:39:16, Z 165 à 171) : ce sont Maj et la molette de Room
(`Maj=1 MoveObject=1`). La borne E ne fixe que la racine à 120 cm sous le plafond (`racine au plus 163`, sol −102),
soit jusqu'à 265 cm au-dessus du sol. **Établi.** Une borne plus basse est proposée (§ 4), pas faite.
### 1.4 Espace
`Pause` = `SpaceBar` (`DefaultInput.ini:97`). G-g (PC `IfThenElse_134`) détourne Espace vers le panneau pendant le
sexe. L'utilisateur le veut sur Alt. Alt est déjà l'action `RotateCamera` (`DefaultInput.ini:107-109`, avec le clic
molette). **Le retour d'Espace à sa fonction demande le PC** : défaire la branche 134 (§ 3).
## 2. Correctif C++ (`LPCameraModeSubsystem`, instantané `CAM-B2p-I3`)
| | `.cpp` | `.h` |
|---|---|---|
| Avant (= B2p-I + D1) | `0F383EF777DED71608347E17D4A0861F`, 1976 lignes | `6EDBBCCF61759B8C6EE4890DF9BC5FE7`, 179 lignes |
| **Après** | **`9D9291021BBB44BD8AD49448494FAB3A`**, 2197 lignes | **`9D85465E284F626D00212FFAA331C4BB`**, 203 lignes |
Fins de ligne : LF (0 CR).
- **J1, souris libre** (`KeepMouseFree`, à chaque image pendant le sexe, hors menu, sans bouton tenu) :
- si le viewport est en `CapturePermanently` (GameOnly du PC), on applique `FInputModeGameAndUI`, `DoNotLock`,
`HideCursorDuringCapture` faux, sans widget de focus (le clavier reste au jeu). C'est l'état de COMMUN-11 ;
- ligne `Sexe : souris liberee pour le glisser (…)`, au plus une toutes les 2 s, avec le compte.
- **J2, curseur de la prise** (`GrabCursor`) : position réelle quand elle bouge ; sinon, deltas bruts de la souris
(`GetKeyValue(MouseX/MouseY)`). Le glisser (seuil, visée par `DeprojectScreenPositionToWorld`) et la rotation ne
dépendent plus du mode d'entrée. C'est un filet si J1 ne passe pas.
- **J3, refus muets rendus visibles** :
- `clic hors du couple, pas de prise (curseur, couple à N px, seuil)`, toutes les 2 s au plus ;
- `glisser sans effet, curseur deplace de N px (seuil 5), deltas bruts sur N images, curseur avec/sans position` ;
- `rotation sans effet, …` ;
- `glisser, le curseur ne vise aucune surface` (une fois par prise) ;
- `couple deplace pendant la prise hors CAM de (dx, dy, dz) ; molette=… Maj=…`, une par seconde au plus : le
témoin de § 1.3.
- **J4, panneau sur Alt** (`TickPanelClick`) : Alt gauche ou droit bref (0,2 s au plus, 5 px au plus) bascule le
panneau, comme le clic molette. Un appui tenu ou une glissée reste l'orbite (`RotateCamera`). Ligne
`panneau bascule (Alt|clic molette, …)`. Toujours seulement pendant le sexe, hors menu.
- **J5, restauration à la sortie** (`BeginSexScene` et `EndSexScene`, au front de `GI.SexOn`) :
- au début : empreinte des mappages (nombre d'actions et d'axes, CRC), ligne `debut de scene, touches …` ;
- à la fin :
- prise levée, clic molette et Alt oubliés ;
- boîte d'aide et icône repliées ;
- **opacité de `TextBlock_1` rendue** (D3 de B2p-I) ;
- `PC.MoveCamera` à faux si aucun bouton n'est tenu ;
- `PC.SexC3` à faux ;
- mode d'entrée rendu à GameOnly si CAM l'avait changé, que la vue est toujours dans l'état posé par CAM et
qu'aucun menu n'est ouvert ;
- empreinte des touches comparée ;
- une ligne : `fin de scene, etats rendus : prise=… MoveCamera=… SexC3=… ; mode d'entree … ; 4 lignes … ; icone et aide repliees ; touches inchangees|CHANGEES (…)`.
- CAM ne change aucun mappage (ZQSD, flèches, clics, Alt, Espace, molette et C sont lus, jamais écrits). Le focus
clavier rendu à la vue (H1, H2) n'a pas d'état à rendre.
- **J6, texte d'aide** : « Mouse wheel: raise / lower the couple » remis (la molette déplace bien le couple, par
B2p-R O1, § 1.3) ; « Alt or middle click (short press): show / hide this panel ». La constante `ActionPause` est
retirée.
- N2 (I0) et B2p-I (I1, avec D1) sont déjà dans la base de ce correctif.
## 3. PC : il faut l'éditeur (UE-GO)
Pour qu'Espace retrouve sa fonction pendant le sexe, on défait G-g (2) dans le PC
(`CAM-B2p-G-PC-FICHE.md` § 7, amendement a) :
1. instantané `CAM-B2p-J-PC` du PC ;
2. `connect_pins` `IfThenElse_40.then` → `CallFunction_277.execute` (remplace 40 → 134) ;
3. `delete_node` `IfThenElse_134` (le lien `VariableGet_22.SexOn` vers 134 part avec lui ; celui vers
`IfThenElse_15` reste) ;
4. `delete_node` `CallFunction_408` ;
5. relecture de 40, 277, 22 et 15 ; compilation stricte ; `save_assets` du PC seul ; V5 (diff contre
`CAM-B2p-G-PC-VAL_LPDumpFunction_20261014-135527.txt` : 1447 → 1445 nœuds) et V6 par un validateur distinct.
Volume : environ 10 appels. Les coupures G-g (1) (clics gauche et droit sans bascule) restent : l'utilisateur ne les
remet pas en cause. Le clic molette et Alt (C++) remplacent Espace.
## 4. Proposé, non fait (à décider)
- Hauteur du couple : borner la racine à la surface sous le couple (sol ou lit) + 30 cm, plutôt qu'au plafond −
120 cm. Cela défait les montées de la molette de Room au-delà. C'est un changement de règle E.
## 5. Essais (COMMUN-13)
- CAM-91 : panneau fermé, glisser au clic gauche et rotation au clic droit marchent ; ligne `souris liberee`.
- CAM-92 : glisser sur le lit : posé dessus (S3) ; sur une commode : `surface refusee`.
- CAM-93 : Alt bref bascule le panneau, Alt tenu tourne la caméra ; Espace (après le PC) fait sa fonction d'origine.
- CAM-94 : fin de scène : ligne `fin de scene, etats rendus … touches inchangees` ; marche, souris et touches
normales.
- CAM-95 : molette pendant une prise : ligne `deplace pendant la prise hors CAM`.
- CAM-86 à 90 (B2p-I) : l'icône « i » et l'aide.
## 5 bis. Reprise après la VAL (`CAM-B2p-J-VAL.md`, FAIL sur D1)
Instantané `CAM-B2p-I4` (`9D929102…` / `9D85465E…`) ; après : **`.cpp` `1F10631F904E0EAB74BAA896571F0A57`, 2220 lignes ;
`.h` `9AEE8D04CF35C0C6EEDF226E3B0A86C3`, 206 lignes**, LF.
- **D1 (bloquant)** : les deltas bruts passent par `GetRawKeyValue`. `GetKeyValue` applique la sensibilité du projet
(0,07), ce qui rendait les deltas 14 fois trop petits.
- **D2** : `KeepMouseFree` libère aussi la souris quand la capture se fait à l'appui mais cache le curseur
(`HideCursorDuringCapture` vrai : haute précision à l'appui). C'est l'état vu au journal après le premier relâcher.
- **D3, D4** : `BeginSexScene` garde l'état de la souris du début de scène (mode de capture, verrou, curseur caché).
`EndSexScene` le rend tel quel (GameOnly seulement si la capture était permanente, puis les trois réglages), au lieu
d'imposer GameOnly. Le membre `MouseCaptureBefore` est remplacé par `bSavedMouseState`, `SavedCaptureMode`,
`SavedLockMode` et `bSavedHideCursor`.
- Note de la VAL : `MoveCamera` n'est plus remis à faux à la fin si Alt est tenu.
- D5 (gabarit, intervalle 12:35:26) et D6 (+22 cm attribués trop vite à la molette) : la DIAG § 1.1 et § 1.3 est
**corrigée en lecture** comme suit. La cause du § 1.1 est **estimée forte** et non établie : le curseur est caché à
l'appui (GameOnly, ou `HideCursorDuringCapture` vrai), donc sa position est figée. Aucune position n'est au journal.
Les +22 cm ont une **cause non établie** : chaque épisode coïncide avec un `panneau bascule` pendant la prise. Le
nouveau témoin `deplace pendant la prise hors CAM` tranchera.
## 6. Fichiers à commiter
A `Source/LifePlay/LPCameraModeSubsystem.cpp` et `.h` ; A `CAM-B2p-J-IMPL.md`, `CAM-B2p-J-VAL.md`.