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

184 lines
30 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.

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