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

143 lines
10 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-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`.