LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-B2q-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

6.1 KiB
Raw Blame History

Fiche STG-B2q-IMPL — Niveau N3 — Modèle prévu claude-opus-5-5 | utilisé claude-opus-5-5 — Agent orchestrateur STG (session principale) — Skills lp-lot, sk-change-safety

STG-B2q-IMPL : bornes de rendu adaptées aux Person assises (B2q-a) et témoin T-cull (2026-10-14)

GO de Big Boss du 2026-10-14 pour B2q-a et T-cull (STG-B2q-DIAG.md § 4-5). Sans UE ni compilation ; VAL statique par un agent distinct ; ils entrent dans COMMUN-8. Lot STG, registre STG-TACHES.md.

Gardes demandées :

  • aucun effet sur les collisions ni les tracés ;
  • coût borné : une seule boucle toutes les 0,5 s, sur les Person visibles seulement ;
  • S borné à 4 ;
  • journal limité : une ligne par changement de plus de 10 %, et une alerte T-cull au plus par seconde.

1. Instantané

Snapshot.ps1 -Lot STG-B2q (état M1e + C6-b + C7-a) : LPDirectControlSubsystem.cpp 1A74D6B724BD63F04E04FDA42682446D, .h 519E23DC9EB2809FA36C1BBF942A7667 (D:\Game\LifePlay_Backup_5.5\STG-B2q\manifest.csv).

2. Changements (STG-B2q.diff : 135 lignes ajoutées (130 au .cpp, 5 au .h, recompte de la VAL), 0 retirée, après la reprise du § 2b)

LPDirectControlSubsystem.h : la déclaration FitPersonBounds(float), et les membres BoundsDelay, CullAlertDelay et MeasuredSeats (personne → meuble déjà mesuré).

LPDirectControlSubsystem.cpp (CRLF) :

  • include Camera/PlayerCameraManager.h ;
  • Tick appelle FitPersonBounds(DeltaTime) à chaque tick, avant le choix entre blocage et marche. Le culling touche aussi les menus, les scènes et le sexe ;
  • FitPersonBounds :
    • une seule boucle toutes les 0,5 s sur les ACharacter de classe Person_C, non cachés, maillage visible ;

    • bassin : os hip, sinon pelvis, sinon l'os 0 (comme M1d) ;

    • facteur : sur chaque axe, (max(0, |bassin − centre des bornes| − 0,3 × demi-étendue) + demi-étendue) / demi-étendue, la demi-étendue étant celle des bornes à l'échelle 1, au moins 10 cm. L'écart toléré de 0,3 demi-étendue garde S = 1 debout. On prend le plus grand des trois, borné à [1 ; 4]. Les bornes pas encore calculées (étendue < 1 cm, personne qui vient d'apparaître) sont sautées jusqu'au balayage suivant ;

    • seulement si le facteur change de plus de 10 % :

      • InvalidateCachedBounds() puis SetBoundsScale(S), qui appelle UpdateBounds et MarkRenderTransformDirty ;
      • sur les enfants en bUseAttachParentBound (vêtements, cheveux, accessoires de Person::NewProxy) : UpdateBounds() et MarkRenderTransformDirty() ;
      • une ligne de journal : B2q-a : <Person> BoundsScale <avant> -> <après> (bassin a N cm du centre des bornes, dans=0|1).

      Debout, le bassin est près du centre, donc S = 1 et rien ne change ;

    • T-cull, mesure : une ligne par nouveau meuble occupé par une personne (OccupyingFnt) : T-cull mesure <Person> meuble <…> : bassin a N cm du centre des bornes (dans=…) ; bornes X x Y x Z ; BoundsScale … ; physAsset=0|1 ;

    • T-cull, alerte, au plus une par seconde : bassin à moins de 15 m de la caméra, projeté dans le viewport, et corps non rendu depuis 0,2 s (WasRecentlyRendered(0.2f) faux) : T-cull : <Person> non rendue, bassin a l'ecran a N cm de la camera, a M cm du centre des bornes (dans=…, centre a l'ecran=…), BoundsScale ….

Collisions et tracés : BoundsScale ne change que les bornes de rendu (UPrimitiveComponent::SetBoundsScale, moteur l. 2538-2543). La capsule (collision du personnage) n'est pas touchée. Le corps n'a pas d'asset physique, donc aucun corps de collision. Les tracés de STG et de CAM visent la capsule ou le monde, jamais les bornes.

Signatures relues (UE 5.8) :

  • UPrimitiveComponent::SetBoundsScale (PrimitiveComponent.h l. 1558) et WasRecentlyRendered(float) const (l. 999) ;
  • USkinnedMeshComponent::InvalidateCachedBounds(), public (SkinnedMeshComponent.h l. 1846) ;
  • APlayerController::ProjectWorldLocationToScreen (PlayerController.h l. 742) et GetViewportSize (l. 1191).

2b. Reprise après la VAL (écart E2 et risque « apparition »)

La VAL (STG-B2q-VAL.md) a relevé deux points :

  • E2 : la formule d'origine donnait S ≈ 1,1 à 1,3 pour une personne debout, dont le bassin n'est pas exactement au centre des bornes. Cela faisait une ligne et un léger surcoût pour chaque personne debout. Correctif : un écart toléré de 0,3 demi-étendue par axe.
  • Apparition : S = 4 pendant un balayage si les bornes sont encore nulles. Correctif : saut tant que l'étendue est < 1 cm.

Ces 7 lignes sont revérifiées par l'agent de VAL (contrôle du delta, § 4 du VAL).

3. Ce qui n'a pas été fait

  • Compilation et essai : au build COMMUN-8.
  • L'accessoire mal attaché (assiette, sandwich) : hors B2q.
  • PlayerBusy / LPOutdoorRoomSubsystem : non concernés.

4. Points à confirmer (fiche d'essai COMMUN-8)

  1. Bar et café (fnt_new048) : faire tourner C2 autour des personnages assis, joueur compris. Attendu : aucune disparition, des lignes B2q-a : … BoundsScale 1.00 -> … à l'assise et T-cull mesure …, et aucune alerte T-cull : … non rendue. Noter l'heure de toute disparition.
  2. Personnage couché (lit) : même contrôle.
  3. Coût : stat unit avant et après au bar, si la console est accessible ; sinon, comparer les lignes LPDebug hitch de COMMUN-7 et de COMMUN-8 au même endroit.
  4. Une alerte T-cull avec dans=1 : la cause n'est pas les bornes (une fiche à part).

5. MD5 après

Fichier MD5
LPDirectControlSubsystem.cpp 7448C8FB1091BD2A994CCA4AA7F8B7A6 (après la reprise du § 2b ; avant : C9D1AC98…)
LPDirectControlSubsystem.h 5F3492917B8202B267D8879E4613966B

6. Retour arrière (proposé, jamais lancé sans accord)

Restore.ps1 -Lot STG-B2q, qui ramène l'état C7-a (1A74D6B7… / 519E23DC…). Avant tout, prendre l'instantané STG-B2q-retour.

7. Fichiers à commiter

Source/LifePlay/LPDirectControlSubsystem.cpp, Source/LifePlay/LPDirectControlSubsystem.h, Docs/Migration/etat/ST/STG/STG-B2q-IMPL.md, Docs/Migration/etat/ST/STG/STG-B2q.diff.

Tours : 8