184 lines
30 KiB
Markdown
184 lines
30 KiB
Markdown
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
|