LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B1e-CART.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

30 KiB
Raw Blame History

Fiche CAM-B1e-CART — Niveau N3 — Modèle prévu opus | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-cart — Skills sk-protocol, lp-paths, lp-ue-compat

CAM-B1e-CART : rendu première personne natif UE 5.8, tête de Person, trois options (2026-10-13)

Lecture seule : aucun éditeur, aucun MCP, aucun commandlet, aucun build, aucun git en écriture ; seul ce livrable est écrit. Moteur lu : D:\Game\Launcher\Engine\UE_5.8\Engine\Build\Build.version = 5.8.3, changelist 58210709, branche ++UE5+Release-5.8 (sources Engine\Source\Runtime\{Engine,Renderer,RenderCore} présentes : environnement complet pour la lecture). Faits relus le 2026-10-13. Fiche scindée par le barème (S = 4) : cartographie et options ici, pas de SPEC d'implantation.

1. Objet et périmètre

Un domaine : comment obtenir, dans LifePlay sous UE 5.8, une vue à la première personne propre (ni dents, ni langue, ni mèches) pour la vue C1 de Room (CAM-B1-IMPL.md:22, § 6, § 7) et pour la POV de sexe de PC (CAM-T2-CART.md:137-141). Questions (a) à (e) de la fiche. Hors périmètre : écrire la SPEC, toucher Config / Content / Source, trancher à la place de l'utilisateur.

Capture de l'utilisateur (...\ebc15012-...\images\2.webp, horodatée 2026-10-13 15:32:11, 315 178 o ; relue avec Read) : vue plongeante sur un buste en vêtement vert ; un disque rouge et rose portant des dents blanches et une langue flotte au centre haut ; un anneau violet (encolure estimée) sous lui ; des mèches noires plates dans les quatre coins ; des lambeaux de peau rose à gauche et à droite ; l'IHM du jeu (« What should I do? », Translate, Timeout, Skip). Le build qui a produit la capture n'est pas identifié (elle date de 15 h 32, après les builds B1d 09 h 51 et B2 13 h 36, avant la VAL B2b de 16 h 14) : incertain.

2. Commandes et lectures (exactes, avec compte brut)

# Commande ou lecture Compte / sortie brute
1 Grep \[(SCS|CDO|INH)[^\]]*\]|=== /Game sur CAM-T4_LPDumpComponents_20261011-004910.txt 13 lignes : === 121 et 2600, [CDO] 122 et 2601, [SCS] 123, 415, 707, 906, 986, 1185, 1384, 1583 et 2602 (le journal contient le dump deux fois) = 8 composants SCS distincts, tous parent=CharacterMesh0
2 Read de ce dump, l. 906-985 FirstPersonSM (FirstPerson_C) : propriétés de UCameraComponent (l. 907-936)
3 Grep HairSM|FirstPersonSM|HideBone|ObtenirMesh|GetMesh sur ST/STE/dumps/PC__EventGraph.txt 28 lignes ; seuls 3 nœuds variable 'HairSM' (l. 2281, 2290, 2299), HideBoneByName l. 2318, UnHideBoneByName l. 2327 et 2335
4 Grep LeaderPose|MasterPose|AddComponent|SetSkeletalMesh|SetSkinnedAsset|OwnerNoSee|OnlyOwnerSee|MorphTarget sur ST/STE/dumps 0 fichier (aucun SetOwnerNoSee dans les dumps STE)
5 Grep des mêmes motifs (sans MorphTarget) sur Docs/Migration/etat (**/*.{md,txt}) 856 occurrences dans 71 fichiers (liste limitée à 40 ; dumps L6f, STG, PawnDyn, AP5, CAM)
6a Grep FirstPerson|bOwnerNoSee|OwnerNoSee|OnlyOwnerSee sur Source 0 résultat : aucun code C++ du jeu ne touche au rendu première personne
6b Grep (?i)teeth|tongue|dents|langue|eyelash|cils|eyebrow|sourcil sur Source 0 résultat
7 Grep PROJECT_CVAR sur Source 0 résultat
8 ls -l "D:/Game/LifePlay-master 5.8/Content/Scenes/" 437067 CentralLondon.umap ; 43149 CentralLondon_BuiltData.uasset
9 git -C ... ls-files Content/Scenes ; git -C ... cat-file -s HEAD:Content/Scenes/CentralLondon_BuiltData.uasset 2 fichiers suivis ; 43149
10 Glob Content/**/*_BuiltData* ; Glob Content/**/*.umap 1 fichier (CentralLondon_BuiltData.uasset) ; 2 cartes (CentralLondon.umap, FreeAnimationsPack/Map/Overview.umap)
11 Grep -o (Lightmap|LightMap|ShadowMap|...)[A-Za-z0-9_]* sur CentralLondon_BuiltData.uasset ShadowMapFlags, Lightmap0, Lightmap1, LightMapTexture2D, Lightmap_0, Lightmap_1, ShadowMapTexture2D (« binary file matches »)
12 Grep -o noms de lumières sur CentralLondon.umap DirectionalLight, SkyLight (SkyLight_3), PointLight, PointLight2, SkyAtmosphere, PostProcessVolume
13 Grep -o B_(Mouth|Eyelashes|...)\b|Cornea sur Content/Heavy/Daz/Bridget/bridget_gp.uasset l. 31 : B_Arms, B_Eyelashes, B_Face, B_Legs, B_Mouth, B_Pupils, B_Sclera, B_Torso (deux fois chacun) ; l. 5 Cornea ; l. 6 EyeMoisture ; l. 31 Transparent
14 Glob Content/Heavy/Daz/Bridget/* ; .../Michael/* Bridget : 49 fichiers dont B_Mouth, B_Eyelashes, B_EyeMoisture, B_Pupils, B_Sclera, Cornea, Transparent, DazSkinHide ; Michael : M_Arms, M_Eyelashes, M_Face, M_Genital, M_Legs, M_Torso, FacialHair_Skeleton, aucun matériau de bouche ni d'yeux
15 Grep DazSkinHide sur Content 0 fichier (aucun actif ne le référence)
16 WebSearch puis WebFetch https://dev.epicgames.com/documentation/en-us/unreal-engine/first-person-rendering page lue (résumé par WebFetch), recoupée avec les sources du moteur (§ 3.c) ; 1 recherche + 1 page : moins de la moitié du budget
17 Lectures du moteur 5.8 fichiers et lignes cités en § 3.b, 3.c, 3.d

3. Constats fichier:ligne

3.a Composition de la tête de Person

  • Composants de Person (SCS), 8 : PenisSM (SkeletalMeshComponent, CAM-T4_LPDumpComponents_20261011-004910.txt:123), HairSM (:415), DirtyTalkSM (WidgetComponent, :707), FirstPersonSM (FirstPerson_C, :906), CensoreSM (:986), CensoreBoobsSM (:1185), ButtonSM (WidgetComponent, :1384), ParticleSM (ParticleSystemComponent, :1583). Aucun composant de dents, langue, yeux, cils, sourcils. Établi.
  • Maillage de base : Mesh = CharacterMesh0 (hérité, parent de tous les SCS ci-dessus). Pour la femme, bridget_gp porte dans ses chaînes les emplacements de matériau B_Mouth, B_Eyelashes, B_Pupils, B_Sclera, Cornea, EyeMoisture (Content/Heavy/Daz/Bridget/bridget_gp.uasset l. 5, 6, 31) : estimé que dents, langue, cils et yeux sont des sections du même SkeletalMesh que le corps (le découpage en sections n'a pas été lu dans l'éditeur). Pour l'homme, Content/Heavy/Daz/Michael n'a aucun matériau de bouche ou d'yeux (Glob, ligne 14 du § 2) : incertain.
  • Suivi de pose : Person::UserConstructionScript pose SetLeaderPoseComponent(Mesh) sur PenisSM et HairSM (portage55/L6f/L6f_dump_Person.txt:1-19 ; dump du 2026-09-30, non relu sur HEAD). HairSM reçoit le mesh de coiffure par SetSkinnedAssetAndUpdate(HairSM, PickedHair) (ST/STG/dumps/Person__EventGraph.txt:1956-1961).
  • Composants dynamiques (vêtements et accessoires) : Person::NewProxy crée un SkeletalMeshComponent (AddComponent, L6f_dump_Person.txt:1857-1866), l'attache à Mesh (K2_AttachToComponent, Parent = Mesh, KeepRelative, :1867-1877), lui donne Mesh pour leader (SetLeaderPoseComponent, :1927-1933), SetCastShadow(false) (:1945-1949), SetRenderCustomDepth(true) (:1940-1944), bUseAttachParentBound (:1934-1938), SetBoundsScale(3) (:1950-1954). Person::ClearSMCs détruit les descendants de Mesh dont le nom ne finit pas par SM (ST/STE/dumps/Person__ClearSMCs_D4.txt:97-137) : les proxys sont donc des enfants de Mesh nommés sans suffixe SM. Le mesh de chaque proxy vient d'une structure de la table de tenues (STG Person__EventGraph.txt:2166-2171, lien avec NewProxy estimé).
  • Ce que masquent les vues actuelles : C1 (Room) : HairSM.SetVisibility(false) puis HideBoneByName(PlayerCharacter.Mesh, 'neckLower', PBO_None) (CAM-B1-IMPL.md:22, § 6 l. 87-88), caméra au milieu de lEye et rEye (§ 7 l. 106-109). POV de sexe (PC) : HairSM(CurrentActor).SetVisibility(false) (ST/STE/dumps/PC__EventGraph.txt:2290-2298, CurrentActor en :2278-2280) puis HideBoneByName(CurrentActor.Mesh, 'neckLower', PBO_None) (:2315-2323), rétablis en :2281-2289 et :2324-2339. Rien d'autre n'est traité : pas de proxy, pas de SetOwnerNoSee (ligne 4 du § 2), pas de matériau.
  • Ce que HideBoneByName couvre vraiment (écart à la fiche : « un os masqué n'affecte que le maillage qui le porte » est inexact pour les suiveurs) :
    • HideBoneByName → HideBone n'agit que si ShouldUpdateBoneVisibility(), c'est-à-dire si le composant n'a pas de leader (SkinnedMeshComponent.cpp:4482-4490, 4424-4433, 2121-2123) ; les enfants de l'os passent en BVS_HiddenByParent (:2145-2161).
    • Un suiveur lit les états de son leader (SkinnedMeshSceneProxyDesc.cpp:438) et masque l'os de même nom (LeaderBoneMap par nom, SkinnedMeshComponent.cpp:3470-3500 ; SkeletalRender.cpp:477-487). Donc HairSM, PenisSM et les proxys suiveurs de Mesh sont masqués pour les os qu'ils partagent.
    • Non couverts (établi dans le code, application au jeu estimée) : (1) un os absent du squelette du leader n'est pas masqué (SkeletalRender.cpp:494-505, pose de référence) ; (2) un composant sans leader ; (3) un composant non skinné (widgets, particules, static mesh) ; (4) un os masqué n'est pas supprimé : sa matrice devient celle du parent mise à l'échelle 0 (SkeletalRender.cpp:484-487), donc un sommet pondéré à la fois sur un os masqué et sur un os visible reste étiré (lambeaux roses : estimé).
    • Pourquoi des dents et de la langue restent visibles malgré neckLower masqué n'est pas établi : si elles sont des sections de Mesh pondérées sur des os descendants de head, elles devraient disparaître (os de head sous neckLower : lEye et rEye sont sous head, CAM-B1-IMPL.md:110-113). Hypothèses : H1 un composant dynamique à squelette différent ou sans leader ; H2 des sommets à pondération mixte ; H3 un autre acteur proche que celui dont la tête est masquée. Essai qui trancherait : § 5, point 1.

3.b FirstPersonSM et la caméra réellement utilisée

  • FirstPersonSM est un composant caméra : classe FirstPerson_C (Blueprint, Content/BPs/FirstPerson.uasset, 6 348 o, CAM-T2-CART.md:47 ; la chaîne CameraComponent y figure) ; le dump liste les propriétés de UCameraComponent : FieldOfView = 90 (CAM-T4_LPDumpComponents_20261011-004910.txt:907), OrthoWidth (:910), AspectRatio (:917), bUsePawnControlRotation vide = faux (:929), PostProcessSettings (bloom 0, SSR qualité 100, occlusion ambiante 1 : :935), RelativeRotation = (90,90,0) (:943), bAutoActivate = True (:977). Ni StaticMesh ni SceneComponent porteur : établi.
  • Premier-personne natif désactivé : FirstPersonFieldOfView = 90, FirstPersonScale = 1 (:908-909) ; bEnableFirstPersonFieldOfView et bEnableFirstPersonScale vides = faux (:930-931) ; FirstPersonPrimitiveType du PenisSM à la valeur par défaut = None (:335). Aucun code du jeu n'y touche (lignes 6a du § 2).
  • Caméra de C1 : SetViewTargetWithBlend(GI.PC, GI.PlayerCharacter) (CAM-B1-IMPL.md:22) : le moteur prend PlayerController->GetViewTarget() comme acteur de vue (LocalPlayer.cpp:874), puis AActor::CalcCamera utilise la première caméra active de l'acteur (Actor.cpp:3688-3703 ; bFindCameraComponentWhenViewTarget = true par défaut, Actor.cpp:320). Person n'a qu'une seule caméra (liste SCS, § 3.a) et FirstPersonSM est active (bAutoActivate) : la caméra de C1 est donc FirstPersonSM de PlayerCharacter. Établi, sauf la valeur de bFindCameraComponentWhenViewTarget sur Person (non lue ; défaut moteur).
  • Caméra de la POV de sexe : SetViewTargetWithBlend(GI.PC, CurrentActor), CurrentActor = SexPersons[SexCameraIndex] (CAM-T2-CART.md:137-140, PC:1788-1796 ; dump PC__EventGraph.txt) : même composant, celui de l'acteur filmé. Le regard souris fait AddWorldRotation(FirstPersonSM) (PC__EventGraph.txt:1896-1903). FirstPersonSM est partagé entre C1 et la POV (CAM-SPEC.md:150, R9). Conséquence : un réglage « première personne » côté caméra se pose à un seul endroit (le composant ou ses valeurs par défaut dans FirstPerson.uasset).

3.c Rendu première personne natif d'UE 5.8 (sources installées)

  • Caméra (Engine\Classes\Camera\CameraComponent.h) : FirstPersonFieldOfView (float, BlueprintReadWrite, :51-52) et SetFirstPersonFieldOfView (BlueprintCallable, :53-54) ; FirstPersonScale (float 0,001 à 1,0, BlueprintReadWrite, :59-60) et SetFirstPersonScale (BlueprintCallable, :61-62) ; bEnableFirstPersonFieldOfView (:207-211) et bEnableFirstPersonScale (:213-217), setters SetEnableFirstPersonFieldOfView et SetEnableFirstPersonScale (BlueprintCallable). Défauts : 90, 1, faux, faux (Private\Camera\CameraComponent.cpp:79-80, 97-98) ; GetCameraView recopie dans la vue (:475-477) : bUseFirstPersonParameters = bEnableFirstPersonFieldOfView || bEnableFirstPersonScale. Le moteur en fait une matrice de vue (SceneView.cpp:742-757 : échelle (FOVCorrectionFactor, FOVCorrectionFactor, 1) × Scale vers la caméra) via FFirstPersonParameters (LocalPlayer.cpp:914).
  • Primitive (Engine\Classes\Components\PrimitiveComponent.h) : enum class EFirstPersonPrimitiveType { None, FirstPerson, WorldSpaceRepresentation } (:151-162) ; propriété FirstPersonPrimitiveType (EditAnywhere, AdvancedDisplay, BlueprintReadOnly, :728-730) ; setter d'exécution SetFirstPersonPrimitiveType(EFirstPersonPrimitiveType), UFUNCTION(BlueprintCallable, Category="Rendering") (:2118-2120). SetOwnerNoSee(bool) aussi BlueprintCallable (:1951-1953) ; bOwnerNoSee : « n'est pas visible quand l'acteur de vue est le propriétaire du composant, directement ou indirectement » (:495-496) ; le test est bOwnerNoSee && bOwnersContain (PrimitiveSceneProxy.cpp:1588, 1672).
  • Ce que fait chaque type : FirstPerson utilise le champ de vision et l'échelle de la caméra et désactive bCastDynamicShadow, bCastStaticShadow, bCastVolumetricTranslucentShadow, bCastFarShadow (PrimitiveSceneProxy.cpp:631-641) ; WorldSpaceRepresentation force bOwnerNoSee = true et bCastHiddenShadow = false : « ignoré par le rendu d'ombres ordinaire, repris par le chemin spécial des ombres virtuelles » (PrimitiveSceneProxy.cpp:642-649 ; PrimitiveComponent.h:159-160). Le mode natif ne retire donc aucune partie du corps : il change la projection et le routage des ombres. La seule mécanique native qui cache un composant à la vue de son propriétaire est bOwnerNoSee, valable au niveau du composant, jamais d'un os ni d'une section.
  • Matériaux : nœud First Person Output (UMaterialExpressionFirstPersonOutput, entrée FirstPersonInterpolationAlpha, sortie « FirstPersonOutput » par sommet, Private\Materials\MaterialExpressionsToMIR.cpp:5160-5163) ; Transform Position avec TRANSFORMPOSSOURCE_FirstPersonTranslatedWorld et FirstPersonInterpolationAlpha optionnel (MaterialExpressions.cpp:11280-11282) ; nœud Is First Person (MaterialExpressionIsFirstPerson.h, inclus MaterialExpressions.cpp:310), évalué sur le drapeau de primitive (PRIMITIVE_SCENE_DATA_FLAG_IS_FIRST_PERSON, Engine\Shaders\Private\MaterialTemplate.ush:3932-3938), donc indépendant du bit GBuffer ; la lecture de scène IsFirstPerson (MaterialTemplate.ush:3417) passe, elle, par le GBuffer (DeferredShadingCommon.ush:456).
  • CVars (Renderer\Private\Shadows\FirstPersonSelfShadow.cpp) : r.FirstPerson.SelfShadow (défaut 0, :13-17), r.FirstPerson.SelfShadow.LightTypes (0 directionnelles, 1 locales, 2 toutes ; défaut 0, :19-23), .DownsampleCheckerboardMode (:25-29), .MaxTraceDistance (100, :31-35), puis .MaxHZBTraceIterations, .RelativeDepthThickness, .MinimumHZBTraceOccupancy, .BilateralFilterDepthThreshold, .RawFullResolution (:37-62) ; r.FirstPerson.Shadow.Virtual.Clipmap (défaut vrai, ShadowScene.cpp:28-33), r.FirstPerson.Shadow.Virtual.Clipmap.FirstLevel / .LastLevel (ShadowSceneRenderer.cpp:77, 84), .Clipmap.PixelRequestBias / .RequestMinLevelClamp (VirtualShadowMapArray.cpp:378, 386).
  • Doc Epic (page lue via WebFetch le 2026-10-13, résumé automatique ; recoupée par les sources ci-dessus sauf mention) : étapes = caméra propriétaire de ses primitives, First Person Primitive Type = First Person, Enable First Person Field Of View et Enable First Person Scale sur la caméra ; World Space Representation = copie en espace monde, invisible pour la caméra propriétaire, qui porte ombres au sol et reflets tracés ; « sans ombres virtuelles ni ombres tracées, pas d'ombre de première personne sur le sol » ; fonctions de base (champ de vision, échelle, interpolation par sommet, la plupart des nœuds) « fonctionnent sur toutes les plateformes et configurations » (recoupé : SceneView.cpp:742-757 ne dépend pas du bit GBuffer) ; cheveux de type groom non pris en charge (non recoupé ; le jeu utilise des cartes de cheveux en SkeletalMesh, § 3.a). Le modèle de la doc est « une caméra + deux maillages » (bras en First Person, corps complet en World Space Representation) : Person n'a qu'un Mesh et des suiveurs. Fil de forum signalant, en 5.8, que l'auto-ombre ne se rend pas avec MegaLights (rapport d'utilisateur, non confirmé) : https://forums.unrealengine.com/t/unreal-5-8-first-person-self-shadowing-does-not-render-with-megalights/2732976 ; sans objet ici (MegaLights absent de Config, § 3.d).
  • Un composant dupliqué pour masquer autrement est coûteux : un suiveur reprend les états d'os de son leader (SkinnedMeshSceneProxyDesc.cpp:438). Une copie « corps première personne » avec d'autres os masqués doit donc être sans leader et recevoir sa pose autrement (estimé), avec ses propres vêtements : la copie touche toute la chaîne de NewProxy.

3.d Contraintes du projet

  • Config/DefaultEngine.ini : r.AllowStaticLighting=True l. 28 ; r.Shadow.Virtual.Enable=0 l. 24 ; r.DynamicGlobalIlluminationMethod=0 (pas de Lumen) l. 22 ; r.ReflectionMethod=2 (reflets d'écran) l. 23 ; NearClipPlane=1.000000 l. 50 ; DefaultGraphicsRHI_DX12 l. 129. Le commentaire l. 18-21 fige le rendu 5.5 « pas de changement de rendu sans décision ». Aucun ForwardShading ni MegaLights dans Config (Grep ; DefaultEditor.ini:4-5 : deux lignes longues qui correspondent au motif, réglages d'éditeur non lus, hors rendu du jeu : estimé). Aucun PROJECT_CVAR_* dans Source (ligne 7 du § 2).
  • Exigence du natif complet : HasFirstPersonGBufferBit = !IsMobilePlatform && !IsForwardShadingEnabled && !IsStaticLightingAllowed() (RenderCore\Private\RenderUtils.cpp:2589-2593 ; « le bit libre si l'éclairage statique est désactivé », :2591). IsStaticLightingAllowed() lit r.AllowStaticLighting (RenderUtils.h:636-638 ; ReadOnlyCVARCache.cpp:107-122) ; la macro de compilation PROJECT_CVAR_ALLOW_STATIC_LIGHTING n'est définie ni dans Source du jeu ni dans UnrealBuildTool (0 résultat) : estimé qu'aucune recompilation C++ n'est requise, seulement un redémarrage et des shaders (la définition HAS_FIRST_PERSON_GBUFFER_BIT entre dans la compilation des shaders, ShaderCompiler.cpp:4084-4085). Sans le bit : pas d'extension de scène première personne (FirstPersonSceneExtension.cpp:10-15), pas de clipmap d'ombres virtuelles première personne (ShadowScene.cpp:35-40), pas d'auto-ombre (FirstPersonSelfShadow.cpp:91, 130, 159, 191, 207). Avec la configuration actuelle (éclairage statique autorisé, ombres virtuelles coupées) : auto-ombre absente, ombre au sol d'un WorldSpaceRepresentation absente (ignoré par les ombres ordinaires, PrimitiveSceneProxy.cpp:642-645), reflets de ce type absents ; champ de vision, échelle, interpolation par sommet et nœud Is First Person fonctionnent.
  • Lumières cuites dans les cartes : Content/Scenes/CentralLondon_BuiltData.uasset existe (43 149 o, identique en HEAD) et contient les noms Lightmap_0, Lightmap_1, LightMapTexture2D, ShadowMapTexture2D, ShadowMapFlags (§ 2, ligne 11) : des lightmaps et des ombres cuites existent pour CentralLondon (nombre d'entrées non lisible par les chaînes : incertain). Overview.umap (FreeAnimationsPack) n'a pas de _BuiltData. La carte contient DirectionalLight, SkyLight, PointLight, PointLight2, SkyAtmosphere, PostProcessVolume (noms) ; leur mobilité n'a pas été lue : incertain. Impact estimé d'un passage à r.AllowStaticLighting=False : la carte perd son éclairage indirect cuit, puisque Lumen est coupé (l. 22) ; les lumières statiques ou stationnaires peuvent changer d'aspect (comportement non lu dans le code : incertain) ; tous les shaders se recompilent (durée non mesurée).
  • Autres points : C1 et POV de sexe emploient le même FirstPersonSM (§ 3.b), donc un réglage caméra sert aux deux ; la POV de sexe reste le code d'origine de PC jusqu'à B5 (CAM-SPEC.md:412-413).

3.e Options chiffrées et recommandation

Mesures de durée connues : Build.ps1 4 s (0 unité), UAT BuildDebug 148 s, cuisson 163 paquets (CAM-B1-IMPL.md:62) ; le reste (CompileAllBlueprints, essai en jeu) n'est pas mesuré ici.

Option Nœuds, assets, config touchés Effet sur le défaut de la capture Risque Réversibilité Durée de copie UE (estimée)
a Masquer ce qui se rattache à la tête en C1 et en POV Room : voie C1 (près de HairSM.SetVisibility, CAM-B1-IMPL.md:22) et RestoreC1 ; PC : POV (PC__EventGraph.txt:2281-2339). Une boucle sur GetChildrenComponents(Mesh) comme ClearSMCs (9 nœuds, Person__ClearSMCs_D4.txt:96-137) + filtre + SetOwnerNoSee ou SetVisibility, et son miroir au retour : ≈ 10 à 14 nœuds par voie, 2 voies. Pour les sections du Mesh (bouche, cils, yeux), SetOwnerNoSee ne sert pas (niveau composant) : il faut SetMaterial par emplacement vers Content/Heavy/Daz/Bridget/Transparent, avec mémorisation et restauration (nœuds en plus, noms d'emplacements à lire) Couvre les composants (cheveux, proxys d'accessoires de tête) ; couvre bouche, cils, yeux seulement avec le remplacement de matériau ; ne corrige pas un défaut d'os (H2) moyen : un oubli de restauration laisse un personnage sans bouche ; les graphes Room et PC sont partagés (réservation) oui : instantané Snapshot.ps1, nœuds supprimables ; aucun shader, aucune config ≈ 5 à 8 min par essai (148 s mesurés pour l'UAT, le reste estimé)
b Natif : champ de vision et échelle seuls FirstPersonSM : SetEnableFirstPersonFieldOfView, SetEnableFirstPersonScale, valeurs (CameraComponent.h:51-62, 207-217), au runtime dans Room / PC ou en défauts de FirstPerson.uasset ; SetFirstPersonPrimitiveType(FirstPerson) sur Mesh, HairSM, PenisSM et chaque proxy (boucle, ≈ 8 nœuds par voie). Aucune config Aucun : le type FirstPerson ne cache rien (§ 3.c) ; il réduit seulement le recouvrement de la géométrie proche avec la scène moyen : les composants FirstPerson perdent leurs ombres dynamiques et statiques (PrimitiveSceneProxy.cpp:631-641), sans copie WorldSpaceRepresentation pour les remplacer (bit absent, ombres virtuelles coupées) : le corps ne projette plus d'ombre en C1 / POV oui (BP, aucune config) ≈ 5 à 8 min par essai (estimé)
c Natif complet : copie en espace monde, ombres virtuelles, éclairage statique coupé DefaultEngine.ini l. 28 (r.AllowStaticLighting=False) et l. 24 (r.Shadow.Virtual.Enable=1) ; CentralLondon_BuiltData et la carte (lumières, mobilité) ; Person : second jeu de composants (corps First Person sans tête + corps World Space Representation), donc NewProxy, ClearProxies, Dress à dupliquer ; matériaux Daz selon besoin Seulement si la copie « corps première personne » masque la tête par un autre moyen (os sur une copie sans leader, § 3.c) : le natif ne le fait pas seul élevé : change l'éclairage de tout le jeu (lightmaps inutilisées, Lumen coupé, rendu 5.5 figé par décision, DefaultEngine.ini:18-21), recompilation de tous les shaders, chaîne de vêtements dupliquée, essai complet du jeu à refaire oui par instantané de Config et de Content, mais le cuit et le DDC sont à refaire rechargement des shaders : non mesuré, probablement de dizaines de minutes à plusieurs heures au premier cuit (estimé) ; l'essai qui trancherait : un cuit à froid en copie
b+ (variante native, hors fiche) : type FirstPerson posé seulement pendant C1 / POV, et nœud Is First Person dans les matériaux des parties de tête SetFirstPersonPrimitiveType à l'entrée et à la sortie des vues (Room, PC) ; chaque matériau de tête (B_Mouth, B_Eyelashes, B_EyeMoisture, B_Pupils, B_Sclera, Cornea, équivalents masculins à identifier) : Is First Person → opacité 0 ; bEnableFirst* laissés à faux pour garder la projection (CameraComponent.cpp:477) Masque par section sans dépendre des os (le nœud lit le drapeau de primitive, MaterialTemplate.ush:3932-3938) moyen à élevé : un matériau opaque ne peut pas annuler un pixel : le mode de fusion devrait passer à Masked (modes non lus : incertain) ; ombres du corps coupées pendant la vue (PrimitiveSceneProxy.cpp:631-641) ; effets sur TAA (r.AntiAliasingMethod=2) et profondeur personnalisée non mesurés oui (matériaux et nœuds BP ; instantanés) ≈ recompilation des seuls matériaux modifiés + 5 à 8 min par essai (estimé)

Recommandation (proposition, la décision revient à l'utilisateur).

  1. Diagnostic d'abord, sans changer le rendu : on ne sait pas encore quels composants ou sections restent dessinés (§ 3.a, hypothèses H1 à H3). Un relevé à l'exécution (§ 5, point 1) départage a, b+ et un défaut d'os en une passe.
  2. Option a comme première correction : elle repose sur des appels déjà utilisés par le jeu (SetVisibility, HideBoneByName) et sur SetOwnerNoSee, qui est précisément la mécanique native de moteur pour cacher des primitives à la vue de leur propriétaire (§ 3.c) ; elle ne touche ni la configuration ni les shaders.
  3. Option b seule : écartée pour ce défaut (ne cache rien, coupe les ombres du corps). Option c : non recommandée ici : c'est un chantier d'éclairage de tout le jeu (lightmaps de CentralLondon, Lumen, VSM, shaders), qui ne règle pas la tête sans duplication des vêtements ; à ouvrir, si l'utilisateur le veut pour les ombres, les reflets et l'auto-ombre du corps, comme un lot de rendu séparé, après décision sur l'éclairage statique.
  4. Option b+ : la plus proche de « l'innovation 5.8 » demandée par l'utilisateur pour cacher une section sans os ; à essayer sur un seul matériau (la bouche) dans une copie si a ne suffit pas pour bouche, cils et yeux.

4. Établi / estimé / incertain

Établi (source lue) : les 8 composants SCS de Person et l'absence de composant dents / langue / yeux (§ 3.a) ; ce que masquent C1 et PC ; la sémantique de HideBone et des suiveurs dans le moteur 5.8.3 ; FirstPersonSM = UCameraComponent actif, seule caméra de Person, choisi par CalcCamera ; noms exacts, setters et valeurs par défaut des propriétés de caméra et de FirstPersonPrimitiveType ; le fait que FirstPerson coupe les ombres et que WorldSpaceRepresentation force bOwnerNoSee ; l'exigence !IsStaticLightingAllowed() du bit GBuffer ; les lignes 24 et 28 de DefaultEngine.ini ; l'existence de CentralLondon_BuiltData (43 149 o) avec noms de lightmaps. Estimé : dents, langue, cils et yeux = sections de bridget_gp (matériaux nommés dans l'actif, sections non lues) ; lambeaux roses = sommets à pondération mixte ; l'anneau violet = encolure ; absence de recompilation C++ pour r.AllowStaticLighting ; durées de cuisson et de shaders ; liaison NewProxy ↔ proxys de tenues. Incertain : cause exacte des dents et de la langue visibles (§ 3.a) ; composition de la bouche et des yeux de l'homme (Michael) ; build de la capture ; mobilité des lumières et nombre de lightmaps de CentralLondon ; modes de fusion des matériaux Daz ; comportement TAA / profondeur personnalisée avec le type FirstPerson ; valeur de bFindCameraComponentWhenViewTarget sur Person ; dump L6f de Person (2026-09-30) non relu sur HEAD ; page Epic lue par résumé automatique ; non vérifié en 5.5 (plus de développement 5.5, mémoire du 2026-10-12).

5. Points à confirmer (repris par la fiche suivante)

  1. Relevé à l'exécution (lecture seule) sur un Person en C1 et en POV : noms et classes des enfants de Mesh, LeaderPoseComponent de chacun, nombre et noms des emplacements de matériau de Mesh, IsBoneHiddenByName de neckLower, head, lowerJaw, tongue. Moyen : lecture MCP en éditeur sur un personnage placé, ou une exécution du jeu avec journal ; à confier à une fiche avec instantané si une écriture est requise.
  2. Build exact de la capture (B2 ou intermédiaire) et personnage filmé (homme ou femme), à demander à l'utilisateur.
  3. Squelette et sections de michael (pas de matériau de bouche dans son dossier).
  4. Mobilité des cinq lumières de CentralLondon et nombre de lightmaps (carte ouverte dans l'éditeur, lecture seule), seulement si l'option c est envisagée.
  5. Modes de fusion de B_Mouth, B_Eyelashes, B_EyeMoisture, B_Pupils, B_Sclera, Cornea (b+).
  6. Relire Person::UserConstructionScript et NewProxy sur HEAD (dump du 2026-09-30).

6. Questions pour la SPEC ou l'utilisateur

  • Q1 : en POV et en C1, le joueur doit-il voir son propre corps (torse, bras) ? (la capture le montre ; conditionne la copie de l'option c.)
  • Q2 : accepte-t-on que le corps du personnage filmé perde son ombre au sol pendant la vue si l'on utilise le type FirstPerson (options b, b+) ?
  • Q3 : l'éclairage statique et les lightmaps de CentralLondon peuvent-ils être abandonnés (condition de l'option c) ? Sinon, l'option c est hors de portée sans lot de rendu.
  • Q4 : périmètre : C1 seul, ou aussi la POV de sexe (code d'origine de PC jusqu'à B5) ?
  • Q5 : feu vert pour une fiche de diagnostic d'exécution (§ 5, point 1) avant toute SPEC d'implantation ?

Fichiers écrits : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B1e-CART.md. Fichiers à commiter (dépôt du jeu, branche ue5.8) : A Docs/Migration/etat/CAM/CAM-B1e-CART.md (suivi en texte : .md de etat/, lp-paths). À verser : lp-ue-compat (ou skill rendu) — FirstPersonPrimitiveType / SetFirstPersonPrimitiveType et caméra première personne : API 5.8.3 relue (§ 3.c) ; le bit GBuffer exige r.AllowStaticLighting=False ; HideBone ne vaut que sur le leader et se propage aux suiveurs par nom d'os.

Tours : 56 / 60