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

7.1 KiB
Raw Blame History

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.