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